Merge "Fix test location provider bug" into pi-dev
diff --git a/Android.bp b/Android.bp
index 4d5d998..ce93568 100644
--- a/Android.bp
+++ b/Android.bp
@@ -145,11 +145,11 @@
":libcamera_client_framework_aidl",
"core/java/android/hardware/IConsumerIrService.aidl",
"core/java/android/hardware/ISerialManager.aidl",
+ "core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl",
"core/java/android/hardware/display/IDisplayManager.aidl",
"core/java/android/hardware/display/IDisplayManagerCallback.aidl",
"core/java/android/hardware/display/IVirtualDisplayCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintClientActiveCallback.aidl",
- "core/java/android/hardware/fingerprint/IFingerprintDialogReceiver.aidl",
"core/java/android/hardware/fingerprint/IFingerprintService.aidl",
"core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl",
diff --git a/Android.mk b/Android.mk
index e2f88e8..d7d9c90 100644
--- a/Android.mk
+++ b/Android.mk
@@ -252,6 +252,11 @@
-federate SupportLib https://developer.android.com \
-federationapi SupportLib prebuilts/sdk/current/support-api.txt
+# Federate AndroidX references against local API file.
+framework_docs_LOCAL_DROIDDOC_OPTIONS += \
+ -federate AndroidX https://developer.android.com \
+ -federationapi AndroidX prebuilts/sdk/current/androidx-api.txt
+
# ==== Public API diff ===========================
include $(CLEAR_VARS)
@@ -861,39 +866,58 @@
# ==== hiddenapi lists =======================================
-# Copy blacklist and light greylist over into the build folder.
+# Copy light and dark greylist over into the build folder.
# This is for ART buildbots which need to mock these lists and have alternative
# rules for building them. Other rules in the build system should depend on the
# files in the build folder.
-$(eval $(call copy-one-file,frameworks/base/config/hiddenapi-blacklist.txt,\
- $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)))
-
+# Automatically add all methods which match the following signatures.
+# These need to be greylisted in order to allow applications to write their
+# own serializers.
+$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): REGEX_SERIALIZATION := \
+ "readObject\(Ljava/io/ObjectInputStream;\)V" \
+ "readObjectNoData\(\)V" \
+ "readResolve\(\)Ljava/lang/Object;" \
+ "serialVersionUID:J" \
+ "serialPersistentFields:\[Ljava/io/ObjectStreamField;" \
+ "writeObject\(Ljava/io/ObjectOutputStream;\)V" \
+ "writeReplace\(\)Ljava/lang/Object;"
+$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
# Temporarily merge light greylist from two files. Vendor list will become dark
# grey once we remove the UI toast.
$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): frameworks/base/config/hiddenapi-light-greylist.txt \
- frameworks/base/config/hiddenapi-vendor-list.txt
- sort $^ > $@
+ frameworks/base/config/hiddenapi-vendor-list.txt \
+ $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
+ sort frameworks/base/config/hiddenapi-light-greylist.txt \
+ frameworks/base/config/hiddenapi-vendor-list.txt \
+ <(grep -E "\->("$(subst $(space),"|",$(REGEX_SERIALIZATION))")$$" $(PRIVATE_API)) \
+ > $@
+
+$(eval $(call copy-one-file,frameworks/base/config/hiddenapi-dark-greylist.txt,\
+ $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)))
# Generate dark greylist as private API minus (blacklist plus light greylist).
-$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
-$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): BLACKLIST := $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
-$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
-$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
- $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST) \
- $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
- if [ ! -z "`comm -12 <(sort $(BLACKLIST)) <(sort $(LIGHT_GREYLIST))`" ]; then \
- echo "There should be no overlap between $(BLACKLIST) and $(LIGHT_GREYLIST)" 1>&2; \
+$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
+$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
+$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): DARK_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)
+$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
+ $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
+ $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)
+ if [ ! -z "`comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST))`" ]; then \
+ echo "There should be no overlap between $(LIGHT_GREYLIST) and $(DARK_GREYLIST)" 1>&2; \
+ comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST)) 1>&2; \
exit 1; \
- elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(BLACKLIST))`" ]; then \
- echo "$(BLACKLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
- exit 2; \
elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST))`" ]; then \
echo "$(LIGHT_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
+ comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST)) 1>&2; \
+ exit 2; \
+ elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST))`" ]; then \
+ echo "$(DARK_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
+ comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST)) 1>&2; \
exit 3; \
fi
- comm -23 <(sort $(PRIVATE_API)) <(sort $(BLACKLIST) $(LIGHT_GREYLIST)) > $@
+ comm -23 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST) $(DARK_GREYLIST)) > $@
# Include subdirectory makefiles
# ============================================================
diff --git a/apct-tests/perftests/core/AndroidTest.xml b/apct-tests/perftests/core/AndroidTest.xml
new file mode 100644
index 0000000..6aa34a6
--- /dev/null
+++ b/apct-tests/perftests/core/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs CorePerfTests metric instrumentation.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-metric-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="CorePerfTests.apk" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.perftests.core" />
+ </test>
+</configuration>
diff --git a/apct-tests/perftests/multiuser/Android.mk b/apct-tests/perftests/multiuser/Android.mk
index a803369..9bc7d05 100644
--- a/apct-tests/perftests/multiuser/Android.mk
+++ b/apct-tests/perftests/multiuser/Android.mk
@@ -26,6 +26,8 @@
LOCAL_PACKAGE_NAME := MultiUserPerfTests
LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_COMPATIBILITY_SUITE += device-tests
+
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
diff --git a/apct-tests/perftests/multiuser/AndroidTest.xml b/apct-tests/perftests/multiuser/AndroidTest.xml
new file mode 100644
index 0000000..6ede827
--- /dev/null
+++ b/apct-tests/perftests/multiuser/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs MultiUserPerfTests metric instrumentation.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-metric-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="MultiUserPerfTests.apk" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.perftests.multiuser" />
+ </test>
+</configuration>
diff --git a/api/current.txt b/api/current.txt
index d37d3d1..607109d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -142,7 +142,8 @@
field public static final java.lang.String TRANSMIT_IR = "android.permission.TRANSMIT_IR";
field public static final java.lang.String UNINSTALL_SHORTCUT = "com.android.launcher.permission.UNINSTALL_SHORTCUT";
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
- field public static final java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
+ field public static final java.lang.String USE_BIOMETRIC = "android.permission.USE_BIOMETRIC";
+ field public static final deprecated java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
field public static final java.lang.String USE_SIP = "android.permission.USE_SIP";
field public static final java.lang.String VIBRATE = "android.permission.VIBRATE";
field public static final java.lang.String WAKE_LOCK = "android.permission.WAKE_LOCK";
@@ -1604,17 +1605,17 @@
field public static final int holo_purple = 17170458; // 0x106001a
field public static final int holo_red_dark = 17170455; // 0x1060017
field public static final int holo_red_light = 17170454; // 0x1060016
- field public static final int primary_text_dark = 17170433; // 0x1060001
- field public static final int primary_text_dark_nodisable = 17170434; // 0x1060002
- field public static final int primary_text_light = 17170435; // 0x1060003
- field public static final int primary_text_light_nodisable = 17170436; // 0x1060004
- field public static final int secondary_text_dark = 17170437; // 0x1060005
- field public static final int secondary_text_dark_nodisable = 17170438; // 0x1060006
- field public static final int secondary_text_light = 17170439; // 0x1060007
- field public static final int secondary_text_light_nodisable = 17170440; // 0x1060008
+ field public static final deprecated int primary_text_dark = 17170433; // 0x1060001
+ field public static final deprecated int primary_text_dark_nodisable = 17170434; // 0x1060002
+ field public static final deprecated int primary_text_light = 17170435; // 0x1060003
+ field public static final deprecated int primary_text_light_nodisable = 17170436; // 0x1060004
+ field public static final deprecated int secondary_text_dark = 17170437; // 0x1060005
+ field public static final deprecated int secondary_text_dark_nodisable = 17170438; // 0x1060006
+ field public static final deprecated int secondary_text_light = 17170439; // 0x1060007
+ field public static final deprecated int secondary_text_light_nodisable = 17170440; // 0x1060008
field public static final int tab_indicator_text = 17170441; // 0x1060009
- field public static final int tertiary_text_dark = 17170448; // 0x1060010
- field public static final int tertiary_text_light = 17170449; // 0x1060011
+ field public static final deprecated int tertiary_text_dark = 17170448; // 0x1060010
+ field public static final deprecated int tertiary_text_light = 17170449; // 0x1060011
field public static final int transparent = 17170445; // 0x106000d
field public static final int white = 17170443; // 0x106000b
field public static final int widget_edittext_dark = 17170442; // 0x106000a
@@ -5877,6 +5878,8 @@
method public java.lang.CharSequence getTitle();
method public boolean isEnabled();
method public void setEnabled(boolean);
+ method public void setShouldShowIcon(boolean);
+ method public boolean shouldShowIcon();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.RemoteAction> CREATOR;
}
@@ -6112,8 +6115,12 @@
method public android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
method public android.view.WindowContentFrameStats getWindowContentFrameStats(int);
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
+ method public void grantRuntimePermission(java.lang.String, java.lang.String);
+ method public void grantRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
method public boolean injectInputEvent(android.view.InputEvent, boolean);
method public boolean performGlobalAction(int);
+ method public void revokeRuntimePermission(java.lang.String, java.lang.String);
+ method public void revokeRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
method public void setOnAccessibilityEventListener(android.app.UiAutomation.OnAccessibilityEventListener);
method public boolean setRotation(int);
method public void setRunAsMonkey(boolean);
@@ -6261,6 +6268,7 @@
method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler);
method public void clear() throws java.io.IOException;
method public void clear(int) throws java.io.IOException;
+ method public void clearWallpaper();
method public void clearWallpaperOffsets(android.os.IBinder);
method public void forgetLoadedWallpaper();
method public android.graphics.drawable.Drawable getBuiltInDrawable();
@@ -6287,6 +6295,7 @@
method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean, int) throws java.io.IOException;
+ method public void setDisplayPadding(android.graphics.Rect);
method public void setResource(int) throws java.io.IOException;
method public int setResource(int, int) throws java.io.IOException;
method public void setStream(java.io.InputStream) throws java.io.IOException;
@@ -6454,12 +6463,11 @@
method public android.content.ComponentName getMandatoryBackupTransport();
method public int getMaximumFailedPasswordsForWipe(android.content.ComponentName);
method public long getMaximumTimeToLock(android.content.ComponentName);
- method public java.util.List<java.lang.String> getMeteredDataDisabled(android.content.ComponentName);
+ method public java.util.List<java.lang.String> getMeteredDataDisabledPackages(android.content.ComponentName);
method public int getOrganizationColor(android.content.ComponentName);
method public java.lang.CharSequence getOrganizationName(android.content.ComponentName);
method public java.util.List<android.telephony.data.ApnSetting> getOverrideApns(android.content.ComponentName);
method public android.app.admin.DevicePolicyManager getParentProfileInstance(android.content.ComponentName);
- method public java.lang.String getPasswordBlacklistName(android.content.ComponentName);
method public long getPasswordExpiration(android.content.ComponentName);
method public long getPasswordExpirationTimeout(android.content.ComponentName);
method public int getPasswordHistoryLength(android.content.ComponentName);
@@ -6496,7 +6504,7 @@
method public boolean installExistingPackage(android.content.ComponentName, java.lang.String);
method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate, java.lang.String);
method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate[], java.lang.String, boolean);
- method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate[], java.lang.String, boolean, boolean);
+ method public boolean installKeyPair(android.content.ComponentName, java.security.PrivateKey, java.security.cert.Certificate[], java.lang.String, int);
method public boolean isActivePasswordSufficient();
method public boolean isAdminActive(android.content.ComponentName);
method public boolean isAffiliatedUser();
@@ -6562,13 +6570,12 @@
method public void setMasterVolumeMuted(android.content.ComponentName, boolean);
method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int);
method public void setMaximumTimeToLock(android.content.ComponentName, long);
- method public java.util.List<java.lang.String> setMeteredDataDisabled(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public java.util.List<java.lang.String> setMeteredDataDisabledPackages(android.content.ComponentName, java.util.List<java.lang.String>);
method public void setNetworkLoggingEnabled(android.content.ComponentName, boolean);
method public void setOrganizationColor(android.content.ComponentName, int);
method public void setOrganizationName(android.content.ComponentName, java.lang.CharSequence);
method public void setOverrideApnsEnabled(android.content.ComponentName, boolean);
method public java.lang.String[] setPackagesSuspended(android.content.ComponentName, java.lang.String[], boolean);
- method public boolean setPasswordBlacklist(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>);
method public void setPasswordExpirationTimeout(android.content.ComponentName, long);
method public void setPasswordHistoryLength(android.content.ComponentName, int);
method public void setPasswordMinimumLength(android.content.ComponentName, int);
@@ -6680,9 +6687,14 @@
field public static final int ID_TYPE_IMEI = 4; // 0x4
field public static final int ID_TYPE_MEID = 8; // 0x8
field public static final int ID_TYPE_SERIAL = 2; // 0x2
+ field public static final int INSTALLKEY_REQUEST_CREDENTIALS_ACCESS = 1; // 0x1
+ field public static final int INSTALLKEY_SET_USER_SELECTABLE = 2; // 0x2
+ field public static final int KEYGUARD_DISABLE_BIOMETRICS = 416; // 0x1a0
+ field public static final int KEYGUARD_DISABLE_FACE = 128; // 0x80
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
field public static final int KEYGUARD_DISABLE_FEATURES_NONE = 0; // 0x0
field public static final int KEYGUARD_DISABLE_FINGERPRINT = 32; // 0x20
+ field public static final int KEYGUARD_DISABLE_IRIS = 256; // 0x100
field public static final int KEYGUARD_DISABLE_REMOTE_INPUT = 64; // 0x40
field public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 2; // 0x2
field public static final int KEYGUARD_DISABLE_SECURE_NOTIFICATIONS = 4; // 0x4
@@ -7041,7 +7053,8 @@
method public int getBackoffPolicy();
method public android.content.ClipData getClipData();
method public int getClipGrantFlags();
- method public long getEstimatedNetworkBytes();
+ method public long getEstimatedNetworkDownloadBytes();
+ method public long getEstimatedNetworkUploadBytes();
method public android.os.PersistableBundle getExtras();
method public long getFlexMillis();
method public int getId();
@@ -7058,8 +7071,10 @@
method public long getTriggerContentMaxDelay();
method public long getTriggerContentUpdateDelay();
method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
+ method public boolean isImportantWhileForeground();
method public boolean isPeriodic();
method public boolean isPersisted();
+ method public boolean isPrefetch();
method public boolean isRequireBatteryNotLow();
method public boolean isRequireCharging();
method public boolean isRequireDeviceIdle();
@@ -7085,15 +7100,15 @@
method public android.app.job.JobInfo build();
method public android.app.job.JobInfo.Builder setBackoffCriteria(long, int);
method public android.app.job.JobInfo.Builder setClipData(android.content.ClipData, int);
- method public android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long);
+ method public android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long, long);
method public android.app.job.JobInfo.Builder setExtras(android.os.PersistableBundle);
method public android.app.job.JobInfo.Builder setImportantWhileForeground(boolean);
- method public android.app.job.JobInfo.Builder setIsPrefetch(boolean);
method public android.app.job.JobInfo.Builder setMinimumLatency(long);
method public android.app.job.JobInfo.Builder setOverrideDeadline(long);
method public android.app.job.JobInfo.Builder setPeriodic(long);
method public android.app.job.JobInfo.Builder setPeriodic(long, long);
method public android.app.job.JobInfo.Builder setPersisted(boolean);
+ method public android.app.job.JobInfo.Builder setPrefetch(boolean);
method public android.app.job.JobInfo.Builder setRequiredNetwork(android.net.NetworkRequest);
method public android.app.job.JobInfo.Builder setRequiredNetworkType(int);
method public android.app.job.JobInfo.Builder setRequiresBatteryNotLow(boolean);
@@ -7163,10 +7178,11 @@
public final class JobWorkItem implements android.os.Parcelable {
ctor public JobWorkItem(android.content.Intent);
- ctor public JobWorkItem(android.content.Intent, long);
+ ctor public JobWorkItem(android.content.Intent, long, long);
method public int describeContents();
method public int getDeliveryCount();
- method public long getEstimatedNetworkBytes();
+ method public long getEstimatedNetworkDownloadBytes();
+ method public long getEstimatedNetworkUploadBytes();
method public android.content.Intent getIntent();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.job.JobWorkItem> CREATOR;
@@ -7194,21 +7210,26 @@
field public static final java.lang.String HINT_ACTIONS = "actions";
field public static final java.lang.String HINT_ERROR = "error";
field public static final java.lang.String HINT_HORIZONTAL = "horizontal";
- field public static final java.lang.String HINT_KEY_WORDS = "key_words";
+ field public static final java.lang.String HINT_KEYWORDS = "keywords";
field public static final java.lang.String HINT_LARGE = "large";
+ field public static final java.lang.String HINT_LAST_UPDATED = "last_updated";
field public static final java.lang.String HINT_LIST = "list";
field public static final java.lang.String HINT_LIST_ITEM = "list_item";
field public static final java.lang.String HINT_NO_TINT = "no_tint";
field public static final java.lang.String HINT_PARTIAL = "partial";
+ field public static final java.lang.String HINT_PERMISSION_REQUEST = "permission_request";
field public static final java.lang.String HINT_SEE_MORE = "see_more";
field public static final java.lang.String HINT_SELECTED = "selected";
field public static final java.lang.String HINT_SHORTCUT = "shortcut";
field public static final java.lang.String HINT_SUMMARY = "summary";
field public static final java.lang.String HINT_TITLE = "title";
+ field public static final java.lang.String HINT_TTL = "ttl";
field public static final java.lang.String SUBTYPE_COLOR = "color";
field public static final java.lang.String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
+ field public static final java.lang.String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
field public static final java.lang.String SUBTYPE_MAX = "max";
field public static final java.lang.String SUBTYPE_MESSAGE = "message";
+ field public static final java.lang.String SUBTYPE_MILLIS = "millis";
field public static final java.lang.String SUBTYPE_PRIORITY = "priority";
field public static final java.lang.String SUBTYPE_RANGE = "range";
field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
@@ -7266,11 +7287,14 @@
public class SliceManager {
method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
+ method public int checkSlicePermission(android.net.Uri, int, int);
method public java.util.List<android.net.Uri> getPinnedSlices();
method public java.util.List<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
method public java.util.Collection<android.net.Uri> getSliceDescendants(android.net.Uri);
+ method public void grantSlicePermission(java.lang.String, android.net.Uri);
method public android.net.Uri mapIntentToUri(android.content.Intent);
method public void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ method public void revokeSlicePermission(java.lang.String, android.net.Uri);
method public void unpinSlice(android.net.Uri);
field public static final java.lang.String CATEGORY_SLICE = "android.app.slice.category.SLICE";
field public static final java.lang.String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
@@ -7279,11 +7303,12 @@
public class SliceMetrics {
ctor public SliceMetrics(android.content.Context, android.net.Uri);
method public void logHidden();
- method public void logTouch(android.net.Uri);
+ method public void logTouch(int, android.net.Uri);
method public void logVisible();
}
public abstract class SliceProvider extends android.content.ContentProvider {
+ ctor public SliceProvider(java.lang.String...);
ctor public SliceProvider();
method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public final java.lang.String getType(android.net.Uri);
@@ -7328,6 +7353,20 @@
field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
}
+ public final class EventStats implements android.os.Parcelable {
+ ctor public EventStats(android.app.usage.EventStats);
+ method public void add(android.app.usage.EventStats);
+ method public int describeContents();
+ method public int getCount();
+ method public int getEventType();
+ method public long getFirstTimeStamp();
+ method public long getLastEventTime();
+ method public long getLastTimeStamp();
+ method public long getTotalTime();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.usage.EventStats> CREATOR;
+ }
+
public final class ExternalStorageStats implements android.os.Parcelable {
method public int describeContents();
method public long getAppBytes();
@@ -7379,8 +7418,9 @@
public class NetworkStatsManager {
method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
- method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException;
+ method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws java.lang.SecurityException;
method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException;
+ method public android.app.usage.NetworkStats queryDetailsForUidTagState(int, java.lang.String, long, long, int, int, int) throws java.lang.SecurityException;
method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
@@ -7430,9 +7470,13 @@
method public int getStandbyBucket();
method public long getTimeStamp();
field public static final int CONFIGURATION_CHANGE = 5; // 0x5
+ field public static final int KEYGUARD_HIDDEN = 18; // 0x12
+ field public static final int KEYGUARD_SHOWN = 17; // 0x11
field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
field public static final int NONE = 0; // 0x0
+ field public static final int SCREEN_INTERACTIVE = 15; // 0xf
+ field public static final int SCREEN_NON_INTERACTIVE = 16; // 0x10
field public static final int SHORTCUT_INVOCATION = 8; // 0x8
field public static final int STANDBY_BUCKET_CHANGED = 11; // 0xb
field public static final int USER_INTERACTION = 7; // 0x7
@@ -7456,6 +7500,7 @@
method public boolean isAppInactive(java.lang.String);
method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long);
method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long);
+ method public java.util.List<android.app.usage.EventStats> queryEventStats(int, long, long);
method public android.app.usage.UsageEvents queryEvents(long, long);
method public android.app.usage.UsageEvents queryEventsForSelf(long, long);
method public java.util.List<android.app.usage.UsageStats> queryUsageStats(int, long, long);
@@ -9882,6 +9927,8 @@
field public static final java.lang.String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
field public static final java.lang.String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
field public static final java.lang.String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
+ field public static final java.lang.String ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED";
+ field public static final java.lang.String ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED";
field public static final java.lang.String ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
field public static final java.lang.String ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT";
field public static final java.lang.String ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE";
@@ -10042,6 +10089,7 @@
field public static final java.lang.String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
field public static final java.lang.String EXTRA_STREAM = "android.intent.extra.STREAM";
field public static final java.lang.String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
+ field public static final java.lang.String EXTRA_SUSPENDED_PACKAGE_EXTRAS = "android.intent.extra.SUSPENDED_PACKAGE_EXTRAS";
field public static final java.lang.String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
field public static final java.lang.String EXTRA_TEXT = "android.intent.extra.TEXT";
field public static final java.lang.String EXTRA_TITLE = "android.intent.extra.TITLE";
@@ -10869,6 +10917,7 @@
method public java.util.List<android.content.pm.LauncherActivityInfo> getShortcutConfigActivityList(java.lang.String, android.os.UserHandle);
method public android.graphics.drawable.Drawable getShortcutIconDrawable(android.content.pm.ShortcutInfo, int);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+ method public android.os.Bundle getSuspendedPackageLauncherExtras(java.lang.String, android.os.UserHandle);
method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
@@ -10893,6 +10942,7 @@
method public abstract void onPackageRemoved(java.lang.String, android.os.UserHandle);
method public abstract void onPackagesAvailable(java.lang.String[], android.os.UserHandle, boolean);
method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle);
+ method public void onPackagesSuspended(java.lang.String[], android.os.Bundle, android.os.UserHandle);
method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean);
method public void onPackagesUnsuspended(java.lang.String[], android.os.UserHandle);
method public void onShortcutsChanged(java.lang.String, java.util.List<android.content.pm.ShortcutInfo>, android.os.UserHandle);
@@ -11155,7 +11205,7 @@
method public abstract android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
- method public android.os.PersistableBundle getSuspendedPackageAppExtras();
+ method public android.os.Bundle getSuspendedPackageAppExtras();
method public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
method public abstract java.lang.String[] getSystemSharedLibraryNames();
method public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
@@ -13302,7 +13352,6 @@
method public void rotate(float);
method public final void rotate(float, float, float);
method public int save();
- method public deprecated int save(int);
method public deprecated int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
method public int saveLayer(android.graphics.RectF, android.graphics.Paint);
method public deprecated int saveLayer(float, float, float, float, android.graphics.Paint, int);
@@ -13320,11 +13369,6 @@
method public void skew(float, float);
method public void translate(float, float);
field public static final int ALL_SAVE_FLAG = 31; // 0x1f
- field public static final deprecated int CLIP_SAVE_FLAG = 2; // 0x2
- field public static final deprecated int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
- field public static final deprecated int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
- field public static final deprecated int HAS_ALPHA_LAYER_SAVE_FLAG = 4; // 0x4
- field public static final deprecated int MATRIX_SAVE_FLAG = 1; // 0x1
}
public static final class Canvas.EdgeType extends java.lang.Enum {
@@ -13615,22 +13659,22 @@
method public int getAllocator();
method public boolean getConserveMemory();
method public android.graphics.Rect getCrop();
- method public boolean getDecodeAsAlphaMask();
- method public boolean getMutable();
method public android.graphics.ImageDecoder.OnPartialImageListener getOnPartialImageListener();
method public android.graphics.PostProcessor getPostProcessor();
- method public boolean getRequireUnpremultiplied();
- method public android.util.Size getSampledSize(int);
- method public android.graphics.ImageDecoder setAllocator(int);
- method public android.graphics.ImageDecoder setConserveMemory(boolean);
- method public android.graphics.ImageDecoder setCrop(android.graphics.Rect);
- method public android.graphics.ImageDecoder setDecodeAsAlphaMask(boolean);
- method public android.graphics.ImageDecoder setMutable(boolean);
- method public android.graphics.ImageDecoder setOnPartialImageListener(android.graphics.ImageDecoder.OnPartialImageListener);
- method public android.graphics.ImageDecoder setPostProcessor(android.graphics.PostProcessor);
- method public android.graphics.ImageDecoder setRequireUnpremultiplied(boolean);
- method public android.graphics.ImageDecoder setResize(int, int);
- method public android.graphics.ImageDecoder setResize(int);
+ method public boolean isDecodeAsAlphaMaskEnabled();
+ method public boolean isMutableRequired();
+ method public boolean isUnpremultipliedRequired();
+ method public void setAllocator(int);
+ method public void setConserveMemory(boolean);
+ method public void setCrop(android.graphics.Rect);
+ method public void setDecodeAsAlphaMaskEnabled(boolean);
+ method public void setMutableRequired(boolean);
+ method public void setOnPartialImageListener(android.graphics.ImageDecoder.OnPartialImageListener);
+ method public void setPostProcessor(android.graphics.PostProcessor);
+ method public void setTargetColorSpace(android.graphics.ColorSpace);
+ method public void setTargetSampleSize(int);
+ method public void setTargetSize(int, int);
+ method public void setUnpremultipliedRequired(boolean);
field public static final int ALLOCATOR_DEFAULT = 0; // 0x0
field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
field public static final int ALLOCATOR_SHARED_MEMORY = 2; // 0x2
@@ -13646,6 +13690,7 @@
}
public static class ImageDecoder.ImageInfo {
+ method public android.graphics.ColorSpace getColorSpace();
method public java.lang.String getMimeType();
method public android.util.Size getSize();
method public boolean isAnimated();
@@ -15708,6 +15753,62 @@
}
+package android.hardware.biometrics {
+
+ public class BiometricDialog {
+ method public void authenticate(android.hardware.biometrics.BiometricDialog.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricDialog.AuthenticationCallback);
+ method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricDialog.AuthenticationCallback);
+ field public static final int BIOMETRIC_ACQUIRED_GOOD = 0; // 0x0
+ field public static final int BIOMETRIC_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
+ field public static final int BIOMETRIC_ACQUIRED_INSUFFICIENT = 2; // 0x2
+ field public static final int BIOMETRIC_ACQUIRED_PARTIAL = 1; // 0x1
+ field public static final int BIOMETRIC_ACQUIRED_TOO_FAST = 5; // 0x5
+ field public static final int BIOMETRIC_ACQUIRED_TOO_SLOW = 4; // 0x4
+ field public static final int BIOMETRIC_ERROR_CANCELED = 5; // 0x5
+ field public static final int BIOMETRIC_ERROR_HW_NOT_PRESENT = 12; // 0xc
+ field public static final int BIOMETRIC_ERROR_HW_UNAVAILABLE = 1; // 0x1
+ field public static final int BIOMETRIC_ERROR_LOCKOUT = 7; // 0x7
+ field public static final int BIOMETRIC_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
+ field public static final int BIOMETRIC_ERROR_NO_BIOMETRICS = 11; // 0xb
+ field public static final int BIOMETRIC_ERROR_NO_SPACE = 4; // 0x4
+ field public static final int BIOMETRIC_ERROR_TIMEOUT = 3; // 0x3
+ field public static final int BIOMETRIC_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
+ field public static final int BIOMETRIC_ERROR_USER_CANCELED = 10; // 0xa
+ field public static final int BIOMETRIC_ERROR_VENDOR = 8; // 0x8
+ }
+
+ public static abstract class BiometricDialog.AuthenticationCallback {
+ ctor public BiometricDialog.AuthenticationCallback();
+ method public void onAuthenticationError(int, java.lang.CharSequence);
+ method public void onAuthenticationFailed();
+ method public void onAuthenticationHelp(int, java.lang.CharSequence);
+ method public void onAuthenticationSucceeded(android.hardware.biometrics.BiometricDialog.AuthenticationResult);
+ }
+
+ public static class BiometricDialog.AuthenticationResult {
+ method public android.hardware.biometrics.BiometricDialog.CryptoObject getCryptoObject();
+ }
+
+ public static class BiometricDialog.Builder {
+ ctor public BiometricDialog.Builder(android.content.Context);
+ method public android.hardware.biometrics.BiometricDialog build();
+ method public android.hardware.biometrics.BiometricDialog.Builder setDescription(java.lang.CharSequence);
+ method public android.hardware.biometrics.BiometricDialog.Builder setNegativeButton(java.lang.CharSequence, java.util.concurrent.Executor, android.content.DialogInterface.OnClickListener);
+ method public android.hardware.biometrics.BiometricDialog.Builder setSubtitle(java.lang.CharSequence);
+ method public android.hardware.biometrics.BiometricDialog.Builder setTitle(java.lang.CharSequence);
+ }
+
+ public static final class BiometricDialog.CryptoObject {
+ ctor public BiometricDialog.CryptoObject(java.security.Signature);
+ ctor public BiometricDialog.CryptoObject(javax.crypto.Cipher);
+ ctor public BiometricDialog.CryptoObject(javax.crypto.Mac);
+ method public javax.crypto.Cipher getCipher();
+ method public javax.crypto.Mac getMac();
+ method public java.security.Signature getSignature();
+ }
+
+}
+
package android.hardware.camera2 {
public class CameraAccessException extends android.util.AndroidException {
@@ -15793,6 +15894,7 @@
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
@@ -16029,6 +16131,9 @@
field public static final int CONTROL_SCENE_MODE_THEATRE = 7; // 0x7
field public static final int CONTROL_VIDEO_STABILIZATION_MODE_OFF = 0; // 0x0
field public static final int CONTROL_VIDEO_STABILIZATION_MODE_ON = 1; // 0x1
+ field public static final int DISTORTION_CORRECTION_MODE_FAST = 1; // 0x1
+ field public static final int DISTORTION_CORRECTION_MODE_HIGH_QUALITY = 2; // 0x2
+ field public static final int DISTORTION_CORRECTION_MODE_OFF = 0; // 0x0
field public static final int EDGE_MODE_FAST = 1; // 0x1
field public static final int EDGE_MODE_HIGH_QUALITY = 2; // 0x2
field public static final int EDGE_MODE_OFF = 0; // 0x0
@@ -16075,6 +16180,7 @@
field public static final int REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA = 11; // 0xb
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING = 2; // 0x2
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR = 1; // 0x1
+ field public static final int REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME = 12; // 0xc
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING = 10; // 0xa
field public static final int REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING = 4; // 0x4
field public static final int REQUEST_AVAILABLE_CAPABILITIES_RAW = 3; // 0x3
@@ -16181,6 +16287,7 @@
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE;
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
field public static final android.os.Parcelable.Creator<android.hardware.camera2.CaptureRequest> CREATOR;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE;
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE;
field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE;
@@ -16263,6 +16370,7 @@
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE;
@@ -16537,58 +16645,6 @@
package android.hardware.fingerprint {
- public class FingerprintDialog {
- method public void authenticate(android.hardware.fingerprint.FingerprintDialog.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback);
- method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback);
- field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
- field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
- field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
- field public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; // 0x1
- field public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; // 0x5
- field public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; // 0x4
- field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
- field public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; // 0xc
- field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
- field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
- field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
- field public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; // 0xb
- field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
- field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
- field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
- field public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; // 0xa
- field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
- }
-
- public static abstract class FingerprintDialog.AuthenticationCallback {
- ctor public FingerprintDialog.AuthenticationCallback();
- method public void onAuthenticationError(int, java.lang.CharSequence);
- method public void onAuthenticationFailed();
- method public void onAuthenticationHelp(int, java.lang.CharSequence);
- method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintDialog.AuthenticationResult);
- }
-
- public static class FingerprintDialog.AuthenticationResult {
- method public android.hardware.fingerprint.FingerprintDialog.CryptoObject getCryptoObject();
- }
-
- public static class FingerprintDialog.Builder {
- ctor public FingerprintDialog.Builder();
- method public android.hardware.fingerprint.FingerprintDialog build(android.content.Context);
- method public android.hardware.fingerprint.FingerprintDialog.Builder setDescription(java.lang.CharSequence);
- method public android.hardware.fingerprint.FingerprintDialog.Builder setNegativeButton(java.lang.CharSequence, java.util.concurrent.Executor, android.content.DialogInterface.OnClickListener);
- method public android.hardware.fingerprint.FingerprintDialog.Builder setSubtitle(java.lang.CharSequence);
- method public android.hardware.fingerprint.FingerprintDialog.Builder setTitle(java.lang.CharSequence);
- }
-
- public static final class FingerprintDialog.CryptoObject {
- ctor public FingerprintDialog.CryptoObject(java.security.Signature);
- ctor public FingerprintDialog.CryptoObject(javax.crypto.Cipher);
- ctor public FingerprintDialog.CryptoObject(javax.crypto.Mac);
- method public javax.crypto.Cipher getCipher();
- method public javax.crypto.Mac getMac();
- method public java.security.Signature getSignature();
- }
-
public deprecated class FingerprintManager {
method public deprecated void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, int, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, android.os.Handler);
method public deprecated boolean hasEnrolledFingerprints();
@@ -21922,6 +21978,7 @@
}
public final class AudioDeviceInfo {
+ method public java.lang.String getAddress();
method public int[] getChannelCounts();
method public int[] getChannelIndexMasks();
method public int[] getChannelMasks();
@@ -23419,9 +23476,6 @@
field public static final int HDCP_V2 = 3; // 0x3
field public static final int HDCP_V2_1 = 4; // 0x4
field public static final int HDCP_V2_2 = 5; // 0x5
- field public static final int HW_SECURE_ALL = 5; // 0x5
- field public static final int HW_SECURE_CRYPTO = 3; // 0x3
- field public static final int HW_SECURE_DECODE = 4; // 0x4
field public static final int KEY_TYPE_OFFLINE = 2; // 0x2
field public static final int KEY_TYPE_RELEASE = 3; // 0x3
field public static final int KEY_TYPE_STREAMING = 1; // 0x1
@@ -23430,9 +23484,12 @@
field public static final java.lang.String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
field public static final java.lang.String PROPERTY_VENDOR = "vendor";
field public static final java.lang.String PROPERTY_VERSION = "version";
+ field public static final int SECURITY_LEVEL_HW_SECURE_ALL = 5; // 0x5
+ field public static final int SECURITY_LEVEL_HW_SECURE_CRYPTO = 3; // 0x3
+ field public static final int SECURITY_LEVEL_HW_SECURE_DECODE = 4; // 0x4
+ field public static final int SECURITY_LEVEL_SW_SECURE_CRYPTO = 1; // 0x1
+ field public static final int SECURITY_LEVEL_SW_SECURE_DECODE = 2; // 0x2
field public static final int SECURITY_LEVEL_UNKNOWN = 0; // 0x0
- field public static final int SW_SECURE_CRYPTO = 1; // 0x1
- field public static final int SW_SECURE_DECODE = 2; // 0x2
}
public final class MediaDrm.CryptoSession {
@@ -23688,6 +23745,8 @@
field public static final java.lang.String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
field public static final java.lang.String MIMETYPE_IMAGE_ANDROID_HEIC = "image/vnd.android.heic";
field public static final java.lang.String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
+ field public static final java.lang.String MIMETYPE_TEXT_CEA_708 = "text/cea-708";
+ field public static final java.lang.String MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt";
field public static final java.lang.String MIMETYPE_VIDEO_AVC = "video/avc";
field public static final java.lang.String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision";
@@ -23869,6 +23928,8 @@
method public void addTimedTextSource(java.io.FileDescriptor, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void addTimedTextSource(java.io.FileDescriptor, long, long, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void attachAuxEffect(int);
+ method public void clearOnMediaTimeDiscontinuityListener();
+ method public void clearOnSubtitleDataListener();
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri);
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder);
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder, android.media.AudioAttributes, int);
@@ -23933,8 +23994,12 @@
method public void setOnDrmPreparedListener(android.media.MediaPlayer.OnDrmPreparedListener, android.os.Handler);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
+ method public void setOnMediaTimeDiscontinuityListener(android.media.MediaPlayer.OnMediaTimeDiscontinuityListener, android.os.Handler);
+ method public void setOnMediaTimeDiscontinuityListener(android.media.MediaPlayer.OnMediaTimeDiscontinuityListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
+ method public void setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener, android.os.Handler);
+ method public void setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener);
method public void setOnTimedMetaDataAvailableListener(android.media.MediaPlayer.OnTimedMetaDataAvailableListener);
method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
@@ -23961,13 +24026,14 @@
field public static final int MEDIA_INFO_BUFFERING_START = 701; // 0x2bd
field public static final int MEDIA_INFO_METADATA_UPDATE = 802; // 0x322
field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
+ field public static final int MEDIA_INFO_STARTED_AS_NEXT = 2; // 0x2
field public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; // 0x386
field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
field public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; // 0x385
field public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; // 0x325
field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3
field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
- field public static final java.lang.String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+ field public static final deprecated java.lang.String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3
field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1
field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2
@@ -24032,6 +24098,10 @@
method public abstract boolean onInfo(android.media.MediaPlayer, int, int);
}
+ public static abstract interface MediaPlayer.OnMediaTimeDiscontinuityListener {
+ method public abstract void onMediaTimeDiscontinuity(android.media.MediaPlayer, android.media.MediaTimestamp);
+ }
+
public static abstract interface MediaPlayer.OnPreparedListener {
method public abstract void onPrepared(android.media.MediaPlayer);
}
@@ -24040,6 +24110,10 @@
method public abstract void onSeekComplete(android.media.MediaPlayer);
}
+ public static abstract interface MediaPlayer.OnSubtitleDataListener {
+ method public abstract void onSubtitleData(android.media.MediaPlayer, android.media.SubtitleData);
+ }
+
public static abstract interface MediaPlayer.OnTimedMetaDataAvailableListener {
method public abstract void onTimedMetaDataAvailable(android.media.MediaPlayer, android.media.TimedMetaData);
}
@@ -24392,9 +24466,11 @@
method public long getAnchorMediaTimeUs();
method public long getAnchorSytemNanoTime();
method public float getMediaClockRate();
+ field public static final android.media.MediaTimestamp TIMESTAMP_UNKNOWN;
}
public final class MicrophoneInfo {
+ method public java.lang.String getAddress();
method public java.util.List<android.util.Pair<java.lang.Integer, java.lang.Integer>> getChannelMapping();
method public java.lang.String getDescription();
method public int getDirectionality();
@@ -24480,29 +24556,6 @@
field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
}
- public final class Rating2 {
- method public static android.media.Rating2 fromBundle(android.content.Context, android.os.Bundle);
- method public float getPercentRating();
- method public int getRatingStyle();
- method public float getStarRating();
- method public boolean hasHeart();
- method public boolean isRated();
- method public boolean isThumbUp();
- method public static android.media.Rating2 newHeartRating(android.content.Context, boolean);
- method public static android.media.Rating2 newPercentageRating(android.content.Context, float);
- method public static android.media.Rating2 newStarRating(android.content.Context, int, float);
- method public static android.media.Rating2 newThumbRating(android.content.Context, boolean);
- method public static android.media.Rating2 newUnratedRating(android.content.Context, int);
- method public android.os.Bundle toBundle();
- field public static final int RATING_3_STARS = 3; // 0x3
- field public static final int RATING_4_STARS = 4; // 0x4
- field public static final int RATING_5_STARS = 5; // 0x5
- field public static final int RATING_HEART = 1; // 0x1
- field public static final int RATING_NONE = 0; // 0x0
- field public static final int RATING_PERCENTAGE = 6; // 0x6
- field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
- }
-
public deprecated class RemoteControlClient {
ctor public RemoteControlClient(android.app.PendingIntent);
ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
@@ -24675,6 +24728,13 @@
method public abstract void onLoadComplete(android.media.SoundPool, int, int);
}
+ public final class SubtitleData {
+ method public byte[] getData();
+ method public long getDurationUs();
+ method public long getStartTimeUs();
+ method public int getTrackIndex();
+ }
+
public final class SyncParams {
ctor public SyncParams();
method public android.media.SyncParams allowDefaults();
@@ -25722,6 +25782,7 @@
public final class MediaSession {
ctor public MediaSession(android.content.Context, java.lang.String);
method public android.media.session.MediaController getController();
+ method public android.media.session.MediaSessionManager.RemoteUserInfo getCurrentControllerInfo();
method public android.media.session.MediaSession.Token getSessionToken();
method public boolean isActive();
method public void release();
@@ -25788,6 +25849,7 @@
method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName);
method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName);
+ method public boolean isTrustedForMediaControl(android.media.session.MediaSessionManager.RemoteUserInfo);
method public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
}
@@ -25795,6 +25857,13 @@
method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>);
}
+ public static final class MediaSessionManager.RemoteUserInfo {
+ ctor public MediaSessionManager.RemoteUserInfo(java.lang.String, int, int);
+ method public java.lang.String getPackageName();
+ method public int getPid();
+ method public int getUid();
+ }
+
public final class PlaybackState implements android.os.Parcelable {
method public int describeContents();
method public long getActions();
@@ -26958,8 +27027,8 @@
public static final class IpSecManager.UdpEncapsulationSocket implements java.lang.AutoCloseable {
method public void close() throws java.io.IOException;
+ method public java.io.FileDescriptor getFileDescriptor();
method public int getPort();
- method public java.io.FileDescriptor getSocket();
}
public final class IpSecTransform implements java.lang.AutoCloseable {
@@ -27088,6 +27157,7 @@
method public void bindSocket(java.net.Socket) throws java.io.IOException;
method public void bindSocket(java.io.FileDescriptor) throws java.io.IOException;
method public int describeContents();
+ method public static android.net.Network fromNetworkHandle(long);
method public java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
method public java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
method public long getNetworkHandle();
@@ -27187,6 +27257,8 @@
public class NetworkRequest implements android.os.Parcelable {
method public int describeContents();
+ method public boolean hasCapability(int);
+ method public boolean hasTransport(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.NetworkRequest> CREATOR;
}
@@ -27195,6 +27267,7 @@
ctor public NetworkRequest.Builder();
method public android.net.NetworkRequest.Builder addCapability(int);
method public android.net.NetworkRequest.Builder addTransportType(int);
+ method public android.net.NetworkRequest.Builder addUnwantedCapability(int);
method public android.net.NetworkRequest build();
method public android.net.NetworkRequest.Builder removeCapability(int);
method public android.net.NetworkRequest.Builder removeTransportType(int);
@@ -27278,6 +27351,7 @@
method public static long getMobileTxBytes();
method public static long getMobileTxPackets();
method public static int getThreadStatsTag();
+ method public static int getThreadStatsUid();
method public static long getTotalRxBytes();
method public static long getTotalRxPackets();
method public static long getTotalTxBytes();
@@ -27297,7 +27371,7 @@
method public static void incrementOperationCount(int);
method public static void incrementOperationCount(int, int);
method public static void setThreadStatsTag(int);
- method public static void setThreadStatsUidSelf();
+ method public static void setThreadStatsUid(int);
method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
method public static void tagFileDescriptor(java.io.FileDescriptor) throws java.io.IOException;
method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
@@ -28609,6 +28683,8 @@
method public int getDistanceMm();
method public int getDistanceStdDevMm();
method public android.net.MacAddress getMacAddress();
+ method public int getNumAttemptedMeasurements();
+ method public int getNumSuccessfulMeasurements();
method public android.net.wifi.aware.PeerHandle getPeerHandle();
method public long getRangingTimestampMillis();
method public int getRssi();
@@ -32058,9 +32134,7 @@
ctor public Build.VERSION();
field public static final java.lang.String BASE_OS;
field public static final java.lang.String CODENAME;
- field public static final int FIRST_SDK_INT;
field public static final java.lang.String INCREMENTAL;
- field public static final int MIN_SUPPORTED_TARGET_SDK_INT;
field public static final int PREVIEW_SDK_INT;
field public static final java.lang.String RELEASE;
field public static final deprecated java.lang.String SDK;
@@ -33094,8 +33168,6 @@
}
public final class SystemClock {
- method public static java.time.Clock currentNetworkTimeClock();
- method public static long currentNetworkTimeMillis();
method public static long currentThreadTimeMillis();
method public static long elapsedRealtime();
method public static long elapsedRealtimeNanos();
@@ -38323,17 +38395,17 @@
package android.se.omapi {
- public class Channel {
+ public final class Channel implements java.nio.channels.Channel {
method public void close();
method public byte[] getSelectResponse();
method public android.se.omapi.Session getSession();
method public boolean isBasicChannel();
- method public boolean isClosed();
+ method public boolean isOpen();
method public boolean selectNext() throws java.io.IOException;
method public byte[] transmit(byte[]) throws java.io.IOException;
}
- public class Reader {
+ public final class Reader {
method public void closeSessions();
method public java.lang.String getName();
method public android.se.omapi.SEService getSEService();
@@ -38341,21 +38413,19 @@
method public android.se.omapi.Session openSession() throws java.io.IOException;
}
- public class SEService {
- ctor public SEService(android.content.Context, android.se.omapi.SEService.SecureElementListener);
+ public final class SEService {
+ ctor public SEService(android.content.Context, java.util.concurrent.Executor, android.se.omapi.SEService.OnConnectedListener);
method public android.se.omapi.Reader[] getReaders();
method public java.lang.String getVersion();
method public boolean isConnected();
method public void shutdown();
}
- public static abstract class SEService.SecureElementListener extends android.os.Binder {
- ctor public SEService.SecureElementListener();
- method public android.os.IBinder asBinder();
- method public void serviceConnected();
+ public static abstract interface SEService.OnConnectedListener {
+ method public abstract void onConnected();
}
- public class Session {
+ public final class Session {
method public void close();
method public void closeChannels();
method public byte[] getATR();
@@ -38513,10 +38583,11 @@
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
method public boolean isStrongBoxBacked();
- method public boolean isTrustedUserPresenceRequired();
+ method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
+ method public boolean isUserPresenceRequired();
}
public static final class KeyGenParameterSpec.Builder {
@@ -38540,11 +38611,12 @@
method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date);
method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setTrustedUserPresenceRequired(boolean);
+ method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean);
+ method public android.security.keystore.KeyGenParameterSpec.Builder setUserPresenceRequired(boolean);
}
public class KeyInfo implements java.security.spec.KeySpec {
@@ -38632,9 +38704,11 @@
method public boolean isDigestsSpecified();
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
+ method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
+ method public boolean isUserPresenceRequired();
}
public static final class KeyProtection.Builder {
@@ -38650,13 +38724,26 @@
method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
+ method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int);
method public android.security.keystore.KeyProtection.Builder setUserConfirmationRequired(boolean);
+ method public android.security.keystore.KeyProtection.Builder setUserPresenceRequired(boolean);
+ }
+
+ public class SecureKeyImportUnavailableException extends java.security.ProviderException {
+ ctor public SecureKeyImportUnavailableException();
+ ctor public SecureKeyImportUnavailableException(java.lang.String);
+ ctor public SecureKeyImportUnavailableException(java.lang.String, java.lang.Throwable);
+ ctor public SecureKeyImportUnavailableException(java.lang.Throwable);
}
public class StrongBoxUnavailableException extends java.security.ProviderException {
+ ctor public StrongBoxUnavailableException();
+ ctor public StrongBoxUnavailableException(java.lang.String);
+ ctor public StrongBoxUnavailableException(java.lang.String, java.lang.Throwable);
+ ctor public StrongBoxUnavailableException(java.lang.Throwable);
}
public class UserNotAuthenticatedException extends java.security.InvalidKeyException {
@@ -39135,6 +39222,7 @@
ctor public MediaBrowserService();
method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public final android.os.Bundle getBrowserRootHints();
+ method public final android.media.session.MediaSessionManager.RemoteUserInfo getCurrentBrowserInfo();
method public android.media.session.MediaSession.Token getSessionToken();
method public void notifyChildrenChanged(java.lang.String);
method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
@@ -40869,7 +40957,7 @@
method public final void putExtras(android.os.Bundle);
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
- method public void requestBluetoothAudio(java.lang.String);
+ method public void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
method public void sendConnectionEvent(java.lang.String, android.os.Bundle);
method public final void sendRemoteRttRequest();
method public final void sendRttInitiationFailure(int);
@@ -41080,7 +41168,7 @@
method public void onCanAddCallChanged(boolean);
method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle);
method public void onSilenceRinger();
- method public final void requestBluetoothAudio(java.lang.String);
+ method public final void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
method public final void setAudioRoute(int);
method public final void setMuted(boolean);
field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.InCallService";
@@ -41587,7 +41675,6 @@
field public static final java.lang.String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";
field public static final java.lang.String KEY_EDITABLE_VOICEMAIL_NUMBER_BOOL = "editable_voicemail_number_bool";
field public static final java.lang.String KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL = "editable_voicemail_number_setting_bool";
- field public static final java.lang.String KEY_ENABLE_APPS_STRING_ARRAY = "enable_apps_string_array";
field public static final java.lang.String KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool";
field public static final java.lang.String KEY_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
field public static final java.lang.String KEY_GSM_DTMF_TONE_DELAY_INT = "gsm_dtmf_tone_delay_int";
@@ -41676,6 +41763,8 @@
public abstract class CellIdentity implements android.os.Parcelable {
method public int describeContents();
+ method public java.lang.CharSequence getOperatorAlphaLong();
+ method public java.lang.CharSequence getOperatorAlphaShort();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentity> CREATOR;
}
@@ -41685,8 +41774,6 @@
method public int getLatitude();
method public int getLongitude();
method public int getNetworkId();
- method public java.lang.CharSequence getOperatorAlphaLong();
- method public java.lang.CharSequence getOperatorAlphaShort();
method public int getSystemId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityCdma> CREATOR;
@@ -41702,8 +41789,6 @@
method public deprecated int getMnc();
method public java.lang.String getMncString();
method public java.lang.String getMobileNetworkOperator();
- method public java.lang.CharSequence getOperatorAlphaLong();
- method public java.lang.CharSequence getOperatorAlphaShort();
method public deprecated int getPsc();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityGsm> CREATOR;
@@ -41718,8 +41803,6 @@
method public deprecated int getMnc();
method public java.lang.String getMncString();
method public java.lang.String getMobileNetworkOperator();
- method public java.lang.CharSequence getOperatorAlphaLong();
- method public java.lang.CharSequence getOperatorAlphaShort();
method public int getPci();
method public int getTac();
method public void writeToParcel(android.os.Parcel, int);
@@ -41744,8 +41827,6 @@
method public deprecated int getMnc();
method public java.lang.String getMncString();
method public java.lang.String getMobileNetworkOperator();
- method public java.lang.CharSequence getOperatorAlphaLong();
- method public java.lang.CharSequence getOperatorAlphaShort();
method public int getPsc();
method public int getUarfcn();
method public void writeToParcel(android.os.Parcel, int);
@@ -41875,17 +41956,17 @@
}
public class MbmsDownloadSession implements java.lang.AutoCloseable {
- method public int addProgressListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadProgressListener);
- method public int addStatusListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStatusListener);
- method public int cancelDownload(android.telephony.mbms.DownloadRequest);
+ method public void addProgressListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadProgressListener);
+ method public void addStatusListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStatusListener);
+ method public void cancelDownload(android.telephony.mbms.DownloadRequest);
method public void close();
method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsDownloadSessionCallback);
method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsDownloadSessionCallback);
- method public int download(android.telephony.mbms.DownloadRequest);
+ method public void download(android.telephony.mbms.DownloadRequest);
method public java.io.File getTempFileRootDirectory();
method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
- method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener);
- method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener);
+ method public void removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener);
+ method public void removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener);
method public void requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
method public void requestUpdateFileServices(java.util.List<java.lang.String>);
method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
@@ -42394,12 +42475,11 @@
method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String);
method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String);
method public boolean isConcurrentVoiceAndDataSupported();
- method public deprecated boolean isDataEnabled();
+ method public boolean isDataEnabled();
method public boolean isHearingAidCompatibilitySupported();
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
method public deprecated boolean isTtyModeSupported();
- method public boolean isUserMobileDataEnabled();
method public boolean isVoiceCapable();
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
@@ -42410,13 +42490,12 @@
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
method public void sendVisualVoicemailSms(java.lang.String, int, java.lang.String, android.app.PendingIntent);
- method public deprecated void setDataEnabled(boolean);
+ method public void setDataEnabled(boolean);
method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
method public void setNetworkSelectionModeAutomatic();
method public boolean setNetworkSelectionModeManual(java.lang.String, boolean);
method public boolean setOperatorBrandOverride(java.lang.String);
method public boolean setPreferredNetworkTypeToGlobal();
- method public void setUserMobileDataEnabled(boolean);
method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings);
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
method public deprecated void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
@@ -42691,6 +42770,7 @@
field public static final int EMBEDDED_SUBSCRIPTION_RESULT_OK = 0; // 0x0
field public static final int EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR = 1; // 0x1
field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DETAILED_CODE";
+ field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION";
field public static final java.lang.String META_DATA_CARRIER_ICON = "android.telephony.euicc.carriericon";
}
@@ -42853,6 +42933,7 @@
field public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2; // 0x2
field public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1; // 0x1
field public static final int SUCCESS = 0; // 0x0
+ field public static final int UNKNOWN = -1; // 0xffffffff
}
public static class MbmsErrors.DownloadErrors {
@@ -43297,6 +43378,7 @@
public class PrecomputedText implements android.text.Spannable {
method public char charAt(int);
method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params);
+ method public void getBounds(int, int, android.graphics.Rect);
method public int getParagraphCount();
method public int getParagraphEnd(int);
method public int getParagraphStart(int);
@@ -43305,7 +43387,7 @@
method public int getSpanFlags(java.lang.Object);
method public int getSpanStart(java.lang.Object);
method public <T> T[] getSpans(int, int, java.lang.Class<T>);
- method public java.lang.CharSequence getText();
+ method public float getWidth(int, int);
method public int length();
method public int nextSpanTransition(int, int, java.lang.Class);
method public void removeSpan(java.lang.Object);
@@ -44595,11 +44677,6 @@
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
- method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.widget.TextView, android.view.textclassifier.TextLinks.Options);
- method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.widget.TextView, android.view.textclassifier.TextLinks.Options, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>);
- method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, android.view.textclassifier.TextLinks.Options);
- method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, int);
- method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, android.view.textclassifier.TextLinks.Options, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>);
field public static final int ALL = 15; // 0xf
field public static final int EMAIL_ADDRESSES = 2; // 0x2
field public static final int MAP_ADDRESSES = 8; // 0x8
@@ -45071,18 +45148,6 @@
field public static final deprecated boolean RELEASE = true;
}
- public class DataUnit extends java.lang.Enum {
- method public long toBytes(long);
- method public static android.util.DataUnit valueOf(java.lang.String);
- method public static final android.util.DataUnit[] values();
- enum_constant public static final android.util.DataUnit GIBIBYTES;
- enum_constant public static final android.util.DataUnit GIGABYTES;
- enum_constant public static final android.util.DataUnit KIBIBYTES;
- enum_constant public static final android.util.DataUnit KILOBYTES;
- enum_constant public static final android.util.DataUnit MEBIBYTES;
- enum_constant public static final android.util.DataUnit MEGABYTES;
- }
-
public class DebugUtils {
method public static boolean isObjectSelected(java.lang.Object);
}
@@ -47254,10 +47319,10 @@
method public void addExtraDataToAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
- method public void addKeyFallbackListener(android.view.View.OnKeyFallbackListener);
method public void addKeyboardNavigationClusters(java.util.Collection<android.view.View>, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
+ method public void addOnUnhandledKeyEventListener(android.view.View.OnUnhandledKeyEventListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
@@ -47595,7 +47660,6 @@
method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
method public boolean onKeyDown(int, android.view.KeyEvent);
- method public boolean onKeyFallback(android.view.KeyEvent);
method public boolean onKeyLongPress(int, android.view.KeyEvent);
method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
method public boolean onKeyPreIme(int, android.view.KeyEvent);
@@ -47649,9 +47713,9 @@
method public void refreshDrawableState();
method public void releasePointerCapture();
method public boolean removeCallbacks(java.lang.Runnable);
- method public void removeKeyFallbackListener(android.view.View.OnKeyFallbackListener);
method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
+ method public void removeOnUnhandledKeyEventListener(android.view.View.OnUnhandledKeyEventListener);
method public void requestApplyInsets();
method public deprecated void requestFitSystemWindows();
method public final boolean requestFocus();
@@ -48075,10 +48139,6 @@
method public abstract boolean onHover(android.view.View, android.view.MotionEvent);
}
- public static abstract interface View.OnKeyFallbackListener {
- method public abstract boolean onKeyFallback(android.view.View, android.view.KeyEvent);
- }
-
public static abstract interface View.OnKeyListener {
method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
}
@@ -48103,6 +48163,10 @@
method public abstract boolean onTouch(android.view.View, android.view.MotionEvent);
}
+ public static abstract interface View.OnUnhandledKeyEventListener {
+ method public abstract boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+ }
+
public final class ViewAnimationUtils {
method public static android.animation.Animator createCircularReveal(android.view.View, int, int, float, float);
}
@@ -50308,38 +50372,13 @@
package android.view.textclassifier {
- public abstract class Logger {
- ctor public Logger(android.view.textclassifier.Logger.Config);
- method public java.text.BreakIterator getTokenIterator(java.util.Locale);
- method public boolean isSmartSelection(java.lang.String);
- method public final void logSelectionActionEvent(int, int, int);
- method public final void logSelectionActionEvent(int, int, int, android.view.textclassifier.TextClassification);
- method public final void logSelectionModifiedEvent(int, int);
- method public final void logSelectionModifiedEvent(int, int, android.view.textclassifier.TextClassification);
- method public final void logSelectionModifiedEvent(int, int, android.view.textclassifier.TextSelection);
- method public final void logSelectionStartedEvent(int, int);
- method public abstract void writeEvent(android.view.textclassifier.SelectionEvent);
- field public static final int OUT_OF_BOUNDS = 2147483647; // 0x7fffffff
- field public static final int OUT_OF_BOUNDS_NEGATIVE = -2147483648; // 0x80000000
- field public static final java.lang.String WIDGET_CUSTOM_EDITTEXT = "customedit";
- field public static final java.lang.String WIDGET_CUSTOM_TEXTVIEW = "customview";
- field public static final java.lang.String WIDGET_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
- field public static final java.lang.String WIDGET_EDITTEXT = "edittext";
- field public static final java.lang.String WIDGET_EDIT_WEBVIEW = "edit-webview";
- field public static final java.lang.String WIDGET_TEXTVIEW = "textview";
- field public static final java.lang.String WIDGET_UNKNOWN = "unknown";
- field public static final java.lang.String WIDGET_UNSELECTABLE_TEXTVIEW = "nosel-textview";
- field public static final java.lang.String WIDGET_WEBVIEW = "webview";
- }
-
- public static final class Logger.Config {
- ctor public Logger.Config(android.content.Context, java.lang.String, java.lang.String);
- method public java.lang.String getPackageName();
- method public java.lang.String getWidgetType();
- method public java.lang.String getWidgetVersion();
- }
-
public final class SelectionEvent implements android.os.Parcelable {
+ method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int);
+ method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int, android.view.textclassifier.TextClassification);
+ method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int);
+ method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, android.view.textclassifier.TextClassification);
+ method public static android.view.textclassifier.SelectionEvent createSelectionModifiedEvent(int, int, android.view.textclassifier.TextSelection);
+ method public static android.view.textclassifier.SelectionEvent createSelectionStartedEvent(int, int);
method public int describeContents();
method public long getDurationSincePreviousEvent();
method public long getDurationSinceSessionStart();
@@ -50350,13 +50389,14 @@
method public int getEventType();
method public int getInvocationMethod();
method public java.lang.String getPackageName();
- method public java.lang.String getSessionId();
- method public java.lang.String getSignature();
+ method public java.lang.String getResultId();
+ method public android.view.textclassifier.TextClassificationSessionId getSessionId();
method public int getSmartEnd();
method public int getSmartStart();
method public int getStart();
method public java.lang.String getWidgetType();
method public java.lang.String getWidgetVersion();
+ method public static boolean isTerminal(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_ABANDON = 107; // 0x6b
field public static final int ACTION_COPY = 101; // 0x65
@@ -50377,22 +50417,20 @@
field public static final int EVENT_SMART_SELECTION_SINGLE = 3; // 0x3
field public static final int INVOCATION_LINK = 2; // 0x2
field public static final int INVOCATION_MANUAL = 1; // 0x1
+ field public static final int INVOCATION_UNKNOWN = 0; // 0x0
}
public final class TextClassification implements android.os.Parcelable {
method public int describeContents();
+ method public java.util.List<android.app.RemoteAction> getActions();
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
- method public android.graphics.drawable.Drawable getIcon();
- method public android.content.Intent getIntent();
- method public java.lang.CharSequence getLabel();
- method public android.view.View.OnClickListener getOnClickListener();
- method public int getSecondaryActionsCount();
- method public android.graphics.drawable.Drawable getSecondaryIcon(int);
- method public android.content.Intent getSecondaryIntent(int);
- method public java.lang.CharSequence getSecondaryLabel(int);
- method public java.lang.String getSignature();
+ method public deprecated android.graphics.drawable.Drawable getIcon();
+ method public java.lang.String getId();
+ method public deprecated android.content.Intent getIntent();
+ method public deprecated java.lang.CharSequence getLabel();
+ method public deprecated android.view.View.OnClickListener getOnClickListener();
method public java.lang.String getText();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification> CREATOR;
@@ -50400,45 +50438,76 @@
public static final class TextClassification.Builder {
ctor public TextClassification.Builder();
- method public android.view.textclassifier.TextClassification.Builder addSecondaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
+ method public android.view.textclassifier.TextClassification.Builder addAction(android.app.RemoteAction);
method public android.view.textclassifier.TextClassification build();
- method public android.view.textclassifier.TextClassification.Builder clearSecondaryActions();
method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
- method public android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
- method public android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
- method public android.view.textclassifier.TextClassification.Builder setPrimaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassification.Builder setSignature(java.lang.String);
+ method public deprecated android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+ method public android.view.textclassifier.TextClassification.Builder setId(java.lang.String);
+ method public deprecated android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
+ method public deprecated android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
+ method public deprecated android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
}
- public static final class TextClassification.Options implements android.os.Parcelable {
- ctor public TextClassification.Options();
+ public static final class TextClassification.Request implements android.os.Parcelable {
method public int describeContents();
method public android.os.LocaleList getDefaultLocales();
- method public java.util.Calendar getReferenceTime();
- method public android.view.textclassifier.TextClassification.Options setDefaultLocales(android.os.LocaleList);
- method public android.view.textclassifier.TextClassification.Options setReferenceTime(java.util.Calendar);
+ method public int getEndIndex();
+ method public java.time.ZonedDateTime getReferenceTime();
+ method public int getStartIndex();
+ method public java.lang.CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Options> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Request> CREATOR;
+ }
+
+ public static final class TextClassification.Request.Builder {
+ ctor public TextClassification.Request.Builder(java.lang.CharSequence, int, int);
+ method public android.view.textclassifier.TextClassification.Request build();
+ method public android.view.textclassifier.TextClassification.Request.Builder setDefaultLocales(android.os.LocaleList);
+ method public android.view.textclassifier.TextClassification.Request.Builder setReferenceTime(java.time.ZonedDateTime);
+ }
+
+ public final class TextClassificationContext implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.lang.String getPackageName();
+ method public java.lang.String getWidgetType();
+ method public java.lang.String getWidgetVersion();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassificationContext> CREATOR;
+ }
+
+ public static final class TextClassificationContext.Builder {
+ ctor public TextClassificationContext.Builder(java.lang.String, java.lang.String);
+ method public android.view.textclassifier.TextClassificationContext build();
+ method public android.view.textclassifier.TextClassificationContext.Builder setWidgetVersion(java.lang.String);
}
public final class TextClassificationManager {
+ method public android.view.textclassifier.TextClassifier createTextClassificationSession(android.view.textclassifier.TextClassificationContext);
method public android.view.textclassifier.TextClassifier getTextClassifier();
+ method public void setTextClassificationSessionFactory(android.view.textclassifier.TextClassificationSessionFactory);
method public void setTextClassifier(android.view.textclassifier.TextClassifier);
}
+ public abstract interface TextClassificationSessionFactory {
+ method public abstract android.view.textclassifier.TextClassifier createTextClassificationSession(android.view.textclassifier.TextClassificationContext);
+ }
+
+ public final class TextClassificationSessionId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassificationSessionId> CREATOR;
+ }
+
public abstract interface TextClassifier {
- method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.view.textclassifier.TextClassification.Options);
- method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int);
+ method public default android.view.textclassifier.TextClassification classifyText(android.view.textclassifier.TextClassification.Request);
method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
- method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options);
- method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence);
- method public default android.view.textclassifier.Logger getLogger(android.view.textclassifier.Logger.Config);
+ method public default void destroy();
+ method public default android.view.textclassifier.TextLinks generateLinks(android.view.textclassifier.TextLinks.Request);
method public default int getMaxGenerateLinksTextLength();
- method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options);
- method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int);
+ method public default boolean isDestroyed();
+ method public default void onSelectionEvent(android.view.textclassifier.SelectionEvent);
+ method public default android.view.textclassifier.TextSelection suggestSelection(android.view.textclassifier.TextSelection.Request);
method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
field public static final java.lang.String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
@@ -50452,12 +50521,21 @@
field public static final java.lang.String TYPE_PHONE = "phone";
field public static final java.lang.String TYPE_UNKNOWN = "";
field public static final java.lang.String TYPE_URL = "url";
+ field public static final java.lang.String WIDGET_TYPE_CUSTOM_EDITTEXT = "customedit";
+ field public static final java.lang.String WIDGET_TYPE_CUSTOM_TEXTVIEW = "customview";
+ field public static final java.lang.String WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
+ field public static final java.lang.String WIDGET_TYPE_EDITTEXT = "edittext";
+ field public static final java.lang.String WIDGET_TYPE_EDIT_WEBVIEW = "edit-webview";
+ field public static final java.lang.String WIDGET_TYPE_TEXTVIEW = "textview";
+ field public static final java.lang.String WIDGET_TYPE_UNKNOWN = "unknown";
+ field public static final java.lang.String WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = "nosel-textview";
+ field public static final java.lang.String WIDGET_TYPE_WEBVIEW = "webview";
}
public static final class TextClassifier.EntityConfig implements android.os.Parcelable {
- method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>);
method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>);
- method public static android.view.textclassifier.TextClassifier.EntityConfig createWithEntityList(java.util.Collection<java.lang.String>);
+ method public static android.view.textclassifier.TextClassifier.EntityConfig createWithExplicitEntityList(java.util.Collection<java.lang.String>);
+ method public static android.view.textclassifier.TextClassifier.EntityConfig createWithHints(java.util.Collection<java.lang.String>);
method public int describeContents();
method public java.util.Collection<java.lang.String> getHints();
method public java.util.List<java.lang.String> resolveEntityListModifications(java.util.Collection<java.lang.String>);
@@ -50466,6 +50544,7 @@
}
public final class TextLinks implements android.os.Parcelable {
+ method public int apply(android.text.Spannable, int, java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan>);
method public int describeContents();
method public java.util.Collection<android.view.textclassifier.TextLinks.TextLink> getLinks();
method public void writeToParcel(android.os.Parcel, int);
@@ -50485,20 +50564,20 @@
method public android.view.textclassifier.TextLinks.Builder clearTextLinks();
}
- public static final class TextLinks.Options implements android.os.Parcelable {
- ctor public TextLinks.Options();
+ public static final class TextLinks.Request implements android.os.Parcelable {
method public int describeContents();
- method public static android.view.textclassifier.TextLinks.Options fromLinkMask(int);
- method public int getApplyStrategy();
method public android.os.LocaleList getDefaultLocales();
method public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
- method public java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan> getSpanFactory();
- method public android.view.textclassifier.TextLinks.Options setApplyStrategy(int);
- method public android.view.textclassifier.TextLinks.Options setDefaultLocales(android.os.LocaleList);
- method public android.view.textclassifier.TextLinks.Options setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
- method public android.view.textclassifier.TextLinks.Options setSpanFactory(java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan>);
+ method public java.lang.CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Options> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Request> CREATOR;
+ }
+
+ public static final class TextLinks.Request.Builder {
+ ctor public TextLinks.Request.Builder(java.lang.CharSequence);
+ method public android.view.textclassifier.TextLinks.Request build();
+ method public android.view.textclassifier.TextLinks.Request.Builder setDefaultLocales(android.os.LocaleList);
+ method public android.view.textclassifier.TextLinks.Request.Builder setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
}
public static final class TextLinks.TextLink implements android.os.Parcelable {
@@ -50523,9 +50602,9 @@
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
+ method public java.lang.String getId();
method public int getSelectionEndIndex();
method public int getSelectionStartIndex();
- method public java.lang.String getSignature();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection> CREATOR;
}
@@ -50534,16 +50613,23 @@
ctor public TextSelection.Builder(int, int);
method public android.view.textclassifier.TextSelection build();
method public android.view.textclassifier.TextSelection.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextSelection.Builder setSignature(java.lang.String);
+ method public android.view.textclassifier.TextSelection.Builder setId(java.lang.String);
}
- public static final class TextSelection.Options implements android.os.Parcelable {
- ctor public TextSelection.Options();
+ public static final class TextSelection.Request implements android.os.Parcelable {
method public int describeContents();
method public android.os.LocaleList getDefaultLocales();
- method public android.view.textclassifier.TextSelection.Options setDefaultLocales(android.os.LocaleList);
+ method public int getEndIndex();
+ method public int getStartIndex();
+ method public java.lang.CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Options> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Request> CREATOR;
+ }
+
+ public static final class TextSelection.Request.Builder {
+ ctor public TextSelection.Request.Builder(java.lang.CharSequence, int, int);
+ method public android.view.textclassifier.TextSelection.Request build();
+ method public android.view.textclassifier.TextSelection.Request.Builder setDefaultLocales(android.os.LocaleList);
}
}
diff --git a/api/removed.txt b/api/removed.txt
index 1228fd1..af2b25e 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -54,6 +54,24 @@
}
+package android.app.job {
+
+ public class JobInfo implements android.os.Parcelable {
+ method public deprecated long getEstimatedNetworkBytes();
+ }
+
+ public static final class JobInfo.Builder {
+ method public deprecated android.app.job.JobInfo.Builder setEstimatedNetworkBytes(long);
+ method public deprecated android.app.job.JobInfo.Builder setIsPrefetch(boolean);
+ }
+
+ public final class JobWorkItem implements android.os.Parcelable {
+ ctor public deprecated JobWorkItem(android.content.Intent, long);
+ method public deprecated long getEstimatedNetworkBytes();
+ }
+
+}
+
package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
@@ -150,11 +168,25 @@
public class Canvas {
method public deprecated boolean clipRegion(android.graphics.Region, android.graphics.Region.Op);
method public deprecated boolean clipRegion(android.graphics.Region);
+ method public deprecated int save(int);
+ field public static final deprecated int CLIP_SAVE_FLAG = 2; // 0x2
+ field public static final deprecated int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
+ field public static final deprecated int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
+ field public static final deprecated int HAS_ALPHA_LAYER_SAVE_FLAG = 4; // 0x4
+ field public static final deprecated int MATRIX_SAVE_FLAG = 1; // 0x1
}
public final class ImageDecoder implements java.lang.AutoCloseable {
method public deprecated boolean getAsAlphaMask();
+ method public deprecated boolean getDecodeAsAlphaMask();
+ method public deprecated boolean getMutable();
+ method public deprecated boolean getRequireUnpremultiplied();
method public deprecated android.graphics.ImageDecoder setAsAlphaMask(boolean);
+ method public deprecated android.graphics.ImageDecoder setDecodeAsAlphaMask(boolean);
+ method public deprecated android.graphics.ImageDecoder setMutable(boolean);
+ method public deprecated android.graphics.ImageDecoder setRequireUnpremultiplied(boolean);
+ method public deprecated android.graphics.ImageDecoder setResize(int, int);
+ method public deprecated android.graphics.ImageDecoder setResize(int);
field public static final deprecated int ERROR_SOURCE_ERROR = 3; // 0x3
field public static final deprecated int ERROR_SOURCE_EXCEPTION = 1; // 0x1
field public static final deprecated int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
@@ -261,6 +293,10 @@
method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
}
+ public class TrafficStats {
+ method public static deprecated void setThreadStatsUidSelf();
+ }
+
}
package android.os {
diff --git a/api/system-current.txt b/api/system-current.txt
index e049f53..1322a39 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -57,6 +57,7 @@
field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
field public static final java.lang.String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
field public static final java.lang.String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
+ field public static final java.lang.String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION";
field public static final java.lang.String CONTROL_INCALL_EXPERIENCE = "android.permission.CONTROL_INCALL_EXPERIENCE";
field public static final java.lang.String CONTROL_LOCATION_UPDATES = "android.permission.CONTROL_LOCATION_UPDATES";
field public static final java.lang.String CONTROL_VPN = "android.permission.CONTROL_VPN";
@@ -299,6 +300,7 @@
field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
+ field public static final java.lang.String OPSTR_START_FOREGROUND = "android:start_foreground";
field public static final java.lang.String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
field public static final java.lang.String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
field public static final java.lang.String OPSTR_TOAST_WINDOW = "android:toast_window";
@@ -400,10 +402,8 @@
}
public class WallpaperManager {
- method public void clearWallpaper();
method public void clearWallpaper(int, int);
method public void setDisplayOffset(android.os.IBinder, int, int);
- method public void setDisplayPadding(android.graphics.Rect);
method public boolean setWallpaperComponent(android.content.ComponentName);
}
@@ -1254,6 +1254,7 @@
method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
method public android.graphics.Point getStableDisplaySize();
method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
+ method public void setSaturationLevel(float);
}
}
@@ -2103,6 +2104,7 @@
method public java.lang.String getVersion();
method public boolean isBackgroundScanningSupported();
method public boolean isCaptureSupported();
+ method public boolean isInitializationRequired();
method public boolean isProgramIdentifierSupported(int);
method public boolean isProgramTypeSupported(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -3104,6 +3106,10 @@
field public static final int ERROR_INVALID_NETWORK = 1; // 0x1
}
+ public final class NetworkCapabilities implements android.os.Parcelable {
+ field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
+ }
+
public class NetworkKey implements android.os.Parcelable {
ctor public NetworkKey(android.net.WifiKey);
method public int describeContents();
@@ -4765,10 +4771,12 @@
ctor public TextClassifierService();
method public final android.view.textclassifier.TextClassifier getLocalTextClassifier();
method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract void onClassifyText(java.lang.CharSequence, int, int, android.view.textclassifier.TextClassification.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
- method public abstract void onGenerateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
- method public void onSelectionEvent(android.view.textclassifier.SelectionEvent);
- method public abstract void onSuggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
+ method public abstract void onClassifyText(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextClassification.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
+ method public abstract void onCreateTextClassificationSession(android.view.textclassifier.TextClassificationContext, android.view.textclassifier.TextClassificationSessionId);
+ method public abstract void onDestroyTextClassificationSession(android.view.textclassifier.TextClassificationSessionId);
+ method public abstract void onGenerateLinks(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextLinks.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
+ method public void onSelectionEvent(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.SelectionEvent);
+ method public abstract void onSuggestSelection(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextSelection.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
field public static final java.lang.String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
}
@@ -5503,7 +5511,6 @@
field public static final int EUICC_OTA_NOT_NEEDED = 4; // 0x4
field public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5; // 0x5
field public static final int EUICC_OTA_SUCCEEDED = 3; // 0x3
- field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION";
field public static final java.lang.String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS";
}
@@ -5552,6 +5559,7 @@
package android.telephony.ims {
public final class ImsCallForwardInfo implements android.os.Parcelable {
+ ctor public ImsCallForwardInfo(int, int, int, int, java.lang.String, int);
method public int describeContents();
method public int getCondition();
method public java.lang.String getNumber();
@@ -5866,7 +5874,7 @@
}
public final class ImsSsData implements android.os.Parcelable {
- ctor public ImsSsData();
+ ctor public ImsSsData(int, int, int, int, int);
method public int describeContents();
method public boolean isTypeBarring();
method public boolean isTypeCf();
@@ -5917,7 +5925,7 @@
}
public final class ImsSsInfo implements android.os.Parcelable {
- ctor public ImsSsInfo();
+ ctor public ImsSsInfo(int, java.lang.String);
method public int describeContents();
method public java.lang.String getIcbNum();
method public int getStatus();
diff --git a/api/test-current.txt b/api/test-current.txt
index 85ed4b9..9f5fa0c 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1,8 +1,10 @@
package android {
public static final class Manifest.permission {
+ field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
field public static final java.lang.String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
+ field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
}
}
@@ -93,6 +95,7 @@
field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
+ field public static final java.lang.String OPSTR_START_FOREGROUND = "android:start_foreground";
field public static final java.lang.String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
field public static final java.lang.String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
field public static final java.lang.String OPSTR_TOAST_WINDOW = "android:toast_window";
@@ -127,8 +130,8 @@
public final class UiAutomation {
method public void destroy();
method public android.os.ParcelFileDescriptor[] executeShellCommandRw(java.lang.String);
- method public boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- method public boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public deprecated boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public deprecated boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
}
public class UiModeManager {
@@ -482,6 +485,7 @@
package android.os {
public static class Build.VERSION {
+ field public static final int FIRST_SDK_INT;
field public static final int RESOURCES_SDK_INT;
}
@@ -775,6 +779,12 @@
method public void setCdmaSystemAndNetworkId(int, int);
}
+ public class TelephonyManager {
+ method public int getCarrierIdListVersion();
+ method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff
+ }
+
}
package android.telephony.mbms {
diff --git a/cmds/incident_helper/src/TextParserBase.cpp b/cmds/incident_helper/src/TextParserBase.cpp
index a8f9968..e9bc70f 100644
--- a/cmds/incident_helper/src/TextParserBase.cpp
+++ b/cmds/incident_helper/src/TextParserBase.cpp
@@ -21,7 +21,6 @@
#include <android-base/file.h>
using namespace android::base;
-using namespace std;
// ================================================================================
status_t NoopParser::Parse(const int in, const int out) const
diff --git a/cmds/incident_helper/src/TextParserBase.h b/cmds/incident_helper/src/TextParserBase.h
index 1667966..784c181 100644
--- a/cmds/incident_helper/src/TextParserBase.h
+++ b/cmds/incident_helper/src/TextParserBase.h
@@ -21,6 +21,7 @@
#include <utils/String8.h>
using namespace android;
+using namespace std;
/**
* Base class for text parser
diff --git a/cmds/incident_helper/src/ih_util.cpp b/cmds/incident_helper/src/ih_util.cpp
index 5b413e9..4c4d1b9 100644
--- a/cmds/incident_helper/src/ih_util.cpp
+++ b/cmds/incident_helper/src/ih_util.cpp
@@ -98,9 +98,9 @@
size_t lastIndex = 0;
int i = 0;
while (headerNames[i] != NULL) {
- string s = headerNames[i];
+ std::string s = headerNames[i];
lastIndex = line.find(s, lastIndex);
- if (lastIndex == string::npos) {
+ if (lastIndex == std::string::npos) {
fprintf(stderr, "Bad Task Header: %s\n", line.c_str());
return false;
}
@@ -271,7 +271,7 @@
:mEnums(),
mEnumValuesByName()
{
- map<std::string, uint64_t> fields;
+ std::map<std::string, uint64_t> fields;
for (int i = 0; i < count; i++) {
fields[names[i]] = ids[i];
}
@@ -286,11 +286,11 @@
Table::addEnumTypeMap(const char* field, const char* enumNames[], const int enumValues[], const int enumSize)
{
if (mFields.find(field) == mFields.end()) {
- fprintf(stderr, "Field '%s' not found", string(field).c_str());
+ fprintf(stderr, "Field '%s' not found", field);
return;
}
- map<std::string, int> enu;
+ std::map<std::string, int> enu;
for (int i = 0; i < enumSize; i++) {
enu[enumNames[i]] = enumValues[i];
}
@@ -420,10 +420,10 @@
// Try to find the message field which is the prefix of name, so the value would be inserted
// recursively into the submessage.
- string mutableName = name;
+ std::string mutableName = name;
for (auto iter = mSubMessages.begin(); iter != mSubMessages.end(); iter++) {
- string fieldName = iter->first;
- string prefix = fieldName + "_"; // underscore is the delimiter in the name
+ std::string fieldName = iter->first;
+ std::string prefix = fieldName + "_"; // underscore is the delimiter in the name
if (stripPrefix(&mutableName, prefix.c_str())) {
if (mPreviousField != fieldName) {
endSession(proto);
@@ -437,7 +437,7 @@
}
void
-Message::startSession(ProtoOutputStream* proto, const string& name)
+Message::startSession(ProtoOutputStream* proto, const std::string& name)
{
uint64_t fieldId = mTable->mFields[name];
uint64_t token = proto->start(fieldId);
diff --git a/cmds/incident_helper/src/ih_util.h b/cmds/incident_helper/src/ih_util.h
index c4eda4a..c02a349 100644
--- a/cmds/incident_helper/src/ih_util.h
+++ b/cmds/incident_helper/src/ih_util.h
@@ -150,9 +150,9 @@
// Return false if the given name can't be found.
bool insertField(ProtoOutputStream* proto, const std::string& name, const std::string& value);
private:
- map<std::string, uint64_t> mFields;
- map<std::string, map<std::string, int>> mEnums;
- map<std::string, int> mEnumValuesByName;
+ std::map<std::string, uint64_t> mFields;
+ std::map<std::string, std::map<std::string, int>> mEnums;
+ std::map<std::string, int> mEnumValuesByName;
};
/**
@@ -187,15 +187,15 @@
bool insertField(ProtoOutputStream* proto, const std::string& name, const std::string& value);
// Starts a new message field proto session.
- void startSession(ProtoOutputStream* proto, const string& name);
+ void startSession(ProtoOutputStream* proto, const std::string& name);
// Ends the previous message field proto session.
void endSession(ProtoOutputStream* proto);
private:
Table* mTable;
std::string mPreviousField;
- stack<uint64_t> mTokens;
- map<std::string, Message*> mSubMessages;
+ std::stack<uint64_t> mTokens;
+ std::map<std::string, Message*> mSubMessages;
};
#endif // INCIDENT_HELPER_UTIL_H
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index 2b85ec0..0885b134 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -26,6 +26,10 @@
#include <unistd.h>
#include <wait.h>
+namespace android {
+namespace os {
+namespace incidentd {
+
const ssize_t BUFFER_SIZE = 16 * 1024; // 16 KB
const ssize_t MAX_BUFFER_COUNT = 256; // 4 MB max
@@ -34,11 +38,11 @@
FdBuffer::~FdBuffer() {}
-status_t FdBuffer::read(unique_fd* fd, int64_t timeout) {
- struct pollfd pfds = {.fd = fd->get(), .events = POLLIN};
+status_t FdBuffer::read(int fd, int64_t timeout) {
+ struct pollfd pfds = {.fd = fd, .events = POLLIN};
mStartTime = uptimeMillis();
- fcntl(fd->get(), F_SETFL, fcntl(fd->get(), F_GETFL, 0) | O_NONBLOCK);
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
while (true) {
if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
@@ -67,16 +71,16 @@
VLOG("return event has error %s", strerror(errno));
return errno != 0 ? -errno : UNKNOWN_ERROR;
} else {
- ssize_t amt = ::read(fd->get(), mBuffer.writeBuffer(), mBuffer.currentToWrite());
+ ssize_t amt = ::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite());
if (amt < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue;
} else {
- VLOG("Fail to read %d: %s", fd->get(), strerror(errno));
+ VLOG("Fail to read %d: %s", fd, strerror(errno));
return -errno;
}
} else if (amt == 0) {
- VLOG("Reached EOF of fd=%d", fd->get());
+ VLOG("Reached EOF of fd=%d", fd);
break;
}
mBuffer.wp()->move(amt);
@@ -87,7 +91,7 @@
return NO_ERROR;
}
-status_t FdBuffer::readFully(unique_fd* fd) {
+status_t FdBuffer::readFully(int fd) {
mStartTime = uptimeMillis();
while (true) {
@@ -99,10 +103,10 @@
}
if (mBuffer.writeBuffer() == NULL) return NO_MEMORY;
- ssize_t amt = TEMP_FAILURE_RETRY(
- ::read(fd->get(), mBuffer.writeBuffer(), mBuffer.currentToWrite()));
+ ssize_t amt =
+ TEMP_FAILURE_RETRY(::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite()));
if (amt < 0) {
- VLOG("Fail to read %d: %s", fd->get(), strerror(errno));
+ VLOG("Fail to read %d: %s", fd, strerror(errno));
return -errno;
} else if (amt == 0) {
VLOG("Done reading %zu bytes", mBuffer.size());
@@ -116,20 +120,20 @@
return NO_ERROR;
}
-status_t FdBuffer::readProcessedDataInStream(unique_fd* fd, unique_fd* toFd, unique_fd* fromFd,
+status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd fromFd,
int64_t timeoutMs, const bool isSysfs) {
struct pollfd pfds[] = {
- {.fd = fd->get(), .events = POLLIN},
- {.fd = toFd->get(), .events = POLLOUT},
- {.fd = fromFd->get(), .events = POLLIN},
+ {.fd = fd, .events = POLLIN},
+ {.fd = toFd.get(), .events = POLLOUT},
+ {.fd = fromFd.get(), .events = POLLIN},
};
mStartTime = uptimeMillis();
// mark all fds non blocking
- fcntl(fd->get(), F_SETFL, fcntl(fd->get(), F_GETFL, 0) | O_NONBLOCK);
- fcntl(toFd->get(), F_SETFL, fcntl(toFd->get(), F_GETFL, 0) | O_NONBLOCK);
- fcntl(fromFd->get(), F_SETFL, fcntl(fromFd->get(), F_GETFL, 0) | O_NONBLOCK);
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
+ fcntl(toFd.get(), F_SETFL, fcntl(toFd.get(), F_GETFL, 0) | O_NONBLOCK);
+ fcntl(fromFd.get(), F_SETFL, fcntl(fromFd.get(), F_GETFL, 0) | O_NONBLOCK);
// A circular buffer holds data read from fd and writes to parsing process
uint8_t cirBuf[BUFFER_SIZE];
@@ -166,10 +170,10 @@
for (int i = 0; i < 3; ++i) {
if ((pfds[i].revents & POLLERR) != 0) {
if (i == 0 && isSysfs) {
- VLOG("fd %d is sysfs, ignore its POLLERR return value", fd->get());
+ VLOG("fd %d is sysfs, ignore its POLLERR return value", fd);
continue;
}
- VLOG("fd[%d]=%d returns error events: %s", i, fd->get(), strerror(errno));
+ VLOG("fd[%d]=%d returns error events: %s", i, fd, strerror(errno));
return errno != 0 ? -errno : UNKNOWN_ERROR;
}
}
@@ -178,17 +182,17 @@
if (cirSize != BUFFER_SIZE && pfds[0].fd != -1) {
ssize_t amt;
if (rpos >= wpos) {
- amt = ::read(fd->get(), cirBuf + rpos, BUFFER_SIZE - rpos);
+ amt = ::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos);
} else {
- amt = ::read(fd->get(), cirBuf + rpos, wpos - rpos);
+ amt = ::read(fd, cirBuf + rpos, wpos - rpos);
}
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
- VLOG("Fail to read fd %d: %s", fd->get(), strerror(errno));
+ VLOG("Fail to read fd %d: %s", fd, strerror(errno));
return -errno;
} // otherwise just continue
} else if (amt == 0) {
- VLOG("Reached EOF of input file %d", fd->get());
+ VLOG("Reached EOF of input file %d", fd);
pfds[0].fd = -1; // reach EOF so don't have to poll pfds[0].
} else {
rpos += amt;
@@ -200,13 +204,13 @@
if (cirSize > 0 && pfds[1].fd != -1) {
ssize_t amt;
if (rpos > wpos) {
- amt = ::write(toFd->get(), cirBuf + wpos, rpos - wpos);
+ amt = ::write(toFd.get(), cirBuf + wpos, rpos - wpos);
} else {
- amt = ::write(toFd->get(), cirBuf + wpos, BUFFER_SIZE - wpos);
+ amt = ::write(toFd.get(), cirBuf + wpos, BUFFER_SIZE - wpos);
}
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
- VLOG("Fail to write toFd %d: %s", toFd->get(), strerror(errno));
+ VLOG("Fail to write toFd %d: %s", toFd.get(), strerror(errno));
return -errno;
} // otherwise just continue
} else {
@@ -217,8 +221,8 @@
// if buffer is empty and fd is closed, close write fd.
if (cirSize == 0 && pfds[0].fd == -1 && pfds[1].fd != -1) {
- VLOG("Close write pipe %d", toFd->get());
- toFd->reset();
+ VLOG("Close write pipe %d", toFd.get());
+ toFd.reset();
pfds[1].fd = -1;
}
@@ -231,14 +235,14 @@
}
// read from parsing process
- ssize_t amt = ::read(fromFd->get(), mBuffer.writeBuffer(), mBuffer.currentToWrite());
+ ssize_t amt = ::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));
+ VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
return -errno;
} // otherwise just continue
} else if (amt == 0) {
- VLOG("Reached EOF of fromFd %d", fromFd->get());
+ VLOG("Reached EOF of fromFd %d", fromFd.get());
break;
} else {
mBuffer.wp()->move(amt);
@@ -252,3 +256,7 @@
size_t FdBuffer::size() const { return mBuffer.size(); }
EncodedBuffer::iterator FdBuffer::data() const { return mBuffer.begin(); }
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/FdBuffer.h b/cmds/incidentd/src/FdBuffer.h
index db3a74b..20deefd 100644
--- a/cmds/incidentd/src/FdBuffer.h
+++ b/cmds/incidentd/src/FdBuffer.h
@@ -22,10 +22,12 @@
#include <android/util/EncodedBuffer.h>
#include <utils/Errors.h>
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
+
using namespace android::base;
using namespace android::util;
-using namespace std;
/**
* Reads data from fd into a buffer, fd must be closed explicitly.
@@ -40,13 +42,13 @@
* Returns NO_ERROR if there were no errors or if we timed out.
* Will mark the file O_NONBLOCK.
*/
- status_t read(unique_fd* fd, int64_t timeoutMs);
+ status_t read(int fd, int64_t timeoutMs);
/**
* Read the data until we hit eof.
* Returns NO_ERROR if there were no errors.
*/
- status_t readFully(unique_fd* fd);
+ status_t readFully(int fd);
/**
* Read processed results by streaming data to a parsing process, e.g. incident helper.
@@ -58,8 +60,8 @@
*
* Poll will return POLLERR if fd is from sysfs, handle this edge case.
*/
- status_t readProcessedDataInStream(unique_fd* fd, unique_fd* toFd, unique_fd* fromFd,
- int64_t timeoutMs, const bool isSysfs = false);
+ status_t readProcessedDataInStream(int fd, unique_fd toFd, unique_fd fromFd, int64_t timeoutMs,
+ const bool isSysfs = false);
/**
* Whether we timed out.
@@ -104,4 +106,8 @@
bool mTruncated;
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // FD_BUFFER_H
diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp
index aeccefd..e305b54 100644
--- a/cmds/incidentd/src/IncidentService.cpp
+++ b/cmds/incidentd/src/IncidentService.cpp
@@ -34,9 +34,6 @@
#include <unistd.h>
-using namespace android;
-using namespace android::base;
-
enum { WHAT_RUN_REPORT = 1, WHAT_SEND_BACKLOG_TO_DROPBOX = 2 };
#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL)
@@ -44,7 +41,10 @@
#define DEFAULT_BYTES_SIZE_LIMIT (20 * 1024 * 1024) // 20MB
#define DEFAULT_REFACTORY_PERIOD_MS (24 * 60 * 60 * 1000) // 1 Day
-// ================================================================================
+namespace android {
+namespace os {
+namespace incidentd {
+
String16 const DUMP_PERMISSION("android.permission.DUMP");
String16 const USAGE_STATS_PERMISSION("android.permission.PACKAGE_USAGE_STATS");
@@ -94,6 +94,7 @@
}
return Status::ok();
}
+
// ================================================================================
ReportRequestQueue::ReportRequestQueue() {}
@@ -352,8 +353,7 @@
printPrivacy(p, out, String8(""));
} else if (opt == "parse") {
FdBuffer buf;
- unique_fd infd(fileno(in));
- status_t error = buf.read(&infd, 60000);
+ status_t error = buf.read(fileno(in), 60000);
if (error != NO_ERROR) {
fprintf(err, "Error reading from stdin\n");
return error;
@@ -374,3 +374,7 @@
}
return NO_ERROR;
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/IncidentService.h b/cmds/incidentd/src/IncidentService.h
index 0ab34ed..e176bfd 100644
--- a/cmds/incidentd/src/IncidentService.h
+++ b/cmds/incidentd/src/IncidentService.h
@@ -28,11 +28,14 @@
#include "Throttler.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
using namespace android;
using namespace android::base;
using namespace android::binder;
using namespace android::os;
-using namespace std;
// ================================================================================
class ReportRequestQueue : public virtual RefBase {
@@ -126,4 +129,8 @@
status_t cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // INCIDENT_SERVICE_H
diff --git a/cmds/incidentd/src/Privacy.cpp b/cmds/incidentd/src/Privacy.cpp
index c42a87b..6e55f90 100644
--- a/cmds/incidentd/src/Privacy.cpp
+++ b/cmds/incidentd/src/Privacy.cpp
@@ -19,6 +19,10 @@
#include <android/os/IncidentReportArgs.h>
#include <stdlib.h>
+namespace android {
+namespace os {
+namespace incidentd {
+
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) {
@@ -65,3 +69,7 @@
return PrivacySpec(android::os::DEST_AUTOMATIC);
}
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/Privacy.h b/cmds/incidentd/src/Privacy.h
index 6b6de9c..a3df490 100644
--- a/cmds/incidentd/src/Privacy.h
+++ b/cmds/incidentd/src/Privacy.h
@@ -20,6 +20,10 @@
#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;
@@ -82,4 +86,8 @@
PrivacySpec(uint8_t dest) : dest(dest) {}
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // PRIVACY_H
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
index f1f7c589..6cd2fe1 100644
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ b/cmds/incidentd/src/PrivacyBuffer.cpp
@@ -23,7 +23,9 @@
#include <android/util/protobuf.h>
#include <cutils/log.h>
-using namespace android::util;
+namespace android {
+namespace os {
+namespace incidentd {
/**
* Write the field to buf based on the wire type, iterator will point to next field.
@@ -140,3 +142,7 @@
}
return NO_ERROR;
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/PrivacyBuffer.h b/cmds/incidentd/src/PrivacyBuffer.h
index cd29d8b..eac3862 100644
--- a/cmds/incidentd/src/PrivacyBuffer.h
+++ b/cmds/incidentd/src/PrivacyBuffer.h
@@ -25,7 +25,10 @@
#include <stdint.h>
#include <utils/Errors.h>
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
+
using namespace android::util;
/**
@@ -69,4 +72,8 @@
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/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp
index fc8a6db..103004d 100644
--- a/cmds/incidentd/src/Reporter.cpp
+++ b/cmds/incidentd/src/Reporter.cpp
@@ -37,6 +37,10 @@
*/
static const char* INCIDENT_DIRECTORY = "/data/misc/incidents/";
+namespace android {
+namespace os {
+namespace incidentd {
+
// ================================================================================
ReportRequest::ReportRequest(const IncidentReportArgs& a,
const sp<IIncidentReportStatusListener>& l, int f)
@@ -320,3 +324,7 @@
return REPORT_FINISHED;
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/Reporter.h b/cmds/incidentd/src/Reporter.h
index f9a092a..45fd944 100644
--- a/cmds/incidentd/src/Reporter.h
+++ b/cmds/incidentd/src/Reporter.h
@@ -30,9 +30,9 @@
#include "Throttler.h"
#include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
-using namespace android;
-using namespace android::os;
-using namespace std;
+namespace android {
+namespace os {
+namespace incidentd {
// ================================================================================
struct ReportRequest : public virtual RefBase {
@@ -110,4 +110,8 @@
bool isTest = true; // default to true for testing
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // REPORTER_H
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index ece3083..45d6281 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -20,7 +20,6 @@
#include <dirent.h>
#include <errno.h>
-#include <wait.h>
#include <mutex>
#include <set>
@@ -44,58 +43,27 @@
#include "frameworks/base/core/proto/android/util/log.proto.h"
#include "incidentd_util.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
using namespace android::base;
using namespace android::util;
-using namespace std;
// special section ids
const int FIELD_ID_INCIDENT_HEADER = 1;
const int FIELD_ID_INCIDENT_METADATA = 2;
// incident section parameters
-const int WAIT_MAX = 5;
-const struct timespec WAIT_INTERVAL_NS = {0, 200 * 1000 * 1000};
const char INCIDENT_HELPER[] = "/system/bin/incident_helper";
-const char GZIP[] = "/system/bin/gzip";
+const char* GZIP[] = {"/system/bin/gzip", NULL};
static pid_t fork_execute_incident_helper(const int id, Fpipe* p2cPipe, Fpipe* c2pPipe) {
const char* ihArgs[]{INCIDENT_HELPER, "-s", String8::format("%d", id).string(), NULL};
- return fork_execute_cmd(INCIDENT_HELPER, const_cast<char**>(ihArgs), p2cPipe, c2pPipe);
+ return fork_execute_cmd(const_cast<char**>(ihArgs), p2cPipe, c2pPipe);
}
// ================================================================================
-static status_t statusCode(int status) {
- if (WIFSIGNALED(status)) {
- VLOG("return by signal: %s", strerror(WTERMSIG(status)));
- return -WTERMSIG(status);
- } else if (WIFEXITED(status) && WEXITSTATUS(status) > 0) {
- VLOG("return by exit: %s", strerror(WEXITSTATUS(status)));
- return -WEXITSTATUS(status);
- }
- return NO_ERROR;
-}
-
-static status_t kill_child(pid_t pid) {
- int status;
- VLOG("try to kill child process %d", pid);
- kill(pid, SIGKILL);
- if (waitpid(pid, &status, 0) == -1) return -1;
- return statusCode(status);
-}
-
-static status_t wait_child(pid_t pid) {
- int status;
- bool died = false;
- // wait for child to report status up to 1 seconds
- for (int loop = 0; !died && loop < WAIT_MAX; loop++) {
- if (waitpid(pid, &status, WNOHANG) == pid) died = true;
- // sleep for 0.2 second
- nanosleep(&WAIT_INTERVAL_NS, NULL);
- }
- if (!died) return kill_child(pid);
- return statusCode(status);
-}
-// ================================================================================
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);
@@ -299,8 +267,9 @@
}
// parent process
- status_t readStatus = buffer.readProcessedDataInStream(
- &fd, &p2cPipe.writeFd(), &c2pPipe.readFd(), this->timeoutMs, mIsSysfs);
+ status_t readStatus = buffer.readProcessedDataInStream(fd.get(), std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()),
+ this->timeoutMs, mIsSysfs);
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("FileSection '%s' failed to read data from incident helper: %s, timedout: %s",
@@ -328,12 +297,15 @@
}
// ================================================================================
GZipSection::GZipSection(int id, const char* filename, ...) : Section(id) {
- name = "gzip ";
- name += filename;
va_list args;
va_start(args, filename);
mFilenames = varargs(filename, args);
va_end(args);
+ name = "gzip";
+ for (int i = 0; mFilenames[i] != NULL; i++) {
+ name += " ";
+ name += mFilenames[i];
+ }
}
GZipSection::~GZipSection() {}
@@ -351,8 +323,10 @@
index++; // look at the next file.
}
VLOG("GZipSection is using file %s, fd=%d", mFilenames[index], fd.get());
- if (fd.get() == -1) return -1;
-
+ if (fd.get() == -1) {
+ ALOGW("GZipSection %s can't open all the files", this->name.string());
+ return NO_ERROR; // e.g. LAST_KMSG will reach here in user build.
+ }
FdBuffer buffer;
Fpipe p2cPipe;
Fpipe c2pPipe;
@@ -362,8 +336,7 @@
return -errno;
}
- const char* gzipArgs[]{GZIP, NULL};
- pid_t pid = fork_execute_cmd(GZIP, const_cast<char**>(gzipArgs), &p2cPipe, &c2pPipe);
+ pid_t pid = fork_execute_cmd((char* const*)GZIP, &p2cPipe, &c2pPipe);
if (pid == -1) {
ALOGW("GZipSection '%s' failed to fork", this->name.string());
return -errno;
@@ -387,9 +360,9 @@
VLOG("GZipSection '%s' editPos=%zd, dataBeginAt=%zd", this->name.string(), editPos,
dataBeginAt);
- status_t readStatus =
- buffer.readProcessedDataInStream(&fd, &p2cPipe.writeFd(), &c2pPipe.readFd(),
- this->timeoutMs, isSysfs(mFilenames[index]));
+ status_t readStatus = buffer.readProcessedDataInStream(
+ fd.get(), std::move(p2cPipe.writeFd()), std::move(c2pPipe.readFd()), this->timeoutMs,
+ isSysfs(mFilenames[index]));
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("GZipSection '%s' failed to read data from gzip: %s, timedout: %s",
@@ -499,7 +472,7 @@
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(), this->timeoutMs);
+ err = buffer.read(data->pipe.readFd().get(), this->timeoutMs);
if (err != NO_ERROR) {
// TODO: Log this error into the incident report.
ALOGW("WorkerThreadSection '%s' reader failed with error '%s'", this->name.string(),
@@ -559,19 +532,27 @@
// ================================================================================
CommandSection::CommandSection(int id, const int64_t timeoutMs, const char* command, ...)
: Section(id, timeoutMs) {
- name = command;
va_list args;
va_start(args, command);
mCommand = varargs(command, args);
va_end(args);
+ name = "cmd";
+ for (int i = 0; mCommand[i] != NULL; i++) {
+ name += " ";
+ name += mCommand[i];
+ }
}
CommandSection::CommandSection(int id, const char* command, ...) : Section(id) {
- name = command;
va_list args;
va_start(args, command);
mCommand = varargs(command, args);
va_end(args);
+ name = "cmd";
+ for (int i = 0; mCommand[i] != NULL; i++) {
+ name += " ";
+ name += mCommand[i];
+ }
}
CommandSection::~CommandSection() { free(mCommand); }
@@ -586,26 +567,11 @@
return -errno;
}
- pid_t cmdPid = fork();
+ pid_t cmdPid = fork_execute_cmd((char* const*)mCommand, NULL, &cmdPipe);
if (cmdPid == -1) {
ALOGW("CommandSection '%s' failed to fork", this->name.string());
return -errno;
}
- // child process to execute the command as root
- if (cmdPid == 0) {
- // replace command's stdout with ihPipe's write Fd
- if (dup2(cmdPipe.writeFd().get(), STDOUT_FILENO) != 1 || !ihPipe.close() ||
- !cmdPipe.close()) {
- ALOGW("CommandSection '%s' failed to set up stdout: %s", this->name.string(),
- strerror(errno));
- _exit(EXIT_FAILURE);
- }
- execvp(this->mCommand[0], (char* const*)this->mCommand);
- int err = errno; // record command error code
- ALOGW("CommandSection '%s' failed in executing command: %s", this->name.string(),
- strerror(errno));
- _exit(err); // exit with command error code
- }
pid_t ihPid = fork_execute_incident_helper(this->id, &cmdPipe, &ihPipe);
if (ihPid == -1) {
ALOGW("CommandSection '%s' failed to fork", this->name.string());
@@ -613,7 +579,7 @@
}
cmdPipe.writeFd().reset();
- status_t readStatus = buffer.read(&ihPipe.readFd(), this->timeoutMs);
+ status_t readStatus = buffer.read(ihPipe.readFd().get(), this->timeoutMs);
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("CommandSection '%s' failed to read data from incident helper: %s, timedout: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
@@ -932,7 +898,7 @@
// Parent process.
// Read from the pipe concurrently to avoid blocking the child.
FdBuffer buffer;
- err = buffer.readFully(&dumpPipe.readFd());
+ err = buffer.readFully(dumpPipe.readFd().get());
if (err != NO_ERROR) {
ALOGW("TombstoneSection '%s' failed to read stack dump: %d", this->name.string(), err);
dumpPipe.readFd().reset();
@@ -946,7 +912,7 @@
dump[i] = iterator.next();
i++;
}
- long long token = proto.start(android::os::BackTraceProto::TRACES);
+ uint64_t token = proto.start(android::os::BackTraceProto::TRACES);
proto.write(android::os::BackTraceProto::Stack::PID, pid);
proto.write(android::os::BackTraceProto::Stack::DUMP, dump.get(), i);
proto.write(android::os::BackTraceProto::Stack::DUMP_DURATION_NS,
@@ -958,3 +924,7 @@
proto.flush(pipeWriteFd);
return err;
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index 19ef7ee..34a3613 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -27,7 +27,9 @@
#include <utils/String8.h>
#include <utils/Vector.h>
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
const int64_t REMOTE_CALL_TIMEOUT_MS = 10 * 1000; // 10 seconds
@@ -175,4 +177,8 @@
std::string mType;
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // SECTIONS_H
diff --git a/cmds/incidentd/src/Throttler.cpp b/cmds/incidentd/src/Throttler.cpp
index 1abf267..2b790ca 100644
--- a/cmds/incidentd/src/Throttler.cpp
+++ b/cmds/incidentd/src/Throttler.cpp
@@ -20,6 +20,10 @@
#include <utils/SystemClock.h>
+namespace android {
+namespace os {
+namespace incidentd {
+
Throttler::Throttler(size_t limit, int64_t refractoryPeriodMs)
: mSizeLimit(limit),
mRefractoryPeriodMs(refractoryPeriodMs),
@@ -48,3 +52,7 @@
fprintf(out, "mRefractoryPeriodMs=%d\n", (int)mRefractoryPeriodMs);
fprintf(out, "mLastRefractoryMs=%d\n", (int)mLastRefractoryMs);
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/Throttler.h b/cmds/incidentd/src/Throttler.h
index c56f753..e8f317d7 100644
--- a/cmds/incidentd/src/Throttler.h
+++ b/cmds/incidentd/src/Throttler.h
@@ -20,6 +20,10 @@
#include <utils/RefBase.h>
#include <unistd.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
/**
* This is a size-based throttler which prevents incidentd to take more data.
*/
@@ -45,4 +49,8 @@
int64_t mLastRefractoryMs;
};
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // THROTTLER_H
diff --git a/cmds/incidentd/src/incidentd_util.cpp b/cmds/incidentd/src/incidentd_util.cpp
index d799513..af685d8 100644
--- a/cmds/incidentd/src/incidentd_util.cpp
+++ b/cmds/incidentd/src/incidentd_util.cpp
@@ -19,9 +19,16 @@
#include "incidentd_util.h"
#include <sys/prctl.h>
+#include <wait.h>
#include "section_list.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
+using namespace android::base;
+
const Privacy* get_privacy_of_section(int id) {
int l = 0;
int r = PRIVACY_POLICY_COUNT - 1;
@@ -57,27 +64,28 @@
unique_fd& Fpipe::writeFd() { return mWrite; }
-pid_t fork_execute_cmd(const char* cmd, char* const argv[], Fpipe* input, Fpipe* output) {
+pid_t fork_execute_cmd(char* const argv[], Fpipe* input, Fpipe* output) {
// fork used in multithreaded environment, avoid adding unnecessary code in child process
pid_t pid = fork();
if (pid == 0) {
- if (TEMP_FAILURE_RETRY(dup2(input->readFd().get(), STDIN_FILENO)) < 0 || !input->close() ||
- TEMP_FAILURE_RETRY(dup2(output->writeFd().get(), STDOUT_FILENO)) < 0 ||
- !output->close()) {
- ALOGW("Can't setup stdin and stdout for command %s", cmd);
+ 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.");
_exit(EXIT_FAILURE);
}
-
+ if (TEMP_FAILURE_RETRY(dup2(output->writeFd().get(), STDOUT_FILENO)) < 0 ||
+ !output->close()) {
+ ALOGW("Failed to dup2 stdout.");
+ _exit(EXIT_FAILURE);
+ }
/* make sure the child dies when incidentd dies */
prctl(PR_SET_PDEATHSIG, SIGKILL);
-
- execv(cmd, argv);
-
- ALOGW("%s failed in the child process: %s", cmd, strerror(errno));
- _exit(EXIT_FAILURE); // always exits with failure if any
+ execvp(argv[0], argv);
+ _exit(errno); // always exits with failure if any
}
// close the fds used in child process.
- input->readFd().reset();
+ if (input != NULL) input->readFd().reset();
output->writeFd().reset();
return pid;
}
@@ -111,3 +119,43 @@
clock_gettime(CLOCK_MONOTONIC, &ts);
return static_cast<uint64_t>(ts.tv_sec * NANOS_PER_SEC + ts.tv_nsec);
}
+
+// ================================================================================
+const int WAIT_MAX = 5;
+const struct timespec WAIT_INTERVAL_NS = {0, 200 * 1000 * 1000};
+
+static status_t statusCode(int status) {
+ if (WIFSIGNALED(status)) {
+ VLOG("return by signal: %s", strerror(WTERMSIG(status)));
+ return -WTERMSIG(status);
+ } else if (WIFEXITED(status) && WEXITSTATUS(status) > 0) {
+ VLOG("return by exit: %s", strerror(WEXITSTATUS(status)));
+ return -WEXITSTATUS(status);
+ }
+ return NO_ERROR;
+}
+
+status_t kill_child(pid_t pid) {
+ int status;
+ VLOG("try to kill child process %d", pid);
+ kill(pid, SIGKILL);
+ if (waitpid(pid, &status, 0) == -1) return -1;
+ return statusCode(status);
+}
+
+status_t wait_child(pid_t pid) {
+ int status;
+ bool died = false;
+ // wait for child to report status up to 1 seconds
+ for (int loop = 0; !died && loop < WAIT_MAX; loop++) {
+ if (waitpid(pid, &status, WNOHANG) == pid) died = true;
+ // sleep for 0.2 second
+ nanosleep(&WAIT_INTERVAL_NS, NULL);
+ }
+ if (!died) return kill_child(pid);
+ return statusCode(status);
+}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/incidentd_util.h b/cmds/incidentd/src/incidentd_util.h
index 228d776..3dac2c4 100644
--- a/cmds/incidentd/src/incidentd_util.h
+++ b/cmds/incidentd/src/incidentd_util.h
@@ -18,12 +18,18 @@
#ifndef INCIDENTD_UTIL_H
#define INCIDENTD_UTIL_H
-#include <android-base/unique_fd.h>
-
#include <stdarg.h>
+#include <unistd.h>
+
+#include <android-base/unique_fd.h>
+#include <utils/Errors.h>
#include "Privacy.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
using namespace android::base;
/**
@@ -52,8 +58,9 @@
/**
* Forks and exec a command with two pipes, one connects stdin for input,
* one connects stdout for output. It returns the pid of the child.
+ * Input pipe can be NULL to indicate child process doesn't read stdin.
*/
-pid_t fork_execute_cmd(const char* cmd, char* const argv[], Fpipe* input, Fpipe* output);
+pid_t fork_execute_cmd(char* const argv[], Fpipe* input, Fpipe* output);
/**
* Grabs varargs from stack and stores them in heap with NULL-terminated array.
@@ -65,4 +72,14 @@
*/
uint64_t Nanotime();
+/**
+ * Methods to wait or kill child process, return exit status code.
+ */
+status_t kill_child(pid_t pid);
+status_t wait_child(pid_t pid);
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // INCIDENTD_UTIL_H
diff --git a/cmds/incidentd/src/main.cpp b/cmds/incidentd/src/main.cpp
index 38b7449..4948823 100644
--- a/cmds/incidentd/src/main.cpp
+++ b/cmds/incidentd/src/main.cpp
@@ -29,6 +29,7 @@
#include <sys/types.h>
using namespace android;
+using namespace android::os::incidentd;
// ================================================================================
int main(int /*argc*/, char** /*argv*/) {
@@ -43,7 +44,7 @@
IPCThreadState::self()->disableBackgroundScheduling(true);
// Create the service
- android::sp<IncidentService> service = new IncidentService(looper);
+ sp<IncidentService> service = new IncidentService(looper);
if (defaultServiceManager()->addService(String16("incident"), service) != 0) {
ALOGE("Failed to add service");
return -1;
diff --git a/cmds/incidentd/src/report_directory.cpp b/cmds/incidentd/src/report_directory.cpp
index f023ee1..e2883ba 100644
--- a/cmds/incidentd/src/report_directory.cpp
+++ b/cmds/incidentd/src/report_directory.cpp
@@ -29,8 +29,9 @@
#include <vector>
-using namespace android;
-using namespace std;
+namespace android {
+namespace os {
+namespace incidentd {
status_t create_directory(const char* directory) {
struct stat st;
@@ -89,8 +90,8 @@
return err;
}
-static bool stat_mtime_cmp(const pair<String8, struct stat>& a,
- const pair<String8, struct stat>& b) {
+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;
}
@@ -99,7 +100,7 @@
struct dirent* entry;
struct stat st;
- vector<pair<String8, struct stat>> files;
+ std::vector<std::pair<String8, struct stat>> files;
if ((dir = opendir(directory)) == NULL) {
ALOGE("Couldn't open incident directory: %s", directory);
@@ -125,7 +126,7 @@
if (!S_ISREG(st.st_mode)) {
continue;
}
- files.push_back(pair<String8, struct stat>(filename, st));
+ files.push_back(std::pair<String8, struct stat>(filename, st));
totalSize += st.st_size;
totalCount++;
@@ -142,10 +143,14 @@
sort(files.begin(), files.end(), stat_mtime_cmp);
// Remove files until we're under our limits.
- for (vector<pair<String8, struct stat>>::iterator it = files.begin();
+ for (std::vector<std::pair<String8, struct stat>>::iterator it = files.begin();
it != files.end() && totalSize >= maxSize && totalCount >= maxCount; it++) {
remove(it->first.string());
totalSize -= it->second.st_size;
totalCount--;
}
}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/report_directory.h b/cmds/incidentd/src/report_directory.h
index 2a3cf4c..a63f8df 100644
--- a/cmds/incidentd/src/report_directory.h
+++ b/cmds/incidentd/src/report_directory.h
@@ -21,7 +21,15 @@
#include <sys/types.h>
#include <utils/Errors.h>
+namespace android {
+namespace os {
+namespace incidentd {
+
android::status_t create_directory(const char* directory);
void clean_directory(const char* directory, off_t maxSize, size_t maxCount);
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // DIRECTORY_CLEANER_H
diff --git a/cmds/incidentd/src/section_list.h b/cmds/incidentd/src/section_list.h
index 697e66f..1498127 100644
--- a/cmds/incidentd/src/section_list.h
+++ b/cmds/incidentd/src/section_list.h
@@ -23,6 +23,10 @@
#include "Privacy.h"
#include "Section.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
/**
* This is the mapping of section IDs to the commands that are run to get those commands.
* The section IDs are guaranteed in ascending order, NULL-terminated.
@@ -37,4 +41,8 @@
extern const int PRIVACY_POLICY_COUNT;
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
#endif // SECTION_LIST_H
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index bf77017..9d208df 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -24,20 +24,20 @@
#include <signal.h>
#include <string.h>
+using namespace android;
+using namespace android::base;
+using namespace android::os::incidentd;
+using ::testing::Test;
+
const int READ_TIMEOUT = 5 * 1000;
const int BUFFER_SIZE = 16 * 1024;
const int QUICK_TIMEOUT_MS = 100;
const std::string HEAD = "[OK]";
-using namespace android;
-using namespace android::base;
-using ::testing::Test;
-
class FdBufferTest : public Test {
public:
virtual void SetUp() override {
ASSERT_NE(tf.fd, -1);
- tffd.reset(tf.fd);
ASSERT_NE(p2cPipe.init(), -1);
ASSERT_NE(c2pPipe.init(), -1);
}
@@ -57,13 +57,13 @@
EXPECT_EQ(expected[i], '\0');
}
- bool DoDataStream(unique_fd* rFd, unique_fd* wFd) {
+ bool DoDataStream(const unique_fd& rFd, const unique_fd& wFd) {
char buf[BUFFER_SIZE];
ssize_t nRead;
- while ((nRead = read(rFd->get(), buf, BUFFER_SIZE)) > 0) {
+ while ((nRead = read(rFd.get(), buf, BUFFER_SIZE)) > 0) {
ssize_t nWritten = 0;
while (nWritten < nRead) {
- ssize_t amt = write(wFd->get(), buf + nWritten, nRead - nWritten);
+ ssize_t amt = write(wFd.get(), buf + nWritten, nRead - nWritten);
if (amt < 0) {
return false;
}
@@ -76,7 +76,6 @@
protected:
FdBuffer buffer;
TemporaryFile tf;
- unique_fd tffd;
Fpipe p2cPipe;
Fpipe c2pPipe;
@@ -87,7 +86,7 @@
TEST_F(FdBufferTest, ReadAndWrite) {
std::string testdata = "FdBuffer test string";
ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
- ASSERT_EQ(NO_ERROR, buffer.read(&tffd, READ_TIMEOUT));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
AssertBufferReadSuccessful(testdata.size());
AssertBufferContent(testdata.c_str());
}
@@ -100,7 +99,7 @@
TEST_F(FdBufferTest, ReadAndIterate) {
std::string testdata = "FdBuffer test string";
ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
- ASSERT_EQ(NO_ERROR, buffer.read(&tffd, READ_TIMEOUT));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
int i = 0;
EncodedBuffer::iterator it = buffer.data();
@@ -128,7 +127,7 @@
} else {
c2pPipe.writeFd().reset();
- status_t status = buffer.read(&c2pPipe.readFd(), QUICK_TIMEOUT_MS);
+ status_t status = buffer.read(c2pPipe.readFd().get(), QUICK_TIMEOUT_MS);
ASSERT_EQ(NO_ERROR, status);
EXPECT_TRUE(buffer.timedOut());
@@ -148,7 +147,7 @@
p2cPipe.writeFd().reset();
c2pPipe.readFd().reset();
ASSERT_TRUE(WriteStringToFd(HEAD, c2pPipe.writeFd()));
- ASSERT_TRUE(DoDataStream(&p2cPipe.readFd(), &c2pPipe.writeFd()));
+ ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
// Must exit here otherwise the child process will continue executing the test binary.
@@ -157,8 +156,9 @@
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
- ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(&tffd, &p2cPipe.writeFd(),
- &c2pPipe.readFd(), READ_TIMEOUT));
+ ASSERT_EQ(NO_ERROR,
+ buffer.readProcessedDataInStream(tf.fd, std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()), READ_TIMEOUT));
AssertBufferReadSuccessful(HEAD.size() + testdata.size());
AssertBufferContent(expected.c_str());
wait(&pid);
@@ -189,8 +189,9 @@
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
- ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(&tffd, &p2cPipe.writeFd(),
- &c2pPipe.readFd(), READ_TIMEOUT));
+ ASSERT_EQ(NO_ERROR,
+ buffer.readProcessedDataInStream(tf.fd, std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()), READ_TIMEOUT));
AssertBufferReadSuccessful(HEAD.size() + testdata.size());
AssertBufferContent(expected.c_str());
wait(&pid);
@@ -206,7 +207,7 @@
if (pid == 0) {
p2cPipe.writeFd().reset();
c2pPipe.readFd().reset();
- ASSERT_TRUE(DoDataStream(&p2cPipe.readFd(), &c2pPipe.writeFd()));
+ ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
_exit(EXIT_SUCCESS);
@@ -214,8 +215,9 @@
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
- ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(&tffd, &p2cPipe.writeFd(),
- &c2pPipe.readFd(), READ_TIMEOUT));
+ ASSERT_EQ(NO_ERROR,
+ buffer.readProcessedDataInStream(tf.fd, std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()), READ_TIMEOUT));
AssertBufferReadSuccessful(0);
AssertBufferContent("");
wait(&pid);
@@ -233,7 +235,7 @@
if (pid == 0) {
p2cPipe.writeFd().reset();
c2pPipe.readFd().reset();
- ASSERT_TRUE(DoDataStream(&p2cPipe.readFd(), &c2pPipe.writeFd()));
+ ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
_exit(EXIT_SUCCESS);
@@ -241,8 +243,9 @@
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
- ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(&fd, &p2cPipe.writeFd(),
- &c2pPipe.readFd(), READ_TIMEOUT));
+ 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());
@@ -278,8 +281,9 @@
p2cPipe.readFd().reset();
c2pPipe.writeFd().reset();
- ASSERT_EQ(NO_ERROR, buffer.readProcessedDataInStream(&tffd, &p2cPipe.writeFd(),
- &c2pPipe.readFd(), QUICK_TIMEOUT_MS));
+ ASSERT_EQ(NO_ERROR,
+ buffer.readProcessedDataInStream(tf.fd, std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()), QUICK_TIMEOUT_MS));
EXPECT_TRUE(buffer.timedOut());
kill(pid, SIGKILL); // reap the child process
}
diff --git a/cmds/incidentd/tests/PrivacyBuffer_test.cpp b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
index 5edc0c7..685759f 100644
--- a/cmds/incidentd/tests/PrivacyBuffer_test.cpp
+++ b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
@@ -27,7 +27,7 @@
using namespace android;
using namespace android::base;
using namespace android::os;
-using namespace std;
+using namespace android::os::incidentd;
using ::testing::StrEq;
using ::testing::Test;
using ::testing::internal::CaptureStdout;
@@ -36,12 +36,12 @@
const uint8_t OTHER_TYPE = 1;
const uint8_t STRING_TYPE = 9;
const uint8_t MESSAGE_TYPE = 11;
-const string STRING_FIELD_0 = "\x02\viamtestdata";
-const string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
-const string STRING_FIELD_2 = "\x12\vwhatthefuck";
-const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
-const string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1
-const string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
+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;
class PrivacyBufferTest : public Test {
public:
@@ -56,21 +56,20 @@
virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
- void writeToFdBuffer(string str) {
+ void writeToFdBuffer(std::string str) {
ASSERT_TRUE(WriteStringToFile(str, tf.path));
- unique_fd tffd(tf.fd);
- ASSERT_EQ(NO_ERROR, buffer.read(&tffd, 10000));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
ASSERT_EQ(str.size(), buffer.size());
}
- void assertBuffer(PrivacyBuffer& buf, string expected) {
+ 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, string expected, Privacy* policy) {
+ 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);
@@ -78,7 +77,7 @@
assertBuffer(privacyBuf, expected);
}
- void assertStripByFields(uint8_t dest, string expected, int size, Privacy* privacy, ...) {
+ void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) {
Privacy* list[size + 1];
list[0] = privacy;
va_list args;
@@ -195,7 +194,7 @@
TEST_F(PrivacyBufferTest, StripVarintAndString) {
writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
FIX32_FIELD_4);
- string expected = STRING_FIELD_0 + 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));
}
@@ -203,7 +202,7 @@
TEST_F(PrivacyBufferTest, StripVarintAndFixed64) {
writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
FIX32_FIELD_4);
- string expected = STRING_FIELD_0 + STRING_FIELD_2 + 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));
}
@@ -211,14 +210,14 @@
TEST_F(PrivacyBufferTest, StripVarintInNestedMessage) {
writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ 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};
- string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ 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));
}
@@ -263,7 +262,7 @@
Privacy* field5 = create_message_privacy(5, NULL);
Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL};
field5->children = list;
- string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
+ std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
assertStrip(DEST_EXPLICIT, expected, field5);
}
@@ -272,6 +271,6 @@
Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC);
autoMsg->children = list;
- string expected = "\x2a\xd" + STRING_FIELD_2;
+ std::string expected = "\x2a\xd" + STRING_FIELD_2;
assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg);
-}
\ No newline at end of file
+}
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index 42d94f0..cf107c8 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -30,6 +30,7 @@
using namespace android::base;
using namespace android::binder;
using namespace android::os;
+using namespace android::os::incidentd;
using namespace std;
using ::testing::StrEq;
using ::testing::Test;
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index 55192d0..9f92353 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -19,29 +19,32 @@
#include <android-base/file.h>
#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 <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string.h>
+using namespace android;
+using namespace android::base;
+using namespace android::binder;
+using namespace android::os;
+using namespace android::os::incidentd;
+using namespace android::util;
+using ::testing::StrEq;
+using ::testing::Test;
+using ::testing::internal::CaptureStdout;
+using ::testing::internal::GetCapturedStdout;
+
const int TIMEOUT_PARSER = -1;
const int NOOP_PARSER = 0;
const int REVERSE_PARSER = 1;
const int QUICK_TIMEOUT_MS = 100;
-const string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
-const string STRING_FIELD_2 = "\x12\vwhatthefuck";
-const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
-
-using namespace android::base;
-using namespace android::binder;
-using namespace android::os;
-using namespace std;
-using ::testing::StrEq;
-using ::testing::Test;
-using ::testing::internal::CaptureStdout;
-using ::testing::internal::GetCapturedStdout;
+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
// NOTICE: this test requires /system/bin/incident_helper is installed.
class SectionTest : public Test {
@@ -99,7 +102,7 @@
requests.add(new ReportRequest(args2, new SimpleListener(), tf.fd));
requests.setMainFd(STDOUT_FILENO);
- string content;
+ std::string content;
CaptureStdout();
ASSERT_EQ(NO_ERROR, hs.Execute(&requests));
EXPECT_THAT(GetCapturedStdout(), StrEq("\n\x5"
@@ -154,17 +157,26 @@
requests.setMainDest(android::os::DEST_LOCAL);
ASSERT_EQ(NO_ERROR, gs.Execute(&requests));
- std::string expect, gzFile, actual;
+ std::string expected, gzFile, actual;
ASSERT_TRUE(ReadFileToString(testGzFile, &gzFile));
ASSERT_TRUE(ReadFileToString(tf.path, &actual));
- expect = "\x2\xC6\x6\n\"" + testFile + "\x12\x9F\x6" + gzFile;
- EXPECT_THAT(actual, StrEq(expect));
+ // generates the expected protobuf result.
+ size_t fileLen = testFile.size();
+ size_t totalLen = 1 + get_varint_size(fileLen) + fileLen + 3 + gzFile.size();
+ uint8_t header[20];
+ header[0] = '\x2'; // header 0 << 3 + 2
+ uint8_t* ptr = write_raw_varint(header + 1, totalLen);
+ *ptr = '\n'; // header 1 << 3 + 2
+ ptr = write_raw_varint(++ptr, fileLen);
+ expected.assign((const char*)header, ptr - header);
+ expected += testFile + "\x12\x9F\x6" + gzFile;
+ EXPECT_THAT(actual, StrEq(expected));
}
TEST_F(SectionTest, GZipSectionNoFileFound) {
GZipSection gs(NOOP_PARSER, "/tmp/nonexist1", "/tmp/nonexist2", NULL);
requests.setMainFd(STDOUT_FILENO);
- ASSERT_EQ(-1, gs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, gs.Execute(&requests));
}
TEST_F(SectionTest, CommandSectionConstructor) {
@@ -173,12 +185,12 @@
CommandSection cs3(1, 3123, "echo", "\"this is a test\"", "ooo", NULL);
CommandSection cs4(2, 43214, "single_command", NULL);
- EXPECT_THAT(cs1.name.string(), StrEq("echo"));
- EXPECT_THAT(cs2.name.string(), StrEq("single_command"));
+ EXPECT_THAT(cs1.name.string(), StrEq("cmd echo \"this is a test\" ooo"));
+ EXPECT_THAT(cs2.name.string(), StrEq("cmd single_command"));
EXPECT_EQ(3123, cs3.timeoutMs);
EXPECT_EQ(43214, cs4.timeoutMs);
- EXPECT_THAT(cs3.name.string(), StrEq("echo"));
- EXPECT_THAT(cs4.name.string(), StrEq("single_command"));
+ EXPECT_THAT(cs3.name.string(), StrEq("cmd echo \"this is a test\" ooo"));
+ EXPECT_THAT(cs4.name.string(), StrEq("cmd single_command"));
}
TEST_F(SectionTest, CommandSectionEcho) {
@@ -216,7 +228,7 @@
requests.setMainFd(STDOUT_FILENO);
CaptureStdout();
ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
- string results = GetCapturedStdout();
+ std::string results = GetCapturedStdout();
EXPECT_FALSE(results.empty());
}
@@ -225,7 +237,7 @@
requests.setMainFd(STDOUT_FILENO);
CaptureStdout();
ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
- string results = GetCapturedStdout();
+ std::string results = GetCapturedStdout();
EXPECT_FALSE(results.empty());
}
@@ -293,7 +305,7 @@
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
- string content, expect;
+ std::string content, expect;
expect = VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3;
char c = (char)expect.size();
EXPECT_TRUE(ReadFileToString(output1.path, &content));
@@ -335,7 +347,7 @@
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
- string content, expect;
+ std::string content, expect;
expect = STRING_FIELD_2 + FIX64_FIELD_3;
char c = (char)expect.size();
diff --git a/cmds/incidentd/tests/Throttler_test.cpp b/cmds/incidentd/tests/Throttler_test.cpp
index 213dcef..8488c99 100644
--- a/cmds/incidentd/tests/Throttler_test.cpp
+++ b/cmds/incidentd/tests/Throttler_test.cpp
@@ -20,6 +20,8 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
+using namespace android::os::incidentd;
+
TEST(ThrottlerTest, DataSizeExceeded) {
Throttler t(100, 100000);
EXPECT_FALSE(t.shouldThrottle());
diff --git a/cmds/incidentd/tests/section_list.cpp b/cmds/incidentd/tests/section_list.cpp
index bd2d15c..1d7f2b6 100644
--- a/cmds/incidentd/tests/section_list.cpp
+++ b/cmds/incidentd/tests/section_list.cpp
@@ -1,6 +1,10 @@
// This file is a dummy section_list.cpp used for test only.
#include "section_list.h"
+namespace android {
+namespace os {
+namespace incidentd {
+
const Section* SECTION_LIST[] = {NULL};
Privacy sub_field_1{1, 1, NULL, DEST_LOCAL, NULL};
@@ -16,3 +20,7 @@
const Privacy** PRIVACY_POLICY_LIST = const_cast<const Privacy**>(final_list);
const int PRIVACY_POLICY_COUNT = 2;
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
\ No newline at end of file
diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java
index 9df229c..6676196 100644
--- a/cmds/media/src/com/android/commands/media/Media.java
+++ b/cmds/media/src/com/android/commands/media/Media.java
@@ -264,13 +264,13 @@
} else if ("q".equals(line) || "quit".equals(line)) {
break;
} else if ("play".equals(line)) {
- mController.play();
+ mController.play("");
} else if ("pause".equals(line)) {
- mController.pause();
+ mController.pause("");
} else if ("next".equals(line)) {
- mController.next();
+ mController.next("");
} else if ("previous".equals(line)) {
- mController.previous();
+ mController.previous("");
} else {
System.out.println("Invalid command: " + line);
}
diff --git a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
index b76d669..37b7acf 100644
--- a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
+++ b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
@@ -29,23 +29,21 @@
private String[] mArgs;
private int mNextArg;
private String mCurArgData;
- private boolean mIsForegroundRequest;
+
+ private int mExemptionFlag = ContentResolver.SYNC_EXEMPTION_NONE;
enum Operation {
REQUEST_SYNC {
@Override
void invoke(RequestSync caller) {
- if (caller.mIsForegroundRequest) {
- caller.mExtras.putBoolean(
- ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC, true);
- } else {
- caller.mExtras.putBoolean(
- ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC, true);
+ final int flag = caller.mExemptionFlag;
+ caller.mExtras.putInt(ContentResolver.SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG, flag);
+ if (flag == ContentResolver.SYNC_EXEMPTION_NONE) {
System.out.println(
"Making a sync request as a background app.\n"
+ "Note: request may be throttled by App Standby.\n"
+ "To override this behavior and run a sync immediately,"
- + " pass a -f option.\n");
+ + " pass a -f or -F option (use -h for help).\n");
}
final SyncRequest request =
new SyncRequest.Builder()
@@ -213,7 +211,10 @@
mExtras.putBoolean(key, Boolean.valueOf(value));
} else if (opt.equals("-f") || opt.equals("--foreground")) {
- mIsForegroundRequest = true;
+ mExemptionFlag = ContentResolver.SYNC_EXEMPTION_ACTIVE;
+
+ } else if (opt.equals("-F") || opt.equals("--top")) {
+ mExemptionFlag = ContentResolver.SYNC_EXEMPTION_ACTIVE_WITH_TEMP;
} else {
System.err.println("Error: Unknown option: " + opt);
@@ -293,7 +294,9 @@
" -a|--authority <AUTHORITY>\n" +
" App-standby related options\n" +
"\n" +
- " -f|--foreground (Exempt a sync from app standby)\n" +
+ " -f|--foreground (cause WORKING_SET, FREQUENT sync adapters" +
+ " to run immediately)\n" +
+ " -F|--top (cause even RARE sync adapters to run immediately)\n" +
" ContentResolver extra options:\n" +
" --is|--ignore-settings: Add SYNC_EXTRAS_IGNORE_SETTINGS\n" +
" --ib|--ignore-backoff: Add SYNC_EXTRAS_IGNORE_BACKOFF\n" +
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 556709b..7723615 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -202,11 +202,14 @@
tests/statsd_test_util.cpp \
tests/e2e/WakelockDuration_e2e_test.cpp \
tests/e2e/MetricConditionLink_e2e_test.cpp \
+ tests/e2e/Alarm_e2e_test.cpp \
tests/e2e/Attribution_e2e_test.cpp \
tests/e2e/GaugeMetric_e2e_push_test.cpp \
tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp \
tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp \
- tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp
+ tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp \
+ tests/e2e/Anomaly_count_e2e_test.cpp \
+ tests/e2e/Anomaly_duration_sum_e2e_test.cpp
LOCAL_STATIC_LIBRARIES := \
$(statsd_common_static_libraries) \
diff --git a/cmds/statsd/benchmark/metric_util.cpp b/cmds/statsd/benchmark/metric_util.cpp
index b67764b..fae186a 100644
--- a/cmds/statsd/benchmark/metric_util.cpp
+++ b/cmds/statsd/benchmark/metric_util.cpp
@@ -127,25 +127,25 @@
}
AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
- const string& name, ActivityForegroundStateChanged::Activity activity) {
+ const string& name, ActivityForegroundStateChanged::State state) {
AtomMatcher atom_matcher;
atom_matcher.set_id(StringToId(name));
auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
field_value_matcher->set_field(4); // Activity field.
- field_value_matcher->set_eq_int(activity);
+ field_value_matcher->set_eq_int(state);
return atom_matcher;
}
AtomMatcher CreateMoveToBackgroundAtomMatcher() {
return CreateActivityForegroundStateChangedAtomMatcher(
- "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
+ "MoveToBackground", ActivityForegroundStateChanged::BACKGROUND);
}
AtomMatcher CreateMoveToForegroundAtomMatcher() {
return CreateActivityForegroundStateChangedAtomMatcher(
- "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
+ "MoveToForeground", ActivityForegroundStateChanged::FOREGROUND);
}
Predicate CreateScheduledJobPredicate() {
@@ -315,25 +315,25 @@
}
std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
- const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
+ const int uid, const ActivityForegroundStateChanged::State state, uint64_t timestampNs) {
auto event = std::make_unique<LogEvent>(
android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
event->write(uid);
event->write("pkg_name");
event->write("class_name");
- event->write(activity);
+ event->write(state);
event->init();
return event;
}
std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
return CreateActivityForegroundStateChangedEvent(
- uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
+ uid, ActivityForegroundStateChanged::BACKGROUND, timestampNs);
}
std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
return CreateActivityForegroundStateChangedEvent(
- uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
+ uid, ActivityForegroundStateChanged::FOREGROUND, timestampNs);
}
std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
@@ -366,7 +366,7 @@
sp<AlarmMonitor> periodicAlarmMonitor;
sp<StatsLogProcessor> processor = new StatsLogProcessor(
uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){});
- processor->OnConfigUpdated(key, config);
+ processor->OnConfigUpdated(0, key, config);
return processor;
}
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index a35570b..f00cdb3 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -79,15 +79,13 @@
mSendBroadcast(sendBroadcast),
mTimeBaseSec(timeBaseSec),
mLastLogTimestamp(0) {
- StatsPullerManager statsPullerManager;
- statsPullerManager.SetTimeBaseSec(mTimeBaseSec);
}
StatsLogProcessor::~StatsLogProcessor() {
}
void StatsLogProcessor::onAnomalyAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
for (const auto& itr : mMetricsManagers) {
@@ -95,7 +93,7 @@
}
}
void StatsLogProcessor::onPeriodicAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
@@ -177,7 +175,7 @@
uint64_t curTimeSec = getElapsedRealtimeSec();
if (curTimeSec - mLastPullerCacheClearTimeSec > StatsdStats::kPullerCacheClearIntervalSec) {
- mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec);
+ mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC);
mLastPullerCacheClearTimeSec = curTimeSec;
}
@@ -193,17 +191,13 @@
}
}
-void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) {
+void StatsLogProcessor::OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+ const StatsdConfig& config) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
VLOG("Updated configuration for key %s", key.ToString().c_str());
sp<MetricsManager> newMetricsManager =
- new MetricsManager(key, config, mTimeBaseSec, mUidMap,
+ new MetricsManager(key, config, mTimeBaseSec, (timestampNs - 1) / NS_PER_SEC + 1, mUidMap,
mAnomalyAlarmMonitor, mPeriodicAlarmMonitor);
- auto it = mMetricsManagers.find(key);
- if (it == mMetricsManagers.end() && mMetricsManagers.size() > StatsdStats::kMaxConfigCount) {
- ALOGE("Can't accept more configs!");
- return;
- }
if (newMetricsManager->isConfigValid()) {
mUidMap->OnConfigUpdated(key);
@@ -213,7 +207,6 @@
mUidMap->addListener(newMetricsManager.get());
}
mMetricsManagers[key] = newMetricsManager;
- // Why doesn't this work? mMetricsManagers.insert({key, std::move(newMetricsManager)});
VLOG("StatsdConfig valid");
} else {
// If there is any error in the config, don't use it.
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 1be4dc5..1c4698f 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -42,7 +42,8 @@
void OnLogEvent(LogEvent* event);
- void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config);
+ void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+ const StatsdConfig& config);
void OnConfigRemoved(const ConfigKey& key);
size_t GetMetricsSize(const ConfigKey& key) const;
@@ -51,12 +52,12 @@
/* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */
void onAnomalyAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
/* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */
void onPeriodicAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
/* Flushes data to disk. Data on memory will be gone after written to disk. */
@@ -69,6 +70,15 @@
void dumpStates(FILE* out, bool verbose);
private:
+ // For testing only.
+ inline sp<AlarmMonitor> getAnomalyAlarmMonitor() const {
+ return mAnomalyAlarmMonitor;
+ }
+
+ inline sp<AlarmMonitor> getPeriodicAlarmMonitor() const {
+ return mPeriodicAlarmMonitor;
+ }
+
mutable mutex mMetricsMutex;
std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers;
@@ -133,13 +143,16 @@
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_SimpleCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_SimpleCondition);
-
-
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationCondition);
-
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
+ FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
};
} // namespace statsd
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index b03b4b4..7b0d5d9 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -595,7 +595,7 @@
status_t StatsService::cmd_print_pulled_metrics(FILE* out, const Vector<String8>& args) {
int s = atoi(args[1].c_str());
vector<shared_ptr<LogEvent> > stats;
- if (mStatsPullerManager.Pull(s, &stats)) {
+ if (mStatsPullerManager.Pull(s, getElapsedRealtimeNs(), &stats)) {
for (const auto& it : stats) {
fprintf(out, "Pull from %d: %s\n", s, it->ToString().c_str());
}
@@ -698,7 +698,7 @@
"Only system uid can call informAlarmForSubscriberTriggeringFired");
}
- uint64_t currentTimeSec = time(nullptr);
+ uint64_t currentTimeSec = getElapsedRealtimeSec();
std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet =
mPeriodicAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
if (alarmSet.size() > 0) {
diff --git a/cmds/statsd/src/anomaly/AlarmTracker.cpp b/cmds/statsd/src/anomaly/AlarmTracker.cpp
index eb28383..70e6e84 100644
--- a/cmds/statsd/src/anomaly/AlarmTracker.cpp
+++ b/cmds/statsd/src/anomaly/AlarmTracker.cpp
@@ -30,7 +30,8 @@
namespace os {
namespace statsd {
-AlarmTracker::AlarmTracker(uint64_t startMillis,
+AlarmTracker::AlarmTracker(const uint64_t startMillis,
+ const uint64_t currentMillis,
const Alarm& alarm, const ConfigKey& configKey,
const sp<AlarmMonitor>& alarmMonitor)
: mAlarmConfig(alarm),
@@ -38,13 +39,19 @@
mAlarmMonitor(alarmMonitor) {
VLOG("AlarmTracker() called");
mAlarmSec = (startMillis + mAlarmConfig.offset_millis()) / MS_PER_SEC;
+ // startMillis is the time statsd is created. We need to find the 1st alarm timestamp after
+ // the config is added to statsd.
+ mAlarmSec = findNextAlarmSec(currentMillis / MS_PER_SEC); // round up
mInternalAlarm = new InternalAlarm{static_cast<uint32_t>(mAlarmSec)};
- mAlarmMonitor->add(mInternalAlarm);
+ VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec);
+ if (mAlarmMonitor != nullptr) {
+ mAlarmMonitor->add(mInternalAlarm);
+ }
}
AlarmTracker::~AlarmTracker() {
VLOG("~AlarmTracker() called");
- if (mInternalAlarm != nullptr) {
+ if (mInternalAlarm != nullptr && mAlarmMonitor != nullptr) {
mAlarmMonitor->remove(mInternalAlarm);
}
}
@@ -53,25 +60,34 @@
mSubscriptions.push_back(subscription);
}
-uint64_t AlarmTracker::findNextAlarmSec(uint64_t currentTimeSec) {
- int periodsForward = (currentTimeSec - mAlarmSec) * MS_PER_SEC / mAlarmConfig.period_millis();
- return mAlarmSec + (periodsForward + 1) * mAlarmConfig.period_millis() / MS_PER_SEC;
+int64_t AlarmTracker::findNextAlarmSec(int64_t currentTimeSec) {
+ if (currentTimeSec <= mAlarmSec) {
+ return mAlarmSec;
+ }
+ int64_t periodsForward =
+ ((currentTimeSec - mAlarmSec) * MS_PER_SEC - 1) / mAlarmConfig.period_millis() + 1;
+ return mAlarmSec + periodsForward * mAlarmConfig.period_millis() / MS_PER_SEC;
}
void AlarmTracker::informAlarmsFired(
const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) {
- if (firedAlarms.empty() || firedAlarms.find(mInternalAlarm) == firedAlarms.end()) {
+ if (firedAlarms.empty() || mInternalAlarm == nullptr ||
+ firedAlarms.find(mInternalAlarm) == firedAlarms.end()) {
return;
}
if (!mSubscriptions.empty()) {
+ VLOG("AlarmTracker triggers the subscribers.");
triggerSubscribers(mAlarmConfig.id(), DEFAULT_METRIC_DIMENSION_KEY, mConfigKey,
mSubscriptions);
}
firedAlarms.erase(mInternalAlarm);
- mAlarmSec = findNextAlarmSec(timestampNs / NS_PER_SEC);
+ mAlarmSec = findNextAlarmSec((timestampNs-1) / NS_PER_SEC + 1); // round up
mInternalAlarm = new InternalAlarm{static_cast<uint32_t>(mAlarmSec)};
- mAlarmMonitor->add(mInternalAlarm);
+ VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec);
+ if (mAlarmMonitor != nullptr) {
+ mAlarmMonitor->add(mInternalAlarm);
+ }
}
} // namespace statsd
diff --git a/cmds/statsd/src/anomaly/AlarmTracker.h b/cmds/statsd/src/anomaly/AlarmTracker.h
index d59dacaa..962a014 100644
--- a/cmds/statsd/src/anomaly/AlarmTracker.h
+++ b/cmds/statsd/src/anomaly/AlarmTracker.h
@@ -34,7 +34,8 @@
class AlarmTracker : public virtual RefBase {
public:
- AlarmTracker(uint64_t startMillis,
+ AlarmTracker(const uint64_t startMillis,
+ const uint64_t currentMillis,
const Alarm& alarm, const ConfigKey& configKey,
const sp<AlarmMonitor>& subscriberAlarmMonitor);
@@ -48,13 +49,18 @@
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms);
protected:
- uint64_t findNextAlarmSec(uint64_t currentTimeMillis);
+ // For test only. Returns the alarm timestamp in seconds. Otherwise returns 0.
+ inline uint32_t getAlarmTimestampSec() const {
+ return mInternalAlarm == nullptr ? 0 : mInternalAlarm->timestampSec;
+ }
+
+ int64_t findNextAlarmSec(int64_t currentTimeMillis);
// statsd_config.proto Alarm message that defines this tracker.
const Alarm mAlarmConfig;
// A reference to the Alarm's config key.
- const ConfigKey& mConfigKey;
+ const ConfigKey mConfigKey;
// The subscriptions that depend on this alarm.
std::vector<Subscription> mSubscriptions;
@@ -63,12 +69,13 @@
sp<AlarmMonitor> mAlarmMonitor;
// The current expected alarm time in seconds.
- uint64_t mAlarmSec;
+ int64_t mAlarmSec;
// The current alarm.
sp<const InternalAlarm> mInternalAlarm;
FRIEND_TEST(AlarmTrackerTest, TestTriggerTimestamp);
+ FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
};
} // namespace statsd
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
index 49de1ac..f0960e3 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
@@ -66,6 +66,9 @@
void AnomalyTracker::advanceMostRecentBucketTo(const int64_t& bucketNum) {
VLOG("advanceMostRecentBucketTo() called.");
+ if (mNumOfPastBuckets <= 0) {
+ return;
+ }
if (bucketNum <= mMostRecentBucketNum) {
ALOGW("Cannot advance buckets backwards (bucketNum=%lld but mMostRecentBucketNum=%lld)",
(long long)bucketNum, (long long)mMostRecentBucketNum);
@@ -170,7 +173,8 @@
int64_t AnomalyTracker::getPastBucketValue(const MetricDimensionKey& key,
const int64_t& bucketNum) const {
- if (bucketNum < 0 || bucketNum <= mMostRecentBucketNum - mNumOfPastBuckets
+ if (bucketNum < 0 || mMostRecentBucketNum < 0
+ || bucketNum <= mMostRecentBucketNum - mNumOfPastBuckets
|| bucketNum > mMostRecentBucketNum) {
return 0;
}
@@ -241,14 +245,10 @@
}
bool AnomalyTracker::isInRefractoryPeriod(const uint64_t& timestampNs,
- const MetricDimensionKey& key) {
+ const MetricDimensionKey& key) const {
const auto& it = mRefractoryPeriodEndsSec.find(key);
if (it != mRefractoryPeriodEndsSec.end()) {
- if (timestampNs < it->second * NS_PER_SEC) {
- return true;
- } else {
- mRefractoryPeriodEndsSec.erase(key);
- }
+ return timestampNs < it->second * NS_PER_SEC;
}
return false;
}
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.h b/cmds/statsd/src/anomaly/AnomalyTracker.h
index d3da7dc..15671a6 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.h
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.h
@@ -113,6 +113,13 @@
}
protected:
+ // For testing only.
+ // Returns the alarm timestamp in seconds for the query dimension if it exists. Otherwise
+ // returns 0.
+ virtual uint32_t getAlarmTimestampSec(const MetricDimensionKey& dimensionKey) const {
+ return 0; // The base AnomalyTracker class doesn't have alarms.
+ }
+
// statsd_config.proto Alert message that defines this tracker.
const Alert mAlert;
@@ -120,7 +127,7 @@
std::vector<Subscription> mSubscriptions;
// A reference to the Alert's config key.
- const ConfigKey& mConfigKey;
+ const ConfigKey mConfigKey;
// Number of past buckets. One less than the total number of buckets needed
// for the anomaly detection (since the current bucket is not in the past).
@@ -159,8 +166,7 @@
void subtractValueFromSum(const MetricDimensionKey& key, const int64_t& bucketValue);
// Returns true if in the refractory period, else false.
- // If there is a stored refractory period but it ended prior to timestampNs, it is removed.
- bool isInRefractoryPeriod(const uint64_t& timestampNs, const MetricDimensionKey& key);
+ bool isInRefractoryPeriod(const uint64_t& timestampNs, const MetricDimensionKey& key) const;
// Calculates the corresponding bucket index within the circular array.
// Requires bucketNum >= 0.
@@ -176,6 +182,9 @@
FRIEND_TEST(AnomalyTrackerTest, TestSparseBuckets);
FRIEND_TEST(GaugeMetricProducerTest, TestAnomalyDetection);
FRIEND_TEST(CountMetricProducerTest, TestAnomalyDetectionUnSliced);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
};
} // namespace statsd
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
index 79067eb..cdc4251 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
@@ -38,11 +38,10 @@
void DurationAnomalyTracker::startAlarm(const MetricDimensionKey& dimensionKey,
const uint64_t& timestampNs) {
// Alarms are stored in secs. Must round up, since if it fires early, it is ignored completely.
- uint32_t timestampSec = static_cast<uint32_t>((timestampNs -1)/ NS_PER_SEC) + 1; // round up
+ uint32_t timestampSec = static_cast<uint32_t>((timestampNs -1) / NS_PER_SEC) + 1; // round up
if (isInRefractoryPeriod(timestampNs, dimensionKey)) {
- // TODO: Bug! By the refractory's end, the data might be erased and the alarm inapplicable.
- VLOG("Setting a delayed anomaly alarm lest it fall in the refractory period");
- timestampSec = getRefractoryPeriodEndsSec(dimensionKey) + 1;
+ VLOG("Not setting anomaly alarm since it would fall in the refractory period.");
+ return;
}
auto itr = mAlarms.find(dimensionKey);
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
index 92bb2bc..53155d9 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
@@ -52,6 +52,13 @@
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) override;
protected:
+ // Returns the alarm timestamp in seconds for the query dimension if it exists. Otherwise
+ // returns 0.
+ uint32_t getAlarmTimestampSec(const MetricDimensionKey& dimensionKey) const override {
+ auto it = mAlarms.find(dimensionKey);
+ return it == mAlarms.end() ? 0 : it->second->timestampSec;
+ }
+
// The alarms owned by this tracker. The alarm monitor also shares the alarm pointers when they
// are still active.
std::unordered_map<MetricDimensionKey, sp<const InternalAlarm>> mAlarms;
diff --git a/cmds/statsd/src/anomaly/subscriber_util.cpp b/cmds/statsd/src/anomaly/subscriber_util.cpp
index e796d19..3f69a2c 100644
--- a/cmds/statsd/src/anomaly/subscriber_util.cpp
+++ b/cmds/statsd/src/anomaly/subscriber_util.cpp
@@ -55,8 +55,9 @@
}
break;
case Subscription::SubscriberInformationCase::kPerfettoDetails:
- if (!CollectPerfettoTraceAndUploadToDropbox(subscription.perfetto_details())) {
- ALOGW("Failed to generate prefetto traces.");
+ if (!CollectPerfettoTraceAndUploadToDropbox(subscription.perfetto_details(),
+ rule_id, configKey)) {
+ ALOGW("Failed to generate perfetto traces.");
}
break;
case Subscription::SubscriberInformationCase::kBroadcastSubscriberDetails:
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 99611f4..ab9c7e8 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -16,7 +16,6 @@
syntax = "proto2";
-// TODO: Not the right package and class name
package android.os.statsd;
option java_package = "com.android.os";
option java_outer_classname = "AtomsProto";
@@ -49,7 +48,7 @@
oneof pushed {
// For StatsLog reasons, 1 is illegal and will not work. Must start at 2.
BleScanStateChanged ble_scan_state_changed = 2;
- BleUnoptimizedScanStateChanged ble_unoptimized_scan_state_changed = 3;
+ // 3 is available for use
BleScanResultReceived ble_scan_result_received = 4;
SensorStateChanged sensor_state_changed = 5;
GpsScanStateChanged gps_scan_state_changed = 6;
@@ -60,12 +59,12 @@
LongPartialWakelockStateChanged long_partial_wakelock_state_changed = 11;
MobileRadioPowerStateChanged mobile_radio_power_state_changed = 12;
WifiRadioPowerStateChanged wifi_radio_power_state_changed = 13;
- // TODO: 14-19 are blank, but need not be
+ // 14 - 19 are available
BatterySaverModeStateChanged battery_saver_mode_state_changed = 20;
DeviceIdleModeStateChanged device_idle_mode_state_changed = 21;
DeviceIdlingModeStateChanged device_idling_mode_state_changed = 22;
AudioStateChanged audio_state_changed = 23;
- MediaCodecActivityChanged media_codec_activity_changed = 24;
+ MediaCodecStateChanged media_codec_state_changed = 24;
CameraStateChanged camera_state_changed = 25;
FlashlightStateChanged flashlight_state_changed = 26;
UidProcessStateChanged uid_process_state_changed = 27;
@@ -74,8 +73,7 @@
BatteryLevelChanged battery_level_changed = 30;
ChargingStateChanged charging_state_changed = 31;
PluggedStateChanged plugged_state_changed = 32;
- // TODO: 33 is blank, but is available for use.
- DeviceOnStatusChanged device_on_status_changed = 34;
+ // 33 - 34 are available
WakeupAlarmOccurred wakeup_alarm_occurred = 35;
KernelWakeupReported kernel_wakeup_reported = 36;
WifiLockStateChanged wifi_lock_state_changed = 37;
@@ -86,12 +84,12 @@
ActivityForegroundStateChanged activity_foreground_state_changed = 42;
IsolatedUidChanged isolated_uid_changed = 43;
PacketWakeupOccurred packet_wakeup_occurred = 44;
- DropboxErrorChanged dropbox_error_changed = 45;
+ // 45 is available
AnomalyDetected anomaly_detected = 46;
AppBreadcrumbReported app_breadcrumb_reported = 47;
- AppStartChanged app_start_changed = 48;
- AppStartCancelChanged app_start_cancel_changed = 49;
- AppStartFullyDrawnChanged app_start_fully_drawn_changed = 50;
+ AppStartOccurred app_start_occurred = 48;
+ AppStartCanceled app_start_canceled = 49;
+ AppStartFullyDrawn app_start_fully_drawn = 50;
LmkKillOccurred lmk_kill_occurred = 51;
PictureInPictureStateChanged picture_in_picture_state_changed = 52;
WifiMulticastLockStateChanged wifi_multicast_lock_state_changed = 53;
@@ -106,18 +104,25 @@
KeyguardStateChanged keyguard_state_changed = 62;
KeyguardBouncerStateChanged keyguard_bouncer_state_changed = 63;
KeyguardBouncerPasswordEntered keyguard_bouncer_password_entered = 64;
- AppDied app_died=65;
+ AppDied app_died = 65;
ResourceConfigurationChanged resource_configuration_changed = 66;
BluetoothEnabledStateChanged bluetooth_enabled_state_changed = 67;
BluetoothConnectionStateChanged bluetooth_connection_state_changed = 68;
- BluetoothA2dpAudioStateChanged bluetooth_a2dp_audio_state_changed = 69;
- UsbConnectorStateChanged usb_connector_changed = 70;
+ // 69 is blank but need not be.
+ UsbConnectorStateChanged usb_connector_state_changed = 70;
SpeakerImpedanceReported speaker_impedance_reported = 71;
HardwareFailed hardware_failed = 72;
PhysicalDropDetected physical_drop_detected = 73;
ChargeCyclesReported charge_cycles_reported = 74;
MobileConnectionStateChanged mobile_connection_state_changed = 75;
MobileRadioTechnologyChanged mobile_radio_technology_changed = 76;
+ UsbDeviceAttached usb_device_attached = 77;
+ AppCrashOccurred app_crash_occurred = 78;
+ ANROccurred anr_occurred = 79;
+ WTFOccurred wtf_occurred = 80;
+ LowMemReported low_mem_reported = 81;
+
+
}
// Pulled events will start at field 10000.
@@ -133,7 +138,7 @@
CpuTimePerFreq cpu_time_per_freq = 10008;
CpuTimePerUid cpu_time_per_uid = 10009;
CpuTimePerUidFreq cpu_time_per_uid_freq = 10010;
- WifiActivityEnergyInfo wifi_activity_energy_info = 10011;
+ WifiActivityInfo wifi_activity_info = 10011;
ModemActivityInfo modem_activity_info = 10012;
BluetoothActivityInfo bluetooth_activity_info = 10007;
ProcessMemoryState process_memory_state = 10013;
@@ -223,28 +228,26 @@
* frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message ProcessLifeCycleStateChanged {
- // TODO: should be a string tagged w/ uid annotation
optional int32 uid = 1 [(is_uid) = true];
// The process name (usually same as the app name).
- optional string name = 2;
+ optional string process_name = 2;
// What lifecycle state the process changed to.
// This enum is specific to atoms.proto.
- enum Event {
- PROCESS_FINISHED = 0;
- PROCESS_STARTED = 1;
- PROCESS_CRASHED = 2;
- PROCESS_ANRED = 3;
+ enum State {
+ FINISHED = 0;
+ STARTED = 1;
+ CRASHED = 2;
}
- optional Event event = 3;
+ optional State state = 3;
}
/**
* Logs when the ble scan state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * packages/apps/Bluetooth/src/com/android/bluetooth/gatt/AppScanStats.java
*/
message BleScanStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -252,25 +255,17 @@
enum State {
OFF = 0;
ON = 1;
+ // RESET indicates all ble stopped. Used when it (re)starts (e.g. after it crashes).
+ RESET = 2;
}
optional State state = 2;
-}
-/**
- * Logs when an unoptimized ble scan state changes.
- *
- * Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-// TODO: Consider changing to tracking per-scanner-id (log from AppScanStats).
-message BleUnoptimizedScanStateChanged {
- repeated AttributionNode attribution_node = 1;
-
- enum State {
- OFF = 0;
- ON = 1;
- }
- optional State state = 2;
+ // Does the scan have a filter.
+ optional bool is_filtered = 3;
+ // Whether the scan is a CALLBACK_TYPE_FIRST_MATCH scan. Called 'background' scan internally.
+ optional bool is_first_match = 4;
+ // Whether the scan set to piggy-back off the results of other scans (SCAN_MODE_OPPORTUNISTIC).
+ optional bool is_opportunistic = 5;
}
/**
@@ -284,19 +279,18 @@
repeated AttributionNode attribution_node = 1;
// Number of ble scan results returned.
- optional int32 num_of_results = 2;
+ optional int32 num_results = 2;
}
/**
* Logs when a sensor state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message SensorStateChanged {
repeated AttributionNode attribution_node = 1;
- // TODO: Is there a way to get the actual name of the sensor?
// The id (int) of the sensor.
optional int32 sensor_id = 2;
@@ -329,13 +323,13 @@
* Logs when a sync manager sync state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message SyncStateChanged {
repeated AttributionNode attribution_node = 1;
// Name of the sync (as named in the app). Can be chosen at run-time.
- optional string name = 2;
+ optional string sync_name = 2;
enum State {
OFF = 0;
@@ -348,13 +342,13 @@
* Logs when a job scheduler job state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message ScheduledJobStateChanged {
repeated AttributionNode attribution_node = 1;
// Name of the job (as named in the app)
- optional string name = 2;
+ optional string job_name = 2;
enum State {
FINISHED = 0;
@@ -365,7 +359,7 @@
// The reason a job has stopped.
// This is only applicable when the state is FINISHED.
- // The default value is CANCELED.
+ // The default value is STOP_REASON_UNKNOWN.
optional android.app.job.StopReasonEnum stop_reason = 4;
}
@@ -373,7 +367,7 @@
* Logs when the audio state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message AudioStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -381,6 +375,8 @@
enum State {
OFF = 0;
ON = 1;
+ // RESET indicates all audio stopped. Used when it (re)starts (e.g. after it crashes).
+ RESET = 2;
}
optional State state = 2;
}
@@ -389,14 +385,16 @@
* Logs when the video codec state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
-message MediaCodecActivityChanged {
+message MediaCodecStateChanged {
repeated AttributionNode attribution_node = 1;
enum State {
OFF = 0;
ON = 1;
+ // RESET indicates all mediaCodec stopped. Used when it (re)starts (e.g. after it crashes).
+ RESET = 2;
}
optional State state = 2;
}
@@ -405,7 +403,7 @@
* Logs when the flashlight state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message FlashlightStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -413,6 +411,8 @@
enum State {
OFF = 0;
ON = 1;
+ // RESET indicates all flashlight stopped. Used when it (re)starts (e.g. after it crashes).
+ RESET = 2;
}
optional State state = 2;
}
@@ -421,7 +421,7 @@
* Logs when the camera state changes.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message CameraStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -429,6 +429,8 @@
enum State {
OFF = 0;
ON = 1;
+ // RESET indicates all camera stopped. Used when it (re)starts (e.g. after it crashes).
+ RESET = 2;
}
optional State state = 2;
}
@@ -559,22 +561,6 @@
optional android.os.BatteryPluggedStateEnum state = 1;
}
-// TODO: Define this more precisely.
-// TODO: Log the ON state somewhere. It isn't currently logged anywhere.
-/**
- * Logs when the device turns off or on.
- *
- * Logged from:
- * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
- */
-message DeviceOnStatusChanged {
- enum State {
- OFF = 0;
- ON = 1;
- }
- optional State state = 1;
-}
-
/**
* Logs when an app's wakeup alarm fires.
*
@@ -596,8 +582,7 @@
* frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
*/
message MobileRadioPowerStateChanged {
- // TODO: Add attribution instead of uid?
- optional int32 uid = 1 [(is_uid) = true];
+ repeated AttributionNode attribution_node = 1;
// Power state, from frameworks/base/core/proto/android/telephony/enums.proto.
optional android.telephony.DataConnectionPowerStateEnum state = 2;
@@ -611,8 +596,7 @@
* frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
*/
message WifiRadioPowerStateChanged {
- // TODO: Add attribution instead of uid?
- optional int32 uid = 1 [(is_uid) = true];
+ repeated AttributionNode attribution_node = 1;
// Power state, from frameworks/base/core/proto/android/telephony/enums.proto.
optional android.telephony.DataConnectionPowerStateEnum state = 2;
@@ -966,6 +950,21 @@
optional int32 sim_slot_index = 2;
}
+/**
+ * Logs the VID and PID of any connected USB devices.
+ *
+ * Notes if any Audio, HID (input buttons/mouse/keyboard), or Storage interfaces are present.
+ *
+ * Logged by Vendor.
+ */
+message UsbDeviceAttached {
+ optional int32 vid = 1;
+ optional int32 pid = 2;
+ optional bool has_audio = 3;
+ optional bool has_hid = 4;
+ optional bool has_storage = 5;
+}
+
/**
* Logs when Bluetooth is enabled and disabled.
@@ -1009,22 +1008,6 @@
}
/**
- * Logs when Bluetooth A2dp audio streaming state changes.
- *
- * Logged from:
- * TODO(b/73971848)
- */
-message BluetoothA2dpAudioStateChanged {
- // Whether or not audio is being played using Bluetooth A2dp.
- enum State {
- UNKNOWN = 0;
- PLAY = 1;
- STOP = 2;
- }
- optional State state = 1;
-}
-
-/**
* Logs when something is plugged into or removed from the USB-C connector.
*
* Logged from:
@@ -1103,6 +1086,8 @@
optional int32 confidence_pctg = 1;
// Peak acceleration of the drop, in 1/1000s of a g.
optional int32 accel_peak_thousandths_g = 2;
+ // Duration of freefall in ms
+ optional int32 freefall_time_millis = 3;
}
/**
@@ -1135,7 +1120,6 @@
message DaveyOccurred {
// The UID that logged this atom.
optional int32 uid = 1 [(is_uid) = true];
- ;
// Amount of time it took to render the frame. Should be >=700ms.
optional int64 jank_duration_millis = 2;
@@ -1202,42 +1186,100 @@
optional string pkg_name = 2;
optional string class_name = 3;
- enum Activity {
- MOVE_TO_BACKGROUND = 0;
- MOVE_TO_FOREGROUND = 1;
+ enum State {
+ BACKGROUND = 0;
+ FOREGROUND = 1;
}
- optional Activity activity = 4;
+ optional State state = 4;
}
/**
- * Logs when an error is written to dropbox.
+ * Logs when an app crashes.
* Logged from:
* frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
*/
-message DropboxErrorChanged {
- // The uid if available. -1 means not available.
+message AppCrashOccurred {
optional int32 uid = 1 [(is_uid) = true];
- // Tag used when recording this error to dropbox. Contains data_ or system_ prefix.
- optional string tag = 2;
+ optional string event_type = 2;
// The name of the process.
+ // system_server if it is not by an app
optional string process_name = 3;
// The pid if available. -1 means not available.
optional sint32 pid = 4;
- // 1 indicates is instant app. -1 indicates Not applicable.
- optional sint32 is_instant_app = 5;
+ optional string package_name = 5;
- // The activity name if available.
- optional string activity_name = 6;
+ enum InstantApp {
+ UNAVAILABLE = 0;
+ FALSE = 1;
+ TRUE = 2;
+ }
+ optional InstantApp is_instant_app = 6;
- // The package name if available.
- optional string package_name = 7;
+ enum ForegroundState {
+ UNKNOWN = 0;
+ BACKGROUND = 1;
+ FOREGROUND = 2;
+ }
+ optional ForegroundState foreground_state = 7;
+}
- // 1 indicates in foreground. -1 indicates not available.
- optional sint32 is_foreground = 8;
+/**
+ * Logs when a WTF (What a Terrible Failure) happened.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+ */
+message WTFOccurred {
+ optional int32 uid = 1 [(is_uid) = true];
+
+ optional string tag = 2;
+
+ // The name of the process.
+ // system_server if it is not by an app
+ optional string process_name = 3;
+
+ // The pid if available. -1 means not available.
+ optional sint32 pid = 4;
+}
+
+/**
+ * Logs when system server reports low memory.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+ */
+message LowMemReported {
+}
+
+/**
+ * Logs when an app ANR (App Not Responding) occurs.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/am/AppErrors.java
+ */
+message ANROccurred {
+ optional int32 uid = 1 [(is_uid) = true];
+
+ optional string process_name = 2;
+
+ optional string short_component_name = 3;
+
+ optional string reason = 4;
+
+ enum InstantApp {
+ UNAVAILABLE = 0;
+ FALSE = 1;
+ TRUE = 2;
+ }
+ optional InstantApp is_instant_app = 5;
+
+ enum ForegroundState {
+ UNKNOWN = 0;
+ BACKGROUND = 1;
+ FOREGROUND = 2;
+ }
+ optional ForegroundState foreground_state = 6;
}
/*
@@ -1280,7 +1322,7 @@
optional int64 alert_id = 3;
}
-message AppStartChanged {
+message AppStartOccurred {
// The uid if available. -1 means not available.
optional int32 uid = 1 [(is_uid) = true];
@@ -1288,7 +1330,7 @@
optional string pkg_name = 2;
enum TransitionType {
- APP_START_TRANSITION_TYPE_UNKNOWN = 0;
+ UNKNOWN = 0;
WARM = 1;
HOT = 2;
COLD = 3;
@@ -1321,13 +1363,13 @@
optional string launch_token = 13;
// The compiler filter used when when the package was optimized.
- optional string package_optimization_compilation_filter = 14;
+ optional int32 package_optimization_compilation_filter = 14;
// The reason why the package was optimized.
- optional string package_optimization_compilation_reason = 15;
+ optional int32 package_optimization_compilation_reason = 15;
}
-message AppStartCancelChanged {
+message AppStartCanceled {
// The uid if available. -1 means not available.
optional int32 uid = 1 [(is_uid) = true];
@@ -1335,7 +1377,7 @@
optional string pkg_name = 2;
enum TransitionType {
- APP_START_TRANSITION_TYPE_UNKNOWN = 0;
+ UNKNOWN = 0;
WARM = 1;
HOT = 2;
COLD = 3;
@@ -1347,7 +1389,7 @@
optional string activity_name = 4;
}
-message AppStartFullyDrawnChanged {
+message AppStartFullyDrawn {
// The uid if available. -1 means not available.
optional int32 uid = 1 [(is_uid) = true];
@@ -1355,7 +1397,7 @@
optional string pkg_name = 2;
enum TransitionType {
- APP_START_TRANSITION_TYPE_UNKNOWN = 0;
+ UNKNOWN = 0;
WITH_BUNDLE = 1;
WITHOUT_BUNDLE = 2;
}
@@ -1440,8 +1482,8 @@
* frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
*/
message IsolatedUidChanged {
- // NOTE: DO NOT annotate uid field in this atom. This atom is specially handled in statsd.
// The host UID. Generally, we should attribute metrics from the isolated uid to the host uid.
+ // NOTE: DO NOT annotate uid field in this atom. This atom is specially handled in statsd.
optional int32 parent_uid = 1;
optional int32 isolated_uid = 2;
@@ -1602,9 +1644,8 @@
message WifiBytesTransferByFgBg {
optional int32 uid = 1 [(is_uid) = true];
- // 1 denotes foreground and 0 denotes background. This is called Set in
- // NetworkStats.
- optional int32 is_foreground = 2;
+ // 1 denotes foreground and 0 denotes background. This is called Set in NetworkStats.
+ optional bool is_foreground = 2;
optional int64 rx_bytes = 3;
@@ -1644,7 +1685,7 @@
// 1 denotes foreground and 0 denotes background. This is called Set in
// NetworkStats.
- optional int32 is_foreground = 2;
+ optional bool is_foreground = 2;
optional int64 rx_bytes = 3;
@@ -1741,7 +1782,7 @@
/**
* Pulls Wifi Controller Activity Energy Info
*/
-message WifiActivityEnergyInfo {
+message WifiActivityInfo {
// timestamp(wall clock) of record creation
optional uint64 timestamp_millis = 1;
// stack reported state
@@ -1917,7 +1958,8 @@
}
/**
- * Pulls the temperature of various parts of the device, in Celsius.
+ * Pulls the temperature of various parts of the device.
+ * The units are tenths of a degree Celsius. Eg: 30.3C is reported as 303.
*
* Pulled from:
* frameworks/base/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp
@@ -1929,6 +1971,6 @@
// The name of the temperature source. Eg. CPU0
optional string sensor_name = 2;
- // Temperature in degrees C.
- optional float temperature_C = 3;
+ // Temperature in tenths of a degree C.
+ optional int32 temperature_dC = 3;
}
diff --git a/cmds/statsd/src/condition/CombinationConditionTracker.cpp b/cmds/statsd/src/condition/CombinationConditionTracker.cpp
index 3661d2b..60a4b23 100644
--- a/cmds/statsd/src/condition/CombinationConditionTracker.cpp
+++ b/cmds/statsd/src/condition/CombinationConditionTracker.cpp
@@ -149,9 +149,9 @@
}
}
+ ConditionState newCondition =
+ evaluateCombinationCondition(mChildren, mLogicalOperation, nonSlicedConditionCache);
if (!mSliced) {
- ConditionState newCondition =
- evaluateCombinationCondition(mChildren, mLogicalOperation, nonSlicedConditionCache);
bool nonSlicedChanged = (mNonSlicedConditionState != newCondition);
mNonSlicedConditionState = newCondition;
@@ -172,7 +172,7 @@
break;
}
}
- nonSlicedConditionCache[mIndex] = ConditionState::kUnknown;
+ nonSlicedConditionCache[mIndex] = newCondition;
VLOG("CombinationPredicate %lld sliced may changed? %d", (long long)mConditionId,
conditionChangedCache[mIndex] == true);
}
diff --git a/cmds/statsd/src/condition/SimpleConditionTracker.cpp b/cmds/statsd/src/condition/SimpleConditionTracker.cpp
index 73efb39..87104a3 100644
--- a/cmds/statsd/src/condition/SimpleConditionTracker.cpp
+++ b/cmds/statsd/src/condition/SimpleConditionTracker.cpp
@@ -289,9 +289,15 @@
// The event doesn't match this condition. So we just report existing condition values.
conditionChangedCache[mIndex] = false;
if (mSliced) {
- // if the condition result is sliced. metrics won't directly get value from the
- // cache, so just set any value other than kNotEvaluated.
+ // if the condition result is sliced. The overall condition is true if any of the sliced
+ // condition is true
conditionCache[mIndex] = mInitialValue;
+ for (const auto& slicedCondition : mSlicedConditionState) {
+ if (slicedCondition.second > 0) {
+ conditionCache[mIndex] = ConditionState::kTrue;
+ break;
+ }
+ }
} else {
const auto& itr = mSlicedConditionState.find(DEFAULT_DIMENSION_KEY);
if (itr == mSlicedConditionState.end()) {
diff --git a/cmds/statsd/src/condition/StateTracker.cpp b/cmds/statsd/src/condition/StateTracker.cpp
index fe1740b..1965ce6 100644
--- a/cmds/statsd/src/condition/StateTracker.cpp
+++ b/cmds/statsd/src/condition/StateTracker.cpp
@@ -141,7 +141,7 @@
// one keys matched.
HashableDimensionKey primaryKey;
HashableDimensionKey state;
- if (!filterValues(mPrimaryKeys, event.getValues(), &primaryKey) ||
+ if ((mPrimaryKeys.size() > 0 && !filterValues(mPrimaryKeys, event.getValues(), &primaryKey)) ||
!filterValues(mOutputDimensions, event.getValues(), &state)) {
ALOGE("Failed to filter fields in the event?? panic now!");
conditionCache[mIndex] =
diff --git a/cmds/statsd/src/config/ConfigListener.h b/cmds/statsd/src/config/ConfigListener.h
index 19ccfcf..54e7770 100644
--- a/cmds/statsd/src/config/ConfigListener.h
+++ b/cmds/statsd/src/config/ConfigListener.h
@@ -40,7 +40,8 @@
/**
* A configuration was added or updated.
*/
- virtual void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) = 0;
+ virtual void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+ const StatsdConfig& config) = 0;
/**
* A configuration was removed.
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp
index f5310a4..f9aaad4 100644
--- a/cmds/statsd/src/config/ConfigManager.cpp
+++ b/cmds/statsd/src/config/ConfigManager.cpp
@@ -14,9 +14,14 @@
* limitations under the License.
*/
+#define DEBUG false // STOPSHIP if true
+#include "Log.h"
+
#include "config/ConfigManager.h"
#include "storage/StorageManager.h"
+#include "guardrail/StatsdStats.h"
+#include "stats_log_util.h"
#include "stats_util.h"
#include <android-base/file.h>
@@ -68,33 +73,47 @@
{
lock_guard <mutex> lock(mMutex);
- auto it = mConfigs.find(key);
-
const int numBytes = config.ByteSize();
vector<uint8_t> buffer(numBytes);
config.SerializeToArray(&buffer[0], numBytes);
- const bool isDuplicate =
- it != mConfigs.end() &&
- StorageManager::hasIdenticalConfig(key, buffer);
+ auto uidIt = mConfigs.find(key.GetUid());
+ // GuardRail: Limit the number of configs per uid.
+ if (uidIt != mConfigs.end()) {
+ auto it = uidIt->second.find(key);
+ if (it == uidIt->second.end() &&
+ uidIt->second.size() >= StatsdStats::kMaxConfigCountPerUid) {
+ ALOGE("ConfigManager: uid %d has exceeded the config count limit", key.GetUid());
+ return;
+ }
+ }
- // Update saved file on disk. We still update timestamp of file when
- // there exists a duplicate configuration to avoid garbage collection.
+ // Check if it's a duplicate config.
+ if (uidIt != mConfigs.end() && uidIt->second.find(key) != uidIt->second.end() &&
+ StorageManager::hasIdenticalConfig(key, buffer)) {
+ // This is a duplicate config.
+ ALOGI("ConfigManager This is a duplicate config %s", key.ToString().c_str());
+ // Update saved file on disk. We still update timestamp of file when
+ // there exists a duplicate configuration to avoid garbage collection.
+ update_saved_configs_locked(key, buffer, numBytes);
+ return;
+ }
+
+ // Update saved file on disk.
update_saved_configs_locked(key, buffer, numBytes);
- if (isDuplicate) return;
-
- // Add to set
- mConfigs.insert(key);
+ // Add to set.
+ mConfigs[key.GetUid()].insert(key);
for (sp<ConfigListener> listener : mListeners) {
broadcastList.push_back(listener);
}
}
+ const int64_t timestampNs = getElapsedRealtimeNs();
// Tell everyone
for (sp<ConfigListener> listener:broadcastList) {
- listener->OnConfigUpdated(key, config);
+ listener->OnConfigUpdated(timestampNs, key, config);
}
}
@@ -113,11 +132,10 @@
{
lock_guard <mutex> lock(mMutex);
- auto it = mConfigs.find(key);
- if (it != mConfigs.end()) {
+ auto uidIt = mConfigs.find(key.GetUid());
+ if (uidIt != mConfigs.end() && uidIt->second.find(key) != uidIt->second.end()) {
// Remove from map
- mConfigs.erase(it);
-
+ uidIt->second.erase(key);
for (sp<ConfigListener> listener : mListeners) {
broadcastList.push_back(listener);
}
@@ -150,18 +168,20 @@
{
lock_guard <mutex> lock(mMutex);
- for (auto it = mConfigs.begin(); it != mConfigs.end();) {
+ auto uidIt = mConfigs.find(uid);
+ if (uidIt == mConfigs.end()) {
+ return;
+ }
+
+ for (auto it = uidIt->second.begin(); it != uidIt->second.end(); ++it) {
// Remove from map
- if (it->GetUid() == uid) {
remove_saved_configs(*it);
removed.push_back(*it);
mConfigReceivers.erase(*it);
- it = mConfigs.erase(it);
- } else {
- it++;
- }
}
+ mConfigs.erase(uidIt);
+
for (sp<ConfigListener> listener : mListeners) {
broadcastList.push_back(listener);
}
@@ -182,17 +202,16 @@
{
lock_guard <mutex> lock(mMutex);
-
- for (auto it = mConfigs.begin(); it != mConfigs.end();) {
- // Remove from map
- removed.push_back(*it);
- auto receiverIt = mConfigReceivers.find(*it);
- if (receiverIt != mConfigReceivers.end()) {
- mConfigReceivers.erase(*it);
+ for (auto uidIt = mConfigs.begin(); uidIt != mConfigs.end();) {
+ for (auto it = uidIt->second.begin(); it != uidIt->second.end();) {
+ // Remove from map
+ removed.push_back(*it);
+ it = uidIt->second.erase(it);
}
- it = mConfigs.erase(it);
+ uidIt = mConfigs.erase(uidIt);
}
+ mConfigReceivers.clear();
for (sp<ConfigListener> listener : mListeners) {
broadcastList.push_back(listener);
}
@@ -211,8 +230,10 @@
lock_guard<mutex> lock(mMutex);
vector<ConfigKey> ret;
- for (auto it = mConfigs.cbegin(); it != mConfigs.cend(); ++it) {
- ret.push_back(*it);
+ for (auto uidIt = mConfigs.cbegin(); uidIt != mConfigs.cend(); ++uidIt) {
+ for (auto it = uidIt->second.cbegin(); it != uidIt->second.cend(); ++it) {
+ ret.push_back(*it);
+ }
}
return ret;
}
@@ -231,13 +252,15 @@
void ConfigManager::Dump(FILE* out) {
lock_guard<mutex> lock(mMutex);
- fprintf(out, "CONFIGURATIONS (%d)\n", (int)mConfigs.size());
+ fprintf(out, "CONFIGURATIONS\n");
fprintf(out, " uid name\n");
- for (const auto& key : mConfigs) {
- fprintf(out, " %6d %lld\n", key.GetUid(), (long long)key.GetId());
- auto receiverIt = mConfigReceivers.find(key);
- if (receiverIt != mConfigReceivers.end()) {
- fprintf(out, " -> received by PendingIntent as binder\n");
+ for (auto uidIt = mConfigs.cbegin(); uidIt != mConfigs.cend(); ++uidIt) {
+ for (auto it = uidIt->second.cbegin(); it != uidIt->second.cend(); ++it) {
+ fprintf(out, " %6d %lld\n", it->GetUid(), (long long)it->GetId());
+ auto receiverIt = mConfigReceivers.find(*it);
+ if (receiverIt != mConfigReceivers.end()) {
+ fprintf(out, " -> received by PendingIntent as binder\n");
+ }
}
}
}
@@ -255,331 +278,6 @@
StorageManager::writeFile(file_name.c_str(), &buffer[0], numBytes);
}
-StatsdConfig build_fake_config() {
- // HACK: Hard code a test metric for counting screen on events...
- StatsdConfig config;
- config.set_id(12345);
-
- int WAKE_LOCK_TAG_ID = 1111; // put a fake id here to make testing easier.
- int WAKE_LOCK_UID_KEY_ID = 1;
- int WAKE_LOCK_NAME_KEY = 3;
- int WAKE_LOCK_STATE_KEY = 4;
- int WAKE_LOCK_ACQUIRE_VALUE = 1;
- int WAKE_LOCK_RELEASE_VALUE = 0;
-
- int APP_USAGE_TAG_ID = 12345;
- int APP_USAGE_UID_KEY_ID = 1;
- int APP_USAGE_STATE_KEY = 2;
- int APP_USAGE_FOREGROUND = 1;
- int APP_USAGE_BACKGROUND = 0;
-
- int SCREEN_EVENT_TAG_ID = 29;
- int SCREEN_EVENT_STATE_KEY = 1;
- int SCREEN_EVENT_ON_VALUE = 2;
- int SCREEN_EVENT_OFF_VALUE = 1;
-
- int UID_PROCESS_STATE_TAG_ID = 27;
- int UID_PROCESS_STATE_UID_KEY = 1;
-
- int KERNEL_WAKELOCK_TAG_ID = 1004;
- int KERNEL_WAKELOCK_COUNT_KEY = 2;
- int KERNEL_WAKELOCK_NAME_KEY = 1;
-
- int DEVICE_TEMPERATURE_TAG_ID = 33;
- int DEVICE_TEMPERATURE_KEY = 1;
-
- // Count Screen ON events.
- CountMetric* metric = config.add_count_metric();
- metric->set_id(1); // METRIC_1
- metric->set_what(102); // "SCREEN_TURNED_ON"
- metric->set_bucket(ONE_MINUTE);
-
- // Anomaly threshold for screen-on count.
- // TODO(b/70627390): Uncomment once the bug is fixed.
- /*Alert* alert = config.add_alert();
- alert->set_id("ALERT_1");
- alert->set_metric_name("METRIC_1");
- alert->set_number_of_buckets(6);
- alert->set_trigger_if_sum_gt(10);
- alert->set_refractory_period_secs(30);
- Alert::IncidentdDetails* details = alert->mutable_incidentd_details();
- details->add_section(12);
- details->add_section(13);*/
-
- config.add_allowed_log_source("AID_ROOT");
- config.add_allowed_log_source("AID_SYSTEM");
- config.add_allowed_log_source("AID_BLUETOOTH");
- config.add_allowed_log_source("com.android.statsd.dogfood");
- config.add_allowed_log_source("com.android.systemui");
-
- // Count process state changes, slice by uid.
- metric = config.add_count_metric();
- metric->set_id(2); // "METRIC_2"
- metric->set_what(104);
- metric->set_bucket(ONE_MINUTE);
- FieldMatcher* dimensions = metric->mutable_dimensions_in_what();
- dimensions->set_field(UID_PROCESS_STATE_TAG_ID);
- dimensions->add_child()->set_field(UID_PROCESS_STATE_UID_KEY);
-
- // Anomaly threshold for background count.
- // TODO(b/70627390): Uncomment once the bug is fixed.
- /*
- alert = config.add_alert();
- alert->set_id("ALERT_2");
- alert->set_metric_name("METRIC_2");
- alert->set_number_of_buckets(4);
- alert->set_trigger_if_sum_gt(30);
- alert->set_refractory_period_secs(20);
- details = alert->mutable_incidentd_details();
- details->add_section(14);
- details->add_section(15);*/
-
- // Count process state changes, slice by uid, while SCREEN_IS_OFF
- metric = config.add_count_metric();
- metric->set_id(3);
- metric->set_what(104);
- metric->set_bucket(ONE_MINUTE);
-
- dimensions = metric->mutable_dimensions_in_what();
- dimensions->set_field(UID_PROCESS_STATE_TAG_ID);
- dimensions->add_child()->set_field(UID_PROCESS_STATE_UID_KEY);
- metric->set_condition(202);
-
- // Count wake lock, slice by uid, while SCREEN_IS_ON and app in background
- metric = config.add_count_metric();
- metric->set_id(4);
- metric->set_what(107);
- metric->set_bucket(ONE_MINUTE);
- dimensions = metric->mutable_dimensions_in_what();
- dimensions->set_field(WAKE_LOCK_TAG_ID);
- dimensions->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
-
-
- metric->set_condition(204);
- MetricConditionLink* link = metric->add_links();
- link->set_condition(203);
- link->mutable_fields_in_what()->set_field(WAKE_LOCK_TAG_ID);
- link->mutable_fields_in_what()->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- link->mutable_fields_in_condition()->set_field(APP_USAGE_TAG_ID);
- link->mutable_fields_in_condition()->add_child()->set_field(APP_USAGE_UID_KEY_ID);
-
- // Duration of an app holding any wl, while screen on and app in background, slice by uid
- DurationMetric* durationMetric = config.add_duration_metric();
- durationMetric->set_id(5);
- durationMetric->set_bucket(ONE_MINUTE);
- durationMetric->set_aggregation_type(DurationMetric_AggregationType_SUM);
- dimensions = durationMetric->mutable_dimensions_in_what();
- dimensions->set_field(WAKE_LOCK_TAG_ID);
- dimensions->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- durationMetric->set_what(205);
- durationMetric->set_condition(204);
- link = durationMetric->add_links();
- link->set_condition(203);
- link->mutable_fields_in_what()->set_field(WAKE_LOCK_TAG_ID);
- link->mutable_fields_in_what()->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- link->mutable_fields_in_condition()->set_field(APP_USAGE_TAG_ID);
- link->mutable_fields_in_condition()->add_child()->set_field(APP_USAGE_UID_KEY_ID);
-
- // max Duration of an app holding any wl, while screen on and app in background, slice by uid
- durationMetric = config.add_duration_metric();
- durationMetric->set_id(6);
- durationMetric->set_bucket(ONE_MINUTE);
- durationMetric->set_aggregation_type(DurationMetric_AggregationType_MAX_SPARSE);
- dimensions = durationMetric->mutable_dimensions_in_what();
- dimensions->set_field(WAKE_LOCK_TAG_ID);
- dimensions->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- durationMetric->set_what(205);
- durationMetric->set_condition(204);
- link = durationMetric->add_links();
- link->set_condition(203);
- link->mutable_fields_in_what()->set_field(WAKE_LOCK_TAG_ID);
- link->mutable_fields_in_what()->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- link->mutable_fields_in_condition()->set_field(APP_USAGE_TAG_ID);
- link->mutable_fields_in_condition()->add_child()->set_field(APP_USAGE_UID_KEY_ID);
-
- // Duration of an app holding any wl, while screen on and app in background
- durationMetric = config.add_duration_metric();
- durationMetric->set_id(7);
- durationMetric->set_bucket(ONE_MINUTE);
- durationMetric->set_aggregation_type(DurationMetric_AggregationType_MAX_SPARSE);
- durationMetric->set_what(205);
- durationMetric->set_condition(204);
- link = durationMetric->add_links();
- link->set_condition(203);
- link->mutable_fields_in_what()->set_field(WAKE_LOCK_TAG_ID);
- link->mutable_fields_in_what()->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- link->mutable_fields_in_condition()->set_field(APP_USAGE_TAG_ID);
- link->mutable_fields_in_condition()->add_child()->set_field(APP_USAGE_UID_KEY_ID);
-
-
- // Duration of screen on time.
- durationMetric = config.add_duration_metric();
- durationMetric->set_id(8);
- durationMetric->set_bucket(ONE_MINUTE);
- durationMetric->set_aggregation_type(DurationMetric_AggregationType_SUM);
- durationMetric->set_what(201);
-
- // Anomaly threshold for background count.
- // TODO(b/70627390): Uncomment once the bug is fixed.
- /*
- alert = config.add_alert();
- alert->set_id(308);
- alert->set_metric_id(8);
- alert->set_number_of_buckets(4);
- alert->set_trigger_if_sum_gt(2000000000); // 2 seconds
- alert->set_refractory_period_secs(120);
- details = alert->mutable_incidentd_details();
- details->add_section(-1);*/
-
- // Value metric to count KERNEL_WAKELOCK when screen turned on
- ValueMetric* valueMetric = config.add_value_metric();
- valueMetric->set_id(11);
- valueMetric->set_what(109);
- valueMetric->mutable_value_field()->set_field(KERNEL_WAKELOCK_TAG_ID);
- valueMetric->mutable_value_field()->add_child()->set_field(KERNEL_WAKELOCK_COUNT_KEY);
- valueMetric->set_condition(201);
- dimensions = valueMetric->mutable_dimensions_in_what();
- dimensions->set_field(KERNEL_WAKELOCK_TAG_ID);
- dimensions->add_child()->set_field(KERNEL_WAKELOCK_NAME_KEY);
- // This is for testing easier. We should never set bucket size this small.
- durationMetric->set_bucket(ONE_MINUTE);
-
- // Add an EventMetric to log process state change events.
- EventMetric* eventMetric = config.add_event_metric();
- eventMetric->set_id(9);
- eventMetric->set_what(102); // "SCREEN_TURNED_ON"
-
- // Add an GaugeMetric.
- GaugeMetric* gaugeMetric = config.add_gauge_metric();
- gaugeMetric->set_id(10);
- gaugeMetric->set_what(101);
- auto gaugeFieldMatcher = gaugeMetric->mutable_gauge_fields_filter()->mutable_fields();
- gaugeFieldMatcher->set_field(DEVICE_TEMPERATURE_TAG_ID);
- gaugeFieldMatcher->add_child()->set_field(DEVICE_TEMPERATURE_KEY);
- durationMetric->set_bucket(ONE_MINUTE);
-
- // Event matchers.
- AtomMatcher* temperatureAtomMatcher = config.add_atom_matcher();
- temperatureAtomMatcher->set_id(101); // "DEVICE_TEMPERATURE"
- temperatureAtomMatcher->mutable_simple_atom_matcher()->set_atom_id(
- DEVICE_TEMPERATURE_TAG_ID);
-
- AtomMatcher* eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(102); // "SCREEN_TURNED_ON"
- SimpleAtomMatcher* simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(SCREEN_EVENT_TAG_ID);
- FieldValueMatcher* fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(SCREEN_EVENT_STATE_KEY);
- fieldValueMatcher->set_eq_int(SCREEN_EVENT_ON_VALUE);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(103); // "SCREEN_TURNED_OFF"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(SCREEN_EVENT_TAG_ID);
- fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(SCREEN_EVENT_STATE_KEY);
- fieldValueMatcher->set_eq_int(SCREEN_EVENT_OFF_VALUE);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(104); // "PROCESS_STATE_CHANGE"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(UID_PROCESS_STATE_TAG_ID);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(105); // "APP_GOES_BACKGROUND"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(APP_USAGE_TAG_ID);
- fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(APP_USAGE_STATE_KEY);
- fieldValueMatcher->set_eq_int(APP_USAGE_BACKGROUND);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(106); // "APP_GOES_FOREGROUND"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(APP_USAGE_TAG_ID);
- fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(APP_USAGE_STATE_KEY);
- fieldValueMatcher->set_eq_int(APP_USAGE_FOREGROUND);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(107); // "APP_GET_WL"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(WAKE_LOCK_TAG_ID);
- fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(WAKE_LOCK_STATE_KEY);
- fieldValueMatcher->set_eq_int(WAKE_LOCK_ACQUIRE_VALUE);
-
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(108); //"APP_RELEASE_WL"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(WAKE_LOCK_TAG_ID);
- fieldValueMatcher = simpleAtomMatcher->add_field_value_matcher();
- fieldValueMatcher->set_field(WAKE_LOCK_STATE_KEY);
- fieldValueMatcher->set_eq_int(WAKE_LOCK_RELEASE_VALUE);
-
- // pulled events
- eventMatcher = config.add_atom_matcher();
- eventMatcher->set_id(109); // "KERNEL_WAKELOCK"
- simpleAtomMatcher = eventMatcher->mutable_simple_atom_matcher();
- simpleAtomMatcher->set_atom_id(KERNEL_WAKELOCK_TAG_ID);
-
- // Predicates.............
- Predicate* predicate = config.add_predicate();
- predicate->set_id(201); // "SCREEN_IS_ON"
- SimplePredicate* simplePredicate = predicate->mutable_simple_predicate();
- simplePredicate->set_start(102); // "SCREEN_TURNED_ON"
- simplePredicate->set_stop(103);
- simplePredicate->set_count_nesting(false);
-
- predicate = config.add_predicate();
- predicate->set_id(202); // "SCREEN_IS_OFF"
- simplePredicate = predicate->mutable_simple_predicate();
- simplePredicate->set_start(103);
- simplePredicate->set_stop(102); // "SCREEN_TURNED_ON"
- simplePredicate->set_count_nesting(false);
-
- predicate = config.add_predicate();
- predicate->set_id(203); // "APP_IS_BACKGROUND"
- simplePredicate = predicate->mutable_simple_predicate();
- simplePredicate->set_start(105);
- simplePredicate->set_stop(106);
- FieldMatcher* predicate_dimension1 = simplePredicate->mutable_dimensions();
- predicate_dimension1->set_field(APP_USAGE_TAG_ID);
- predicate_dimension1->add_child()->set_field(APP_USAGE_UID_KEY_ID);
- simplePredicate->set_count_nesting(false);
-
- predicate = config.add_predicate();
- predicate->set_id(204); // "APP_IS_BACKGROUND_AND_SCREEN_ON"
- Predicate_Combination* combination_predicate = predicate->mutable_combination();
- combination_predicate->set_operation(LogicalOperation::AND);
- combination_predicate->add_predicate(203);
- combination_predicate->add_predicate(201);
-
- predicate = config.add_predicate();
- predicate->set_id(205); // "WL_HELD_PER_APP_PER_NAME"
- simplePredicate = predicate->mutable_simple_predicate();
- simplePredicate->set_start(107);
- simplePredicate->set_stop(108);
- FieldMatcher* predicate_dimension = simplePredicate->mutable_dimensions();
- predicate_dimension1->set_field(WAKE_LOCK_TAG_ID);
- predicate_dimension->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- predicate_dimension->add_child()->set_field(WAKE_LOCK_NAME_KEY);
- simplePredicate->set_count_nesting(true);
-
- predicate = config.add_predicate();
- predicate->set_id(206); // "WL_HELD_PER_APP"
- simplePredicate = predicate->mutable_simple_predicate();
- simplePredicate->set_start(107);
- simplePredicate->set_stop(108);
- simplePredicate->set_initial_value(SimplePredicate_InitialValue_FALSE);
- predicate_dimension = simplePredicate->mutable_dimensions();
- predicate_dimension->set_field(WAKE_LOCK_TAG_ID);
- predicate_dimension->add_child()->set_field(WAKE_LOCK_UID_KEY_ID);
- simplePredicate->set_count_nesting(true);
-
- return config;
-}
-
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/src/config/ConfigManager.h b/cmds/statsd/src/config/ConfigManager.h
index 9a38188a..611c342 100644
--- a/cmds/statsd/src/config/ConfigManager.h
+++ b/cmds/statsd/src/config/ConfigManager.h
@@ -36,9 +36,6 @@
/**
* Keeps track of which configurations have been set from various sources.
- *
- * TODO: Store the configs persistently too.
- * TODO: Dump method for debugging.
*/
class ConfigManager : public virtual android::RefBase {
public:
@@ -125,9 +122,9 @@
void remove_saved_configs(const ConfigKey& key);
/**
- * Config keys that have been set.
+ * Maps from uid to the config keys that have been set.
*/
- std::set<ConfigKey> mConfigs;
+ std::map<int, std::set<ConfigKey>> mConfigs;
/**
* Each config key can be subscribed by up to one receiver, specified as IBinder from
diff --git a/cmds/statsd/src/external/Perfetto.cpp b/cmds/statsd/src/external/Perfetto.cpp
index b09d373..0554483 100644
--- a/cmds/statsd/src/external/Perfetto.cpp
+++ b/cmds/statsd/src/external/Perfetto.cpp
@@ -15,6 +15,7 @@
*/
#define DEBUG false // STOPSHIP if true
+#include "config/ConfigKey.h"
#include "Log.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" // Alert
@@ -22,6 +23,7 @@
#include <android-base/unique_fd.h>
#include <errno.h>
#include <fcntl.h>
+#include <inttypes.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
@@ -36,7 +38,9 @@
namespace os {
namespace statsd {
-bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config) {
+bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
+ int64_t alert_id,
+ const ConfigKey& configKey) {
VLOG("Starting trace collection through perfetto");
if (!config.has_trace_config()) {
@@ -44,6 +48,13 @@
return false;
}
+ char alertId[20];
+ char configId[20];
+ char configUid[20];
+ snprintf(alertId, sizeof(alertId), "%" PRId64, alert_id);
+ snprintf(configId, sizeof(configId), "%" PRId64, configKey.GetId());
+ snprintf(configUid, sizeof(configUid), "%d", configKey.GetUid());
+
android::base::unique_fd readPipe;
android::base::unique_fd writePipe;
if (!android::base::Pipe(&readPipe, &writePipe)) {
@@ -82,7 +93,8 @@
}
execl("/system/bin/perfetto", "perfetto", "--background", "--config", "-", "--dropbox",
- kDropboxTag, nullptr);
+ kDropboxTag, "--alert-id", alertId, "--config-id", configId, "--config-uid",
+ configUid, nullptr);
// execl() doesn't return in case of success, if we get here something
// failed.
diff --git a/cmds/statsd/src/external/Perfetto.h b/cmds/statsd/src/external/Perfetto.h
index 2a5679c..1e7f728 100644
--- a/cmds/statsd/src/external/Perfetto.h
+++ b/cmds/statsd/src/external/Perfetto.h
@@ -24,13 +24,16 @@
namespace os {
namespace statsd {
+class ConfigKey;
class PerfettoDetails; // Declared in statsd_config.pb.h
// Starts the collection of a Perfetto trace with the given |config|.
// The trace is uploaded to Dropbox by the perfetto cmdline util once done.
// This method returns immediately after passing the config and does NOT wait
// for the full duration of the trace.
-bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config);
+bool CollectPerfettoTraceAndUploadToDropbox(const PerfettoDetails& config,
+ int64_t alert_id,
+ const ConfigKey& configKey);
} // namespace statsd
} // namespace os
diff --git a/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp
index b3acdfc..33a17de 100644
--- a/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp
+++ b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp
@@ -120,7 +120,9 @@
wallClockTimestampNs, elapsedTimestampNs);
ptr->write((static_cast<int>(temps[i].type)));
ptr->write(temps[i].name);
- ptr->write(temps[i].currentValue);
+ // Convert the temperature to an int.
+ int32_t temp = static_cast<int>(temps[i].currentValue * 10);
+ ptr->write(temp);
ptr->init();
data->push_back(ptr);
}
diff --git a/cmds/statsd/src/external/StatsPuller.cpp b/cmds/statsd/src/external/StatsPuller.cpp
index 3b0cd34..b29e979 100644
--- a/cmds/statsd/src/external/StatsPuller.cpp
+++ b/cmds/statsd/src/external/StatsPuller.cpp
@@ -35,27 +35,32 @@
// ValueMetric has a minimum bucket size of 10min so that we don't pull too frequently
StatsPuller::StatsPuller(const int tagId)
: mTagId(tagId) {
- mCoolDownSec = StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.coolDownSec;
- VLOG("Puller for tag %d created. Cooldown set to %ld", mTagId, mCoolDownSec);
+ mCoolDownNs = StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.coolDownNs;
+ VLOG("Puller for tag %d created. Cooldown set to %lld", mTagId, (long long)mCoolDownNs);
}
-bool StatsPuller::Pull(std::vector<std::shared_ptr<LogEvent>>* data) {
+bool StatsPuller::Pull(const int64_t elapsedTimeNs, std::vector<std::shared_ptr<LogEvent>>* data) {
lock_guard<std::mutex> lock(mLock);
+ int64_t wallClockTimeNs = getWallClockNs();
StatsdStats::getInstance().notePull(mTagId);
- long curTime = getElapsedRealtimeSec();
- if (curTime - mLastPullTimeSec < mCoolDownSec) {
+ if (elapsedTimeNs - mLastPullTimeNs < mCoolDownNs) {
(*data) = mCachedData;
StatsdStats::getInstance().notePullFromCache(mTagId);
return true;
}
- if (mMinPullIntervalSec > curTime - mLastPullTimeSec) {
- mMinPullIntervalSec = curTime - mLastPullTimeSec;
- StatsdStats::getInstance().updateMinPullIntervalSec(mTagId, mMinPullIntervalSec);
+ if (mMinPullIntervalNs > elapsedTimeNs - mLastPullTimeNs) {
+ mMinPullIntervalNs = elapsedTimeNs - mLastPullTimeNs;
+ StatsdStats::getInstance().updateMinPullIntervalSec(mTagId,
+ mMinPullIntervalNs / NS_PER_SEC);
}
mCachedData.clear();
- mLastPullTimeSec = curTime;
+ mLastPullTimeNs = elapsedTimeNs;
bool ret = PullInternal(&mCachedData);
- if (ret) {
+ for (const shared_ptr<LogEvent>& data : mCachedData) {
+ data->setElapsedTimestampNs(elapsedTimeNs);
+ data->setLogdWallClockTimestampNs(wallClockTimeNs);
+ }
+ if (ret && mCachedData.size() > 0) {
mergeIsolatedUidsToHostUid(mCachedData, mUidMap, mTagId);
(*data) = mCachedData;
}
@@ -70,12 +75,12 @@
lock_guard<std::mutex> lock(mLock);
int ret = mCachedData.size();
mCachedData.clear();
- mLastPullTimeSec = 0;
+ mLastPullTimeNs = 0;
return ret;
}
-int StatsPuller::ClearCacheIfNecessary(long timestampSec) {
- if (timestampSec - mLastPullTimeSec > mCoolDownSec) {
+int StatsPuller::ClearCacheIfNecessary(int64_t timestampNs) {
+ if (timestampNs - mLastPullTimeNs > mCoolDownNs) {
return clearCache();
} else {
return 0;
diff --git a/cmds/statsd/src/external/StatsPuller.h b/cmds/statsd/src/external/StatsPuller.h
index 936c47e..caac677 100644
--- a/cmds/statsd/src/external/StatsPuller.h
+++ b/cmds/statsd/src/external/StatsPuller.h
@@ -37,13 +37,13 @@
virtual ~StatsPuller() {}
- bool Pull(std::vector<std::shared_ptr<LogEvent>>* data);
+ bool Pull(const int64_t timeNs, std::vector<std::shared_ptr<LogEvent>>* data);
// Clear cache immediately
int ForceClearCache();
// Clear cache if elapsed time is more than cooldown time
- int ClearCacheIfNecessary(long timestampSec);
+ int ClearCacheIfNecessary(int64_t timestampNs);
static void SetUidMap(const sp<UidMap>& uidMap);
@@ -59,9 +59,9 @@
// If a pull request comes before cooldown, a cached version from purevious pull
// will be returned.
// The actual value should be determined by individual pullers.
- long mCoolDownSec;
+ int64_t mCoolDownNs;
// For puller stats
- long mMinPullIntervalSec = LONG_MAX;
+ int64_t mMinPullIntervalNs = LONG_MAX;
virtual bool PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) = 0;
@@ -69,7 +69,7 @@
// cached data will be returned.
std::vector<std::shared_ptr<LogEvent>> mCachedData;
- long mLastPullTimeSec;
+ int64_t mLastPullTimeNs;
int clearCache();
diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h
index 2717d5c..83d59c0 100644
--- a/cmds/statsd/src/external/StatsPullerManager.h
+++ b/cmds/statsd/src/external/StatsPullerManager.h
@@ -26,10 +26,9 @@
public:
virtual ~StatsPullerManager() {}
- virtual void RegisterReceiver(int tagId,
- wp <PullDataReceiver> receiver,
- long intervalMs) {
- mPullerManager.RegisterReceiver(tagId, receiver, intervalMs);
+ virtual void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, int64_t nextPullTimeNs,
+ int64_t intervalNs) {
+ mPullerManager.RegisterReceiver(tagId, receiver, nextPullTimeNs, intervalNs);
};
virtual void UnRegisterReceiver(int tagId, wp <PullDataReceiver> receiver) {
@@ -45,13 +44,9 @@
mPullerManager.OnAlarmFired();
}
- virtual bool
- Pull(const int tagId, vector<std::shared_ptr<LogEvent>>* data) {
- return mPullerManager.Pull(tagId, data);
- }
-
- void SetTimeBaseSec(const long timeBaseSec) {
- mPullerManager.SetTimeBaseSec(timeBaseSec);
+ virtual bool Pull(const int tagId, const int64_t timesNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ return mPullerManager.Pull(tagId, timesNs, data);
}
int ForceClearPullerCache() {
@@ -62,8 +57,8 @@
mPullerManager.SetStatsCompanionService(statsCompanionService);
}
- int ClearPullerCacheIfNecessary(long timestampSec) {
- return mPullerManager.ClearPullerCacheIfNecessary(timestampSec);
+ int ClearPullerCacheIfNecessary(int64_t timestampNs) {
+ return mPullerManager.ClearPullerCacheIfNecessary(timestampNs);
}
private:
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
index dd6406b..2f0e885 100644
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
+++ b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
@@ -19,15 +19,17 @@
#include <android/os/IStatsCompanionService.h>
#include <cutils/log.h>
+#include <math.h>
#include <algorithm>
#include <climits>
+#include "../StatsService.h"
#include "../logd/LogEvent.h"
#include "../stats_log_util.h"
#include "../statscompanion_util.h"
#include "ResourceHealthManagerPuller.h"
#include "ResourceThermalManagerPuller.h"
#include "StatsCompanionServicePuller.h"
-#include "StatsService.h"
+#include "StatsPullerManagerImpl.h"
#include "SubsystemSleepStatePuller.h"
#include "statslog.h"
@@ -47,89 +49,136 @@
const std::map<int, PullAtomInfo> StatsPullerManagerImpl::kAllPullAtomInfo = {
// wifi_bytes_transfer
{android::util::WIFI_BYTES_TRANSFER,
- {{2, 3, 4, 5}, {}, 1,
+ {{2, 3, 4, 5},
+ {},
+ 1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER)}},
// wifi_bytes_transfer_by_fg_bg
{android::util::WIFI_BYTES_TRANSFER_BY_FG_BG,
- {{3, 4, 5, 6}, {2}, 1,
+ {{3, 4, 5, 6},
+ {2},
+ 1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER_BY_FG_BG)}},
// mobile_bytes_transfer
{android::util::MOBILE_BYTES_TRANSFER,
- {{2, 3, 4, 5}, {}, 1,
+ {{2, 3, 4, 5},
+ {},
+ 1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER)}},
// mobile_bytes_transfer_by_fg_bg
{android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG,
- {{3, 4, 5, 6}, {2}, 1,
+ {{3, 4, 5, 6},
+ {2},
+ 1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG)}},
// bluetooth_bytes_transfer
{android::util::BLUETOOTH_BYTES_TRANSFER,
- {{2, 3}, {}, 1, new StatsCompanionServicePuller(android::util::BLUETOOTH_BYTES_TRANSFER)}},
+ {{2, 3},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::BLUETOOTH_BYTES_TRANSFER)}},
// kernel_wakelock
{android::util::KERNEL_WAKELOCK,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::KERNEL_WAKELOCK)}},
+ {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::KERNEL_WAKELOCK)}},
// subsystem_sleep_state
{android::util::SUBSYSTEM_SLEEP_STATE,
- {{}, {}, 1, new SubsystemSleepStatePuller()}},
+ {{}, {}, 1 * NS_PER_SEC, new SubsystemSleepStatePuller()}},
// cpu_time_per_freq
{android::util::CPU_TIME_PER_FREQ,
- {{3}, {2}, 1, new StatsCompanionServicePuller(android::util::CPU_TIME_PER_FREQ)}},
+ {{3},
+ {2},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::CPU_TIME_PER_FREQ)}},
// cpu_time_per_uid
{android::util::CPU_TIME_PER_UID,
- {{2, 3}, {}, 1, new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID)}},
+ {{2, 3},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID)}},
// cpu_time_per_uid_freq
- // the throttling is 3sec, handled in frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
+ // the throttling is 3sec, handled in
+ // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
{android::util::CPU_TIME_PER_UID_FREQ,
- {{4}, {2,3}, 0, new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID_FREQ)}},
+ {{4},
+ {2, 3},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID_FREQ)}},
// cpu_active_time
- // the throttling is 3sec, handled in frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
+ // the throttling is 3sec, handled in
+ // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
{android::util::CPU_ACTIVE_TIME,
- {{2}, {}, 0, new StatsCompanionServicePuller(android::util::CPU_ACTIVE_TIME)}},
+ {{2},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::CPU_ACTIVE_TIME)}},
// cpu_cluster_time
- // the throttling is 3sec, handled in frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
+ // the throttling is 3sec, handled in
+ // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
{android::util::CPU_CLUSTER_TIME,
- {{3}, {2}, 0, new StatsCompanionServicePuller(android::util::CPU_CLUSTER_TIME)}},
+ {{3},
+ {2},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::CPU_CLUSTER_TIME)}},
// wifi_activity_energy_info
- {android::util::WIFI_ACTIVITY_ENERGY_INFO,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::WIFI_ACTIVITY_ENERGY_INFO)}},
+ {android::util::WIFI_ACTIVITY_INFO,
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::WIFI_ACTIVITY_INFO)}},
// modem_activity_info
{android::util::MODEM_ACTIVITY_INFO,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::MODEM_ACTIVITY_INFO)}},
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::MODEM_ACTIVITY_INFO)}},
// bluetooth_activity_info
{android::util::BLUETOOTH_ACTIVITY_INFO,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::BLUETOOTH_ACTIVITY_INFO)}},
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::BLUETOOTH_ACTIVITY_INFO)}},
// system_elapsed_realtime
{android::util::SYSTEM_ELAPSED_REALTIME,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::SYSTEM_ELAPSED_REALTIME)}},
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::SYSTEM_ELAPSED_REALTIME)}},
// system_uptime
{android::util::SYSTEM_UPTIME,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::SYSTEM_UPTIME)}},
+ {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::SYSTEM_UPTIME)}},
// disk_space
{android::util::DISK_SPACE,
- {{}, {}, 1, new StatsCompanionServicePuller(android::util::DISK_SPACE)}},
+ {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::DISK_SPACE)}},
// remaining_battery_capacity
{android::util::REMAINING_BATTERY_CAPACITY,
- {{}, {}, 1, new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}},
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}},
// full_battery_capacity
{android::util::FULL_BATTERY_CAPACITY,
- {{}, {}, 1, new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}},
+ {{},
+ {},
+ 1 * NS_PER_SEC,
+ new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}},
// process_memory_state
{android::util::PROCESS_MEMORY_STATE,
- {{4,5,6,7,8},
- {2,3},
- 0,
+ {{4, 5, 6, 7, 8},
+ {2, 3},
+ 1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}},
// temperature
{android::util::TEMPERATURE, {{}, {}, 1, new ResourceThermalManagerPuller()}}};
-StatsPullerManagerImpl::StatsPullerManagerImpl()
- : mCurrentPullingInterval(LONG_MAX) {
+StatsPullerManagerImpl::StatsPullerManagerImpl() : mNextPullTimeNs(LONG_MAX) {
}
-bool StatsPullerManagerImpl::Pull(int tagId, vector<shared_ptr<LogEvent>>* data) {
+bool StatsPullerManagerImpl::Pull(const int tagId, const int64_t timeNs,
+ vector<shared_ptr<LogEvent>>* data) {
VLOG("Initiating pulling %d", tagId);
if (kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end()) {
- bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(data);
+ bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(timeNs, data);
VLOG("pulled %d items", (int)data->size());
return ret;
} else {
@@ -148,12 +197,14 @@
}
void StatsPullerManagerImpl::updateAlarmLocked() {
- long currentTimeMs = getElapsedRealtimeMillis();
- long nextAlarmTimeMs = currentTimeMs + mCurrentPullingInterval -
- (currentTimeMs - mTimeBaseSec * 1000) % mCurrentPullingInterval;
+ if (mNextPullTimeNs == LONG_MAX) {
+ VLOG("No need to set alarms. Skipping");
+ return;
+ }
+
sp<IStatsCompanionService> statsCompanionServiceCopy = mStatsCompanionService;
if (statsCompanionServiceCopy != nullptr) {
- statsCompanionServiceCopy->setPullingAlarms(nextAlarmTimeMs, mCurrentPullingInterval);
+ statsCompanionServiceCopy->setPullingAlarm(mNextPullTimeNs / 1000000);
} else {
VLOG("StatsCompanionService not available. Alarm not set.");
}
@@ -174,7 +225,7 @@
}
void StatsPullerManagerImpl::RegisterReceiver(int tagId, wp<PullDataReceiver> receiver,
- long intervalMs) {
+ int64_t nextPullTimeNs, int64_t intervalNs) {
AutoMutex _l(mLock);
auto& receivers = mReceivers[tagId];
for (auto it = receivers.begin(); it != receivers.end(); it++) {
@@ -185,21 +236,24 @@
}
ReceiverInfo receiverInfo;
receiverInfo.receiver = receiver;
- receiverInfo.timeInfo.first = intervalMs;
- receivers.push_back(receiverInfo);
// Round it to the nearest minutes. This is the limit of alarm manager.
- // In practice, we should limit it higher.
- long roundedIntervalMs = intervalMs/1000/60 * 1000 * 60;
+ // In practice, we should always have larger buckets.
+ int64_t roundedIntervalNs = intervalNs / NS_PER_SEC / 60 * NS_PER_SEC * 60;
// Scheduled pulling should be at least 1 min apart.
// This can be lower in cts tests, in which case we round it to 1 min.
- if (roundedIntervalMs < 60 * 1000) {
- roundedIntervalMs = 60 * 1000;
+ if (roundedIntervalNs < 60 * (int64_t)NS_PER_SEC) {
+ roundedIntervalNs = 60 * (int64_t)NS_PER_SEC;
}
+
+ receiverInfo.intervalNs = roundedIntervalNs;
+ receiverInfo.nextPullTimeNs = nextPullTimeNs;
+ receivers.push_back(receiverInfo);
+
// There is only one alarm for all pulled events. So only set it to the smallest denom.
- if (roundedIntervalMs < mCurrentPullingInterval) {
- VLOG("Updating pulling interval %ld", intervalMs);
- mCurrentPullingInterval = roundedIntervalMs;
+ if (nextPullTimeNs < mNextPullTimeNs) {
+ VLOG("Updating next pull time %lld", (long long)mNextPullTimeNs);
+ mNextPullTimeNs = nextPullTimeNs;
updateAlarmLocked();
}
VLOG("Puller for tagId %d registered of %d", tagId, (int)receivers.size());
@@ -224,16 +278,22 @@
void StatsPullerManagerImpl::OnAlarmFired() {
AutoMutex _l(mLock);
- uint64_t currentTimeMs = getElapsedRealtimeMillis();
+ int64_t currentTimeNs = getElapsedRealtimeNs();
+
+ int64_t minNextPullTimeNs = LONG_MAX;
vector<pair<int, vector<ReceiverInfo*>>> needToPull =
vector<pair<int, vector<ReceiverInfo*>>>();
for (auto& pair : mReceivers) {
vector<ReceiverInfo*> receivers = vector<ReceiverInfo*>();
if (pair.second.size() != 0) {
- for (auto& receiverInfo : pair.second) {
- if (receiverInfo.timeInfo.first + receiverInfo.timeInfo.second > currentTimeMs) {
+ for (ReceiverInfo& receiverInfo : pair.second) {
+ if (receiverInfo.nextPullTimeNs < currentTimeNs) {
receivers.push_back(&receiverInfo);
+ } else {
+ if (receiverInfo.nextPullTimeNs < minNextPullTimeNs) {
+ minNextPullTimeNs = receiverInfo.nextPullTimeNs;
+ }
}
}
if (receivers.size() > 0) {
@@ -244,18 +304,29 @@
for (const auto& pullInfo : needToPull) {
vector<shared_ptr<LogEvent>> data;
- if (Pull(pullInfo.first, &data)) {
+ if (Pull(pullInfo.first, currentTimeNs, &data)) {
for (const auto& receiverInfo : pullInfo.second) {
sp<PullDataReceiver> receiverPtr = receiverInfo->receiver.promote();
if (receiverPtr != nullptr) {
receiverPtr->onDataPulled(data);
- receiverInfo->timeInfo.second = currentTimeMs;
+ // we may have just come out of a coma, compute next pull time
+ receiverInfo->nextPullTimeNs =
+ ceil((double_t)(currentTimeNs - receiverInfo->nextPullTimeNs) /
+ receiverInfo->intervalNs) *
+ receiverInfo->intervalNs +
+ receiverInfo->nextPullTimeNs;
+ if (receiverInfo->nextPullTimeNs < minNextPullTimeNs) {
+ minNextPullTimeNs = receiverInfo->nextPullTimeNs;
+ }
} else {
VLOG("receiver already gone.");
}
}
}
}
+
+ mNextPullTimeNs = minNextPullTimeNs;
+ updateAlarmLocked();
}
int StatsPullerManagerImpl::ForceClearPullerCache() {
@@ -266,10 +337,10 @@
return totalCleared;
}
-int StatsPullerManagerImpl::ClearPullerCacheIfNecessary(long timestampSec) {
+int StatsPullerManagerImpl::ClearPullerCacheIfNecessary(int64_t timestampNs) {
int totalCleared = 0;
for (const auto& pulledAtom : kAllPullAtomInfo) {
- totalCleared += pulledAtom.second.puller->ClearCacheIfNecessary(timestampSec);
+ totalCleared += pulledAtom.second.puller->ClearCacheIfNecessary(timestampNs);
}
return totalCleared;
}
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.h b/cmds/statsd/src/external/StatsPullerManagerImpl.h
index 682ad33..8c771f3 100644
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.h
+++ b/cmds/statsd/src/external/StatsPullerManagerImpl.h
@@ -41,7 +41,7 @@
std::vector<int> nonAdditiveFields;
// How long should the puller wait before doing an actual pull again. Default
// 1 sec. Set this to 0 if this is handled elsewhere.
- long coolDownSec = 1;
+ int64_t coolDownNs = 1 * NS_PER_SEC;
// The actual puller
sp<StatsPuller> puller;
} PullAtomInfo;
@@ -50,7 +50,8 @@
public:
static StatsPullerManagerImpl& GetInstance();
- void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, long intervalMs);
+ void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, int64_t nextPullTimeNs,
+ int64_t intervalNs);
void UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver);
@@ -59,13 +60,11 @@
void OnAlarmFired();
- bool Pull(const int tagId, vector<std::shared_ptr<LogEvent>>* data);
-
- void SetTimeBaseSec(long timeBaseSec) {mTimeBaseSec = timeBaseSec;};
+ bool Pull(const int tagId, const int64_t timeNs, vector<std::shared_ptr<LogEvent>>* data);
int ForceClearPullerCache();
- int ClearPullerCacheIfNecessary(long timestampSec);
+ int ClearPullerCacheIfNecessary(int64_t timestampNs);
void SetStatsCompanionService(sp<IStatsCompanionService> statsCompanionService);
@@ -77,8 +76,8 @@
sp<IStatsCompanionService> mStatsCompanionService = nullptr;
typedef struct {
- // pull_interval_sec : last_pull_time_sec
- std::pair<uint64_t, uint64_t> timeInfo;
+ int64_t nextPullTimeNs;
+ int64_t intervalNs;
wp<PullDataReceiver> receiver;
} ReceiverInfo;
@@ -90,12 +89,7 @@
void updateAlarmLocked();
- long mCurrentPullingInterval;
-
- // for pulled metrics, it is important for the buckets to be aligned to multiple of smallest
- // bucket size. All pulled metrics start pulling based on this time, so that they can be
- // correctly attributed to the correct buckets.
- long mTimeBaseSec;
+ int64_t mNextPullTimeNs;
};
} // namespace statsd
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index ef637df..22ff942 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -76,6 +76,7 @@
const int FIELD_ID_CONFIG_STATS_CONDITION_STATS = 14;
const int FIELD_ID_CONFIG_STATS_METRIC_STATS = 15;
const int FIELD_ID_CONFIG_STATS_ALERT_STATS = 16;
+const int FIELD_ID_CONFIG_STATS_METRIC_DIMENSION_IN_CONDITION_STATS = 17;
const int FIELD_ID_MATCHER_STATS_ID = 1;
const int FIELD_ID_MATCHER_STATS_COUNT = 2;
@@ -255,6 +256,20 @@
}
}
+void StatsdStats::noteMetricDimensionInConditionSize(
+ const ConfigKey& key, const int64_t& id, int size) {
+ lock_guard<std::mutex> lock(mLock);
+ // if name doesn't exist before, it will create the key with count 0.
+ auto statsIt = mConfigStats.find(key);
+ if (statsIt == mConfigStats.end()) {
+ return;
+ }
+ auto& metricsDimensionMap = statsIt->second->metric_dimension_in_condition_stats;
+ if (size > metricsDimensionMap[id]) {
+ metricsDimensionMap[id] = size;
+ }
+}
+
void StatsdStats::noteMatcherMatched(const ConfigKey& key, const int64_t& id) {
lock_guard<std::mutex> lock(mLock);
@@ -339,6 +354,7 @@
config.second->matcher_stats.clear();
config.second->condition_stats.clear();
config.second->metric_stats.clear();
+ config.second->metric_dimension_in_condition_stats.clear();
config.second->alert_stats.clear();
}
}
@@ -504,6 +520,13 @@
proto->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_STATS_COUNT, pair.second);
proto->end(tmpToken);
}
+ for (const auto& pair : configStats.metric_dimension_in_condition_stats) {
+ uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ FIELD_ID_CONFIG_STATS_METRIC_DIMENSION_IN_CONDITION_STATS);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_METRIC_STATS_ID, (long long)pair.first);
+ proto->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_STATS_COUNT, pair.second);
+ proto->end(tmpToken);
+ }
for (const auto& pair : configStats.alert_stats) {
uint64_t tmpToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 7675888..bd395c4 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -57,6 +57,12 @@
// it means some data has been dropped. The map size is capped by kMaxConfigCount.
std::map<const int64_t, int> metric_stats;
+ // Stores the max number of output tuple of dimensions in condition across dimensions in what
+ // when it's bigger than kDimensionKeySizeSoftLimit. When you see the number is
+ // kDimensionKeySizeHardLimit +1, it means some data has been dropped. The map size is capped by
+ // kMaxConfigCount.
+ std::map<const int64_t, int> metric_dimension_in_condition_stats;
+
// Stores the number of times an anomaly detection alert has been declared.
// The map size is capped by kMaxConfigCount.
std::map<const int64_t, int> alert_stats;
@@ -78,17 +84,17 @@
~StatsdStats(){};
// TODO: set different limit if the device is low ram.
- const static int kDimensionKeySizeSoftLimit = 300;
- const static int kDimensionKeySizeHardLimit = 500;
+ const static int kDimensionKeySizeSoftLimit = 500;
+ const static int kDimensionKeySizeHardLimit = 800;
// Per atom dimension key size limit
static const std::map<int, std::pair<size_t, size_t>> kAtomDimensionKeySizeLimitMap;
- const static int kMaxConfigCount = 10;
+ const static int kMaxConfigCountPerUid = 10;
const static int kMaxAlertCountPerConfig = 100;
- const static int kMaxConditionCountPerConfig = 200;
- const static int kMaxMetricCountPerConfig = 300;
- const static int kMaxMatcherCountPerConfig = 500;
+ const static int kMaxConditionCountPerConfig = 300;
+ const static int kMaxMetricCountPerConfig = 1000;
+ const static int kMaxMatcherCountPerConfig = 800;
// The max number of old config stats we keep.
const static int kMaxIceBoxSize = 20;
@@ -183,6 +189,19 @@
*/
void noteMetricDimensionSize(const ConfigKey& key, const int64_t& id, int size);
+
+ /**
+ * Report the max size of output tuple of dimension in condition across dimensions in what.
+ *
+ * Note: only report when the metric has an output dimension in condition, and the max tuple
+ * count > kDimensionKeySizeSoftLimit.
+ *
+ * [key]: The config key that this metric belongs to.
+ * [id]: The id of the metric.
+ * [size]: The output tuple size.
+ */
+ void noteMetricDimensionInConditionSize(const ConfigKey& key, const int64_t& id, int size);
+
/**
* Report a matcher has been matched.
*
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp
index 8e8a529..afa5140 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp
@@ -117,7 +117,8 @@
}
}
-void CountMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
+void CountMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) {
VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
}
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h
index ef738ac..fd9f0e0 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.h
+++ b/cmds/statsd/src/metrics/CountMetricProducer.h
@@ -61,7 +61,7 @@
void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
// Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override;
+ void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
// Internal function to calculate the current used bytes.
size_t byteSizeLocked() const override;
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
index c6b9405..f02f307 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
@@ -169,7 +169,8 @@
// 1. If combination condition, logical operation is AND, only one sliced child predicate.
// 2. No condition in dimension
// 3. The links covers all dimension fields in the sliced child condition predicate.
-void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt1(const uint64_t eventTime) {
+void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt1(bool condition,
+ const uint64_t eventTime) {
if (mMetric2ConditionLinks.size() != 1 ||
!mHasLinksToAllConditionDimensionsInTracker ||
!mDimensionsInCondition.empty()) {
@@ -241,7 +242,8 @@
// SlicedConditionChange optimization case 2:
// 1. If combination condition, logical operation is AND, only one sliced child predicate.
// 2. Has dimensions_in_condition and it equals to the output dimensions of the sliced predicate.
-void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt2(const uint64_t eventTime) {
+void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt2(bool condition,
+ const uint64_t eventTime) {
if (mMetric2ConditionLinks.size() > 1 || !mSameConditionDimensionsInTracker) {
return;
}
@@ -306,11 +308,14 @@
if (mMetric2ConditionLinks.size() == 0 ||
trueDim.contains(linkedConditionDimensionKey)) {
if (!whatIt.second.empty()) {
+ auto newEventKey = MetricDimensionKey(whatIt.first, trueDim);
+ if (hitGuardRailLocked(newEventKey)) {
+ continue;
+ }
unique_ptr<DurationTracker> newTracker =
whatIt.second.begin()->second->clone(eventTime);
if (newTracker != nullptr) {
- newTracker->setEventKey(
- MetricDimensionKey(whatIt.first, trueDim));
+ newTracker->setEventKey(newEventKey);
newTracker->onConditionChanged(true, eventTime);
whatIt.second[trueDim] = std::move(newTracker);
}
@@ -322,7 +327,8 @@
}
}
-void DurationMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
+void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) {
VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
flushIfNeededLocked(eventTime);
@@ -333,20 +339,20 @@
bool changeDimTrackable = mWizard->IsChangedDimensionTrackable(mConditionTrackerIndex);
if (changeDimTrackable && mHasLinksToAllConditionDimensionsInTracker &&
mDimensionsInCondition.empty()) {
- onSlicedConditionMayChangeLocked_opt1(eventTime);
+ onSlicedConditionMayChangeLocked_opt1(overallCondition, eventTime);
return;
}
if (changeDimTrackable && mSameConditionDimensionsInTracker &&
mMetric2ConditionLinks.size() <= 1) {
- onSlicedConditionMayChangeLocked_opt2(eventTime);
+ onSlicedConditionMayChangeLocked_opt2(overallCondition, eventTime);
return;
}
// Now for each of the on-going event, check if the condition has changed for them.
for (auto& whatIt : mCurrentSlicedDurationTrackerMap) {
for (auto& pair : whatIt.second) {
- pair.second->onSlicedConditionMayChange(eventTime);
+ pair.second->onSlicedConditionMayChange(overallCondition, eventTime);
}
}
@@ -367,12 +373,15 @@
for (const auto& conditionDimension : conditionDimensionsKeySet) {
for (auto& whatIt : mCurrentSlicedDurationTrackerMap) {
if (!whatIt.second.empty()) {
+ auto newEventKey = MetricDimensionKey(whatIt.first, conditionDimension);
+ if (hitGuardRailLocked(newEventKey)) {
+ continue;
+ }
unique_ptr<DurationTracker> newTracker =
whatIt.second.begin()->second->clone(eventTime);
if (newTracker != nullptr) {
- newTracker->setEventKey(MetricDimensionKey(
- whatIt.first, conditionDimension));
- newTracker->onSlicedConditionMayChange(eventTime);
+ newTracker->setEventKey(MetricDimensionKey(newEventKey));
+ newTracker->onSlicedConditionMayChange(overallCondition, eventTime);
whatIt.second[conditionDimension] = std::move(newTracker);
}
}
@@ -394,11 +403,14 @@
for (const auto& conditionDimension : conditionDimensionsKeys) {
if (!whatIt.second.empty() &&
whatIt.second.find(conditionDimension) == whatIt.second.end()) {
+ auto newEventKey = MetricDimensionKey(whatIt.first, conditionDimension);
+ if (hitGuardRailLocked(newEventKey)) {
+ continue;
+ }
auto newTracker = whatIt.second.begin()->second->clone(eventTime);
if (newTracker != nullptr) {
- newTracker->setEventKey(
- MetricDimensionKey(whatIt.first, conditionDimension));
- newTracker->onSlicedConditionMayChange(eventTime);
+ newTracker->setEventKey(newEventKey);
+ newTracker->onSlicedConditionMayChange(overallCondition, eventTime);
whatIt.second[conditionDimension] = std::move(newTracker);
}
}
@@ -549,15 +561,35 @@
}
bool DurationMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) {
- // 1. Report the tuple count if the tuple count > soft limit
- if (mCurrentSlicedDurationTrackerMap.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
- size_t newTupleCount = mCurrentSlicedDurationTrackerMap.size() + 1;
- StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount);
- // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
- if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
- ALOGE("DurationMetric %lld dropping data for dimension key %s",
- (long long)mMetricId, newKey.toString().c_str());
- return true;
+ auto whatIt = mCurrentSlicedDurationTrackerMap.find(newKey.getDimensionKeyInWhat());
+ if (whatIt != mCurrentSlicedDurationTrackerMap.end()) {
+ auto condIt = whatIt->second.find(newKey.getDimensionKeyInCondition());
+ if (condIt != whatIt->second.end()) {
+ return false;
+ }
+ if (whatIt->second.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
+ size_t newTupleCount = whatIt->second.size() + 1;
+ StatsdStats::getInstance().noteMetricDimensionInConditionSize(
+ mConfigKey, mMetricId, newTupleCount);
+ // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
+ if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
+ ALOGE("DurationMetric %lld dropping data for condition dimension key %s",
+ (long long)mMetricId, newKey.getDimensionKeyInCondition().toString().c_str());
+ return true;
+ }
+ }
+ } else {
+ // 1. Report the tuple count if the tuple count > soft limit
+ if (mCurrentSlicedDurationTrackerMap.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
+ size_t newTupleCount = mCurrentSlicedDurationTrackerMap.size() + 1;
+ StatsdStats::getInstance().noteMetricDimensionSize(
+ mConfigKey, mMetricId, newTupleCount);
+ // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
+ if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
+ ALOGE("DurationMetric %lld dropping data for what dimension key %s",
+ (long long)mMetricId, newKey.getDimensionKeyInWhat().toString().c_str());
+ return true;
+ }
}
}
return false;
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h
index 985749d..75f2391 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.h
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.h
@@ -68,10 +68,10 @@
void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
// Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override;
+ void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
- void onSlicedConditionMayChangeLocked_opt1(const uint64_t eventTime);
- void onSlicedConditionMayChangeLocked_opt2(const uint64_t eventTime);
+ void onSlicedConditionMayChangeLocked_opt1(bool overallCondition, const uint64_t eventTime);
+ void onSlicedConditionMayChangeLocked_opt2(bool overallCondition, const uint64_t eventTime);
// Internal function to calculate the current used bytes.
size_t byteSizeLocked() const override;
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index bd8b293..42a5a3a 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -79,7 +79,8 @@
mProto->clear();
}
-void EventMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
+void EventMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) {
}
std::unique_ptr<std::vector<uint8_t>> serializeProtoLocked(ProtoOutputStream& protoOutput) {
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h
index d6f81fd..93c6c9a 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.h
+++ b/cmds/statsd/src/metrics/EventMetricProducer.h
@@ -53,7 +53,7 @@
void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
// Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override;
+ void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
void dropDataLocked(const uint64_t dropTimeNs) override;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index f08d54a..b13c3e7 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -112,11 +112,13 @@
// Kicks off the puller immediately.
if (mPullTagId != -1 && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- mStatsPullerManager->RegisterReceiver(mPullTagId, this, bucketSizeMills);
+ mStatsPullerManager->RegisterReceiver(
+ mPullTagId, this, mCurrentBucketStartTimeNs + mBucketSizeNs, mBucketSizeNs);
}
- VLOG("metric %lld created. bucket size %lld start_time: %lld", (long long)metric.id(),
- (long long)mBucketSizeNs, (long long)mStartTimeNs);
+ VLOG("Gauge metric %lld created. bucket size %lld start_time: %lld sliced %d",
+ (long long)metric.id(), (long long)mBucketSizeNs, (long long)mStartTimeNs,
+ mConditionSliced);
}
// for testing
@@ -155,7 +157,7 @@
void GaugeMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
ProtoOutputStream* protoOutput) {
- VLOG("gauge metric %lld report now...", (long long)mMetricId);
+ VLOG("Gauge metric %lld report now...", (long long)mMetricId);
flushIfNeededLocked(dumpTimeNs);
if (mPastBuckets.empty()) {
@@ -168,7 +170,7 @@
for (const auto& pair : mPastBuckets) {
const MetricDimensionKey& dimensionKey = pair.first;
- VLOG(" dimension key %s", dimensionKey.toString().c_str());
+ VLOG("Gauge dimension key %s", dimensionKey.toString().c_str());
uint64_t wrapperToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
@@ -221,8 +223,9 @@
}
}
protoOutput->end(bucketInfoToken);
- VLOG("\t bucket [%lld - %lld] includes %d atoms.", (long long)bucket.mBucketStartNs,
- (long long)bucket.mBucketEndNs, (int)bucket.mGaugeAtoms.size());
+ VLOG("Gauge \t bucket [%lld - %lld] includes %d atoms.",
+ (long long)bucket.mBucketStartNs, (long long)bucket.mBucketEndNs,
+ (int)bucket.mGaugeAtoms.size());
}
protoOutput->end(wrapperToken);
}
@@ -233,27 +236,6 @@
}
void GaugeMetricProducer::pullLocked() {
- vector<std::shared_ptr<LogEvent>> allData;
- if (!mStatsPullerManager->Pull(mPullTagId, &allData)) {
- ALOGE("Stats puller failed for tag: %d", mPullTagId);
- return;
- }
- for (const auto& data : allData) {
- onMatchedLogEventLocked(0, *data);
- }
-}
-
-void GaugeMetricProducer::onConditionChangedLocked(const bool conditionMet,
- const uint64_t eventTime) {
- VLOG("Metric %lld onConditionChanged", (long long)mMetricId);
- flushIfNeededLocked(eventTime);
- mCondition = conditionMet;
-
- // Push mode. No need to proactively pull the gauge data.
- if (mPullTagId == -1) {
- return;
- }
-
bool triggerPuller = false;
switch(mSamplingType) {
// When the metric wants to do random sampling and there is already one gauge atom for the
@@ -274,18 +256,38 @@
}
vector<std::shared_ptr<LogEvent>> allData;
- if (!mStatsPullerManager->Pull(mPullTagId, &allData)) {
- ALOGE("Stats puller failed for tag: %d", mPullTagId);
+ if (!mStatsPullerManager->Pull(mPullTagId, getElapsedRealtimeNs(), &allData)) {
+ ALOGE("Gauge Stats puller failed for tag: %d", mPullTagId);
return;
}
+
for (const auto& data : allData) {
onMatchedLogEventLocked(0, *data);
}
- flushIfNeededLocked(eventTime);
}
-void GaugeMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
- VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
+void GaugeMetricProducer::onConditionChangedLocked(const bool conditionMet,
+ const uint64_t eventTime) {
+ VLOG("GaugeMetric %lld onConditionChanged", (long long)mMetricId);
+ flushIfNeededLocked(eventTime);
+ mCondition = conditionMet;
+
+ if (mPullTagId != -1) {
+ pullLocked();
+ } // else: Push mode. No need to proactively pull the gauge data.
+}
+
+void GaugeMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) {
+ VLOG("GaugeMetric %lld onSlicedConditionMayChange overall condition %d", (long long)mMetricId,
+ overallCondition);
+ flushIfNeededLocked(eventTime);
+ // If the condition is sliced, mCondition is true if any of the dimensions is true. And we will
+ // pull for every dimension.
+ mCondition = overallCondition;
+ if (mPullTagId != -1) {
+ pullLocked();
+ } // else: Push mode. No need to proactively pull the gauge data.
}
std::shared_ptr<vector<FieldValue>> GaugeMetricProducer::getGaugeFields(const LogEvent& event) {
@@ -337,7 +339,7 @@
uint64_t eventTimeNs = event.GetElapsedTimestampNs();
mTagId = event.GetTagId();
if (eventTimeNs < mCurrentBucketStartTimeNs) {
- VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
+ VLOG("Gauge Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
(long long)mCurrentBucketStartTimeNs);
return;
}
@@ -403,8 +405,8 @@
uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
if (eventTimeNs < currentBucketEndTimeNs) {
- VLOG("eventTime is %lld, less than next bucket start time %lld", (long long)eventTimeNs,
- (long long)(mCurrentBucketStartTimeNs + mBucketSizeNs));
+ VLOG("Gauge eventTime is %lld, less than next bucket start time %lld",
+ (long long)eventTimeNs, (long long)(mCurrentBucketStartTimeNs + mBucketSizeNs));
return;
}
@@ -414,7 +416,7 @@
int64_t numBucketsForward = 1 + (eventTimeNs - currentBucketEndTimeNs) / mBucketSizeNs;
mCurrentBucketStartTimeNs = currentBucketEndTimeNs + (numBucketsForward - 1) * mBucketSizeNs;
mCurrentBucketNum += numBucketsForward;
- VLOG("metric %lld: new bucket start time: %lld", (long long)mMetricId,
+ VLOG("Gauge metric %lld: new bucket start time: %lld", (long long)mMetricId,
(long long)mCurrentBucketStartTimeNs);
}
@@ -433,7 +435,7 @@
info.mGaugeAtoms = slice.second;
auto& bucketList = mPastBuckets[slice.first];
bucketList.push_back(info);
- VLOG("gauge metric %lld, dump key value: %s", (long long)mMetricId,
+ VLOG("Gauge gauge metric %lld, dump key value: %s", (long long)mMetricId,
slice.first.toString().c_str());
}
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index 4b543f8..9605b13 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -100,7 +100,7 @@
void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
// Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override;
+ void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
// Internal function to calculate the current used bytes.
size_t byteSizeLocked() const override;
@@ -155,6 +155,7 @@
const size_t mDimensionHardLimit;
FRIEND_TEST(GaugeMetricProducerTest, TestWithCondition);
+ FRIEND_TEST(GaugeMetricProducerTest, TestWithSlicedCondition);
FRIEND_TEST(GaugeMetricProducerTest, TestNoCondition);
FRIEND_TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithUpgrade);
diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp
index f4495a1..bf529c8 100644
--- a/cmds/statsd/src/metrics/MetricProducer.cpp
+++ b/cmds/statsd/src/metrics/MetricProducer.cpp
@@ -33,7 +33,6 @@
bool condition;
ConditionKey conditionKey;
-
std::unordered_set<HashableDimensionKey> dimensionKeysInCondition;
if (mConditionSliced) {
for (const auto& link : mMetric2ConditionLinks) {
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index ea45f43..0b3d677 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -98,9 +98,9 @@
onConditionChangedLocked(condition, eventTime);
}
- void onSlicedConditionMayChange(const uint64_t eventTime) {
+ void onSlicedConditionMayChange(bool overallCondition, const uint64_t eventTime) {
std::lock_guard<std::mutex> lock(mMutex);
- onSlicedConditionMayChangeLocked(eventTime);
+ onSlicedConditionMayChangeLocked(overallCondition, eventTime);
}
bool isConditionSliced() const {
@@ -163,7 +163,8 @@
protected:
virtual void onConditionChangedLocked(const bool condition, const uint64_t eventTime) = 0;
- virtual void onSlicedConditionMayChangeLocked(const uint64_t eventTime) = 0;
+ virtual void onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) = 0;
virtual void onDumpReportLocked(const uint64_t dumpTimeNs,
android::util::ProtoOutputStream* protoOutput) = 0;
virtual size_t byteSizeLocked() const = 0;
@@ -188,7 +189,7 @@
// Convenience to compute the current bucket's end time, which is always aligned with the
// start time of the metric.
- uint64_t getCurrentBucketEndTimeNs() {
+ uint64_t getCurrentBucketEndTimeNs() const {
return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs;
}
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index c773d4f..c61fa76 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -49,7 +49,7 @@
const int FIELD_ID_METRICS = 1;
MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config,
- const long timeBaseSec,
+ const long timeBaseSec, const long currentTimeSec,
const sp<UidMap> &uidMap,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor)
@@ -58,7 +58,7 @@
mLastReportWallClockNs(getWallClockNs()) {
mConfigValid =
initStatsdConfig(key, config, *uidMap, anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, mTagIds, mAllAtomMatchers,
+ timeBaseSec, currentTimeSec, mTagIds, mAllAtomMatchers,
mAllConditionTrackers, mAllMetricProducers, mAllAnomalyTrackers,
mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap,
mTrackerToConditionMap, mNoReportMetricIds);
@@ -326,7 +326,8 @@
// notification, and the metric can query the sliced conditions that are
// interesting to it.
} else {
- mAllMetricProducers[metricIndex]->onSlicedConditionMayChange(eventTime);
+ mAllMetricProducers[metricIndex]->onSlicedConditionMayChange(conditionCache[i],
+ eventTime);
}
}
}
@@ -350,7 +351,7 @@
}
void MetricsManager::onAnomalyAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet) {
for (const auto& itr : mAllAnomalyTrackers) {
itr->informAlarmsFired(timestampNs, alarmSet);
@@ -358,7 +359,7 @@
}
void MetricsManager::onPeriodicAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet) {
for (const auto& itr : mAllPeriodicAlarmTrackers) {
itr->informAlarmsFired(timestampNs, alarmSet);
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index 46a9b34..4fd64b7 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -36,7 +36,8 @@
// A MetricsManager is responsible for managing metrics from one single config source.
class MetricsManager : public PackageInfoListener {
public:
- MetricsManager(const ConfigKey& configKey, const StatsdConfig& config, const long timeBaseSec,
+ MetricsManager(const ConfigKey& configKey, const StatsdConfig& config,
+ const long timeBaseSec, const long currentTimeSec,
const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor);
@@ -48,11 +49,11 @@
void onLogEvent(const LogEvent& event);
void onAnomalyAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet);
void onPeriodicAlarmFired(
- const uint64_t timestampNs,
+ const uint64_t& timestampNs,
unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet);
void notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
@@ -178,6 +179,13 @@
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationCondition);
FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
+ FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
+
+ FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index ed4d7e4..d0f510d 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -110,10 +110,12 @@
}
mConditionSliced = (metric.links().size() > 0) || (mDimensionsInCondition.size() > 0);
- if (!metric.has_condition() && mPullTagId != -1) {
- VLOG("Setting up periodic pulling for %d", mPullTagId);
- mStatsPullerManager->RegisterReceiver(mPullTagId, this, bucketSizeMills);
+ // Kicks off the puller immediately.
+ if (mPullTagId != -1) {
+ mStatsPullerManager->RegisterReceiver(
+ mPullTagId, this, mCurrentBucketStartTimeNs + mBucketSizeNs, mBucketSizeNs);
}
+
VLOG("value metric %lld created. bucket size %lld start_time: %lld",
(long long)metric.id(), (long long)mBucketSizeNs, (long long)mStartTimeNs);
}
@@ -134,7 +136,8 @@
}
}
-void ValueMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
+void ValueMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
+ const uint64_t eventTime) {
VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
}
@@ -193,26 +196,21 @@
// TODO: Clear mDimensionKeyMap once the report is dumped.
}
-void ValueMetricProducer::onConditionChangedLocked(const bool condition, const uint64_t eventTime) {
+void ValueMetricProducer::onConditionChangedLocked(const bool condition,
+ const uint64_t eventTimeNs) {
mCondition = condition;
- if (eventTime < mCurrentBucketStartTimeNs) {
- VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTime,
+ if (eventTimeNs < mCurrentBucketStartTimeNs) {
+ VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
(long long)mCurrentBucketStartTimeNs);
return;
}
- flushIfNeededLocked(eventTime);
+ flushIfNeededLocked(eventTimeNs);
if (mPullTagId != -1) {
- if (mCondition == true) {
- mStatsPullerManager->RegisterReceiver(mPullTagId, this, mBucketSizeNs / 1000 / 1000);
- } else if (mCondition == false) {
- mStatsPullerManager->UnRegisterReceiver(mPullTagId, this);
- }
-
vector<shared_ptr<LogEvent>> allData;
- if (mStatsPullerManager->Pull(mPullTagId, &allData)) {
+ if (mStatsPullerManager->Pull(mPullTagId, eventTimeNs, &allData)) {
if (allData.size() == 0) {
return;
}
@@ -314,8 +312,13 @@
if (mPullTagId != -1) { // for pulled events
if (mCondition == true) {
- interval.start = value;
- interval.startUpdated = true;
+ if (!interval.startUpdated) {
+ interval.start = value;
+ interval.startUpdated = true;
+ } else {
+ // skip it if there is already value recorded for the start
+ VLOG("Already recorded value for this dimension %s", eventKey.toString().c_str());
+ }
} else {
// Generally we expect value to be monotonically increasing.
// If not, there was a reset event. We take the absolute value as
@@ -384,6 +387,7 @@
int tainted = 0;
for (const auto& slice : mCurrentSlicedBucket) {
tainted += slice.second.tainted;
+ tainted += slice.second.startUpdated;
info.mValue = slice.second.sum;
// it will auto create new vector of ValuebucketInfo if the key is not found.
auto& bucketList = mPastBuckets[slice.first];
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index c4477b3..45d9531 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -53,7 +53,7 @@
if (mPullTagId != -1) {
vector<shared_ptr<LogEvent>> allData;
- mStatsPullerManager->Pull(mPullTagId, &allData);
+ mStatsPullerManager->Pull(mPullTagId, eventTimeNs, &allData);
if (allData.size() == 0) {
// This shouldn't happen since this valuemetric is not useful now.
}
@@ -93,7 +93,7 @@
void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
// Internal interface to handle sliced condition change.
- void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override;
+ void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
// Internal function to calculate the current used bytes.
size_t byteSizeLocked() const override;
@@ -159,6 +159,10 @@
FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade);
FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition);
FRIEND_TEST(ValueMetricProducerTest, TestAnomalyDetection);
+ FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition);
+ FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition);
+ FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2);
+ FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
index 991a76a..4132703 100644
--- a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
@@ -92,7 +92,7 @@
const bool stopAll) = 0;
virtual void noteStopAll(const uint64_t eventTime) = 0;
- virtual void onSlicedConditionMayChange(const uint64_t timestamp) = 0;
+ virtual void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) = 0;
virtual void onConditionChanged(bool condition, const uint64_t timestamp) = 0;
// Flush stale buckets if needed, and return true if the tracker has no on-going duration
@@ -109,7 +109,7 @@
// Predict the anomaly timestamp given the current status.
virtual int64_t predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
- const uint64_t currentTimestamp) const = 0;
+ const int64_t currentTimestamp) const = 0;
// Dump internal states for debugging
virtual void dumpStates(FILE* out, bool verbose) const = 0;
@@ -118,12 +118,19 @@
}
protected:
+ uint64_t getCurrentBucketEndTimeNs() const {
+ return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs;
+ }
+
// Starts the anomaly alarm.
void startAnomalyAlarm(const uint64_t eventTime) {
for (auto& anomalyTracker : mAnomalyTrackers) {
if (anomalyTracker != nullptr) {
- anomalyTracker->startAlarm(mEventKey,
- predictAnomalyTimestampNs(*anomalyTracker, eventTime));
+ const uint64_t alarmTimestampNs =
+ predictAnomalyTimestampNs(*anomalyTracker, eventTime);
+ if (alarmTimestampNs > 0) {
+ anomalyTracker->startAlarm(mEventKey, alarmTimestampNs);
+ }
}
}
}
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
index c9547cf..5c1e9c0 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
@@ -245,7 +245,8 @@
return flushCurrentBucket(eventTimeNs, output);
}
-void MaxDurationTracker::onSlicedConditionMayChange(const uint64_t timestamp) {
+void MaxDurationTracker::onSlicedConditionMayChange(bool overallCondition,
+ const uint64_t timestamp) {
// Now for each of the on-going event, check if the condition has changed for them.
for (auto& pair : mInfos) {
if (pair.second.state == kStopped) {
@@ -313,7 +314,7 @@
}
int64_t MaxDurationTracker::predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
- const uint64_t currentTimestamp) const {
+ const int64_t currentTimestamp) const {
// The allowed time we can continue in the current state is the
// (anomaly threshold) - max(elapsed time of the started mInfos).
int64_t maxElapsed = 0;
@@ -326,8 +327,9 @@
}
}
}
- int64_t threshold = anomalyTracker.getAnomalyThreshold();
- return currentTimestamp + threshold - maxElapsed;
+ int64_t anomalyTimeNs = currentTimestamp + anomalyTracker.getAnomalyThreshold() - maxElapsed;
+ int64_t refractoryEndNs = anomalyTracker.getRefractoryPeriodEndsSec(mEventKey) * NS_PER_SEC;
+ return std::max(anomalyTimeNs, refractoryEndNs);
}
void MaxDurationTracker::dumpStates(FILE* out, bool verbose) const {
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
index 0452d37..884e8ac 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
@@ -53,11 +53,11 @@
const uint64_t& eventTimeNs,
std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>*) override;
- void onSlicedConditionMayChange(const uint64_t timestamp) override;
+ void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) override;
void onConditionChanged(bool condition, const uint64_t timestamp) override;
int64_t predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
- const uint64_t currentTimestamp) const override;
+ const int64_t currentTimestamp) const override;
void dumpStates(FILE* out, bool verbose) const override;
private:
diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
index b418a85..50db9a0 100644
--- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
@@ -166,13 +166,13 @@
current_info.mDuration = mDuration;
(*output)[mEventKey].push_back(current_info);
mDurationFullBucket += mDuration;
- if (eventTimeNs > fullBucketEnd) {
- // End of full bucket, can send to anomaly tracker now.
- addPastBucketToAnomalyTrackers(mDurationFullBucket, mCurrentBucketNum);
- mDurationFullBucket = 0;
- }
VLOG(" duration: %lld", (long long)current_info.mDuration);
}
+ if (eventTimeNs > fullBucketEnd) {
+ // End of full bucket, can send to anomaly tracker now.
+ addPastBucketToAnomalyTrackers(mDurationFullBucket, mCurrentBucketNum);
+ mDurationFullBucket = 0;
+ }
if (mStarted.size() > 0) {
for (int i = 1; i < numBucketsForward; i++) {
@@ -186,6 +186,10 @@
addPastBucketToAnomalyTrackers(info.mDuration, mCurrentBucketNum + i);
VLOG(" add filling bucket with duration %lld", (long long)info.mDuration);
}
+ } else {
+ if (numBucketsForward >= 2) {
+ addPastBucketToAnomalyTrackers(0, mCurrentBucketNum + numBucketsForward - 1);
+ }
}
mDuration = 0;
@@ -210,7 +214,8 @@
return flushCurrentBucket(eventTimeNs, output);
}
-void OringDurationTracker::onSlicedConditionMayChange(const uint64_t timestamp) {
+void OringDurationTracker::onSlicedConditionMayChange(bool overallCondition,
+ const uint64_t timestamp) {
vector<pair<HashableDimensionKey, int>> startedToPaused;
vector<pair<HashableDimensionKey, int>> pausedToStarted;
if (!mStarted.empty()) {
@@ -320,57 +325,84 @@
}
int64_t OringDurationTracker::predictAnomalyTimestampNs(
- const DurationAnomalyTracker& anomalyTracker, const uint64_t eventTimestampNs) const {
+ const DurationAnomalyTracker& anomalyTracker, const int64_t eventTimestampNs) const {
// TODO: Unit-test this and see if it can be done more efficiently (e.g. use int32).
- // All variables below represent durations (not timestamps).
+ // The anomaly threshold.
const int64_t thresholdNs = anomalyTracker.getAnomalyThreshold();
- // The time until the current bucket ends. This is how much more 'space' it can hold.
- const int64_t currRemainingBucketSizeNs =
- mBucketSizeNs - (eventTimestampNs - mCurrentBucketStartTimeNs);
- if (currRemainingBucketSizeNs < 0) {
- ALOGE("OringDurationTracker currRemainingBucketSizeNs < 0");
- // This should never happen. Return the safest thing possible given that data is corrupt.
- return eventTimestampNs + thresholdNs;
- }
+ // The timestamp of the current bucket end.
+ const int64_t currentBucketEndNs = getCurrentBucketEndTimeNs();
+
+ // The past duration ns for the current bucket.
+ int64_t currentBucketPastNs = mDuration + mDurationFullBucket;
// As we move into the future, old buckets get overwritten (so their old data is erased).
-
// Sum of past durations. Will change as we overwrite old buckets.
- int64_t pastNs = mDuration + mDurationFullBucket;
- pastNs += anomalyTracker.getSumOverPastBuckets(mEventKey);
+ int64_t pastNs = currentBucketPastNs + anomalyTracker.getSumOverPastBuckets(mEventKey);
- // How much of the threshold is still unaccounted after considering pastNs.
- int64_t leftNs = thresholdNs - pastNs;
+ // The refractory period end timestamp for dimension mEventKey.
+ const int64_t refractoryPeriodEndNs =
+ anomalyTracker.getRefractoryPeriodEndsSec(mEventKey) * NS_PER_SEC;
- // First deal with the remainder of the current bucket.
- if (leftNs <= currRemainingBucketSizeNs) { // Predict the anomaly will occur in this bucket.
- return eventTimestampNs + leftNs;
+ // The anomaly should happen when accumulated wakelock duration is above the threshold and
+ // not within the refractory period.
+ int64_t anomalyTimestampNs =
+ std::max(eventTimestampNs + thresholdNs - pastNs, refractoryPeriodEndNs);
+ // If the predicted the anomaly timestamp is within the current bucket, return it directly.
+ if (anomalyTimestampNs <= currentBucketEndNs) {
+ return std::max(eventTimestampNs, anomalyTimestampNs);
}
- // The remainder of this bucket contributes, but we must then move to the next bucket.
- pastNs += currRemainingBucketSizeNs;
- // Now deal with the past buckets, starting with the oldest.
- for (int futBucketIdx = 0; futBucketIdx < anomalyTracker.getNumOfPastBuckets();
- futBucketIdx++) {
- // We now overwrite the oldest bucket with the previous 'current', and start a new
- // 'current'.
+ // Remove the old bucket.
+ if (anomalyTracker.getNumOfPastBuckets() > 0) {
pastNs -= anomalyTracker.getPastBucketValue(
- mEventKey, mCurrentBucketNum - anomalyTracker.getNumOfPastBuckets() + futBucketIdx);
- leftNs = thresholdNs - pastNs;
- if (leftNs <= mBucketSizeNs) { // Predict anomaly will occur in this bucket.
- return eventTimestampNs + currRemainingBucketSizeNs + (futBucketIdx * mBucketSizeNs) +
- leftNs;
- } else { // This bucket would be entirely filled, and we'll need to move to the next
- // bucket.
- pastNs += mBucketSizeNs;
+ mEventKey,
+ mCurrentBucketNum - anomalyTracker.getNumOfPastBuckets());
+ // Add the remaining of the current bucket to the accumulated wakelock duration.
+ pastNs += (currentBucketEndNs - eventTimestampNs);
+ } else {
+ // The anomaly depends on only one bucket.
+ pastNs = 0;
+ }
+
+ // The anomaly will not happen in the current bucket. We need to iterate over the future buckets
+ // to predict the accumulated wakelock duration and determine the anomaly timestamp accordingly.
+ for (int futureBucketIdx = 1; futureBucketIdx <= anomalyTracker.getNumOfPastBuckets() + 1;
+ futureBucketIdx++) {
+ // The alarm candidate timestamp should meet two requirements:
+ // 1. the accumulated wakelock duration is above the threshold.
+ // 2. it is not within the refractory period.
+ // 3. the alarm timestamp falls in this bucket. Otherwise we need to flush the past buckets,
+ // find the new alarm candidate timestamp and check these requirements again.
+ const int64_t bucketEndNs = currentBucketEndNs + futureBucketIdx * mBucketSizeNs;
+ int64_t anomalyTimestampNs =
+ std::max(bucketEndNs - mBucketSizeNs + thresholdNs - pastNs, refractoryPeriodEndNs);
+ if (anomalyTimestampNs <= bucketEndNs) {
+ return anomalyTimestampNs;
+ }
+ if (anomalyTracker.getNumOfPastBuckets() <= 0) {
+ continue;
+ }
+
+ // No valid alarm timestamp is found in this bucket. The clock moves to the end of the
+ // bucket. Update the pastNs.
+ pastNs += mBucketSizeNs;
+ // 1. If the oldest past bucket is still in the past bucket window, we could fetch the past
+ // bucket and erase it from pastNs.
+ // 2. If the oldest past bucket is the current bucket, we should compute the
+ // wakelock duration in the current bucket and erase it from pastNs.
+ // 3. Otherwise all othe past buckets are ancient.
+ if (futureBucketIdx < anomalyTracker.getNumOfPastBuckets()) {
+ pastNs -= anomalyTracker.getPastBucketValue(
+ mEventKey,
+ mCurrentBucketNum - anomalyTracker.getNumOfPastBuckets() + futureBucketIdx);
+ } else if (futureBucketIdx == anomalyTracker.getNumOfPastBuckets()) {
+ pastNs -= (currentBucketPastNs + (currentBucketEndNs - eventTimestampNs));
}
}
- // If we have reached this point, we even have to overwrite the the original current bucket.
- // Thus, none of the past data will still be extant - pastNs is now 0.
- return eventTimestampNs + thresholdNs;
+ return std::max(eventTimestampNs + thresholdNs, refractoryPeriodEndNs);
}
void OringDurationTracker::dumpStates(FILE* out, bool verbose) const {
diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
index 610e3ea..987e28e 100644
--- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
@@ -45,7 +45,7 @@
const bool stopAll) override;
void noteStopAll(const uint64_t eventTime) override;
- void onSlicedConditionMayChange(const uint64_t timestamp) override;
+ void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) override;
void onConditionChanged(bool condition, const uint64_t timestamp) override;
bool flushCurrentBucket(
@@ -56,7 +56,7 @@
std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) override;
int64_t predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
- const uint64_t currentTimestamp) const override;
+ const int64_t currentTimestamp) const override;
void dumpStates(FILE* out, bool verbose) const override;
private:
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index 50eca05..b7c5795 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -599,10 +599,11 @@
bool initAlarms(const StatsdConfig& config, const ConfigKey& key,
const sp<AlarmMonitor>& periodicAlarmMonitor,
- const long timeBaseSec,
+ const long timeBaseSec, const long currentTimeSec,
vector<sp<AlarmTracker>>& allAlarmTrackers) {
unordered_map<int64_t, int> alarmTrackerMap;
uint64_t startMillis = (uint64_t)timeBaseSec * MS_PER_SEC;
+ uint64_t currentTimeMillis = (uint64_t)currentTimeSec * MS_PER_SEC;
for (int i = 0; i < config.alarm_size(); i++) {
const Alarm& alarm = config.alarm(i);
if (alarm.offset_millis() <= 0) {
@@ -615,7 +616,8 @@
}
alarmTrackerMap.insert(std::make_pair(alarm.id(), allAlarmTrackers.size()));
allAlarmTrackers.push_back(
- new AlarmTracker(startMillis, alarm, key, periodicAlarmMonitor));
+ new AlarmTracker(startMillis, currentTimeMillis,
+ alarm, key, periodicAlarmMonitor));
}
for (int i = 0; i < config.subscription_size(); ++i) {
const Subscription& subscription = config.subscription(i);
@@ -644,7 +646,7 @@
const UidMap& uidMap,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor,
- const long timeBaseSec,
+ const long timeBaseSec, const long currentTimeSec,
set<int>& allTagIds,
vector<sp<LogMatchingTracker>>& allAtomMatchers,
vector<sp<ConditionTracker>>& allConditionTrackers,
@@ -682,7 +684,8 @@
ALOGE("initAlerts failed");
return false;
}
- if (!initAlarms(config, key, periodicAlarmMonitor, timeBaseSec, allPeriodicAlarmTrackers)) {
+ if (!initAlarms(config, key, periodicAlarmMonitor,
+ timeBaseSec, currentTimeSec, allPeriodicAlarmTrackers)) {
ALOGE("initAlarms failed");
return false;
}
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.h b/cmds/statsd/src/metrics/metrics_manager_util.h
index 386de0b..3754ae0 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.h
+++ b/cmds/statsd/src/metrics/metrics_manager_util.h
@@ -98,7 +98,7 @@
const UidMap& uidMap,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor,
- const long timeBaseSec,
+ const long timeBaseSec, const long currentTimeSec,
std::set<int>& allTagIds,
std::vector<sp<LogMatchingTracker>>& allAtomMatchers,
std::vector<sp<ConditionTracker>>& allConditionTrackers,
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index dd3b37c..a25df3f 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -241,6 +241,7 @@
repeated ConditionStats condition_stats = 14;
repeated MetricStats metric_stats = 15;
repeated AlertStats alert_stats = 16;
+ repeated MetricStats metric_dimension_in_condition_stats = 17;
}
repeated ConfigStats config_stats = 3;
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index cab61e9..efd810f 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -221,7 +221,8 @@
int64_t TimeUnitToBucketSizeInMillisGuardrailed(int uid, TimeUnit unit) {
int64_t bucketSizeMillis = TimeUnitToBucketSizeInMillis(unit);
- if (bucketSizeMillis > 1000 && bucketSizeMillis < 5 * 60 * 1000LL && uid != AID_SHELL) {
+ if (bucketSizeMillis > 1000 && bucketSizeMillis < 5 * 60 * 1000LL && uid != AID_SHELL &&
+ uid != AID_ROOT) {
bucketSizeMillis = 5 * 60 * 1000LL;
}
return bucketSizeMillis;
diff --git a/cmds/statsd/statsd.rc b/cmds/statsd/statsd.rc
index 920273b..3a0c224 100644
--- a/cmds/statsd/statsd.rc
+++ b/cmds/statsd/statsd.rc
@@ -20,5 +20,5 @@
on post-fs-data
# Create directory for statsd
- mkdir /data/misc/stats-data/ 0770 statsd statsd
- mkdir /data/misc/stats-service/ 0770 statsd statsd
+ mkdir /data/misc/stats-data/ 0770 statsd system
+ mkdir /data/misc/stats-service/ 0770 statsd system
diff --git a/cmds/statsd/tests/ConfigManager_test.cpp b/cmds/statsd/tests/ConfigManager_test.cpp
index 90c3a2f..9455304 100644
--- a/cmds/statsd/tests/ConfigManager_test.cpp
+++ b/cmds/statsd/tests/ConfigManager_test.cpp
@@ -44,7 +44,8 @@
*/
class MockListener : public ConfigListener {
public:
- MOCK_METHOD2(OnConfigUpdated, void(const ConfigKey& key, const StatsdConfig& config));
+ MOCK_METHOD3(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key,
+ const StatsdConfig& config));
MOCK_METHOD1(OnConfigRemoved, void(const ConfigKey& key));
};
@@ -64,16 +65,6 @@
const int64_t testConfigId = 12345;
-TEST(ConfigManagerTest, TestFakeConfig) {
- auto metricsManager = std::make_unique<MetricsManager>(
- ConfigKey(0, testConfigId), build_fake_config(), 1000, new UidMap(),
- new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
- [](const sp<IStatsCompanionService>&){}),
- new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
- [](const sp<IStatsCompanionService>&){}));
- EXPECT_TRUE(metricsManager->isConfigValid());
-}
-
/**
* Test the addOrUpdate and remove methods
*/
@@ -98,25 +89,25 @@
manager->StartupForTest();
// Add another one
- EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")),
+ EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
StatsdConfigEq(91)))
.RetiresOnSaturation();
manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config91);
// Update It
- EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")),
+ EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
StatsdConfigEq(92)))
.RetiresOnSaturation();
manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config92);
// Add one with the same uid but a different name
- EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("yyy")),
+ EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")),
StatsdConfigEq(93)))
.RetiresOnSaturation();
manager->UpdateConfig(ConfigKey(1, StringToId("yyy")), config93);
// Add one with the same name but a different uid
- EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(2, StringToId("zzz")),
+ EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")),
StatsdConfigEq(94)))
.RetiresOnSaturation();
manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config94);
@@ -152,7 +143,7 @@
StatsdConfig config;
- EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _)).Times(5);
+ EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _)).Times(5);
EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("xxx"))));
EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("yyy"))));
EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz"))));
diff --git a/cmds/statsd/tests/FieldValue_test.cpp b/cmds/statsd/tests/FieldValue_test.cpp
index 73e7c44..5a6aba6 100644
--- a/cmds/statsd/tests/FieldValue_test.cpp
+++ b/cmds/statsd/tests/FieldValue_test.cpp
@@ -356,7 +356,7 @@
EXPECT_EQ("location1", atom.attribution_node(0).tag());
EXPECT_EQ(2222, atom.attribution_node(1).uid());
EXPECT_EQ("location2", atom.attribution_node(1).tag());
- EXPECT_EQ(999, atom.num_of_results());
+ EXPECT_EQ(999, atom.num_results());
}
diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp
index 5d8c3f7..07378db 100644
--- a/cmds/statsd/tests/MetricsManager_test.cpp
+++ b/cmds/statsd/tests/MetricsManager_test.cpp
@@ -287,7 +287,7 @@
EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -315,7 +315,7 @@
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -340,7 +340,7 @@
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -364,7 +364,7 @@
std::set<int64_t> noReportMetricIds;
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -388,7 +388,7 @@
std::set<int64_t> noReportMetricIds;
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -413,7 +413,7 @@
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -438,7 +438,7 @@
EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, allTagIds, allAtomMatchers,
+ timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
allConditionTrackers, allMetricProducers, allAnomalyTrackers,
allAlarmTrackers,
conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index 4b9a87d..5a8ba79 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -43,7 +43,7 @@
class MockMetricsManager : public MetricsManager {
public:
MockMetricsManager() : MetricsManager(
- ConfigKey(1, 12345), StatsdConfig(), 1000,
+ ConfigKey(1, 12345), StatsdConfig(), 1000, 1000,
new UidMap(),
new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
[](const sp<IStatsCompanionService>&){}),
@@ -135,7 +135,7 @@
ConfigKey key(3, 4);
StatsdConfig config;
config.add_allowed_log_source("AID_ROOT");
- p.OnConfigUpdated(key, config);
+ p.OnConfigUpdated(0, key, config);
// Expect to get no metrics, but snapshot specified above in uidmap.
vector<uint8_t> bytes;
diff --git a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
index 3330ee9..5e6de1c 100644
--- a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
+++ b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
@@ -39,25 +39,24 @@
Alarm alarm;
alarm.set_offset_millis(15 * MS_PER_SEC);
alarm.set_period_millis(60 * 60 * MS_PER_SEC); // 1hr
- uint64_t startMillis = 100000000 * MS_PER_SEC;
- AlarmTracker tracker(startMillis, alarm, kConfigKey,
- subscriberAlarmMonitor);
+ int64_t startMillis = 100000000 * MS_PER_SEC;
+ AlarmTracker tracker(startMillis, startMillis, alarm, kConfigKey, subscriberAlarmMonitor);
- EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15);
+ EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
uint64_t currentTimeSec = startMillis / MS_PER_SEC + 10;
std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarmSet =
subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
EXPECT_TRUE(firedAlarmSet.empty());
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
- EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15);
+ EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
currentTimeSec = startMillis / MS_PER_SEC + 7000;
firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
EXPECT_EQ(firedAlarmSet.size(), 1u);
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
EXPECT_TRUE(firedAlarmSet.empty());
- EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15 + 2 * 60 * 60);
+ EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15 + 2 * 60 * 60));
}
} // namespace statsd
diff --git a/cmds/statsd/tests/e2e/Alarm_e2e_test.cpp b/cmds/statsd/tests/e2e/Alarm_e2e_test.cpp
new file mode 100644
index 0000000..73c4e7b
--- /dev/null
+++ b/cmds/statsd/tests/e2e/Alarm_e2e_test.cpp
@@ -0,0 +1,92 @@
+// 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 <gtest/gtest.h>
+
+#include "src/StatsLogProcessor.h"
+#include "src/stats_log_util.h"
+#include "tests/statsd_test_util.h"
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+
+namespace {
+
+StatsdConfig CreateStatsdConfig() {
+ StatsdConfig config;
+ config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
+
+ auto alarm = config.add_alarm();
+ alarm->set_id(123456);
+ alarm->set_offset_millis(TimeUnitToBucketSizeInMillis(TEN_MINUTES));
+ alarm->set_period_millis(TimeUnitToBucketSizeInMillis(ONE_HOUR));
+
+ alarm = config.add_alarm();
+ alarm->set_id(654321);
+ alarm->set_offset_millis(TimeUnitToBucketSizeInMillis(FIVE_MINUTES));
+ alarm->set_period_millis(TimeUnitToBucketSizeInMillis(THIRTY_MINUTES));
+ return config;
+}
+
+} // namespace
+
+TEST(AlarmE2eTest, TestMultipleAlarms) {
+ auto config = CreateStatsdConfig();
+ int64_t bucketStartTimeNs = 10000000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(2u, processor->mMetricsManagers.begin()->second->mAllPeriodicAlarmTrackers.size());
+
+ auto alarmTracker1 = processor->mMetricsManagers.begin()->second->mAllPeriodicAlarmTrackers[0];
+ auto alarmTracker2 = processor->mMetricsManagers.begin()->second->mAllPeriodicAlarmTrackers[1];
+
+ int64_t alarmTimestampSec0 = bucketStartTimeNs / NS_PER_SEC + 10 * 60;
+ int64_t alarmTimestampSec1 = bucketStartTimeNs / NS_PER_SEC + 5 * 60;
+ EXPECT_EQ(alarmTimestampSec0, alarmTracker1->getAlarmTimestampSec());
+ EXPECT_EQ(alarmTimestampSec1, alarmTracker2->getAlarmTimestampSec());
+
+ // Alarm fired.
+ const int64_t alarmFiredTimestampSec0 = alarmTimestampSec1 + 5;
+ auto alarmSet = processor->getPeriodicAlarmMonitor()->popSoonerThan(
+ static_cast<uint32_t>(alarmFiredTimestampSec0));
+ EXPECT_EQ(1u, alarmSet.size());
+ processor->onPeriodicAlarmFired(alarmFiredTimestampSec0 * NS_PER_SEC, alarmSet);
+ EXPECT_EQ(alarmTimestampSec0, alarmTracker1->getAlarmTimestampSec());
+ EXPECT_EQ(alarmTimestampSec1 + 30 * 60, alarmTracker2->getAlarmTimestampSec());
+
+ // Alarms fired very late.
+ const int64_t alarmFiredTimestampSec1 = alarmTimestampSec0 + 2 * 60 * 60 + 125;
+ alarmSet = processor->getPeriodicAlarmMonitor()->popSoonerThan(
+ static_cast<uint32_t>(alarmFiredTimestampSec1));
+ EXPECT_EQ(2u, alarmSet.size());
+ processor->onPeriodicAlarmFired(alarmFiredTimestampSec1 * NS_PER_SEC, alarmSet);
+ EXPECT_EQ(alarmTimestampSec0 + 60 * 60 * 3, alarmTracker1->getAlarmTimestampSec());
+ EXPECT_EQ(alarmTimestampSec1 + 30 * 60 * 5, alarmTracker2->getAlarmTimestampSec());
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/tests/e2e/Anomaly_count_e2e_test.cpp b/cmds/statsd/tests/e2e/Anomaly_count_e2e_test.cpp
new file mode 100644
index 0000000..93ecde5
--- /dev/null
+++ b/cmds/statsd/tests/e2e/Anomaly_count_e2e_test.cpp
@@ -0,0 +1,241 @@
+// 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.
+
+#include <gtest/gtest.h>
+
+#include "src/StatsLogProcessor.h"
+#include "src/stats_log_util.h"
+#include "tests/statsd_test_util.h"
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+
+namespace {
+
+StatsdConfig CreateStatsdConfig(int num_buckets, int threshold) {
+ StatsdConfig config;
+ config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
+ auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
+
+ *config.add_atom_matcher() = wakelockAcquireMatcher;
+
+ auto countMetric = config.add_count_metric();
+ countMetric->set_id(123456);
+ countMetric->set_what(wakelockAcquireMatcher.id());
+ *countMetric->mutable_dimensions_in_what() = CreateAttributionUidDimensions(
+ android::util::WAKELOCK_STATE_CHANGED, {Position::FIRST});
+ countMetric->set_bucket(FIVE_MINUTES);
+
+ auto alert = config.add_alert();
+ alert->set_id(StringToId("alert"));
+ alert->set_metric_id(123456);
+ alert->set_num_buckets(num_buckets);
+ alert->set_refractory_period_secs(10);
+ alert->set_trigger_if_sum_gt(threshold);
+ return config;
+}
+
+} // namespace
+
+TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket) {
+ const int num_buckets = 1;
+ const int threshold = 3;
+ auto config = CreateStatsdConfig(num_buckets, threshold);
+ const uint64_t alert_id = config.alert(0).id();
+ const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs();
+
+ int64_t bucketStartTimeNs = 10000000000;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size());
+
+ sp<AnomalyTracker> anomalyTracker =
+ processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0];
+
+ std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
+ std::vector<AttributionNodeInternal> attributions2 = {
+ CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions3 = {
+ CreateAttribution(111, "App1"), CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions4 = {
+ CreateAttribution(222, "GMSCoreModule1"), CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions5 = {
+ CreateAttribution(222, "GMSCoreModule1") };
+
+ FieldValue fieldValue1(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+ Value((int32_t)111));
+ HashableDimensionKey whatKey1({fieldValue1});
+ MetricDimensionKey dimensionKey1(whatKey1, DEFAULT_DIMENSION_KEY);
+
+ FieldValue fieldValue2(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+ Value((int32_t)222));
+ HashableDimensionKey whatKey2({fieldValue2});
+ MetricDimensionKey dimensionKey2(whatKey2, DEFAULT_DIMENSION_KEY);
+
+ auto event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions4, "wl2", bucketStartTimeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ event = CreateAcquireWakelockEvent(attributions2, "wl1", bucketStartTimeNs + 3);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions5, "wl2", bucketStartTimeNs + 3);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ event = CreateAcquireWakelockEvent(attributions3, "wl1", bucketStartTimeNs + 4);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions5, "wl2", bucketStartTimeNs + 4);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ // Fired alarm and refractory period end timestamp updated.
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 5);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + bucketStartTimeNs / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 100);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + bucketStartTimeNs / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + bucketSizeNs - 1);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs - 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + bucketSizeNs + 1);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs - 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions4, "wl2", bucketStartTimeNs + bucketSizeNs + 1);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ event = CreateAcquireWakelockEvent(attributions5, "wl2", bucketStartTimeNs + bucketSizeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ event = CreateAcquireWakelockEvent(attributions5, "wl2", bucketStartTimeNs + bucketSizeNs + 3);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ event = CreateAcquireWakelockEvent(attributions5, "wl2", bucketStartTimeNs + bucketSizeNs + 4);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs + 4) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+}
+
+TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets) {
+ const int num_buckets = 3;
+ const int threshold = 3;
+ auto config = CreateStatsdConfig(num_buckets, threshold);
+ const uint64_t alert_id = config.alert(0).id();
+ const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs();
+
+ int64_t bucketStartTimeNs = 10000000000;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size());
+
+ sp<AnomalyTracker> anomalyTracker =
+ processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0];
+
+ std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
+ std::vector<AttributionNodeInternal> attributions2 = {
+ CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions3 = {
+ CreateAttribution(111, "App1"), CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions4 = {
+ CreateAttribution(222, "GMSCoreModule1"), CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions5 = {
+ CreateAttribution(222, "GMSCoreModule1") };
+
+ FieldValue fieldValue1(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+ Value((int32_t)111));
+ HashableDimensionKey whatKey1({fieldValue1});
+ MetricDimensionKey dimensionKey1(whatKey1, DEFAULT_DIMENSION_KEY);
+
+ FieldValue fieldValue2(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+ Value((int32_t)222));
+ HashableDimensionKey whatKey2({fieldValue2});
+ MetricDimensionKey dimensionKey2(whatKey2, DEFAULT_DIMENSION_KEY);
+
+ auto event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions2, "wl1", bucketStartTimeNs + 3);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ // Fired alarm and refractory period end timestamp updated.
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 4);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + bucketSizeNs + 1);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs + 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(attributions2, "wl1", bucketStartTimeNs + bucketSizeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs + 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 3 * bucketSizeNs + 1);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs + 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+
+ event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 3 * bucketSizeNs + 2);
+ processor->OnLogEvent(event.get());
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + 3 * bucketSizeNs + 2) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1));
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp b/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp
new file mode 100644
index 0000000..e924b03
--- /dev/null
+++ b/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp
@@ -0,0 +1,486 @@
+// 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.
+
+#include <gtest/gtest.h>
+
+#include "src/anomaly/DurationAnomalyTracker.h"
+#include "src/StatsLogProcessor.h"
+#include "src/stats_log_util.h"
+#include "tests/statsd_test_util.h"
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+
+namespace {
+
+StatsdConfig CreateStatsdConfig(int num_buckets,
+ uint64_t threshold_ns,
+ DurationMetric::AggregationType aggregationType,
+ bool nesting) {
+ StatsdConfig config;
+ config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
+ *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
+ *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
+ *config.add_atom_matcher() = CreateAcquireWakelockAtomMatcher();
+ *config.add_atom_matcher() = CreateReleaseWakelockAtomMatcher();
+
+ auto screenIsOffPredicate = CreateScreenIsOffPredicate();
+ *config.add_predicate() = screenIsOffPredicate;
+
+ auto holdingWakelockPredicate = CreateHoldingWakelockPredicate();
+ FieldMatcher dimensions = CreateAttributionUidDimensions(
+ android::util::WAKELOCK_STATE_CHANGED, {Position::FIRST});
+ dimensions.add_child()->set_field(3); // The wakelock tag is set in field 3 of the wakelock.
+ *holdingWakelockPredicate.mutable_simple_predicate()->mutable_dimensions() = dimensions;
+ holdingWakelockPredicate.mutable_simple_predicate()->set_count_nesting(nesting);
+ *config.add_predicate() = holdingWakelockPredicate;
+
+ auto durationMetric = config.add_duration_metric();
+ durationMetric->set_id(StringToId("WakelockDuration"));
+ durationMetric->set_what(holdingWakelockPredicate.id());
+ durationMetric->set_condition(screenIsOffPredicate.id());
+ durationMetric->set_aggregation_type(aggregationType);
+ *durationMetric->mutable_dimensions_in_what() =
+ CreateAttributionUidDimensions(android::util::WAKELOCK_STATE_CHANGED, {Position::FIRST});
+ durationMetric->set_bucket(FIVE_MINUTES);
+
+ auto alert = config.add_alert();
+ alert->set_id(StringToId("alert"));
+ alert->set_metric_id(StringToId("WakelockDuration"));
+ alert->set_num_buckets(num_buckets);
+ alert->set_refractory_period_secs(2);
+ alert->set_trigger_if_sum_gt(threshold_ns);
+ return config;
+}
+
+} // namespace
+
+std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
+ CreateAttribution(222, "GMSCoreModule1")};
+
+std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(111, "App2"),
+ CreateAttribution(222, "GMSCoreModule1")};
+
+std::vector<AttributionNodeInternal> attributions3 = {CreateAttribution(222, "GMSCoreModule1")};
+
+MetricDimensionKey dimensionKey(
+ HashableDimensionKey({FieldValue(Field(android::util::WAKELOCK_STATE_CHANGED,
+ (int32_t)0x02010101), Value((int32_t)111))}),
+ DEFAULT_DIMENSION_KEY);
+
+MetricDimensionKey dimensionKey2(
+ HashableDimensionKey({FieldValue(Field(android::util::WAKELOCK_STATE_CHANGED,
+ (int32_t)0x02010101), Value((int32_t)222))}),
+ DEFAULT_DIMENSION_KEY);
+
+TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) {
+ const int num_buckets = 1;
+ const uint64_t threshold_ns = NS_PER_SEC;
+ auto config = CreateStatsdConfig(num_buckets, threshold_ns, DurationMetric::SUM, true);
+ const uint64_t alert_id = config.alert(0).id();
+ const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs();
+
+ int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size());
+
+ sp<AnomalyTracker> anomalyTracker =
+ processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0];
+
+ auto screen_on_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_ON, bucketStartTimeNs + 1);
+ auto screen_off_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF, bucketStartTimeNs + 10);
+ processor->OnLogEvent(screen_on_event.get());
+ processor->OnLogEvent(screen_off_event.get());
+
+ // Acquire wakelock wl1.
+ auto acquire_event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 11);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 11 + threshold_ns) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Release wakelock wl1. No anomaly detected. Alarm cancelled at the "release" event.
+ auto release_event = CreateReleaseWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 101);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire wakelock wl1 within bucket #0.
+ acquire_event = CreateAcquireWakelockEvent(attributions2, "wl1", bucketStartTimeNs + 110);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 110 + threshold_ns - 90) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Release wakelock wl1. One anomaly detected.
+ release_event = CreateReleaseWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + NS_PER_SEC + 109);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + NS_PER_SEC + 109) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire wakelock wl1.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + NS_PER_SEC + 112);
+ processor->OnLogEvent(acquire_event.get());
+ // Wakelock has been hold longer than the threshold in bucket #0. The alarm is set at the
+ // end of the refractory period.
+ const int64_t alarmFiredTimestampSec0 = anomalyTracker->getAlarmTimestampSec(dimensionKey);
+ EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + NS_PER_SEC + 109) / NS_PER_SEC + 1,
+ (uint32_t)alarmFiredTimestampSec0);
+
+ // Anomaly alarm fired.
+ auto alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan(
+ static_cast<uint32_t>(alarmFiredTimestampSec0));
+ EXPECT_EQ(1u, alarmSet.size());
+ processor->onAnomalyAlarmFired(alarmFiredTimestampSec0 * NS_PER_SEC, alarmSet);
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec + alarmFiredTimestampSec0,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Release wakelock wl1.
+ release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", alarmFiredTimestampSec0 * NS_PER_SEC + NS_PER_SEC + 1);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ // Within refractory period. No more anomaly detected.
+ EXPECT_EQ(refractory_period_sec + alarmFiredTimestampSec0,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire wakelock wl1.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + bucketSizeNs - 5 * NS_PER_SEC - 11);
+ processor->OnLogEvent(acquire_event.get());
+ const int64_t alarmFiredTimestampSec1 = anomalyTracker->getAlarmTimestampSec(dimensionKey);
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs - 5 * NS_PER_SEC) / NS_PER_SEC,
+ (uint64_t)alarmFiredTimestampSec1);
+
+ // Release wakelock wl1.
+ release_event = CreateReleaseWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + bucketSizeNs - 4 * NS_PER_SEC - 10);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + bucketSizeNs - 4 * NS_PER_SEC - 10) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan(
+ static_cast<uint32_t>(alarmFiredTimestampSec1));
+ EXPECT_EQ(0u, alarmSet.size());
+
+ // Acquire wakelock wl1 near the end of bucket #0.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs - 2);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ // Release the event at early bucket #1.
+ release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs + NS_PER_SEC - 1);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ // Anomaly detected when stopping the alarm. The refractory period does not change.
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + bucketSizeNs + NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Condition changes to false.
+ screen_on_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_ON,
+ bucketStartTimeNs + 2 * bucketSizeNs + 20);
+ processor->OnLogEvent(screen_on_event.get());
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + bucketSizeNs + NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 30);
+ processor->OnLogEvent(acquire_event.get());
+ // The condition is false. Do not start the alarm.
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + bucketSizeNs + NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Condition turns true.
+ screen_off_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
+ bucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC);
+ processor->OnLogEvent(screen_off_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC + threshold_ns) / NS_PER_SEC,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ // Condition turns to false.
+ screen_on_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_ON,
+ bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC + 1);
+ processor->OnLogEvent(screen_on_event.get());
+ // Condition turns to false. Cancelled the alarm.
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ // Detected one anomaly.
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC + 1) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Condition turns to true again.
+ screen_off_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
+ bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC + 2);
+ processor->OnLogEvent(screen_off_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2 + 2 + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ release_event = CreateReleaseWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 5 * NS_PER_SEC);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + 2 * bucketSizeNs + 5 * NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+}
+
+TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets) {
+ const int num_buckets = 3;
+ const uint64_t threshold_ns = NS_PER_SEC;
+ auto config = CreateStatsdConfig(num_buckets, threshold_ns, DurationMetric::SUM, true);
+ const uint64_t alert_id = config.alert(0).id();
+ const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs();
+
+ int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000;
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size());
+
+ sp<AnomalyTracker> anomalyTracker =
+ processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0];
+
+ auto screen_off_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF, bucketStartTimeNs + 1);
+ processor->OnLogEvent(screen_off_event.get());
+
+ // Acquire wakelock "wc1" in bucket #0.
+ auto acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs - NS_PER_SEC / 2 - 1);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Release wakelock "wc1" in bucket #0.
+ auto release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs - 1);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire wakelock "wc1" in bucket #1.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + bucketSizeNs + 1);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ release_event = CreateReleaseWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + bucketSizeNs + 100);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire wakelock "wc2" in bucket #2.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions3, "wl2", bucketStartTimeNs + 2 * bucketSizeNs + 1);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey2));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ // Release wakelock "wc2" in bucket #2.
+ release_event = CreateReleaseWakelockEvent(
+ attributions3, "wl2", bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey2));
+ EXPECT_EQ(refractory_period_sec +
+ (bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2));
+
+ // Acquire wakelock "wc1" in bucket #2.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2 + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Release wakelock "wc1" in bucket #2.
+ release_event = CreateReleaseWakelockEvent(
+ attributions2, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 2.5 * NS_PER_SEC);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec +
+ (int64_t)(bucketStartTimeNs + 2 * bucketSizeNs + 2.5 * NS_PER_SEC) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions3, "wl2", bucketStartTimeNs + 6 * bucketSizeNs - NS_PER_SEC + 4);
+ processor->OnLogEvent(acquire_event.get());
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 6 * bucketSizeNs - NS_PER_SEC + 5);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ((bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 1,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey2));
+
+ release_event = CreateReleaseWakelockEvent(
+ attributions3, "wl2", bucketStartTimeNs + 6 * bucketSizeNs + 2);
+ processor->OnLogEvent(release_event.get());
+ release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 6 * bucketSizeNs + 6);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey2));
+ // The buckets are not messed up across dimensions. Only one dimension has anomaly triggered.
+ EXPECT_EQ(refractory_period_sec +
+ (int64_t)(bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 1,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+}
+
+TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period) {
+ const int num_buckets = 2;
+ const uint64_t threshold_ns = 3 * NS_PER_SEC;
+ auto config = CreateStatsdConfig(num_buckets, threshold_ns, DurationMetric::SUM, false);
+ int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+ int64_t bucketSizeNs =
+ TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000;
+
+ const uint64_t alert_id = config.alert(0).id();
+ const uint32_t refractory_period_sec = 3 * bucketSizeNs / NS_PER_SEC;
+ config.mutable_alert(0)->set_refractory_period_secs(refractory_period_sec);
+
+ ConfigKey cfgKey;
+ auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+ EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+ EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+ EXPECT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size());
+
+ sp<AnomalyTracker> anomalyTracker =
+ processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0];
+
+ auto screen_off_event = CreateScreenStateChangedEvent(
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF, bucketStartTimeNs + 1);
+ processor->OnLogEvent(screen_off_event.get());
+
+ // Acquire wakelock "wc1" in bucket #0.
+ auto acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs - 100);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Acquire the wakelock "wc1" again.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + bucketSizeNs + 2 * NS_PER_SEC + 1);
+ processor->OnLogEvent(acquire_event.get());
+ // The alarm does not change.
+ EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // Anomaly alarm fired late.
+ const int64_t firedAlarmTimestampNs = bucketStartTimeNs + 2 * bucketSizeNs - NS_PER_SEC;
+ auto alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan(
+ static_cast<uint32_t>(firedAlarmTimestampNs / NS_PER_SEC));
+ EXPECT_EQ(1u, alarmSet.size());
+ processor->onAnomalyAlarmFired(firedAlarmTimestampNs, alarmSet);
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 2 * bucketSizeNs - 100);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ auto release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 1);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+ // Within the refractory period. No anomaly.
+ EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ // A new wakelock, but still within refractory period.
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 2 * bucketSizeNs + 10 * NS_PER_SEC);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 3 * bucketSizeNs - NS_PER_SEC);
+ // Still in the refractory period. No anomaly.
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey));
+
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 5);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ release_event = CreateReleaseWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 4);
+ processor->OnLogEvent(release_event.get());
+ EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey));
+
+ acquire_event = CreateAcquireWakelockEvent(
+ attributions1, "wl1", bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 3);
+ processor->OnLogEvent(acquire_event.get());
+ EXPECT_EQ((bucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC,
+ anomalyTracker->getAlarmTimestampSec(dimensionKey));
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
index 2287c2b..c2334d8 100644
--- a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
+++ b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
@@ -458,7 +458,7 @@
} // namespace
TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition) {
- for (auto aggregationType : { DurationMetric::MAX_SPARSE}) { // DurationMetric::SUM,
+ for (auto aggregationType : { DurationMetric::MAX_SPARSE, DurationMetric::SUM}) {
ConfigKey cfgKey;
auto config = CreateDurationMetricConfig_NoLink_CombinationCondition(aggregationType);
int64_t bucketStartTimeNs = 10000000000;
diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
index 2e6a0f0..2b91324 100644
--- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
+++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
@@ -34,7 +34,7 @@
*config.add_atom_matcher() = CreateMoveToBackgroundAtomMatcher();
*config.add_atom_matcher() = CreateMoveToForegroundAtomMatcher();
- auto atomMatcher = CreateSimpleAtomMatcher("", android::util::APP_START_CHANGED);
+ auto atomMatcher = CreateSimpleAtomMatcher("", android::util::APP_START_OCCURRED);
*config.add_atom_matcher() = atomMatcher;
auto isInBackgroundPredicate = CreateIsInBackgroundPredicate();
@@ -49,18 +49,18 @@
gaugeMetric->mutable_gauge_fields_filter()->set_include_all(false);
gaugeMetric->set_sampling_type(sampling_type);
auto fieldMatcher = gaugeMetric->mutable_gauge_fields_filter()->mutable_fields();
- fieldMatcher->set_field(android::util::APP_START_CHANGED);
+ fieldMatcher->set_field(android::util::APP_START_OCCURRED);
fieldMatcher->add_child()->set_field(3); // type (enum)
fieldMatcher->add_child()->set_field(4); // activity_name(str)
fieldMatcher->add_child()->set_field(7); // activity_start_msec(int64)
*gaugeMetric->mutable_dimensions_in_what() =
- CreateDimensions(android::util::APP_START_CHANGED, {1 /* uid field */ });
+ CreateDimensions(android::util::APP_START_OCCURRED, {1 /* uid field */ });
gaugeMetric->set_bucket(FIVE_MINUTES);
auto links = gaugeMetric->add_links();
links->set_condition(isInBackgroundPredicate.id());
auto dimensionWhat = links->mutable_fields_in_what();
- dimensionWhat->set_field(android::util::APP_START_CHANGED);
+ dimensionWhat->set_field(android::util::APP_START_OCCURRED);
dimensionWhat->add_child()->set_field(1); // uid field.
auto dimensionCondition = links->mutable_fields_in_condition();
dimensionCondition->set_field(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
@@ -68,12 +68,12 @@
return config;
}
-std::unique_ptr<LogEvent> CreateAppStartChangedEvent(
- const int uid, const string& pkg_name, AppStartChanged::TransitionType type,
+std::unique_ptr<LogEvent> CreateAppStartOccurredEvent(
+ const int uid, const string& pkg_name, AppStartOccurred::TransitionType type,
const string& activity_name, const string& calling_pkg_name, const bool is_instant_app,
int64_t activity_start_msec, uint64_t timestampNs) {
auto logEvent = std::make_unique<LogEvent>(
- android::util::APP_START_CHANGED, timestampNs);
+ android::util::APP_START_OCCURRED, timestampNs);
logEvent->write(uid);
logEvent->write(pkg_name);
logEvent->write(type);
@@ -112,32 +112,32 @@
appUid1, bucketStartTimeNs + 2 * bucketSizeNs + 100));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::WARM, "activity_name1", "calling_pkg_name1",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::WARM, "activity_name1", "calling_pkg_name1",
true /*is_instant_app*/, 101 /*activity_start_msec*/, bucketStartTimeNs + 10));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::HOT, "activity_name2", "calling_pkg_name2",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::HOT, "activity_name2", "calling_pkg_name2",
true /*is_instant_app*/, 102 /*activity_start_msec*/, bucketStartTimeNs + 20));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::COLD, "activity_name3", "calling_pkg_name3",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::COLD, "activity_name3", "calling_pkg_name3",
true /*is_instant_app*/, 103 /*activity_start_msec*/, bucketStartTimeNs + 30));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::WARM, "activity_name4", "calling_pkg_name4",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::WARM, "activity_name4", "calling_pkg_name4",
true /*is_instant_app*/, 104 /*activity_start_msec*/,
bucketStartTimeNs + bucketSizeNs + 30));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::COLD, "activity_name5", "calling_pkg_name5",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::COLD, "activity_name5", "calling_pkg_name5",
true /*is_instant_app*/, 105 /*activity_start_msec*/,
bucketStartTimeNs + 2 * bucketSizeNs));
- events.push_back(CreateAppStartChangedEvent(
- appUid1, "app1", AppStartChanged::HOT, "activity_name6", "calling_pkg_name6",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid1, "app1", AppStartOccurred::HOT, "activity_name6", "calling_pkg_name6",
false /*is_instant_app*/, 106 /*activity_start_msec*/,
bucketStartTimeNs + 2 * bucketSizeNs + 10));
events.push_back(CreateMoveToBackgroundEvent(
appUid2, bucketStartTimeNs + bucketSizeNs + 10));
- events.push_back(CreateAppStartChangedEvent(
- appUid2, "app2", AppStartChanged::COLD, "activity_name7", "calling_pkg_name7",
+ events.push_back(CreateAppStartOccurredEvent(
+ appUid2, "app2", AppStartOccurred::COLD, "activity_name7", "calling_pkg_name7",
true /*is_instant_app*/, 201 /*activity_start_msec*/,
bucketStartTimeNs + 2 * bucketSizeNs + 10));
@@ -159,7 +159,7 @@
EXPECT_EQ(2, gaugeMetrics.data_size());
auto data = gaugeMetrics.data(0);
- EXPECT_EQ(android::util::APP_START_CHANGED, data.dimensions_in_what().field());
+ EXPECT_EQ(android::util::APP_START_OCCURRED, data.dimensions_in_what().field());
EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
EXPECT_EQ(1 /* uid field */,
data.dimensions_in_what().value_tuple().dimensions_value(0).field());
@@ -171,29 +171,29 @@
EXPECT_EQ(2, data.bucket_info(0).wall_clock_timestamp_nanos_size());
EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(0).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::HOT, data.bucket_info(0).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::HOT, data.bucket_info(0).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name2",
- data.bucket_info(0).atom(0).app_start_changed().activity_name());
+ data.bucket_info(0).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(102L,
- data.bucket_info(0).atom(0).app_start_changed().activity_start_millis());
- EXPECT_EQ(AppStartChanged::COLD,
- data.bucket_info(0).atom(1).app_start_changed().type());
+ data.bucket_info(0).atom(0).app_start_occurred().activity_start_millis());
+ EXPECT_EQ(AppStartOccurred::COLD,
+ data.bucket_info(0).atom(1).app_start_occurred().type());
EXPECT_EQ("activity_name3",
- data.bucket_info(0).atom(1).app_start_changed().activity_name());
+ data.bucket_info(0).atom(1).app_start_occurred().activity_name());
EXPECT_EQ(103L,
- data.bucket_info(0).atom(1).app_start_changed().activity_start_millis());
+ data.bucket_info(0).atom(1).app_start_occurred().activity_start_millis());
EXPECT_EQ(1, data.bucket_info(1).atom_size());
EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size());
EXPECT_EQ(1, data.bucket_info(1).wall_clock_timestamp_nanos_size());
EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(1).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(1).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::WARM,
- data.bucket_info(1).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::WARM,
+ data.bucket_info(1).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name4",
- data.bucket_info(1).atom(0).app_start_changed().activity_name());
+ data.bucket_info(1).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(104L,
- data.bucket_info(1).atom(0).app_start_changed().activity_start_millis());
+ data.bucket_info(1).atom(0).app_start_occurred().activity_start_millis());
EXPECT_EQ(2, data.bucket_info(2).atom_size());
EXPECT_EQ(2, data.bucket_info(2).elapsed_timestamp_nanos_size());
@@ -202,41 +202,41 @@
data.bucket_info(2).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs,
data.bucket_info(2).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::COLD,
- data.bucket_info(2).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::COLD,
+ data.bucket_info(2).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name5",
- data.bucket_info(2).atom(0).app_start_changed().activity_name());
+ data.bucket_info(2).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(105L,
- data.bucket_info(2).atom(0).app_start_changed().activity_start_millis());
- EXPECT_EQ(AppStartChanged::HOT,
- data.bucket_info(2).atom(1).app_start_changed().type());
+ data.bucket_info(2).atom(0).app_start_occurred().activity_start_millis());
+ EXPECT_EQ(AppStartOccurred::HOT,
+ data.bucket_info(2).atom(1).app_start_occurred().type());
EXPECT_EQ("activity_name6",
- data.bucket_info(2).atom(1).app_start_changed().activity_name());
+ data.bucket_info(2).atom(1).app_start_occurred().activity_name());
EXPECT_EQ(106L,
- data.bucket_info(2).atom(1).app_start_changed().activity_start_millis());
+ data.bucket_info(2).atom(1).app_start_occurred().activity_start_millis());
} else {
EXPECT_EQ(1, data.bucket_info(0).atom_size());
EXPECT_EQ(1, data.bucket_info(0).elapsed_timestamp_nanos_size());
EXPECT_EQ(1, data.bucket_info(0).wall_clock_timestamp_nanos_size());
EXPECT_EQ(bucketStartTimeNs, data.bucket_info(0).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(0).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::HOT, data.bucket_info(0).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::HOT, data.bucket_info(0).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name2",
- data.bucket_info(0).atom(0).app_start_changed().activity_name());
+ data.bucket_info(0).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(102L,
- data.bucket_info(0).atom(0).app_start_changed().activity_start_millis());
+ data.bucket_info(0).atom(0).app_start_occurred().activity_start_millis());
EXPECT_EQ(1, data.bucket_info(1).atom_size());
EXPECT_EQ(1, data.bucket_info(1).elapsed_timestamp_nanos_size());
EXPECT_EQ(1, data.bucket_info(1).wall_clock_timestamp_nanos_size());
EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, data.bucket_info(1).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(1).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::WARM,
- data.bucket_info(1).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::WARM,
+ data.bucket_info(1).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name4",
- data.bucket_info(1).atom(0).app_start_changed().activity_name());
+ data.bucket_info(1).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(104L,
- data.bucket_info(1).atom(0).app_start_changed().activity_start_millis());
+ data.bucket_info(1).atom(0).app_start_occurred().activity_start_millis());
EXPECT_EQ(1, data.bucket_info(2).atom_size());
EXPECT_EQ(1, data.bucket_info(2).elapsed_timestamp_nanos_size());
@@ -245,17 +245,17 @@
data.bucket_info(2).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs,
data.bucket_info(2).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::COLD,
- data.bucket_info(2).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::COLD,
+ data.bucket_info(2).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name5",
- data.bucket_info(2).atom(0).app_start_changed().activity_name());
+ data.bucket_info(2).atom(0).app_start_occurred().activity_name());
EXPECT_EQ(105L,
- data.bucket_info(2).atom(0).app_start_changed().activity_start_millis());
+ data.bucket_info(2).atom(0).app_start_occurred().activity_start_millis());
}
data = gaugeMetrics.data(1);
- EXPECT_EQ(data.dimensions_in_what().field(), android::util::APP_START_CHANGED);
+ EXPECT_EQ(data.dimensions_in_what().field(), android::util::APP_START_OCCURRED);
EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1);
EXPECT_EQ(1 /* uid field */,
data.dimensions_in_what().value_tuple().dimensions_value(0).field());
@@ -266,10 +266,10 @@
EXPECT_EQ(1, data.bucket_info(0).wall_clock_timestamp_nanos_size());
EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_nanos());
EXPECT_EQ(bucketStartTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_nanos());
- EXPECT_EQ(AppStartChanged::COLD, data.bucket_info(0).atom(0).app_start_changed().type());
+ EXPECT_EQ(AppStartOccurred::COLD, data.bucket_info(0).atom(0).app_start_occurred().type());
EXPECT_EQ("activity_name7",
- data.bucket_info(0).atom(0).app_start_changed().activity_name());
- EXPECT_EQ(201L, data.bucket_info(0).atom(0).app_start_changed().activity_start_millis());
+ data.bucket_info(0).atom(0).app_start_occurred().activity_name());
+ EXPECT_EQ(201L, data.bucket_info(0).atom(0).app_start_occurred().activity_start_millis());
}
}
diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
index 5c4eda8..04ce73a 100644
--- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -210,7 +210,7 @@
stats.noteAtomLogged(android::util::SENSOR_STATE_CHANGED, now + 1);
stats.noteAtomLogged(android::util::SENSOR_STATE_CHANGED, now + 2);
- stats.noteAtomLogged(android::util::DROPBOX_ERROR_CHANGED, now + 3);
+ stats.noteAtomLogged(android::util::APP_CRASH_OCCURRED, now + 3);
// pulled event, should ignore
stats.noteAtomLogged(android::util::WIFI_BYTES_TRANSFER, now + 4);
@@ -228,7 +228,7 @@
if (atomStats.tag() == android::util::SENSOR_STATE_CHANGED && atomStats.count() == 3) {
sensorAtomGood = true;
}
- if (atomStats.tag() == android::util::DROPBOX_ERROR_CHANGED && atomStats.count() == 1) {
+ if (atomStats.tag() == android::util::APP_CRASH_OCCURRED && atomStats.count() == 1) {
dropboxAtomGood = true;
}
}
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 5ef84e6..7ca66fd 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -40,7 +40,7 @@
const ConfigKey kConfigKey(0, 12345);
const int tagId = 1;
const int64_t metricId = 123;
-const int64_t bucketStartTimeNs = 10000000000;
+const int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
const int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
const int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
const int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
@@ -63,7 +63,7 @@
// For now we still need this so that it doesn't do real pulling.
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
@@ -213,10 +213,11 @@
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
- EXPECT_CALL(*pullerManager, Pull(tagId, _))
- .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
data->clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, eventUpgradeTimeNs);
event->write("some value");
@@ -281,10 +282,11 @@
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
- EXPECT_CALL(*pullerManager, Pull(tagId, _))
- .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
data->clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event->write("some value");
@@ -338,13 +340,90 @@
->mValue.int_value);
}
+TEST(GaugeMetricProducerTest, TestWithSlicedCondition) {
+ const int conditionTag = 65;
+ GaugeMetric metric;
+ metric.set_id(1111111);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_gauge_fields_filter()->set_include_all(true);
+ metric.set_condition(StringToId("APP_DIED"));
+ auto dim = metric.mutable_dimensions_in_what();
+ dim->set_field(tagId);
+ dim->add_child()->set_field(1);
+
+ dim = metric.mutable_dimensions_in_condition();
+ dim->set_field(conditionTag);
+ dim->add_child()->set_field(1);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ EXPECT_CALL(*wizard, query(_, _, _, _, _, _))
+ .WillRepeatedly(
+ Invoke([](const int conditionIndex, const ConditionKey& conditionParameters,
+ const vector<Matcher>& dimensionFields, const bool isSubsetDim,
+ const bool isPartialLink,
+ std::unordered_set<HashableDimensionKey>* dimensionKeySet) {
+ dimensionKeySet->clear();
+ int pos[] = {1, 0, 0};
+ Field f(conditionTag, pos, 0);
+ HashableDimensionKey key;
+ key.mutableValues()->emplace_back(f, Value((int32_t)1000000));
+ dimensionKeySet->insert(key);
+
+ return ConditionState::kTrue;
+ }));
+
+ shared_ptr<MockStatsPullerManager> pullerManager =
+ make_shared<StrictMock<MockStatsPullerManager>>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event->write(1000);
+ event->write(100);
+ event->init();
+ data->push_back(event);
+ return true;
+ }));
+
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
+ pullerManager);
+ gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+
+ gaugeProducer.onSlicedConditionMayChange(true, bucketStartTimeNs + 8);
+
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ const auto& key = gaugeProducer.mCurrentSlicedBucket->begin()->first;
+ EXPECT_EQ(1UL, key.getDimensionKeyInWhat().getValues().size());
+ EXPECT_EQ(1000, key.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+
+ EXPECT_EQ(1UL, key.getDimensionKeyInCondition().getValues().size());
+ EXPECT_EQ(1000000, key.getDimensionKeyInCondition().getValues()[0].mValue.int_value);
+
+ EXPECT_EQ(0UL, gaugeProducer.mPastBuckets.size());
+
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
+ event->write(1000);
+ event->write(110);
+ event->init();
+ allData.push_back(event);
+ gaugeProducer.onDataPulled(allData);
+
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ EXPECT_EQ(1UL, gaugeProducer.mPastBuckets.size());
+}
+
TEST(GaugeMetricProducerTest, TestAnomalyDetection) {
sp<AlarmMonitor> alarmMonitor;
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
GaugeMetric metric;
diff --git a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
index 57a8925..a0f1c00 100644
--- a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
+++ b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
@@ -344,8 +344,37 @@
tracker.noteConditionChanged(key1, true, conditionStarts2);
EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
auto alarm = anomalyTracker->mAlarms.begin()->second;
+ uint64_t anomalyFireTimeSec = alarm->timestampSec;
EXPECT_EQ(conditionStarts2 + 36 * NS_PER_SEC,
- (unsigned long long)(alarm->timestampSec * NS_PER_SEC));
+ (unsigned long long)anomalyFireTimeSec * NS_PER_SEC);
+
+ // Now we test the calculation now that there's a refractory period.
+ // At the correct time, declare the anomaly. This will set a refractory period. Make sure it
+ // gets correctly taken into account in future predictAnomalyTimestampNs calculations.
+ std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarms({alarm});
+ anomalyTracker->informAlarmsFired(anomalyFireTimeSec * NS_PER_SEC, firedAlarms);
+ EXPECT_EQ(0u, anomalyTracker->mAlarms.size());
+ uint64_t refractoryPeriodEndsSec = anomalyFireTimeSec + refPeriodSec;
+ EXPECT_EQ(anomalyTracker->getRefractoryPeriodEndsSec(eventKey), refractoryPeriodEndsSec);
+
+ // Now stop and start again. Make sure the new predictAnomalyTimestampNs takes into account
+ // the refractory period correctly.
+ uint64_t eventStopTimeNs = anomalyFireTimeSec * NS_PER_SEC + 10;
+ tracker.noteStop(key1, eventStopTimeNs, false);
+ tracker.noteStop(key2, eventStopTimeNs, false);
+ tracker.noteStart(key1, true, eventStopTimeNs + 1000000, conditionKey1);
+ // Anomaly is ongoing, but we're still in the refractory period.
+ EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
+ alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ(refractoryPeriodEndsSec, (unsigned long long)(alarm->timestampSec));
+
+ // Makes sure it is correct after the refractory period is over.
+ tracker.noteStop(key1, eventStopTimeNs + 2000000, false);
+ uint64_t justBeforeRefPeriodNs = (refractoryPeriodEndsSec - 2) * NS_PER_SEC;
+ tracker.noteStart(key1, true, justBeforeRefPeriodNs, conditionKey1);
+ alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ(justBeforeRefPeriodNs + 40 * NS_PER_SEC,
+ (unsigned long long)(alarm->timestampSec * NS_PER_SEC));
}
// Suppose that within one tracker there are two dimensions A and B.
diff --git a/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp b/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
index 9b27f3c..817dcae 100644
--- a/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
+++ b/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
@@ -44,7 +44,7 @@
const HashableDimensionKey kConditionKey1 = getMockedDimensionKey(TagId, 1, "maps");
const HashableDimensionKey kEventKey1 = getMockedDimensionKey(TagId, 2, "maps");
const HashableDimensionKey kEventKey2 = getMockedDimensionKey(TagId, 3, "maps");
-const uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+const uint64_t bucketSizeNs = 30 * NS_PER_SEC;
TEST(OringDurationTrackerTest, TestDurationOverlap) {
const MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 0, "event");
@@ -209,7 +209,7 @@
tracker.noteStart(kEventKey1, true, eventStartTimeNs, key1);
- tracker.onSlicedConditionMayChange(eventStartTimeNs + 5);
+ tracker.onSlicedConditionMayChange(true, eventStartTimeNs + 5);
tracker.noteStop(kEventKey1, eventStartTimeNs + durationTimeNs, false);
@@ -249,9 +249,9 @@
tracker.noteStart(kEventKey1, true, eventStartTimeNs, key1);
// condition to false; record duration 5n
- tracker.onSlicedConditionMayChange(eventStartTimeNs + 5);
+ tracker.onSlicedConditionMayChange(true, eventStartTimeNs + 5);
// condition to true.
- tracker.onSlicedConditionMayChange(eventStartTimeNs + 1000);
+ tracker.onSlicedConditionMayChange(true, eventStartTimeNs + 1000);
// 2nd duration: 1000ns
tracker.noteStop(kEventKey1, eventStartTimeNs + durationTimeNs, false);
@@ -291,7 +291,7 @@
tracker.noteStop(kEventKey1, eventStartTimeNs + 3, false);
- tracker.onSlicedConditionMayChange(eventStartTimeNs + 15);
+ tracker.onSlicedConditionMayChange(true, eventStartTimeNs + 15);
tracker.noteStop(kEventKey1, eventStartTimeNs + 2003, false);
@@ -370,6 +370,103 @@
tracker.predictAnomalyTimestampNs(*anomalyTracker, event3StartTimeNs));
}
+TEST(OringDurationTrackerTest, TestPredictAnomalyTimestamp2) {
+ vector<Matcher> dimensionInCondition;
+ Alert alert;
+ alert.set_id(101);
+ alert.set_metric_id(1);
+ alert.set_trigger_if_sum_gt(5 * NS_PER_SEC);
+ alert.set_num_buckets(1);
+ alert.set_refractory_period_secs(20);
+
+ uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+ uint64_t bucketNum = 0;
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<AlarmMonitor> alarmMonitor;
+ sp<DurationAnomalyTracker> anomalyTracker =
+ new DurationAnomalyTracker(alert, kConfigKey, alarmMonitor);
+ OringDurationTracker tracker(kConfigKey, metricId, DEFAULT_METRIC_DIMENSION_KEY, wizard, 1,
+ dimensionInCondition,
+ true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
+ bucketSizeNs, true, false, {anomalyTracker});
+
+ uint64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
+ tracker.noteStart(DEFAULT_DIMENSION_KEY, true, eventStartTimeNs, ConditionKey());
+ // Anomaly happens in the bucket #1.
+ EXPECT_EQ((long long)(bucketStartTimeNs + 14 * NS_PER_SEC),
+ tracker.predictAnomalyTimestampNs(*anomalyTracker, eventStartTimeNs));
+
+ tracker.noteStop(DEFAULT_DIMENSION_KEY, bucketStartTimeNs + 14 * NS_PER_SEC, false);
+
+ EXPECT_EQ((long long)(bucketStartTimeNs + 34 * NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY));
+
+ uint64_t event2StartTimeNs = bucketStartTimeNs + 22 * NS_PER_SEC;
+ EXPECT_EQ((long long)(bucketStartTimeNs + 34 * NS_PER_SEC) / NS_PER_SEC,
+ anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY));
+ EXPECT_EQ((long long)(bucketStartTimeNs + 35 * NS_PER_SEC),
+ tracker.predictAnomalyTimestampNs(*anomalyTracker, event2StartTimeNs));
+}
+
+TEST(OringDurationTrackerTest, TestPredictAnomalyTimestamp3) {
+ // Test the cases where the refractory period is smaller than the bucket size, longer than
+ // the bucket size, and longer than 2x of the anomaly detection window.
+ for (int j = 0; j < 3; j++) {
+ uint64_t thresholdNs = j * bucketSizeNs + 5 * NS_PER_SEC;
+ for (int i = 0; i <= 7; ++i) {
+ vector<Matcher> dimensionInCondition;
+ Alert alert;
+ alert.set_id(101);
+ alert.set_metric_id(1);
+ alert.set_trigger_if_sum_gt(thresholdNs);
+ alert.set_num_buckets(3);
+ alert.set_refractory_period_secs(
+ bucketSizeNs / NS_PER_SEC / 2 + i * bucketSizeNs / NS_PER_SEC);
+
+ uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+ uint64_t bucketNum = 101;
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<AlarmMonitor> alarmMonitor;
+ sp<DurationAnomalyTracker> anomalyTracker =
+ new DurationAnomalyTracker(alert, kConfigKey, alarmMonitor);
+ OringDurationTracker tracker(kConfigKey, metricId, DEFAULT_METRIC_DIMENSION_KEY,
+ wizard, 1, dimensionInCondition,
+ true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
+ bucketSizeNs, true, false, {anomalyTracker});
+
+ uint64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
+ tracker.noteStart(DEFAULT_DIMENSION_KEY, true, eventStartTimeNs, ConditionKey());
+ EXPECT_EQ((long long)(eventStartTimeNs + thresholdNs),
+ tracker.predictAnomalyTimestampNs(*anomalyTracker, eventStartTimeNs));
+ uint64_t eventStopTimeNs = eventStartTimeNs + thresholdNs + NS_PER_SEC;
+ tracker.noteStop(DEFAULT_DIMENSION_KEY, eventStopTimeNs, false);
+
+ uint64_t refractoryPeriodEndSec =
+ anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY);
+ EXPECT_EQ((long long)(eventStopTimeNs) / NS_PER_SEC + alert.refractory_period_secs(),
+ refractoryPeriodEndSec);
+
+ // Acquire and release a wakelock in the next bucket.
+ uint64_t event2StartTimeNs = eventStopTimeNs + bucketSizeNs;
+ tracker.noteStart(DEFAULT_DIMENSION_KEY, true, event2StartTimeNs, ConditionKey());
+ uint64_t event2StopTimeNs = event2StartTimeNs + 4 * NS_PER_SEC;
+ tracker.noteStop(DEFAULT_DIMENSION_KEY, event2StopTimeNs, false);
+
+ // Test the alarm prediction works well when seeing another wakelock start event.
+ for (int k = 0; k <= 2; ++k) {
+ uint64_t event3StartTimeNs = event2StopTimeNs + NS_PER_SEC + k * bucketSizeNs;
+ uint64_t alarmTimestampNs =
+ tracker.predictAnomalyTimestampNs(*anomalyTracker, event3StartTimeNs);
+ EXPECT_GT(alarmTimestampNs, 0u);
+ EXPECT_GE(alarmTimestampNs, event3StartTimeNs);
+ EXPECT_GE(alarmTimestampNs, refractoryPeriodEndSec * NS_PER_SEC);
+ }
+ }
+ }
+}
+
TEST(OringDurationTrackerTest, TestAnomalyDetectionExpiredAlarm) {
const MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 0, "event");
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index a8eb2703..c650a06 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -45,6 +45,8 @@
const int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
const int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
const int64_t bucket4StartTimeNs = bucketStartTimeNs + 3 * bucketSizeNs;
+const int64_t bucket5StartTimeNs = bucketStartTimeNs + 4 * bucketSizeNs;
+const int64_t bucket6StartTimeNs = bucketStartTimeNs + 5 * bucketSizeNs;
const int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
/*
@@ -62,7 +64,7 @@
// For now we still need this so that it doesn't do real pulling.
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
@@ -141,11 +143,12 @@
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
- EXPECT_CALL(*pullerManager, Pull(tagId, _))
- .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
data->clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event->write(tagId);
@@ -154,7 +157,8 @@
data->push_back(event);
return true;
}))
- .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
data->clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 10);
event->write(tagId);
@@ -260,10 +264,11 @@
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
shared_ptr<MockStatsPullerManager> pullerManager =
make_shared<StrictMock<MockStatsPullerManager>>();
- EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
- EXPECT_CALL(*pullerManager, Pull(tagId, _))
- .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
data->clear();
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
event->write(tagId);
@@ -428,6 +433,376 @@
std::ceil(1.0 * event6->GetElapsedTimestampNs() / NS_PER_SEC + refPeriodSec));
}
+// Test value metric no condition, the pull on bucket boundary come in time and too late
+TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ shared_ptr<MockStatsPullerManager> pullerManager =
+ make_shared<StrictMock<MockStatsPullerManager>>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
+ tagId, bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ vector<shared_ptr<LogEvent>> allData;
+ // pull 1
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
+ event->write(tagId);
+ event->write(11);
+ event->init();
+ allData.push_back(event);
+
+ valueProducer.onDataPulled(allData);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ // startUpdated:true tainted:0 sum:0 start:11
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(11, curInterval.start);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second.back().mValue);
+
+ // pull 2 at correct time
+ allData.clear();
+ event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 1);
+ event->write(tagId);
+ event->write(23);
+ event->init();
+ allData.push_back(event);
+ valueProducer.onDataPulled(allData);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ // tartUpdated:false tainted:0 sum:12
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
+
+ // pull 3 come late.
+ // The previous bucket gets closed with error. (Has start value 23, no ending)
+ // Another bucket gets closed with error. (No start, but ending with 36)
+ // The new bucket is back to normal.
+ allData.clear();
+ event = make_shared<LogEvent>(tagId, bucket6StartTimeNs + 1);
+ event->write(tagId);
+ event->write(36);
+ event->init();
+ allData.push_back(event);
+ valueProducer.onDataPulled(allData);
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ // startUpdated:false tainted:0 sum:12
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(36, curInterval.start);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(4UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+ EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second[1].mValue);
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[2].mValue);
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[3].mValue);
+}
+
+/*
+ * Test pulled event with non sliced condition. The pull on boundary come late because the alarm
+ * was delivered late.
+ */
+TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_condition(StringToId("SCREEN_ON"));
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ shared_ptr<MockStatsPullerManager> pullerManager =
+ make_shared<StrictMock<MockStatsPullerManager>>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
+
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ // condition becomes true
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event->write(tagId);
+ event->write(100);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ // condition becomes false
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 20);
+ event->write(tagId);
+ event->write(120);
+ event->init();
+ data->push_back(event);
+ return true;
+ }));
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
+ pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+ valueProducer.onConditionChanged(true, bucketStartTimeNs + 8);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ // startUpdated:false tainted:0 sum:0 start:100
+ EXPECT_EQ(100, curInterval.start);
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
+
+ // pull on bucket boundary come late, condition change happens before it
+ valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.startUpdated);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+
+ // Now the alarm is delivered.
+ // since the condition turned to off before this pull finish, it has no effect
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 30);
+ event->write(1);
+ event->write(110);
+ event->init();
+ allData.push_back(event);
+ valueProducer.onDataPulled(allData);
+
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.startUpdated);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+}
+
+/*
+ * Test pulled event with non sliced condition. The pull on boundary come late, after the condition
+ * change to false, and then true again. This is due to alarm delivered late.
+ */
+TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_condition(StringToId("SCREEN_ON"));
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ shared_ptr<MockStatsPullerManager> pullerManager =
+ make_shared<StrictMock<MockStatsPullerManager>>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillRepeatedly(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
+
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ // condition becomes true
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event->write(tagId);
+ event->write(100);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ // condition becomes false
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 20);
+ event->write(tagId);
+ event->write(120);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ // condition becomes true again
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 30);
+ event->write(tagId);
+ event->write(130);
+ event->init();
+ data->push_back(event);
+ return true;
+ }));
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
+ pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+ valueProducer.onConditionChanged(true, bucketStartTimeNs + 8);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ // startUpdated:false tainted:0 sum:0 start:100
+ EXPECT_EQ(100, curInterval.start);
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
+
+ // pull on bucket boundary come late, condition change happens before it
+ valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.startUpdated);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+
+ // condition changed to true again, before the pull alarm is delivered
+ valueProducer.onConditionChanged(true, bucket2StartTimeNs + 25);
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(130, curInterval.start);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+
+ // Now the alarm is delivered, but it is considered late, it has no effect
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 50);
+ event->write(1);
+ event->write(110);
+ event->init();
+ allData.push_back(event);
+ valueProducer.onDataPulled(allData);
+
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(130, curInterval.start);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+}
+
+/*
+ * Test pulled event with non sliced condition. The pull on boundary come late because the puller is
+ * very slow.
+ */
+TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_condition(StringToId("SCREEN_ON"));
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ shared_ptr<MockStatsPullerManager> pullerManager =
+ make_shared<StrictMock<MockStatsPullerManager>>();
+ EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
+ EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
+
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ // condition becomes true
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event->write(tagId);
+ event->write(100);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ // condition becomes false
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 20);
+ event->write(tagId);
+ event->write(120);
+ event->init();
+ data->push_back(event);
+ return true;
+ }));
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
+ pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+ valueProducer.onConditionChanged(true, bucketStartTimeNs + 8);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ // startUpdated:false tainted:0 sum:0 start:100
+ EXPECT_EQ(100, curInterval.start);
+ EXPECT_EQ(true, curInterval.startUpdated);
+ EXPECT_EQ(0, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
+
+ // pull on bucket boundary come late, condition change happens before it.
+ // But puller is very slow in this one, so the data come after bucket finish
+ valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.startUpdated);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+
+ // Alarm is delivered in time, but the pull is very slow, and pullers are called in order,
+ // so this one comes even later
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 30);
+ event->write(1);
+ event->write(110);
+ event->init();
+ allData.push_back(event);
+ valueProducer.onDataPulled(allData);
+
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.startUpdated);
+ EXPECT_EQ(1, curInterval.tainted);
+ EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
+}
+
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/tests/metrics/metrics_test_helper.h b/cmds/statsd/tests/metrics/metrics_test_helper.h
index f040bf9..5afaba6 100644
--- a/cmds/statsd/tests/metrics/metrics_test_helper.h
+++ b/cmds/statsd/tests/metrics/metrics_test_helper.h
@@ -35,9 +35,11 @@
class MockStatsPullerManager : public StatsPullerManager {
public:
- MOCK_METHOD3(RegisterReceiver, void(int tagId, wp<PullDataReceiver> receiver, long intervalMs));
+ MOCK_METHOD4(RegisterReceiver, void(int tagId, wp<PullDataReceiver> receiver,
+ int64_t nextPulltimeNs, int64_t intervalNs));
MOCK_METHOD2(UnRegisterReceiver, void(int tagId, wp<PullDataReceiver> receiver));
- MOCK_METHOD2(Pull, bool(const int pullCode, vector<std::shared_ptr<LogEvent>>* data));
+ MOCK_METHOD3(Pull, bool(const int pullCode, const int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data));
};
class MockUidMap : public UidMap {
diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp
index 0f785df..0acd297 100644
--- a/cmds/statsd/tests/statsd_test_util.cpp
+++ b/cmds/statsd/tests/statsd_test_util.cpp
@@ -152,42 +152,42 @@
}
AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
- const string& name, ActivityForegroundStateChanged::Activity activity) {
+ const string& name, ActivityForegroundStateChanged::State state) {
AtomMatcher atom_matcher;
atom_matcher.set_id(StringToId(name));
auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
field_value_matcher->set_field(4); // Activity field.
- field_value_matcher->set_eq_int(activity);
+ field_value_matcher->set_eq_int(state);
return atom_matcher;
}
AtomMatcher CreateMoveToBackgroundAtomMatcher() {
return CreateActivityForegroundStateChangedAtomMatcher(
- "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
+ "Background", ActivityForegroundStateChanged::BACKGROUND);
}
AtomMatcher CreateMoveToForegroundAtomMatcher() {
return CreateActivityForegroundStateChangedAtomMatcher(
- "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
+ "Foreground", ActivityForegroundStateChanged::FOREGROUND);
}
AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
- const string& name, ProcessLifeCycleStateChanged::Event event) {
+ const string& name, ProcessLifeCycleStateChanged::State state) {
AtomMatcher atom_matcher;
atom_matcher.set_id(StringToId(name));
auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
field_value_matcher->set_field(3); // Process state field.
- field_value_matcher->set_eq_int(event);
+ field_value_matcher->set_eq_int(state);
return atom_matcher;
}
AtomMatcher CreateProcessCrashAtomMatcher() {
return CreateProcessLifeCycleStateChangedAtomMatcher(
- "ProcessCrashed", ProcessLifeCycleStateChanged::PROCESS_CRASHED);
+ "Crashed", ProcessLifeCycleStateChanged::CRASHED);
}
Predicate CreateScheduledJobPredicate() {
@@ -241,8 +241,8 @@
Predicate CreateIsInBackgroundPredicate() {
Predicate predicate;
predicate.set_id(StringToId("IsInBackground"));
- predicate.mutable_simple_predicate()->set_start(StringToId("MoveToBackground"));
- predicate.mutable_simple_predicate()->set_stop(StringToId("MoveToForeground"));
+ predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
+ predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
return predicate;
}
@@ -373,25 +373,25 @@
}
std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
- const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
+ const int uid, const ActivityForegroundStateChanged::State state, uint64_t timestampNs) {
auto event = std::make_unique<LogEvent>(
android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
event->write(uid);
event->write("pkg_name");
event->write("class_name");
- event->write(activity);
+ event->write(state);
event->init();
return event;
}
std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
return CreateActivityForegroundStateChangedEvent(
- uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
+ uid, ActivityForegroundStateChanged::BACKGROUND, timestampNs);
}
std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
return CreateActivityForegroundStateChangedEvent(
- uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
+ uid, ActivityForegroundStateChanged::FOREGROUND, timestampNs);
}
std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
@@ -418,19 +418,19 @@
}
std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
- const int uid, const ProcessLifeCycleStateChanged::Event event, uint64_t timestampNs) {
+ const int uid, const ProcessLifeCycleStateChanged::State state, uint64_t timestampNs) {
auto logEvent = std::make_unique<LogEvent>(
android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
logEvent->write(uid);
logEvent->write("");
- logEvent->write(event);
+ logEvent->write(state);
logEvent->init();
return logEvent;
}
std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
return CreateProcessLifeCycleStateChangedEvent(
- uid, ProcessLifeCycleStateChanged::PROCESS_CRASHED, timestampNs);
+ uid, ProcessLifeCycleStateChanged::CRASHED, timestampNs);
}
std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
@@ -447,11 +447,15 @@
sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
const ConfigKey& key) {
sp<UidMap> uidMap = new UidMap();
- sp<AlarmMonitor> anomalyAlarmMonitor;
- sp<AlarmMonitor> periodicAlarmMonitor;
+ sp<AlarmMonitor> anomalyAlarmMonitor =
+ new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
+ [](const sp<IStatsCompanionService>&){});
+ sp<AlarmMonitor> periodicAlarmMonitor =
+ new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
+ [](const sp<IStatsCompanionService>&){});
sp<StatsLogProcessor> processor = new StatsLogProcessor(
uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){});
- processor->OnConfigUpdated(key, config);
+ processor->OnConfigUpdated(timeBaseSec, key, config);
return processor;
}
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index 8a9c738..9c7bfb2 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -1,4 +1,5 @@
Landroid/accounts/AccountManager;->mContext:Landroid/content/Context;
+Landroid/accounts/IAccountAuthenticatorResponse$Stub;-><init>()V
Landroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager;
Landroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/animation/LayoutTransition;->cancel()V
@@ -6,6 +7,7 @@
Landroid/animation/ValueAnimator;->sDurationScale:F
Landroid/app/Activity;->getActivityOptions()Landroid/app/ActivityOptions;
Landroid/app/Activity;->getActivityToken()Landroid/os/IBinder;
+Landroid/app/ActivityGroup;->mLocalActivityManager:Landroid/app/LocalActivityManager;
Landroid/app/Activity;->mActivityInfo:Landroid/content/pm/ActivityInfo;
Landroid/app/ActivityManager;->clearApplicationUserData(Ljava/lang/String;Landroid/content/pm/IPackageDataObserver;)Z
Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I
@@ -62,8 +64,10 @@
Landroid/app/ActivityThread$AppBindData;->appInfo:Landroid/content/pm/ApplicationInfo;
Landroid/app/ActivityThread$AppBindData;->info:Landroid/app/LoadedApk;
Landroid/app/ActivityThread$AppBindData;->instrumentationArgs:Landroid/os/Bundle;
+Landroid/app/ActivityThread$AppBindData;->persistent:Z
Landroid/app/ActivityThread$AppBindData;->processName:Ljava/lang/String;
Landroid/app/ActivityThread$AppBindData;->providers:Ljava/util/List;
+Landroid/app/ActivityThread$AppBindData;->restrictedBackupMode:Z
Landroid/app/ActivityThread$BindServiceData;->intent:Landroid/content/Intent;
Landroid/app/ActivityThread$BindServiceData;->token:Landroid/os/IBinder;
Landroid/app/ActivityThread$CreateServiceData;->compatInfo:Landroid/content/res/CompatibilityInfo;
@@ -88,11 +92,13 @@
Landroid/app/ActivityThread$H;->BIND_SERVICE:I
Landroid/app/ActivityThread$H;->CREATE_SERVICE:I
Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I
+Landroid/app/ActivityThread$H;->ENTER_ANIMATION_COMPLETE:I
Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I
Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I
Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I
Landroid/app/ActivityThread$H;->RECEIVER:I
Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I
+Landroid/app/ActivityThread$H;->SCHEDULE_CRASH:I
Landroid/app/ActivityThread$H;->SERVICE_ARGS:I
Landroid/app/ActivityThread$H;->STOP_SERVICE:I
Landroid/app/ActivityThread$H;->UNBIND_SERVICE:I
@@ -101,6 +107,7 @@
Landroid/app/ActivityThread;->mActivities:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->mAllApplications:Ljava/util/ArrayList;
Landroid/app/ActivityThread;->mBoundApplication:Landroid/app/ActivityThread$AppBindData;
+Landroid/app/ActivityThread;->mConfiguration:Landroid/content/res/Configuration;
Landroid/app/ActivityThread;->mDensityCompatMode:Z
Landroid/app/ActivityThread;->mH:Landroid/app/ActivityThread$H;
Landroid/app/ActivityThread;->mInitialApplication:Landroid/app/Application;
@@ -109,8 +116,10 @@
Landroid/app/ActivityThread;->mLocalProviders:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->mNumVisibleActivities:I
Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mPendingConfiguration:Landroid/content/res/Configuration;
Landroid/app/ActivityThread;->mProviderMap:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->mResourcePackages:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager;
Landroid/app/ActivityThread;->mServices:Landroid/util/ArrayMap;
Landroid/app/ActivityThread;->performNewIntents(Landroid/os/IBinder;Ljava/util/List;Z)V
Landroid/app/ActivityThread;->performStopActivity(Landroid/os/IBinder;ZLjava/lang/String;)V
@@ -145,6 +154,7 @@
Landroid/app/AlertDialog$Builder;->P:Lcom/android/internal/app/AlertController$AlertParams;
Landroid/app/AlertDialog;->mAlert:Lcom/android/internal/app/AlertController;
Landroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application;
+Landroid/app/AppGlobals;->getInitialPackage()Ljava/lang/String;
Landroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager;
Landroid/app/Application;->attach(Landroid/content/Context;)V
Landroid/app/Application;->collectActivityLifecycleCallbacks()[Ljava/lang/Object;
@@ -165,21 +175,26 @@
Landroid/app/ApplicationPackageManager;->getPackageSizeInfoAsUser(Ljava/lang/String;ILandroid/content/pm/IPackageStatsObserver;)V
Landroid/app/ApplicationPackageManager;-><init>(Landroid/app/ContextImpl;Landroid/content/pm/IPackageManager;)V
Landroid/app/ApplicationPackageManager;->mPM:Landroid/content/pm/IPackageManager;
+Landroid/app/ApplicationPackageManager;->shouldShowRequestPermissionRationale(Ljava/lang/String;)Z
Landroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I
Landroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I
Landroid/app/AppOpsManager;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
Landroid/app/AppOpsManager;->mService:Lcom/android/internal/app/IAppOpsService;
Landroid/app/AppOpsManager;->noteOp(I)I
Landroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I
+Landroid/app/AppOpsManager;->OP_AUDIO_NOTIFICATION_VOLUME:I
Landroid/app/AppOpsManager;->OP_COARSE_LOCATION:I
Landroid/app/AppOpsManager$OpEntry;->getDuration()I
Landroid/app/AppOpsManager$OpEntry;->getRejectTime()J
Landroid/app/AppOpsManager;->OP_FINE_LOCATION:I
Landroid/app/AppOpsManager;->OP_GET_USAGE_STATS:I
Landroid/app/AppOpsManager;->OP_POST_NOTIFICATION:I
+Landroid/app/AppOpsManager;->OP_READ_CONTACTS:I
Landroid/app/AppOpsManager;->OP_READ_PHONE_STATE:I
Landroid/app/AppOpsManager;->OP_READ_SMS:I
+Landroid/app/AppOpsManager;->OP_VIBRATE:I
Landroid/app/AppOpsManager;->OP_WIFI_SCAN:I
+Landroid/app/AppOpsManager;->OP_WRITE_CONTACTS:I
Landroid/app/AppOpsManager;->OP_WRITE_SMS:I
Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
Landroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
@@ -203,6 +218,7 @@
Landroid/app/ContextImpl;->getPreferencesDir()Ljava/io/File;
Landroid/app/ContextImpl;->getReceiverRestrictedContext()Landroid/content/Context;
Landroid/app/ContextImpl;->mBasePackageName:Ljava/lang/String;
+Landroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;
Landroid/app/ContextImpl;->mContentResolver:Landroid/app/ContextImpl$ApplicationContentResolver;
Landroid/app/ContextImpl;->mMainThread:Landroid/app/ActivityThread;
Landroid/app/ContextImpl;->mOpPackageName:Ljava/lang/String;
@@ -212,6 +228,7 @@
Landroid/app/ContextImpl;->mResources:Landroid/content/res/Resources;
Landroid/app/ContextImpl;->mServiceCache:[Ljava/lang/Object;
Landroid/app/ContextImpl;->mTheme:Landroid/content/res/Resources$Theme;
+Landroid/app/ContextImpl;->mThemeResource:I
Landroid/app/ContextImpl;->scheduleFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
Landroid/app/ContextImpl;->setOuterContext(Landroid/content/Context;)V
Landroid/app/ContextImpl;->sSharedPrefsCache:Landroid/util/ArrayMap;
@@ -229,26 +246,37 @@
Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl;
Landroid/app/Fragment;->mWho:Ljava/lang/String;
Landroid/app/IActivityManager;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+Landroid/app/IActivityManager;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
Landroid/app/IActivityManager;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
Landroid/app/IActivityManager;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
Landroid/app/IActivityManager;->forceStopPackage(Ljava/lang/String;I)V
+Landroid/app/IActivityManager;->getIntentSender(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;
Landroid/app/IActivityManager;->getLaunchedFromPackage(Landroid/os/IBinder;)Ljava/lang/String;
+Landroid/app/IActivityManager;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String;
Landroid/app/IActivityManager;->getTaskForActivity(Landroid/os/IBinder;Z)I
Landroid/app/IActivityManager;->moveTaskToFront(IILandroid/os/Bundle;)V
Landroid/app/IActivityManager;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
+Landroid/app/IActivityManager;->requestBugReport(I)V
Landroid/app/IActivityManager;->resumeAppSwitches()V
Landroid/app/IActivityManager;->setRequestedOrientation(Landroid/os/IBinder;I)V
Landroid/app/IActivityManager;->setTaskResizeable(II)V
+Landroid/app/IActivityManager;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
Landroid/app/IActivityManager$Stub$Proxy;->getConfiguration()Landroid/content/res/Configuration;
Landroid/app/IActivityManager$Stub$Proxy;->getLaunchedFromUid(Landroid/os/IBinder;)I
+Landroid/app/IActivityManager$Stub$Proxy;->getProcessLimit()I
Landroid/app/IActivityManager$Stub$Proxy;->getProcessPss([I)[J
Landroid/app/IActivityManager$Stub$Proxy;->isAppForeground(I)Z
Landroid/app/IActivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/app/IActivityManager;->unbindService(Landroid/app/IServiceConnection;)Z
+Landroid/app/IActivityManager;->unstableProviderDied(Landroid/os/IBinder;)V
Landroid/app/IAlarmManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/IAlarmManager$Stub;->TRANSACTION_remove:I
Landroid/app/IAlarmManager$Stub;->TRANSACTION_set:I
Landroid/app/IApplicationThread;->scheduleTrimMemory(I)V
+Landroid/app/INotificationManager;->cancelAllNotifications(Ljava/lang/String;I)V
+Landroid/app/INotificationManager;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;II)V
+Landroid/app/INotificationManager;->cancelToast(Ljava/lang/String;Landroid/app/ITransientNotification;)V
+Landroid/app/INotificationManager;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;I)V
Landroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager;
Landroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/Instrumentation;->execStartActivities(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;[Landroid/content/Intent;Landroid/os/Bundle;)V
@@ -256,15 +284,19 @@
Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult;
Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/Instrumentation$ActivityResult;
Landroid/app/IntentService;->mServiceHandler:Landroid/app/IntentService$ServiceHandler;
+Landroid/app/IProcessObserver$Stub;-><init>()V
Landroid/app/ISearchManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/ISearchManager;
Landroid/app/ISearchManager$Stub$Proxy;->getGlobalSearchActivity()Landroid/content/ComponentName;
Landroid/app/ISearchManager$Stub$Proxy;->getWebSearchActivity()Landroid/content/ComponentName;
+Landroid/app/IServiceConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IServiceConnection;
+Landroid/app/IStopUserCallback;->userStopped(I)V
Landroid/app/IUiModeManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/IWallpaperManager;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor;
Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager;
Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader;
+Landroid/app/LoadedApk;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
Landroid/app/LoadedApk;->getDataDirFile()Ljava/io/File;
Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread;
@@ -285,16 +317,21 @@
Landroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V
Landroid/app/LocalActivityManager;->mActivities:Ljava/util/Map;
Landroid/app/LocalActivityManager;->mActivityArray:Ljava/util/ArrayList;
+Landroid/app/LocalActivityManager;->mParent:Landroid/app/Activity;
+Landroid/app/LocalActivityManager;->mResumed:Landroid/app/LocalActivityManager$LocalActivityRecord;
+Landroid/app/LocalActivityManager;->mSingleMode:Z
Landroid/app/NativeActivity;->hideIme(I)V
Landroid/app/NativeActivity;->setWindowFlags(II)V
Landroid/app/NativeActivity;->setWindowFormat(I)V
Landroid/app/NativeActivity;->showIme(I)V
Landroid/app/Notification$Builder;->mActions:Ljava/util/ArrayList;
+Landroid/app/Notification$Builder;->makePublicContentView()Landroid/widget/RemoteViews;
Landroid/app/Notification$Builder;->setChannel(Ljava/lang/String;)Landroid/app/Notification$Builder;
Landroid/app/Notification;->isGroupSummary()Z
Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager;
Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V
Landroid/app/NotificationManager;->sService:Landroid/app/INotificationManager;
+Landroid/app/Notification;->mChannelId:Ljava/lang/String;
Landroid/app/Notification;->mGroupKey:Ljava/lang/String;
Landroid/app/Notification;->mLargeIcon:Landroid/graphics/drawable/Icon;
Landroid/app/Notification;->mSmallIcon:Landroid/graphics/drawable/Icon;
@@ -307,6 +344,7 @@
Landroid/app/ProgressDialog;->mProgressNumber:Landroid/widget/TextView;
Landroid/app/QueuedWork;->addFinisher(Ljava/lang/Runnable;)V
Landroid/app/QueuedWork;->removeFinisher(Ljava/lang/Runnable;)V
+Landroid/app/QueuedWork;->sFinishers:Ljava/util/LinkedList;
Landroid/app/ResourcesManager;->appendLibAssetForMainAssetPath(Ljava/lang/String;Ljava/lang/String;)V
Landroid/app/ResourcesManager;->getInstance()Landroid/app/ResourcesManager;
Landroid/app/ResourcesManager;->mActivityResourceReferences:Ljava/util/WeakHashMap;
@@ -320,7 +358,9 @@
Landroid/app/Service;->mThread:Landroid/app/ActivityThread;
Landroid/app/Service;->mToken:Landroid/os/IBinder;
Landroid/app/Service;->setForeground(Z)V
+Landroid/app/SharedPreferencesImpl;-><init>(Ljava/io/File;I)V
Landroid/app/SharedPreferencesImpl;->mFile:Ljava/io/File;
+Landroid/app/SharedPreferencesImpl;->startReloadIfChangedUnexpectedly()V
Landroid/app/StatusBarManager;->collapsePanels()V
Landroid/app/StatusBarManager;->disable(I)V
Landroid/app/StatusBarManager;->expandNotificationsPanel()V
@@ -330,8 +370,6 @@
Landroid/app/TaskStackListener;-><init>()V
Landroid/app/TimePickerDialog;->mTimePicker:Landroid/widget/TimePicker;
Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/app/usage/StorageStatsManager;->getFreeBytes(Ljava/lang/String;)J
-Landroid/app/usage/StorageStatsManager;->getTotalBytes(Ljava/lang/String;)J
Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
Landroid/app/usage/UsageStats;->mLastEvent:I
Landroid/app/usage/UsageStats;->mTotalTimeInForeground:J
@@ -340,8 +378,10 @@
Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder;
Landroid/app/Vr2dDisplayProperties;-><init>(III)V
Landroid/app/VrManager;->getPersistentVrModeEnabled()Z
+Landroid/app/VrManager;->mService:Landroid/service/vr/IVrManager;
Landroid/app/VrManager;->registerVrStateCallback(Landroid/app/VrStateCallback;Landroid/os/Handler;)V
Landroid/app/VrManager;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
+Landroid/app/VrManager;->unregisterVrStateCallback(Landroid/app/VrStateCallback;)V
Landroid/app/WallpaperColors;->getColorHints()I
Landroid/app/WallpaperManager;->getBitmap()Landroid/graphics/Bitmap;
Landroid/app/WallpaperManager;->getBitmap(Z)Landroid/graphics/Bitmap;
@@ -371,6 +411,7 @@
Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I
Landroid/bluetooth/BluetoothGatt;->refresh()Z
Landroid/bluetooth/BluetoothHeadset;->close()V
+Landroid/bluetooth/BluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
Landroid/bluetooth/BluetoothPan;->isTetheringOn()Z
Landroid/bluetooth/BluetoothPan;->setBluetoothTethering(Z)V
Landroid/bluetooth/BluetoothUuid;->RESERVED_UUIDS:[Landroid/os/ParcelUuid;
@@ -409,6 +450,7 @@
Landroid/content/ContentResolver;->unstableProviderDied(Landroid/content/IContentProvider;)V
Landroid/content/ContentValues;-><init>(Ljava/util/HashMap;)V
Landroid/content/ContentValues;->mValues:Ljava/util/HashMap;
+Landroid/content/Context;->getBasePackageName()Ljava/lang/String;
Landroid/content/Context;->getSharedPrefsFile(Ljava/lang/String;)Ljava/io/File;
Landroid/content/Context;->getThemeResId()I
Landroid/content/Context;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;I)V
@@ -428,8 +470,10 @@
Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/Intent;->ACTION_ALARM_CHANGED:Ljava/lang/String;
Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList;
+Landroid/content/Intent;->mExtras:Landroid/os/Bundle;
Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent;
Landroid/content/pm/ActivityInfo;->resizeMode:I
+Landroid/content/pm/ActivityInfo;->supportsPictureInPicture()Z
Landroid/content/pm/ApplicationInfo;->enabledSetting:I
Landroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->installLocation:I
@@ -438,18 +482,33 @@
Landroid/content/pm/ApplicationInfo;->privateFlags:I
Landroid/content/pm/ApplicationInfo;->scanPublicSourceDir:Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->scanSourceDir:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->secondaryCpuAbi:Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->secondaryNativeLibraryDir:Ljava/lang/String;
Landroid/content/pm/ComponentInfo;->getComponentName()Landroid/content/ComponentName;
+Landroid/content/pm/IPackageDataObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDataObserver;
+Landroid/content/pm/IPackageManager;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z
+Landroid/content/pm/IPackageManager;->addPermission(Landroid/content/pm/PermissionInfo;)Z
+Landroid/content/pm/IPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
+Landroid/content/pm/IPackageManager;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+Landroid/content/pm/IPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
Landroid/content/pm/IPackageManager;->getInstallLocation()I
Landroid/content/pm/IPackageManager;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;
+Landroid/content/pm/IPackageManager;->getProviderInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/IPackageManager;->getReceiverInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/IPackageManager;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
Landroid/content/pm/IPackageManager;->setApplicationEnabledSetting(Ljava/lang/String;IIILjava/lang/String;)V
Landroid/content/pm/IPackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V
+Landroid/content/pm/IPackageManager;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V
Landroid/content/pm/IPackageManager;->setLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/IntentFilter;ILandroid/content/ComponentName;)V
Landroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager;
+Landroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String;
Landroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String;
+Landroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver;
+Landroid/content/pm/IPackageMoveObserver$Stub;-><init>()V
Landroid/content/pm/IPackageStatsObserver$Stub;-><init>()V
+Landroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/LauncherActivityInfo;->mActivityInfo:Landroid/content/pm/ActivityInfo;
Landroid/content/pm/LauncherApps;->mPm:Landroid/content/pm/PackageManager;
Landroid/content/pm/LauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)V
@@ -474,14 +533,29 @@
Landroid/content/pm/PackageParser$Component;->className:Ljava/lang/String;
Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName;
Landroid/content/pm/PackageParser$Component;->intents:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser;->generateActivityInfo(Landroid/content/pm/PackageParser$Activity;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ActivityInfo;
Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageParser;->generateProviderInfo(Landroid/content/pm/PackageParser$Provider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/PackageParser;->generateServiceInfo(Landroid/content/pm/PackageParser$Service;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ServiceInfo;
Landroid/content/pm/PackageParser;-><init>()V
+Landroid/content/pm/PackageParser$Instrumentation;->info:Landroid/content/pm/InstrumentationInfo;
+Landroid/content/pm/PackageParser$IntentInfo;->banner:I
+Landroid/content/pm/PackageParser$IntentInfo;->hasDefault:Z
+Landroid/content/pm/PackageParser$IntentInfo;->icon:I
+Landroid/content/pm/PackageParser$IntentInfo;-><init>()V
+Landroid/content/pm/PackageParser$IntentInfo;->labelRes:I
+Landroid/content/pm/PackageParser$IntentInfo;->logo:I
+Landroid/content/pm/PackageParser$IntentInfo;->nonLocalizedLabel:Ljava/lang/CharSequence;
Landroid/content/pm/PackageParser$Package;->activities:Ljava/util/ArrayList;
Landroid/content/pm/PackageParser$Package;->applicationInfo:Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/PackageParser$Package;->instrumentation:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->mAppMetaData:Landroid/os/Bundle;
Landroid/content/pm/PackageParser$Package;->mVersionCode:I
Landroid/content/pm/PackageParser$Package;->mVersionName:Ljava/lang/String;
Landroid/content/pm/PackageParser$Package;->packageName:Ljava/lang/String;
+Landroid/content/pm/PackageParser$Package;->permissionGroups:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->permissions:Ljava/util/ArrayList;
Landroid/content/pm/PackageParser$Package;->providers:Ljava/util/ArrayList;
Landroid/content/pm/PackageParser$Package;->receivers:Ljava/util/ArrayList;
Landroid/content/pm/PackageParser$Package;->requestedPermissions:Ljava/util/ArrayList;
@@ -492,6 +566,7 @@
Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package;
Landroid/content/pm/PackageParser$Provider;->info:Landroid/content/pm/ProviderInfo;
Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider;
+Landroid/content/pm/PackageParser$Service;->info:Landroid/content/pm/ServiceInfo;
Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service;
Landroid/content/pm/PackageUserState;-><init>()V
Landroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V
@@ -530,14 +605,18 @@
Landroid/content/res/CompatibilityInfo;->applicationScale:F
Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo;
Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
+Landroid/content/res/DrawableCache;-><init>()V
Landroid/content/res/ObbInfo;->salt:[B
Landroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
+Landroid/content/res/ResourcesImpl;->getAssets()Landroid/content/res/AssetManager;
Landroid/content/res/ResourcesImpl;->mAccessLock:Ljava/lang/Object;
+Landroid/content/res/ResourcesImpl;->mAnimatorCache:Landroid/content/res/ConfigurationBoundResourceCache;
Landroid/content/res/ResourcesImpl;->mAssets:Landroid/content/res/AssetManager;
Landroid/content/res/ResourcesImpl;->mColorDrawableCache:Landroid/content/res/DrawableCache;
Landroid/content/res/ResourcesImpl;->mConfiguration:Landroid/content/res/Configuration;
Landroid/content/res/ResourcesImpl;->mDrawableCache:Landroid/content/res/DrawableCache;
Landroid/content/res/ResourcesImpl;->mPreloading:Z
+Landroid/content/res/ResourcesImpl;->mStateListAnimatorCache:Landroid/content/res/ConfigurationBoundResourceCache;
Landroid/content/res/ResourcesImpl;->sPreloadedColorDrawables:Landroid/util/LongSparseArray;
Landroid/content/res/ResourcesImpl;->sPreloadedComplexColors:Landroid/util/LongSparseArray;
Landroid/content/res/ResourcesImpl;->sPreloadedDrawables:[Landroid/util/LongSparseArray;
@@ -553,6 +632,7 @@
Landroid/content/res/Resources;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V
Landroid/content/res/Resources;->updateSystemConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
Landroid/content/res/StringBlock;-><init>(JZ)V
+Landroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V
Landroid/content/res/TypedArray;->extractThemeAttrs()[I
Landroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;
Landroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
@@ -571,7 +651,10 @@
Landroid/content/res/XmlBlock$Parser;->mBlock:Landroid/content/res/XmlBlock;
Landroid/content/res/XmlBlock$Parser;->mParseState:J
Landroid/content/SearchRecentSuggestionsProvider;->mSuggestionProjection:[Ljava/lang/String;
+Landroid/content/SyncContext;->setStatusText(Ljava/lang/String;)V
Landroid/content/SyncStatusInfo;->lastSuccessTime:J
+Landroid/content/UriMatcher;->mChildren:Ljava/util/ArrayList;
+Landroid/content/UriMatcher;->mText:Ljava/lang/String;
Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;
Landroid/database/AbstractCursor;->mNotifyUri:Landroid/net/Uri;
Landroid/database/AbstractCursor;->mRowIdColumnIndex:I
@@ -590,6 +673,7 @@
Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I
Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
Landroid/ddm/DdmHandleAppName;->getAppName()Ljava/lang/String;
+Landroid/graphics/AvoidXfermode$Mode;->AVOID:Landroid/graphics/AvoidXfermode$Mode;
Landroid/graphics/AvoidXfermode$Mode;->TARGET:Landroid/graphics/AvoidXfermode$Mode;
Landroid/graphics/BaseCanvas;->mNativeCanvasWrapper:J
Landroid/graphics/Bitmap$Config;->nativeInt:I
@@ -610,6 +694,7 @@
Landroid/graphics/Camera;->native_instance:J
Landroid/graphics/Canvas;-><init>(J)V
Landroid/graphics/Canvas;->release()V
+Landroid/graphics/Canvas;->save(I)I
Landroid/graphics/ColorMatrixColorFilter;->setColorMatrix(Landroid/graphics/ColorMatrix;)V
Landroid/graphics/drawable/AnimatedImageDrawable;->onAnimationEnd()V
Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mStateIds:Landroid/util/SparseIntArray;
@@ -622,6 +707,7 @@
Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/PorterDuff$Mode;
Landroid/graphics/drawable/BitmapDrawable;->mTargetDensity:I
Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V
+Landroid/graphics/drawable/ColorDrawable$ColorState;->mUseColor:I
Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect;
Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
@@ -765,6 +851,7 @@
Landroid/hardware/Camera;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
Landroid/hardware/display/WifiDisplayStatus;->mActiveDisplay:Landroid/hardware/display/WifiDisplay;
Landroid/hardware/display/WifiDisplayStatus;->mDisplays:[Landroid/hardware/display/WifiDisplay;
+Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/HardwareBuffer;-><init>(J)V
Landroid/hardware/HardwareBuffer;->mNativeObject:J
Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
@@ -824,57 +911,28 @@
Landroid/hardware/usb/UsbRequest;->mLength:I
Landroid/hardware/usb/UsbRequest;->mNativeContext:J
Landroid/icu/impl/CurrencyData;-><init>()V
-Landroid/icu/impl/number/DecimalFormatProperties;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/impl/number/DecimalFormatProperties;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/impl/TimeZoneGenericNames;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/text/ArabicShaping;->isAlefMaksouraChar(C)Z
Landroid/icu/text/ArabicShaping;->isSeenTailFamilyChar(C)I
Landroid/icu/text/ArabicShaping;->isTailChar(C)Z
Landroid/icu/text/ArabicShaping;->isYehHamzaChar(C)Z
-Landroid/icu/text/DateFormat;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/text/DateFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/text/DateIntervalFormat;-><init>()V
-Landroid/icu/text/DateIntervalFormat;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;-><init>()V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/DecimalFormat;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/icu/text/DecimalFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/DecimalFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/MessageFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/MessageFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/NumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/NumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/PluralFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/PluralRules$FixedDecimal;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/PluralRules$FixedDecimal;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/PluralRules;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/PluralRules;->writeObject(Ljava/io/ObjectOutputStream;)V
Landroid/icu/text/RuleBasedCollator;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/text/RuleBasedNumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/RuleBasedNumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/text/SelectFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/SimpleDateFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/SimpleDateFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
Landroid/icu/text/SpoofChecker$ScriptSet;->and(I)V
Landroid/icu/text/SpoofChecker$ScriptSet;-><init>()V
Landroid/icu/text/SpoofChecker$ScriptSet;->isFull()Z
Landroid/icu/text/SpoofChecker$ScriptSet;->setAll()V
-Landroid/icu/text/TimeZoneFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/text/TimeZoneFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames$FactoryImpl;-><init>()V
Landroid/icu/text/Transliterator;->createFromRules(Ljava/lang/String;Ljava/lang/String;I)Landroid/icu/text/Transliterator;
Landroid/icu/text/Transliterator;->transliterate(Ljava/lang/String;)Ljava/lang/String;
Landroid/icu/text/UFormat;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
Landroid/icu/util/Calendar;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/util/Calendar;->writeObject(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/util/ChineseCalendar;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/util/IslamicCalendar;->readObject(Ljava/io/ObjectInputStream;)V
-Landroid/icu/util/SimpleTimeZone;->readObject(Ljava/io/ObjectInputStream;)V
Landroid/inputmethodservice/InputMethodService;->mExtractEditText:Landroid/inputmethodservice/ExtractEditText;
+Landroid/inputmethodservice/InputMethodService;->mRootView:Landroid/view/View;
+Landroid/inputmethodservice/InputMethodService;->mSettingsObserver:Landroid/inputmethodservice/InputMethodService$SettingsObserver;
+Landroid/inputmethodservice/InputMethodService$SettingsObserver;->shouldShowImeWithHardKeyboard()Z
Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country;
Landroid/location/Country;->getCountryIso()Ljava/lang/String;
Landroid/location/Country;->getSource()I
@@ -971,11 +1029,15 @@
Landroid/media/AudioTrack;->mStreamType:I
Landroid/media/AudioTrack;->native_release()V
Landroid/media/AudioTrack;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/media/ExifInterface;->getDateTime()J
Landroid/media/IAudioService;->getStreamMaxVolume(I)I
Landroid/media/IAudioService;->getStreamVolume(I)I
Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V
Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService;
+Landroid/media/IRemoteDisplayCallback;->onStateChanged(Landroid/media/RemoteDisplayState;)V
Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController;
Landroid/media/JetPlayer;->mNativePlayerInJavaObj:J
Landroid/media/JetPlayer;->postEventFromNative(Ljava/lang/Object;III)V
@@ -1028,6 +1090,8 @@
Landroid/media/RemoteDisplay;->notifyDisplayConnected(Landroid/view/Surface;IIII)V
Landroid/media/RemoteDisplay;->notifyDisplayDisconnected()V
Landroid/media/RemoteDisplay;->notifyDisplayError(I)V
+Landroid/media/RemoteDisplayState;->displays:Ljava/util/ArrayList;
+Landroid/media/RemoteDisplayState;-><init>()V
Landroid/media/RingtoneManager;->getRingtone(Landroid/content/Context;Landroid/net/Uri;I)Landroid/media/Ringtone;
Landroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper;
Landroid/media/session/MediaSession;->mCallback:Landroid/media/session/MediaSession$CallbackMessageHandler;
@@ -1039,6 +1103,11 @@
Landroid/media/soundtrigger/SoundTriggerManager;->stopRecognition(Ljava/util/UUID;)I
Landroid/media/soundtrigger/SoundTriggerManager;->unloadSoundModel(Ljava/util/UUID;)I
Landroid/media/SubtitleController;->mHandler:Landroid/os/Handler;
+Landroid/media/SubtitleTrack$RenderingWidget;->draw(Landroid/graphics/Canvas;)V
+Landroid/media/SubtitleTrack$RenderingWidget;->onAttachedToWindow()V
+Landroid/media/SubtitleTrack$RenderingWidget;->onDetachedFromWindow()V
+Landroid/media/SubtitleTrack$RenderingWidget;->setOnChangedListener(Landroid/media/SubtitleTrack$RenderingWidget$OnChangedListener;)V
+Landroid/media/SubtitleTrack$RenderingWidget;->setSize(II)V
Landroid/media/ThumbnailUtils;->createImageThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;
Landroid/media/ToneGenerator;->mNativeContext:J
Landroid/media/VolumeShaper$Configuration;-><init>(IIIDI[F[F)V
@@ -1078,11 +1147,16 @@
Landroid/net/ConnectivityManager;->TYPE_PROXY:I
Landroid/net/ConnectivityManager;->TYPE_WIFI_P2P:I
Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Network;
Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableIfaces()[Ljava/lang/String;
Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String;
Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
+Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/IpConfiguration;->httpProxy:Landroid/net/ProxyInfo;
Landroid/net/LinkProperties;->setHttpProxy(Landroid/net/ProxyInfo;)V
Landroid/net/LocalSocketImpl;->inboundFileDescriptors:[Ljava/io/FileDescriptor;
@@ -1106,6 +1180,7 @@
Landroid/net/NetworkStats;->txPackets:[J
Landroid/net/NetworkStats;->uid:[I
Landroid/net/NetworkTemplate;->buildTemplateWifi()Landroid/net/NetworkTemplate;
+Landroid/net/Proxy;->getProxy(Landroid/content/Context;Ljava/lang/String;)Ljava/net/Proxy;
Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;ILjava/lang/String;)V
Landroid/net/SntpClient;-><init>()V
Landroid/net/SSLCertificateSocketFactory;->castToOpenSSLSocket(Ljava/net/Socket;)Lcom/android/org/conscrypt/OpenSSLSocketImpl;
@@ -1132,6 +1207,7 @@
Landroid/net/SSLCertificateSocketFactory;->TAG:Ljava/lang/String;
Landroid/net/SSLCertificateSocketFactory;->verifyHostname(Ljava/net/Socket;Ljava/lang/String;)V
Landroid/net/SSLSessionCache;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache;
+Landroid/net/TrafficStats;->getMobileIfaces()[Ljava/lang/String;
Landroid/net/TrafficStats;->getRxBytes(Ljava/lang/String;)J
Landroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService;
Landroid/net/TrafficStats;->getTxBytes(Ljava/lang/String;)J
@@ -1140,9 +1216,12 @@
Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/wifi/p2p/WifiP2pGroup;->getNetworkId()I
Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection;
+Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
+Landroid/net/wifi/p2p/WifiP2pManager$Channel;->putListener(Ljava/lang/Object;)I
Landroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
Landroid/net/wifi/p2p/WifiP2pManager;->requestPersistentGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;)V
Landroid/net/wifi/p2p/WifiP2pManager;->setDeviceName(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
+Landroid/net/wifi/p2p/WifiP2pManager;->setWifiP2pChannels(Landroid/net/wifi/p2p/WifiP2pManager$Channel;IILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
Landroid/net/wifi/ScanResult;->anqpDomainId:I
Landroid/net/wifi/ScanResult;->anqpLines:Ljava/util/List;
Landroid/net/wifi/ScanResult;->distanceCm:I
@@ -1172,10 +1251,12 @@
Landroid/net/wifi/WifiConfiguration;->apBand:I
Landroid/net/wifi/WifiConfiguration;->apChannel:I
Landroid/net/wifi/WifiConfiguration;->defaultGwMacAddress:Ljava/lang/String;
+Landroid/net/wifi/WifiConfiguration;->lastConnectUid:I
Landroid/net/wifi/WifiConfiguration;->mIpConfiguration:Landroid/net/IpConfiguration;
Landroid/net/wifi/WifiConfiguration;->validatedInternetAccess:Z
Landroid/net/wifi/WifiEnterpriseConfig;->getCaCertificateAlias()Ljava/lang/String;
Landroid/net/wifi/WifiEnterpriseConfig;->getClientCertificateAlias()Ljava/lang/String;
+Landroid/net/wifi/WifiInfo;->DEFAULT_MAC_ADDRESS:Ljava/lang/String;
Landroid/net/wifi/WifiInfo;->getMeteredHint()Z
Landroid/net/wifi/WifiInfo;->mMacAddress:Ljava/lang/String;
Landroid/net/wifi/WifiInfo;->removeDoubleQuotes(Ljava/lang/String;)Ljava/lang/String;
@@ -1197,17 +1278,30 @@
Landroid/os/AsyncTask;->mWorker:Landroid/os/AsyncTask$WorkerRunnable;
Landroid/os/AsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;
Landroid/os/AsyncTask;->setDefaultExecutor(Ljava/util/concurrent/Executor;)V
+Landroid/os/BatteryStats$Counter;->getCountLocked(I)I
Landroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray;
Landroid/os/BatteryStats$HistoryItem;->states2:I
Landroid/os/BatteryStats;->NUM_DATA_CONNECTION_TYPES:I
Landroid/os/BatteryStats;->startIteratingHistoryLocked()Z
Landroid/os/BatteryStats$Timer;->getTotalTimeLocked(JI)J
+Landroid/os/BatteryStats$Uid;->getAudioTurnedOnTimer()Landroid/os/BatteryStats$Timer;
Landroid/os/BatteryStats$Uid;->getFullWifiLockTime(JI)J
+Landroid/os/BatteryStats$Uid;->getPackageStats()Landroid/util/ArrayMap;
Landroid/os/BatteryStats$Uid;->getProcessStats()Landroid/util/ArrayMap;
Landroid/os/BatteryStats$Uid;->getSensorStats()Landroid/util/SparseArray;
Landroid/os/BatteryStats$Uid;->getUid()I
+Landroid/os/BatteryStats$Uid;->getVideoTurnedOnTimer()Landroid/os/BatteryStats$Timer;
Landroid/os/BatteryStats$Uid;->getWifiMulticastTime(JI)J
Landroid/os/BatteryStats$Uid;->getWifiScanTime(JI)J
+Landroid/os/BatteryStats$Uid$Pkg;->getServiceStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid$Pkg;->getWakeupAlarmStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid$Pkg$Serv;->getLaunches(I)I
+Landroid/os/BatteryStats$Uid$Pkg$Serv;->getStartTime(JI)J
+Landroid/os/BatteryStats$Uid$Proc;->countExcessivePowers()I
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->overTime:J
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->type:I
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->usedTime:J
+Landroid/os/BatteryStats$Uid$Proc;->getExcessivePower(I)Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;
Landroid/os/BatteryStats$Uid$Proc;->getForegroundTime(I)J
Landroid/os/BatteryStats$Uid$Proc;->getSystemTime(I)J
Landroid/os/BatteryStats$Uid$Proc;->getUserTime(I)J
@@ -1254,6 +1348,7 @@
Landroid/os/Debug$MemoryInfo;->otherSwappedOutPss:I
Landroid/os/Environment;->buildExternalStorageAppDataDirs(Ljava/lang/String;)[Ljava/io/File;
Landroid/os/Environment;->getVendorDirectory()Ljava/io/File;
+Landroid/os/Environment;->maybeTranslateEmulatedPathToInternal(Ljava/io/File;)Ljava/io/File;
Landroid/os/FileObserver$ObserverThread;->onEvent(IILjava/lang/String;)V
Landroid/os/FileUtils;->checksumCrc32(Ljava/io/File;)J
Landroid/os/FileUtils;->copyFile(Ljava/io/File;Ljava/io/File;)Z
@@ -1265,6 +1360,7 @@
Landroid/os/FileUtils;->setPermissions(Ljava/lang/String;III)I
Landroid/os/FileUtils;->stringToFile(Ljava/io/File;Ljava/lang/String;)V
Landroid/os/FileUtils;->stringToFile(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/os/FileUtils;->sync(Ljava/io/FileOutputStream;)Z
Landroid/os/Handler;->getIMessenger()Landroid/os/IMessenger;
Landroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z
Landroid/os/Handler;-><init>(Z)V
@@ -1279,6 +1375,7 @@
Landroid/os/IPowerManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z
Landroid/os/IPowerManager;->userActivity(JII)V
+Landroid/os/IServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
Landroid/os/IServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
Landroid/os/IUserManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/os/Looper;->mQueue:Landroid/os/MessageQueue;
@@ -1322,6 +1419,7 @@
Landroid/os/Process;->isIsolated(I)Z
Landroid/os/Process;->readProcFile(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z
Landroid/os/Process;->readProcLines(Ljava/lang/String;[Ljava/lang/String;[J)V
+Landroid/os/Process;->setArgV0(Ljava/lang/String;)V
Landroid/os/SELinux;->isSELinuxEnabled()Z
Landroid/os/SELinux;->isSELinuxEnforced()Z
Landroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;)V
@@ -1357,7 +1455,6 @@
Landroid/os/storage/VolumeInfo;->getPath()Ljava/io/File;
Landroid/os/storage/VolumeInfo;->getState()I
Landroid/os/storage/VolumeInfo;->getType()I
-Landroid/os/storage/VolumeInfo;->isMountedReadable()Z
Landroid/os/storage/VolumeInfo;->isPrimary()Z
Landroid/os/storage/VolumeInfo;->isVisible()Z
Landroid/os/StrictMode;->disableDeathOnFileUriExposure()V
@@ -1484,13 +1581,16 @@
Landroid/print/PrinterId;->getServiceName()Landroid/content/ComponentName;
Landroid/print/PrintJobInfo;->getAdvancedOptions()Landroid/os/Bundle;
Landroid/print/PrintJobInfo;->getDocumentInfo()Landroid/print/PrintDocumentInfo;
+Landroid/provider/Browser$BookmarkColumns;->DATE:Ljava/lang/String;
Landroid/provider/Browser;->BOOKMARKS_URI:Landroid/net/Uri;
Landroid/provider/Browser;->canClearHistory(Landroid/content/ContentResolver;)Z
Landroid/provider/Browser;->clearHistory(Landroid/content/ContentResolver;)V
Landroid/provider/Browser;->clearSearches(Landroid/content/ContentResolver;)V
Landroid/provider/Browser;->deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V
Landroid/provider/Browser;->getVisitedHistory(Landroid/content/ContentResolver;)[Ljava/lang/String;
+Landroid/provider/Browser;->SEARCHES_URI:Landroid/net/Uri;
Landroid/provider/Browser;->sendString(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
+Landroid/provider/Browser;->updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V
Landroid/provider/CalendarContract$CalendarAlerts;->findNextAlarmTime(Landroid/content/ContentResolver;J)J
Landroid/provider/CalendarContract$CalendarAlerts;->rescheduleMissedAlarms(Landroid/content/ContentResolver;Landroid/content/Context;Landroid/app/AlarmManager;)V
Landroid/provider/Settings$ContentProviderHolder;->mContentProvider:Landroid/content/IContentProvider;
@@ -1718,6 +1818,7 @@
Landroid/R$styleable;->Window:[I
Landroid/R$styleable;->Window_windowBackground:I
Landroid/R$styleable;->Window_windowFrame:I
+Landroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreOperationHandle(Ljava/lang/Object;)J
Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore;
Landroid/security/keystore/KeychainProtectionParams;->clearSecret()V
Landroid/security/keystore/KeychainProtectionParams;->getKeyDerivationParams()Landroid/security/keystore/KeyDerivationParams;
@@ -1866,6 +1967,7 @@
Landroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList()[I
Landroid/telephony/SubscriptionManager;->getAllSubscriptionInfoCount()I
Landroid/telephony/SubscriptionManager;->getAllSubscriptionInfoList()Ljava/util/List;
+Landroid/telephony/SubscriptionManager;->getDefaultDataPhoneId()I
Landroid/telephony/SubscriptionManager;->getDefaultDataSubscriptionInfo()Landroid/telephony/SubscriptionInfo;
Landroid/telephony/SubscriptionManager;->getDefaultSmsPhoneId()I
Landroid/telephony/SubscriptionManager;->getDefaultVoiceSubscriptionInfo()Landroid/telephony/SubscriptionInfo;
@@ -1905,6 +2007,7 @@
Landroid/telephony/TelephonyManager;->isMultiSimEnabled()Z
Landroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z
Landroid/telephony/TelephonyManager;->isVolteAvailable()Z
+Landroid/telephony/TelephonyManager;->mSubscriptionManager:Landroid/telephony/SubscriptionManager;
Landroid/text/AndroidBidi;->bidi(I[C[B)I
Landroid/text/DynamicLayout;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZIIILandroid/text/TextUtils$TruncateAt;I)V
Landroid/text/DynamicLayout;->sStaticLayout:Landroid/text/StaticLayout;
@@ -1961,6 +2064,7 @@
Landroid/text/StaticLayout;->mColumns:I
Landroid/text/StaticLayout;->mLineCount:I
Landroid/text/StaticLayout;->mLines:[I
+Landroid/text/StaticLayout;->mMaximumVisibleLineCount:I
Landroid/text/TextLine;->mCharacterStyleSpanSet:Landroid/text/SpanSet;
Landroid/text/TextLine;->mMetricAffectingSpanSpanSet:Landroid/text/SpanSet;
Landroid/text/TextLine;->mReplacementSpanSpanSet:Landroid/text/SpanSet;
@@ -1992,14 +2096,19 @@
Landroid/util/Pools$SynchronizedPool;-><init>(I)V
Landroid/util/Rational;->mDenominator:I
Landroid/util/Rational;->mNumerator:I
-Landroid/util/Rational;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/util/Singleton;->get()Ljava/lang/Object;
+Landroid/util/Singleton;-><init>()V
Landroid/util/Singleton;->mInstance:Ljava/lang/Object;
Landroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->w(Ljava/lang/String;Ljava/lang/String;)I
Landroid/util/SparseIntArray;->mKeys:[I
Landroid/util/SparseIntArray;->mSize:I
Landroid/util/SparseIntArray;->mValues:[I
+Landroid/view/accessibility/AccessibilityInteractionClient;->clearCache()V
+Landroid/view/accessibility/AccessibilityInteractionClient;->getInstance()Landroid/view/accessibility/AccessibilityInteractionClient;
Landroid/view/accessibility/AccessibilityManager;->getInstance(Landroid/content/Context;)Landroid/view/accessibility/AccessibilityManager;
Landroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
+Landroid/view/accessibility/AccessibilityManager;->mAccessibilityStateChangeListeners:Landroid/util/ArrayMap;
Landroid/view/accessibility/AccessibilityManager;->mIsEnabled:Z
Landroid/view/accessibility/AccessibilityManager;->mIsHighTextContrastEnabled:Z
Landroid/view/accessibility/AccessibilityManager;->sInstance:Landroid/view/accessibility/AccessibilityManager;
@@ -2049,6 +2158,7 @@
Landroid/view/inputmethod/InputMethodInfo;->mSubtypes:Landroid/view/inputmethod/InputMethodSubtypeArray;
Landroid/view/inputmethod/InputMethodManager;->finishInputLocked()V
Landroid/view/inputmethod/InputMethodManager;->focusIn(Landroid/view/View;)V
+Landroid/view/inputmethod/InputMethodManager;->focusOut(Landroid/view/View;)V
Landroid/view/inputmethod/InputMethodManager;->getInputMethodWindowVisibleHeight()I
Landroid/view/inputmethod/InputMethodManager;->mCurId:Ljava/lang/String;
Landroid/view/inputmethod/InputMethodManager;->mCurRootView:Landroid/view/View;
@@ -2057,6 +2167,7 @@
Landroid/view/inputmethod/InputMethodManager;->mServedView:Landroid/view/View;
Landroid/view/inputmethod/InputMethodManager;->mService:Lcom/android/internal/view/IInputMethodManager;
Landroid/view/inputmethod/InputMethodManager;->notifyUserAction()V
+Landroid/view/inputmethod/InputMethodManager;->peekInstance()Landroid/view/inputmethod/InputMethodManager;
Landroid/view/inputmethod/InputMethodManager;->showSoftInputUnchecked(ILandroid/os/ResultReceiver;)V
Landroid/view/inputmethod/InputMethodManager;->sInstance:Landroid/view/inputmethod/InputMethodManager;
Landroid/view/inputmethod/InputMethodManager;->windowDismissed(Landroid/os/IBinder;)V
@@ -2070,6 +2181,7 @@
Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V
Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager;
Landroid/view/IWindowManager$Stub$Proxy;->getBaseDisplayDensity(I)I
+Landroid/view/IWindowManager$Stub$Proxy;->getDockedStackSide()I
Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I
Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z
Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -2100,6 +2212,7 @@
Landroid/view/LayoutInflater;->mPrivateFactory:Landroid/view/LayoutInflater$Factory2;
Landroid/view/LayoutInflater;->sConstructorMap:Ljava/util/HashMap;
Landroid/view/LayoutInflater;->setPrivateFactory(Landroid/view/LayoutInflater$Factory2;)V
+Landroid/view/MotionEvent;->getPointerIdBits()I
Landroid/view/MotionEvent;->HISTORY_CURRENT:I
Landroid/view/MotionEvent;->mNativePtr:J
Landroid/view/MotionEvent;->nativeGetRawAxisValue(JIII)F
@@ -2107,6 +2220,7 @@
Landroid/view/MotionEvent$PointerCoords;->mPackedAxisBits:J
Landroid/view/MotionEvent$PointerCoords;->mPackedAxisValues:[F
Landroid/view/MotionEvent;->scale(F)V
+Landroid/view/MotionEvent;->split(I)Landroid/view/MotionEvent;
Landroid/view/PointerIcon;->load(Landroid/content/Context;)Landroid/view/PointerIcon;
Landroid/view/PointerIcon;->mBitmapFrames:[Landroid/graphics/Bitmap;
Landroid/view/PointerIcon;->mBitmap:Landroid/graphics/Bitmap;
@@ -2127,6 +2241,8 @@
Landroid/view/RemoteAnimationTarget;->taskId:I
Landroid/view/RemoteAnimationTarget;->windowConfiguration:Landroid/app/WindowConfiguration;
Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V
+Landroid/view/RenderNode;->discardDisplayList()V
+Landroid/view/RenderNode;->output()V
Landroid/view/ScaleGestureDetector;->mListener:Landroid/view/ScaleGestureDetector$OnScaleGestureListener;
Landroid/view/ScaleGestureDetector;->mMinSpan:I
Landroid/view/SurfaceControl$PhysicalDisplayInfo;->appVsyncOffsetNanos:J
@@ -2161,6 +2277,7 @@
Landroid/view/textclassifier/TextClassificationManager;->getTextClassifier(I)Landroid/view/textclassifier/TextClassifier;
Landroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
Landroid/view/TextureView;->destroyHardwareLayer()V
+Landroid/view/TextureView;->destroyHardwareResources()V
Landroid/view/TextureView;->mLayer:Landroid/view/TextureLayer;
Landroid/view/TextureView;->mNativeWindow:J
Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture;
@@ -2172,6 +2289,7 @@
Landroid/view/VelocityTracker$Estimator;->yCoeff:[F
Landroid/view/VelocityTracker;->obtain(Ljava/lang/String;)Landroid/view/VelocityTracker;
Landroid/view/View;->applyDrawableToTransparentRegion(Landroid/graphics/drawable/Drawable;Landroid/graphics/Region;)V
+Landroid/view/View$AttachInfo;->mContentInsets:Landroid/graphics/Rect;
Landroid/view/View$AttachInfo;->mDrawingTime:J
Landroid/view/View$AttachInfo;->mStableInsets:Landroid/graphics/Rect;
Landroid/view/View;->clearAccessibilityFocus()V
@@ -2190,12 +2308,14 @@
Landroid/view/View;->fitsSystemWindows()Z
Landroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
+Landroid/view/View;->getHorizontalScrollFactor()F
Landroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix;
Landroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo;
Landroid/view/View;->getLocationOnScreen()[I
Landroid/view/View;->getRawTextAlignment()I
Landroid/view/View;->getRawTextDirection()I
Landroid/view/View;->getTransitionAlpha()F
+Landroid/view/View;->getVerticalScrollFactor()F
Landroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl;
Landroid/view/View;->getWindowDisplayFrame(Landroid/graphics/Rect;)V
Landroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V
@@ -2210,18 +2330,23 @@
Landroid/view/ViewGroup;->mFirstTouchTarget:Landroid/view/ViewGroup$TouchTarget;
Landroid/view/ViewGroup;->mGroupFlags:I
Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener;
+Landroid/view/ViewGroup;->mPersistentDrawingCache:I
+Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V
Landroid/view/ViewGroup;->resetResolvedDrawables()V
Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V
Landroid/view/ViewGroup;->resetResolvedPadding()V
Landroid/view/ViewGroup;->resetResolvedTextAlignment()V
Landroid/view/ViewGroup;->resetResolvedTextDirection()V
Landroid/view/ViewGroup;->suppressLayout(Z)V
+Landroid/view/View;->includeForAccessibility()Z
Landroid/view/View;->initializeScrollbars(Landroid/content/res/TypedArray;)V
Landroid/view/View;->internalSetPadding(IIII)V
Landroid/view/View;->isPaddingResolved()Z
Landroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
Landroid/view/View;->isVisibleToUser()Z
+Landroid/view/View$ListenerInfo;-><init>()V
Landroid/view/View$ListenerInfo;->mOnClickListener:Landroid/view/View$OnClickListener;
+Landroid/view/View$ListenerInfo;->mOnFocusChangeListener:Landroid/view/View$OnFocusChangeListener;
Landroid/view/View$ListenerInfo;->mOnLongClickListener:Landroid/view/View$OnLongClickListener;
Landroid/view/View$ListenerInfo;->mOnTouchListener:Landroid/view/View$OnTouchListener;
Landroid/view/View;->mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate;
@@ -2234,10 +2359,13 @@
Landroid/view/View;->mListenerInfo:Landroid/view/View$ListenerInfo;
Landroid/view/View;->mMinHeight:I
Landroid/view/View;->mMinWidth:I
+Landroid/view/View;->mPaddingBottom:I
Landroid/view/View;->mPaddingLeft:I
Landroid/view/View;->mPaddingRight:I
+Landroid/view/View;->mPaddingTop:I
Landroid/view/View;->mParent:Landroid/view/ViewParent;
Landroid/view/View;->mPrivateFlags3:I
+Landroid/view/View;->mPrivateFlags:I
Landroid/view/View;->mRecreateDisplayList:Z
Landroid/view/View;->mResources:Landroid/content/res/Resources;
Landroid/view/View;->mRight:I
@@ -2250,6 +2378,8 @@
Landroid/view/View;->mUnscaledDrawingCache:Landroid/graphics/Bitmap;
Landroid/view/View;->mViewFlags:I
Landroid/view/View;->notifySubtreeAccessibilityStateChangedIfNeeded()V
+Landroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
+Landroid/view/View;->performAccessibilityActionInternal(ILandroid/os/Bundle;)Z
Landroid/view/View;->recomputePadding()V
Landroid/view/View;->requestAccessibilityFocus()Z
Landroid/view/View;->resetDisplayList()V
@@ -2310,10 +2440,14 @@
Landroid/view/WindowManager$LayoutParams;->userActivityTimeout:J
Landroid/view/Window;->mAppName:Ljava/lang/String;
Landroid/view/Window;->mAppToken:Landroid/os/IBinder;
+Landroid/view/Window;->mCallback:Landroid/view/Window$Callback;
+Landroid/view/Window;->mContext:Landroid/content/Context;
Landroid/view/Window;->mHardwareAccelerated:Z
+Landroid/view/Window;->mWindowStyle:Landroid/content/res/TypedArray;
Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/webkit/WebResourceResponse;->mImmutable:Z
Landroid/webkit/WebSyncManager;->mHandler:Landroid/os/Handler;
+Landroid/webkit/WebViewClient;->onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V
Landroid/webkit/WebView;->debugDump()V
Landroid/webkit/WebView;->disablePlatformNotifications()V
Landroid/webkit/WebView;->emulateShiftHeld()V
@@ -2322,6 +2456,7 @@
Landroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context;
Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo;
Landroid/webkit/WebViewFactory;->sProviderInstance:Landroid/webkit/WebViewFactoryProvider;
+Landroid/webkit/WebView;->getTouchIconUrl()Ljava/lang/String;
Landroid/webkit/WebView;->getVisibleTitleHeight()I
Landroid/webkit/WebView;->isPaused()Z
Landroid/webkit/WebView;->mProvider:Landroid/webkit/WebViewProvider;
@@ -2343,6 +2478,8 @@
Landroid/widget/AbsListView;->mMaximumVelocity:I
Landroid/widget/AbsListView;->mMotionPosition:I
Landroid/widget/AbsListView;->mOnScrollListener:Landroid/widget/AbsListView$OnScrollListener;
+Landroid/widget/AbsListView;->mPendingCheckForLongPress:Landroid/widget/AbsListView$CheckForLongPress;
+Landroid/widget/AbsListView;->mPendingCheckForTap:Landroid/widget/AbsListView$CheckForTap;
Landroid/widget/AbsListView;->mRecycler:Landroid/widget/AbsListView$RecycleBin;
Landroid/widget/AbsListView;->mSelectionTopPadding:I
Landroid/widget/AbsListView;->mSelectorPosition:I
@@ -2355,6 +2492,8 @@
Landroid/widget/AbsListView$RecycleBin;->clear()V
Landroid/widget/AbsListView$RecycleBin;->mRecyclerListener:Landroid/widget/AbsListView$RecyclerListener;
Landroid/widget/AbsListView;->reportScrollStateChange(I)V
+Landroid/widget/AbsListView$SavedState;->firstId:J
+Landroid/widget/AbsListView$SavedState;->viewTop:I
Landroid/widget/AbsListView;->smoothScrollBy(IIZZ)V
Landroid/widget/AbsListView;->trackMotionScroll(II)Z
Landroid/widget/AbsSeekBar;->mIsDragging:Z
@@ -2373,7 +2512,9 @@
Landroid/widget/AutoCompleteTextView;->ensureImeVisible(Z)V
Landroid/widget/AutoCompleteTextView;->mPopup:Landroid/widget/ListPopupWindow;
Landroid/widget/AutoCompleteTextView;->setDropDownAlwaysVisible(Z)V
+Landroid/widget/AutoCompleteTextView;->setForceIgnoreOutsideTouch(Z)V
Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/CompoundButton;->mOnCheckedChangeListener:Landroid/widget/CompoundButton$OnCheckedChangeListener;
Landroid/widget/CursorAdapter;->mChangeObserver:Landroid/widget/CursorAdapter$ChangeObserver;
Landroid/widget/CursorAdapter;->mDataSetObserver:Landroid/database/DataSetObserver;
Landroid/widget/CursorAdapter;->mDataValid:Z
@@ -2384,6 +2525,7 @@
Landroid/widget/Editor;->mShowCursor:J
Landroid/widget/Editor;->mShowSoftInputOnFocus:Z
Landroid/widget/ExpandableListView;->mChildDivider:Landroid/graphics/drawable/Drawable;
+Landroid/widget/ExpandableListView;->mGroupIndicator:Landroid/graphics/drawable/Drawable;
Landroid/widget/FastScroller;->mContainerRect:Landroid/graphics/Rect;
Landroid/widget/FastScroller;->mHeaderCount:I
Landroid/widget/FastScroller;->mLongList:Z
@@ -2490,13 +2632,17 @@
Landroid/widget/RemoteViews;->mergeRemoteViews(Landroid/widget/RemoteViews;)V
Landroid/widget/RemoteViews;->mPortrait:Landroid/widget/RemoteViews;
Landroid/widget/RemoteViews$ReflectionAction;->methodName:Ljava/lang/String;
+Landroid/widget/RemoteViews$ReflectionAction;->value:Ljava/lang/Object;
+Landroid/widget/RemoteViews$SetOnClickPendingIntent;->pendingIntent:Landroid/app/PendingIntent;
Landroid/widget/ScrollBarDrawable;->mVerticalThumb:Landroid/graphics/drawable/Drawable;
Landroid/widget/ScrollBarDrawable;->setHorizontalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
Landroid/widget/ScrollBarDrawable;->setVerticalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
+Landroid/widget/Scroller;->mInterpolator:Landroid/view/animation/Interpolator;
Landroid/widget/ScrollView;->mChildToScrollTo:Landroid/view/View;
Landroid/widget/ScrollView;->mEdgeGlowBottom:Landroid/widget/EdgeEffect;
Landroid/widget/ScrollView;->mEdgeGlowTop:Landroid/widget/EdgeEffect;
Landroid/widget/ScrollView;->mIsBeingDragged:Z
+Landroid/widget/ScrollView;->mMinimumVelocity:I
Landroid/widget/ScrollView;->mOverflingDistance:I
Landroid/widget/ScrollView;->mOverscrollDistance:I
Landroid/widget/ScrollView;->mScroller:Landroid/widget/OverScroller;
@@ -2510,7 +2656,11 @@
Landroid/widget/Spinner;->mPopup:Landroid/widget/Spinner$SpinnerPopup;
Landroid/widget/Switch;->mThumbDrawable:Landroid/graphics/drawable/Drawable;
Landroid/widget/Switch;->mTrackDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/TabHost$IntentContentStrategy;->getContentView()Landroid/view/View;
+Landroid/widget/TabHost$IntentContentStrategy;->tabClosed()V
+Landroid/widget/TabHost;->mTabSpecs:Ljava/util/List;
Landroid/widget/TabHost$TabSpec;->mContentStrategy:Landroid/widget/TabHost$ContentStrategy;
+Landroid/widget/TabWidget;->mSelectedTab:I
Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V
Landroid/widget/TextView;->assumeLayout()V
Landroid/widget/TextView;->createEditorIfNeeded()V
@@ -2528,7 +2678,11 @@
Landroid/widget/TextView;->mTextPaint:Landroid/text/TextPaint;
Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V
Landroid/widget/Toast;->getService()Landroid/app/INotificationManager;
+Landroid/widget/Toast;->getWindowParams()Landroid/view/WindowManager$LayoutParams;
+Landroid/widget/Toast;->mTN:Landroid/widget/Toast$TN;
Landroid/widget/Toast;->sService:Landroid/app/INotificationManager;
+Landroid/widget/Toast$TN;->mNextView:Landroid/view/View;
+Landroid/widget/Toast$TN;->mParams:Landroid/view/WindowManager$LayoutParams;
Landroid/widget/VideoView2;->getMediaController()Landroid/media/session/MediaController;
Landroid/widget/VideoView2$OnViewTypeChangedListener;->onViewTypeChanged(Landroid/view/View;I)V
Landroid/widget/VideoView2;->setOnViewTypeChangedListener(Landroid/widget/VideoView2$OnViewTypeChangedListener;)V
@@ -2611,6 +2765,7 @@
Lcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService;
Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I
Lcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->setMode(IILjava/lang/String;I)V
Lcom/android/internal/app/IBatteryStats;->getStatistics()[B
Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats;
Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -2638,10 +2793,12 @@
Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryRealtime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryUptime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/os/BatteryStatsImpl;->getBatteryRealtime(J)J
Lcom/android/internal/os/BatteryStatsImpl;->getDischargeAmount(I)I
Lcom/android/internal/os/BatteryStatsImpl;->getGlobalWifiRunningTime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;->getScreenOnTime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;->getUidStats()Landroid/util/SparseArray;
+Lcom/android/internal/os/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/internal/os/BatteryStatsImpl$Uid;
Lcom/android/internal/os/BatteryStatsImpl$Timer;->getCountLocked(I)I
Lcom/android/internal/os/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J
Lcom/android/internal/os/BatteryStatsImpl$Uid;->getProcessStats()Landroid/util/ArrayMap;
@@ -2709,6 +2866,18 @@
Lcom/android/internal/R$string;->megabyteShort:I
Lcom/android/internal/R$string;->petabyteShort:I
Lcom/android/internal/R$string;->terabyteShort:I
+Lcom/android/internal/R$styleable;->AbsListView_cacheColorHint:I
+Lcom/android/internal/R$styleable;->AbsListView_choiceMode:I
+Lcom/android/internal/R$styleable;->AbsListView_drawSelectorOnTop:I
+Lcom/android/internal/R$styleable;->AbsListView_fastScrollAlwaysVisible:I
+Lcom/android/internal/R$styleable;->AbsListView_fastScrollEnabled:I
+Lcom/android/internal/R$styleable;->AbsListView:[I
+Lcom/android/internal/R$styleable;->AbsListView_listSelector:I
+Lcom/android/internal/R$styleable;->AbsListView_scrollingCache:I
+Lcom/android/internal/R$styleable;->AbsListView_smoothScrollbar:I
+Lcom/android/internal/R$styleable;->AbsListView_stackFromBottom:I
+Lcom/android/internal/R$styleable;->AbsListView_textFilterEnabled:I
+Lcom/android/internal/R$styleable;->AbsListView_transcriptMode:I
Lcom/android/internal/R$styleable;->AccountAuthenticator_accountPreferences:I
Lcom/android/internal/R$styleable;->AccountAuthenticator_accountType:I
Lcom/android/internal/R$styleable;->AccountAuthenticator_customTokens:I
@@ -2716,6 +2885,28 @@
Lcom/android/internal/R$styleable;->AccountAuthenticator_icon:I
Lcom/android/internal/R$styleable;->AccountAuthenticator_label:I
Lcom/android/internal/R$styleable;->AccountAuthenticator_smallIcon:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_allowTaskReparenting:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_configChanges:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_description:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_enabled:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_excludeFromRecents:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_exported:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_hardwareAccelerated:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity:[I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_icon:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_immersive:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_label:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_launchMode:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_logo:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_noHistory:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_permission:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_process:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_screenOrientation:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_taskAffinity:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_theme:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_uiOptions:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_windowSoftInputMode:I
Lcom/android/internal/R$styleable;->AndroidManifestApplication_enabled:I
Lcom/android/internal/R$styleable;->AndroidManifestApplication_hardwareAccelerated:I
Lcom/android/internal/R$styleable;->AndroidManifestApplication:[I
@@ -2727,8 +2918,21 @@
Lcom/android/internal/R$styleable;->AndroidManifestApplication_supportsRtl:I
Lcom/android/internal/R$styleable;->AndroidManifestApplication_theme:I
Lcom/android/internal/R$styleable;->AndroidManifestApplication_uiOptions:I
+Lcom/android/internal/R$styleable;->AndroidManifestData:[I
Lcom/android/internal/R$styleable;->AndroidManifest:[I
Lcom/android/internal/R$styleable;->AndroidManifest_installLocation:I
+Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter:[I
+Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter_priority:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData:[I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_resource:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_value:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_enabled:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_exported:I
+Lcom/android/internal/R$styleable;->AndroidManifestService:[I
+Lcom/android/internal/R$styleable;->AndroidManifestService_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_permission:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_process:I
Lcom/android/internal/R$styleable;->AndroidManifest_sharedUserId:I
Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission:[I
Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission_name:I
@@ -2742,12 +2946,26 @@
Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOff:I
Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOn:I
Lcom/android/internal/R$styleable;->CompoundButton_button:I
+Lcom/android/internal/R$styleable;->CompoundButton_checked:I
Lcom/android/internal/R$styleable;->CompoundButton:[I
+Lcom/android/internal/R$styleable;->DialogPreference_dialogTitle:I
+Lcom/android/internal/R$styleable;->DialogPreference:[I
Lcom/android/internal/R$styleable;->EdgeEffect_colorEdgeEffect:I
Lcom/android/internal/R$styleable;->EdgeEffect:[I
Lcom/android/internal/R$styleable;->IconMenuView:[I
Lcom/android/internal/R$styleable;->ImageView:[I
Lcom/android/internal/R$styleable;->ImageView_src:I
+Lcom/android/internal/R$styleable;->ListPreference_entries:I
+Lcom/android/internal/R$styleable;->ListPreference:[I
+Lcom/android/internal/R$styleable;->ListView_dividerHeight:I
+Lcom/android/internal/R$styleable;->ListView_divider:I
+Lcom/android/internal/R$styleable;->ListView_entries:I
+Lcom/android/internal/R$styleable;->ListView_footerDividersEnabled:I
+Lcom/android/internal/R$styleable;->ListView_headerDividersEnabled:I
+Lcom/android/internal/R$styleable;->ListView:[I
+Lcom/android/internal/R$styleable;->ListView_overScrollFooter:I
+Lcom/android/internal/R$styleable;->ListView_overScrollHeader:I
+Lcom/android/internal/R$styleable;->PopupWindow:[I
Lcom/android/internal/R$styleable;->Preference_defaultValue:I
Lcom/android/internal/R$styleable;->Preference_dependency:I
Lcom/android/internal/R$styleable;->Preference_enabled:I
@@ -2776,12 +2994,15 @@
Lcom/android/internal/R$styleable;->SyncAdapter_supportsUploading:I
Lcom/android/internal/R$styleable;->SyncAdapter_userVisible:I
Lcom/android/internal/R$styleable;->TabWidget:[I
+Lcom/android/internal/R$styleable;->TextAppearance:[I
Lcom/android/internal/R$styleable;->TextView_drawableBottom:I
Lcom/android/internal/R$styleable;->TextView_drawableLeft:I
Lcom/android/internal/R$styleable;->TextView_drawableRight:I
Lcom/android/internal/R$styleable;->TextView_drawableTop:I
Lcom/android/internal/R$styleable;->TextView:[I
Lcom/android/internal/R$styleable;->TextView_maxLines:I
+Lcom/android/internal/R$styleable;->TextView_textColorHint:I
+Lcom/android/internal/R$styleable;->TextView_textColor:I
Lcom/android/internal/R$styleable;->View_background:I
Lcom/android/internal/R$styleable;->ViewGroup_Layout:[I
Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_height:I
@@ -2802,23 +3023,35 @@
Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms;
Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/ITelephony;->answerRingingCall()V
Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V
Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z
Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z
Lcom/android/internal/telephony/ITelephony;->endCall()Z
+Lcom/android/internal/telephony/ITelephony;->getCallState()I
+Lcom/android/internal/telephony/ITelephony;->getDataState()I
Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z
Lcom/android/internal/telephony/ITelephony;->silenceRinger()V
Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z
Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I
+Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_endCall:I
Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I
+Lcom/android/internal/telephony/SmsRawData;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/telephony/SmsRawData;-><init>([B)V
Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/util/AsyncChannel;->sendMessage(III)V
Lcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;)V
Lcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap;
+Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/io/OutputStream;)V
Lcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager;
Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList()Ljava/util/List;
Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/view/InputBindResult;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V
Lcom/android/internal/view/menu/MenuBuilder;->mContext:Landroid/content/Context;
Lcom/android/internal/view/menu/MenuBuilder;->setCurrentMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V
Lcom/android/internal/view/menu/MenuBuilder;->setOptionalIconsVisible(Z)V
@@ -2841,8 +3074,6 @@
Lcom/android/okhttp/OkHttpClient;->dns:Lcom/android/okhttp/Dns;
Lcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
Lcom/android/okhttp/OkHttpClient;->setRetryOnConnectionFailure(Z)V
-Lcom/android/okhttp/okio/ByteString;->readObject(Ljava/io/ObjectInputStream;)V
-Lcom/android/okhttp/okio/ByteString;->writeObject(Ljava/io/ObjectOutputStream;)V
Lcom/android/okhttp/Request;->headers:Lcom/android/okhttp/Headers;
Lcom/android/okhttp/Request;->method:Ljava/lang/String;
Lcom/android/okhttp/Request;->url:Lcom/android/okhttp/HttpUrl;
@@ -2876,6 +3107,7 @@
Lcom/android/org/conscrypt/ConscryptSocketBase;->setHandshakeTimeout(I)V
Lcom/android/org/conscrypt/ConscryptSocketBase;->setHostname(Ljava/lang/String;)V
Lcom/android/org/conscrypt/ConscryptSocketBase;->setSoWriteTimeout(I)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->socket:Ljava/net/Socket;
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getChannelId()[B
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostname()Ljava/lang/String;
@@ -2898,10 +3130,12 @@
Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;
Ldalvik/system/BlockGuard;->getThreadPolicy()Ldalvik/system/BlockGuard$Policy;
Ldalvik/system/BlockGuard$Policy;->onNetwork()V
+Ldalvik/system/BlockGuard$Policy;->onReadFromDisk()V
Ldalvik/system/CloseGuard;->close()V
Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard;
Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V
Ldalvik/system/CloseGuard;->warnIfOpen()V
+Ldalvik/system/DexFile$DFEnum;->mNameList:[Ljava/lang/String;
Ldalvik/system/DexFile;->getClassNameList(Ljava/lang/Object;)[Ljava/lang/String;
Ldalvik/system/DexFile;->isBackedByOatFile()Z
Ldalvik/system/DexFile;->loadClassBinaryName(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
@@ -2910,6 +3144,7 @@
Ldalvik/system/DexFile;->mInternalCookie:Ljava/lang/Object;
Ldalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object;
Ldalvik/system/DexPathList;->addDexPath(Ljava/lang/String;Ljava/io/File;)V
+Ldalvik/system/DexPathList;->definingContext:Ljava/lang/ClassLoader;
Ldalvik/system/DexPathList;->dexElements:[Ldalvik/system/DexPathList$Element;
Ldalvik/system/DexPathList$Element;->dexFile:Ldalvik/system/DexFile;
Ldalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V
@@ -2930,6 +3165,7 @@
Ldalvik/system/VMRuntime;->addressOf(Ljava/lang/Object;)J
Ldalvik/system/VMRuntime;->clearGrowthLimit()V
Ldalvik/system/VMRuntime;->getCurrentInstructionSet()Ljava/lang/String;
+Ldalvik/system/VMRuntime;->getInstructionSet(Ljava/lang/String;)Ljava/lang/String;
Ldalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;
Ldalvik/system/VMRuntime;->is64Bit()Z
Ldalvik/system/VMRuntime;->newNonMovableArray(Ljava/lang/Class;I)Ljava/lang/Object;
@@ -2945,26 +3181,24 @@
Ldalvik/system/VMRuntime;->vmLibrary()Ljava/lang/String;
Ldalvik/system/VMStack;->getCallingClassLoader()Ljava/lang/ClassLoader;
Ldalvik/system/VMStack;->getStackClass2()Ljava/lang/Class;
-Ljava/awt/font/NumericShaper;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/beans/PropertyChangeSupport;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/beans/PropertyChangeSupport;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/io/FileDescriptor;->descriptor:I
Ljava/io/FileDescriptor;->getInt$()I
+Ljava/io/FileDescriptor;->isSocket$()Z
Ljava/io/FileDescriptor;->setInt$(I)V
+Ljava/io/File;->fs:Ljava/io/FileSystem;
Ljava/io/FileInputStream;->fd:Ljava/io/FileDescriptor;
Ljava/io/FileOutputStream;->fd:Ljava/io/FileDescriptor;
-Ljava/io/File;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/io/File;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/io/ObjectStreamClass;->getConstructorId(Ljava/lang/Class;)J
Ljava/io/ObjectStreamClass;->newInstance(Ljava/lang/Class;J)Ljava/lang/Object;
Ljava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object;
-Ljava/io/UncheckedIOException;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/lang/AbstractStringBuilder;->value:[C
Ljava/lang/Boolean;->value:Z
Ljava/lang/Byte;->value:B
Ljava/lang/Character;->value:C
+Ljava/lang/Class;->accessFlags:I
Ljava/lang/Class;->dexCache:Ljava/lang/Object;
Ljava/lang/Class;->dexClassDefIndex:I
+Ljava/lang/Class;->ifTable:[Ljava/lang/Object;
Ljava/lang/ClassLoader;->parent:Ljava/lang/ClassLoader;
Ljava/lang/Daemons$Daemon;->isRunning()Z
Ljava/lang/Daemons$Daemon;->start()V
@@ -2979,11 +3213,8 @@
Ljava/lang/Daemons;->start()V
Ljava/lang/Daemons;->stop()V
Ljava/lang/Double;->value:D
-Ljava/lang/Enum;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/lang/Float;->value:F
Ljava/lang/Integer;->value:I
-Ljava/lang/invoke/MethodType;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/lang/invoke/MethodType;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/lang/Long;->value:J
Ljava/lang/ref/FinalizerReference;->add(Ljava/lang/Object;)V
Ljava/lang/ref/FinalizerReference;->head:Ljava/lang/ref/FinalizerReference;
@@ -2999,11 +3230,8 @@
Ljava/lang/Runtime;->load(Ljava/lang/String;Ljava/lang/ClassLoader;)V
Ljava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;
Ljava/lang/Short;->value:S
-Ljava/lang/StringBuffer;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/lang/StringBuffer;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/lang/StringBuilder;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/lang/StringBuilder;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/lang/String;-><init>(II[C)V
+Ljava/lang/System;->arraycopy([II[III)V
Ljava/lang/System;-><init>()V
Ljava/lang/Thread;->daemon:Z
Ljava/lang/Thread;->dispatchUncaughtException(Ljava/lang/Throwable;)V
@@ -3026,16 +3254,9 @@
Ljava/lang/Throwable;->cause:Ljava/lang/Throwable;
Ljava/lang/Throwable;->detailMessage:Ljava/lang/String;
Ljava/lang/Throwable;->nativeFillInStackTrace()Ljava/lang/Object;
-Ljava/lang/Throwable;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/lang/Throwable;->stackTrace:[Ljava/lang/StackTraceElement;
Ljava/lang/Throwable;->suppressedExceptions:Ljava/util/List;
-Ljava/lang/Throwable;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/lang/Void;-><init>()V
-Ljava/math/BigDecimal;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/math/BigDecimal;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/math/BigInteger;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/math/BigInteger;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/math/MathContext;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/net/Authenticator;->theAuthenticator:Ljava/net/Authenticator;
Ljava/net/DatagramSocket;->impl:Ljava/net/DatagramSocketImpl;
Ljava/net/HttpCookie;->httpOnly:Z
@@ -3047,29 +3268,22 @@
Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id_set:Z
Ljava/net/Inet6Address$Inet6AddressHolder;->scope_ifname:Ljava/net/NetworkInterface;
Ljava/net/Inet6Address;-><init>()V
-Ljava/net/Inet6Address;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/net/Inet6Address;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/net/InetAddress;->clearDnsCache()V
Ljava/net/InetAddress;->holder:Ljava/net/InetAddress$InetAddressHolder;
+Ljava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder;
Ljava/net/InetAddress$InetAddressHolder;->address:I
Ljava/net/InetAddress$InetAddressHolder;->family:I
Ljava/net/InetAddress$InetAddressHolder;->hostName:Ljava/lang/String;
Ljava/net/InetAddress$InetAddressHolder;->originalHostName:Ljava/lang/String;
Ljava/net/InetAddress;->isNumeric(Ljava/lang/String;)Z
Ljava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
-Ljava/net/InetAddress;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/net/InetAddress;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/net/InetSocketAddress;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/net/InetSocketAddress;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/net/Socket;->getFileDescriptor$()Ljava/io/FileDescriptor;
Ljava/net/Socket;->impl:Ljava/net/SocketImpl;
+Ljava/net/SocketImpl;->serverSocket:Ljava/net/ServerSocket;
+Ljava/net/SocketImpl;->socket:Ljava/net/Socket;
Ljava/net/URI;->host:Ljava/lang/String;
-Ljava/net/URI;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/net/URI;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/net/URL;->handler:Ljava/net/URLStreamHandler;
Ljava/net/URL;->handlers:Ljava/util/Hashtable;
-Ljava/net/URL;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/net/URL;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/nio/Buffer;->address:J
Ljava/nio/Buffer;->capacity:I
Ljava/nio/Buffer;->_elementSizeShift:I
@@ -3080,168 +3294,42 @@
Ljava/nio/ByteBuffer;->offset:I
Ljava/nio/charset/CharsetEncoder;->canEncode(Ljava/nio/CharBuffer;)Z
Ljava/nio/DirectByteBuffer;-><init>(JI)V
-Ljava/nio/file/DirectoryIteratorException;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/nio/NIOAccess;->getBaseArray(Ljava/nio/Buffer;)Ljava/lang/Object;
Ljava/nio/NIOAccess;->getBaseArrayOffset(Ljava/nio/Buffer;)I
Ljava/nio/NIOAccess;->getBasePointer(Ljava/nio/Buffer;)J
-Ljava/security/cert/CertificateRevokedException;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/security/cert/CertificateRevokedException;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/security/cert/CertPathValidatorException;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/security/CodeSigner;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/security/GuardedObject;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/security/Provider;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/security/SignedObject;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/security/spec/ECParameterSpec;->getCurveName()Ljava/lang/String;
Ljava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V
-Ljava/security/Timestamp;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/ChoiceFormat;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/text/DateFormat;->is24Hour:Ljava/lang/Boolean;
-Ljava/text/DateFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/DateFormatSymbols;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/text/DecimalFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/DecimalFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/DecimalFormatSymbols;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/text/DecimalFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/text/MessageFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/NumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/text/NumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/text/SimpleDateFormat;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/AbstractChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/HijrahChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/HijrahDate;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/IsoChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/JapaneseChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/JapaneseDate;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/JapaneseEra;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/MinguoChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/MinguoDate;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/ThaiBuddhistChronology;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/chrono/ThaiBuddhistDate;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/Duration;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/time/Duration;->toSeconds()Ljava/math/BigDecimal;
-Ljava/time/Instant;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/LocalDate;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/LocalDateTime;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/LocalTime;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/MonthDay;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)V
-Ljava/time/OffsetDateTime;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/OffsetTime;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/Period;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/temporal/ValueRange;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/temporal/WeekFields;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/YearMonth;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/Year;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/ZonedDateTime;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/ZoneId;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/ZoneOffset;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/zone/ZoneOffsetTransition;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/zone/ZoneOffsetTransitionRule;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/time/zone/ZoneRules;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/ArrayDeque;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/ArrayDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/ArrayList;->elementData:[Ljava/lang/Object;
-Ljava/util/ArrayList;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/ArrayList;->size:I
Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList;
Ljava/util/ArrayList$SubList;->parentOffset:I
Ljava/util/ArrayList$SubList;->size:I
-Ljava/util/ArrayList;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Arrays$ArrayList;->a:[Ljava/lang/Object;
-Ljava/util/BitSet;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/BitSet;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/Calendar;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/Calendar;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Calendar;->zone:Ljava/util/TimeZone;
Ljava/util/Collections$EmptyList;-><init>()V
-Ljava/util/Collections$SetFromMap;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/Collections$SynchronizedCollection;->c:Ljava/util/Collection;
-Ljava/util/Collections$SynchronizedCollection;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Collections$SynchronizedMap;->m:Ljava/util/Map;
-Ljava/util/Collections$SynchronizedMap;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Collections$UnmodifiableCollection;->c:Ljava/util/Collection;
Ljava/util/Collections$UnmodifiableMap;->m:Ljava/util/Map;
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/atomic/DoubleAccumulator;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/atomic/DoubleAdder;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/atomic/LongAccumulator;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/atomic/LongAdder;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasMoreElements()Z
-Ljava/util/concurrent/ConcurrentHashMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/ConcurrentHashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/ConcurrentLinkedQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/ConcurrentLinkedQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/ConcurrentSkipListMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/ConcurrentSkipListMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/CopyOnWriteArrayList;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/CopyOnWriteArrayList;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/ForkJoinTask;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/ForkJoinTask;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/Executors$RunnableAdapter;->task:Ljava/lang/Runnable;
Ljava/util/concurrent/FutureTask;->callable:Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/LinkedBlockingDeque;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/LinkedBlockingDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/FutureTask;->EXCEPTIONAL:I
+Ljava/util/concurrent/FutureTask;->outcome:Ljava/lang/Object;
+Ljava/util/concurrent/FutureTask;->state:I
Ljava/util/concurrent/LinkedBlockingQueue;->capacity:I
-Ljava/util/concurrent/LinkedBlockingQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/LinkedBlockingQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/LinkedTransferQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/LinkedTransferQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/locks/StampedLock;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/SynchronousQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/concurrent/SynchronousQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/concurrent/ThreadLocalRandom;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/Date;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/Date;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/EnumMap;->keyType:Ljava/lang/Class;
-Ljava/util/EnumMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/EnumMap;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/EnumSet;->elementType:Ljava/lang/Class;
-Ljava/util/EnumSet;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/GregorianCalendar;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/HashMap$HashIterator;->hasNext()Z
-Ljava/util/HashMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/HashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/HashSet;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/HashSet;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/Hashtable;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/Hashtable;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/IdentityHashMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/IdentityHashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/InvalidPropertiesFormatException;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/InvalidPropertiesFormatException;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/jar/JarFile;->manifest:Ljava/util/jar/Manifest;
Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
-Ljava/util/LinkedList;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/LinkedList;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
-Ljava/util/Locale;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/Locale;->readResolve()Ljava/lang/Object;
-Ljava/util/Locale;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/logging/LogRecord;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/logging/LogRecord;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/prefs/NodeChangeEvent;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/prefs/NodeChangeEvent;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/prefs/PreferenceChangeEvent;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/prefs/PreferenceChangeEvent;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/PriorityQueue;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/PriorityQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/Random;->readObject(Ljava/io/ObjectInputStream;)V
Ljava/util/Random;->seedUniquifier()J
-Ljava/util/Random;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/regex/Matcher;->appendPos:I
-Ljava/util/regex/Pattern;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/SimpleTimeZone;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/SimpleTimeZone;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/TreeMap;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/TreeMap;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/TreeSet;->readObject(Ljava/io/ObjectInputStream;)V
-Ljava/util/TreeSet;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljava/util/Vector;->writeObject(Ljava/io/ObjectOutputStream;)V
Ljava/util/zip/Deflater;->buf:[B
Ljava/util/zip/Deflater;->finished:Z
Ljava/util/zip/Deflater;->finish:Z
@@ -3257,23 +3345,17 @@
Ljava/util/zip/Inflater;->off:I
Ljava/util/zip/ZipEntry;-><init>(Ljava/lang/String;Ljava/lang/String;JJJII[BJ)V
Ljava/util/zip/ZipFile;->jzfile:J
-Ljavax/crypto/SealedObject;->readObject(Ljava/io/ObjectInputStream;)V
Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ssl/SSLServerSocketFactory;
Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Ljavax/security/auth/Subject;->readObject(Ljava/io/ObjectInputStream;)V
-Ljavax/security/auth/Subject$SecureSet;->readObject(Ljava/io/ObjectInputStream;)V
-Ljavax/security/auth/Subject$SecureSet;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljavax/security/auth/Subject;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljavax/security/auth/x500/X500Principal;->readObject(Ljava/io/ObjectInputStream;)V
-Ljavax/security/auth/x500/X500Principal;->writeObject(Ljava/io/ObjectOutputStream;)V
-Ljavax/xml/datatype/DatatypeConfigurationException;->readObject(Ljava/io/ObjectInputStream;)V
-Ljavax/xml/namespace/QName;->readObject(Ljava/io/ObjectInputStream;)V
+Llibcore/util/BasicLruCache;->map:Ljava/util/LinkedHashMap;
Llibcore/util/ZoneInfo;->mTransitions:[J
-Llibcore/util/ZoneInfo;->readObject(Ljava/io/ObjectInputStream;)V
Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V
Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>()V
+Lorg/ccil/cowan/tagsoup/AttributesImpl;->data:[Ljava/lang/String;
+Lorg/ccil/cowan/tagsoup/AttributesImpl;->length:I
Lorg/json/JSONArray;->values:Ljava/util/List;
+Lorg/json/JSONObject;->append(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
+Lorg/json/JSONObject;->keySet()Ljava/util/Set;
Lorg/json/JSONObject;->writeTo(Lorg/json/JSONStringer;)V
+Lorg/w3c/dom/traversal/NodeIterator;->nextNode()Lorg/w3c/dom/Node;
Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe;
-Lsun/security/util/ObjectIdentifier;->readObject(Ljava/io/ObjectInputStream;)V
-Lsun/security/util/ObjectIdentifier;->writeObject(Ljava/io/ObjectOutputStream;)V
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index 2f0bba1..61ae6e7 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -42,6 +42,7 @@
Landroid/app/IAssistDataReceiver;->onHandleAssistScreenshot(Landroid/graphics/Bitmap;)V
Landroid/app/IAssistDataReceiver$Stub;-><init>()V
Landroid/app/KeyguardManager;->isDeviceLocked(I)Z
+Landroid/app/NotificationManager;->cancelAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)V
Landroid/app/StatusBarManager;->removeIcon(Ljava/lang/String;)V
Landroid/app/StatusBarManager;->setIcon(Ljava/lang/String;IILjava/lang/String;)V
Landroid/app/TaskStackListener;->onActivityDismissingDockedStack()V
@@ -308,6 +309,7 @@
Landroid/net/SntpClient;->getNtpTime()J
Landroid/net/SntpClient;->getNtpTimeReference()J
Landroid/net/SntpClient;->getRoundTripTime()J
+Landroid/net/SntpClient;->requestTime(Ljava/lang/String;I)Z
Landroid/net/StaticIpConfiguration;->dnsServers:Ljava/util/ArrayList;
Landroid/net/StaticIpConfiguration;->domains:Ljava/lang/String;
Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress;
@@ -402,6 +404,9 @@
Landroid/service/dreams/DreamService;->isDozing()Z
Landroid/service/dreams/DreamService;->startDozing()V
Landroid/service/dreams/DreamService;->stopDozing()V
+Landroid/service/euicc/EuiccProfileInfo;-><init>(Ljava/lang/String;[Landroid/telephony/UiccAccessRule;Ljava/lang/String;)V
+Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult;->result:I
+Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult;->result:I
Landroid/service/vr/VrListenerService;->onCurrentVrActivityChanged(Landroid/content/ComponentName;ZI)V
Landroid/system/NetlinkSocketAddress;-><init>(II)V
Landroid/system/Os;->bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
@@ -418,16 +423,42 @@
Landroid/telecom/ParcelableCall;->getId()Ljava/lang/String;
Landroid/telecom/TelecomManager;->from(Landroid/content/Context;)Landroid/telecom/TelecomManager;
Landroid/telecom/VideoProfile$CameraCapabilities;-><init>(IIZF)V
+Landroid/telephony/euicc/DownloadableSubscription;->encodedActivationCode:Ljava/lang/String;
+Landroid/telephony/euicc/DownloadableSubscription;->setAccessRules([Landroid/telephony/UiccAccessRule;)V
+Landroid/telephony/euicc/DownloadableSubscription;->setCarrierName(Ljava/lang/String;)V
+Landroid/telephony/ims/compat/feature/ImsFeature;->getFeatureState()I
+Landroid/telephony/ims/compat/feature/ImsFeature;->setFeatureState(I)V
Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V
Landroid/telephony/ims/compat/ImsService;-><init>()V
+Landroid/telephony/ims/compat/ImsService;->mImsServiceController:Landroid/os/IBinder;
Landroid/telephony/ims/compat/stub/ImsCallSessionImplBase;-><init>()V
+Landroid/telephony/ims/compat/stub/ImsConfigImplBase;->getIImsConfig()Lcom/android/ims/internal/IImsConfig;
Landroid/telephony/ims/compat/stub/ImsConfigImplBase;-><init>(Landroid/content/Context;)V
Landroid/telephony/ims/compat/stub/ImsUtListenerImplBase;-><init>()V
Landroid/telephony/ims/ImsCallForwardInfo;-><init>()V
+Landroid/telephony/ims/ImsCallForwardInfo;->mCondition:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mNumber:Ljava/lang/String;
+Landroid/telephony/ims/ImsCallForwardInfo;->mServiceClass:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mStatus:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mTimeSeconds:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mToA:I
+Landroid/telephony/ims/ImsCallProfile;->mCallExtras:Landroid/os/Bundle;
+Landroid/telephony/ims/ImsCallProfile;->mCallType:I
+Landroid/telephony/ims/ImsCallProfile;->mMediaProfile:Landroid/telephony/ims/ImsStreamMediaProfile;
+Landroid/telephony/ims/ImsCallProfile;->mRestrictCause:I
Landroid/telephony/ims/ImsCallProfile;->presentationToOIR(I)I
Landroid/telephony/ims/ImsExternalCallState;-><init>(ILandroid/net/Uri;ZIIZ)V
Landroid/telephony/ims/ImsReasonInfo;-><init>(II)V
+Landroid/telephony/ims/ImsReasonInfo;->mCode:I
+Landroid/telephony/ims/ImsReasonInfo;->mExtraCode:I
+Landroid/telephony/ims/ImsReasonInfo;->mExtraMessage:Ljava/lang/String;
+Landroid/telephony/ims/ImsSsInfo;->mIcbNum:Ljava/lang/String;
+Landroid/telephony/ims/ImsSsInfo;->mStatus:I
Landroid/telephony/ims/ImsStreamMediaProfile;-><init>()V
+Landroid/telephony/ims/ImsStreamMediaProfile;->mAudioDirection:I
+Landroid/telephony/ims/ImsStreamMediaProfile;->mAudioQuality:I
+Landroid/telephony/ims/ImsStreamMediaProfile;->mVideoDirection:I
+Landroid/telephony/ims/ImsVideoCallProvider;->getInterface()Lcom/android/ims/internal/IImsVideoCallProvider;
Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V
Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V
Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri;
@@ -449,6 +480,7 @@
Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I
Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
Landroid/telephony/Rlog;->i(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/telephony/ServiceState;->bitmaskHasTech(II)Z
Landroid/telephony/ServiceState;->getDataRegState()I
Landroid/telephony/ServiceState;->getDataRoaming()Z
Landroid/telephony/ServiceState;->getRilDataRadioTechnology()I
@@ -475,12 +507,19 @@
Landroid/telephony/SubscriptionManager;->setDisplayName(Ljava/lang/String;IJ)I
Landroid/telephony/SubscriptionManager;->setIconTint(II)I
Landroid/telephony/TelephonyManager;->getIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;I)I
+Landroid/telephony/TelephonyManager;->getIsimDomain()Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getNetworkTypeName()Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getPreferredNetworkType(I)I
+Landroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/telephony/ServiceState;
Landroid/telephony/TelephonyManager;->getVoiceMessageCount()I
Landroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
+Landroid/telephony/TelephonyManager;->isImsRegistered()Z
+Landroid/telephony/TelephonyManager;->isWifiCallingAvailable()Z
Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants;
Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants;
+Landroid/telephony/TelephonyManager;->nvResetConfig(I)Z
Landroid/telephony/TelephonyManager;->putIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
+Landroid/telephony/TelephonyManager;->setPreferredNetworkType(II)Z
Landroid/text/TextUtils;->isPrintableAsciiOnly(Ljava/lang/CharSequence;)Z
Landroid/util/FloatMath;->ceil(F)F
Landroid/util/FloatMath;->cos(F)F
@@ -498,6 +537,8 @@
Landroid/util/LongArray;->get(I)J
Landroid/util/LongArray;-><init>()V
Landroid/util/LongArray;->size()I
+Landroid/util/RecurrenceRule;->buildRecurringMonthly(ILjava/time/ZoneId;)Landroid/util/RecurrenceRule;
+Landroid/util/RecurrenceRule;->start:Ljava/time/ZonedDateTime;
Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;)I
Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
Landroid/util/Slog;->println(ILjava/lang/String;Ljava/lang/String;)I
@@ -586,6 +627,7 @@
Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTtyModeReceived(Lcom/android/ims/internal/IImsCallSession;I)V
Lcom/android/ims/internal/IImsCallSessionListener;->callSessionUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
Lcom/android/ims/internal/IImsRegistrationListener;->registrationAssociatedUriChanged([Landroid/net/Uri;)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationChangeFailed(ILandroid/telephony/ims/ImsReasonInfo;)V
Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnectedWithRadioTech(I)V
Lcom/android/ims/internal/IImsRegistrationListener;->registrationDisconnected(Landroid/telephony/ims/ImsReasonInfo;)V
Lcom/android/ims/internal/IImsRegistrationListener;->registrationFeatureCapabilityChanged(I[I[I)V
@@ -598,6 +640,27 @@
Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueryFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdated(Lcom/android/ims/internal/IImsUt;I)V
Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdateFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/uce/common/CapInfo;->getCapTimestamp()J
+Lcom/android/ims/internal/uce/common/CapInfo;->isCdViaPresenceSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtHttpSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtSnFSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtThumbSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFullSnFGroupChatSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPullFtSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPullSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPushSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isImSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIpVideoSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIpVoiceSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIsSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVideoCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVideoOnlyCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVoiceCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isSmSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isSpSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isVsDuringCSSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isVsSupported()Z
Lcom/android/ims/internal/uce/common/StatusCode;->getStatusCode()I
Lcom/android/ims/internal/uce/common/UceLong;->getClientId()I
Lcom/android/ims/internal/uce/common/UceLong;-><init>()V
@@ -617,6 +680,24 @@
Lcom/android/ims/internal/uce/options/IOptionsService;->responseIncomingOptions(IIILjava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;Z)Lcom/android/ims/internal/uce/common/StatusCode;
Lcom/android/ims/internal/uce/options/IOptionsService;->setMyInfo(ILcom/android/ims/internal/uce/common/CapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo;
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getSdp()Ljava/lang/String;
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setCapInfo(Lcom/android/ims/internal/uce/common/CapInfo;)V
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setSdp(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdId;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCmdId;->setCmdId(I)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setCapInfo(Lcom/android/ims/internal/uce/common/CapInfo;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setCmdId(Lcom/android/ims/internal/uce/options/OptionsCmdId;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setStatus(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setUserData(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setCmdId(Lcom/android/ims/internal/uce/options/OptionsCmdId;)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setReasonPhrase(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setRequestId(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setRetryAfter(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setSipResponseCode(I)V
Lcom/android/ims/internal/uce/presence/IPresenceListener;->capInfoReceived(Ljava/lang/String;[Lcom/android/ims/internal/uce/presence/PresTupleInfo;)V
Lcom/android/ims/internal/uce/presence/IPresenceListener;->cmdStatus(Lcom/android/ims/internal/uce/presence/PresCmdStatus;)V
Lcom/android/ims/internal/uce/presence/IPresenceListener;->getVersionCb(Ljava/lang/String;)V
@@ -635,6 +716,12 @@
Lcom/android/ims/internal/uce/presence/IPresenceService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
Lcom/android/ims/internal/uce/presence/IPresenceService;->setNewFeatureTag(ILjava/lang/String;Lcom/android/ims/internal/uce/presence/PresServiceInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo;
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->getContactUri()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getMediaType()I
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceDesc()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceId()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceVer()Ljava/lang/String;
Lcom/android/ims/internal/uce/presence/PresSipResponse;->getCmdId()Lcom/android/ims/internal/uce/presence/PresCmdId;
Lcom/android/ims/internal/uce/presence/PresSipResponse;->getReasonPhrase()Ljava/lang/String;
Lcom/android/ims/internal/uce/presence/PresSipResponse;->getRequestId()I
@@ -684,6 +771,9 @@
Lcom/android/internal/os/BatteryStatsImpl;->getPhoneSignalStrengthTime(IJI)J
Lcom/android/internal/os/BatteryStatsImpl;->getScreenBrightnessTime(IJI)J
Lcom/android/internal/os/BatteryStatsImpl;->getWifiOnTime(JI)J
+Lcom/android/internal/os/SomeArgs;->arg1:Ljava/lang/Object;
+Lcom/android/internal/os/SomeArgs;->arg2:Ljava/lang/Object;
+Lcom/android/internal/os/SomeArgs;->arg3:Ljava/lang/Object;
Lcom/android/internal/os/SomeArgs;->obtain()Lcom/android/internal/os/SomeArgs;
Lcom/android/internal/os/SomeArgs;->recycle()V
Lcom/android/internal/R$styleable;->NumberPicker:[I
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 3696eae..20149de 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -425,7 +425,7 @@
* vs. those targeting prior platforms. Starting with Honeycomb, an application
* is not in the killable state until its {@link #onStop} has returned. This
* impacts when {@link #onSaveInstanceState(Bundle)} may be called (it may be
- * safely called after {@link #onPause()} and allows and application to safely
+ * safely called after {@link #onPause()}) and allows an application to safely
* wait until {@link #onStop()} to save persistent state.</p>
*
* <p class="note">For applications targeting platforms starting with
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 3047cdb..289a4dd 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -959,8 +959,10 @@
* @hide
*/
static public boolean isHighEndGfx() {
- return !isLowRamDeviceStatic() &&
- !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
+ return !isLowRamDeviceStatic()
+ && !RoSystemProperties.CONFIG_AVOID_GFX_ACCEL
+ && !Resources.getSystem()
+ .getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
}
/**
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index f01eee4..50a4398 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -30,12 +30,15 @@
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.backup.BackupAgent;
+import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
+import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ActivityResultItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.PendingTransactionActions.StopInfo;
import android.app.servertransaction.TransactionExecutor;
+import android.app.servertransaction.TransactionExecutorHelper;
import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
@@ -520,6 +523,10 @@
return activityInfo.persistableMode == ActivityInfo.PERSIST_ACROSS_REBOOTS;
}
+ public boolean isVisibleFromServer() {
+ return activity != null && activity.mVisibleFromServer;
+ }
+
public String toString() {
ComponentName componentName = intent != null ? intent.getComponent() : null;
return "ActivityRecord{"
@@ -1797,6 +1804,7 @@
// message is handled.
transaction.recycle();
}
+ // TODO(lifecycler): Recycle locally scheduled transactions.
break;
}
Object obj = msg.obj;
@@ -2755,6 +2763,11 @@
}
}
+ @Override
+ TransactionExecutor getTransactionExecutor() {
+ return mTransactionExecutor;
+ }
+
void sendMessage(int what, Object obj) {
sendMessage(what, obj, 0, 0, false);
}
@@ -3723,54 +3736,64 @@
//Slog.i(TAG, "Running services: " + mServices);
}
- ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
+ /**
+ * Resume the activity.
+ * @param token Target activity token.
+ * @param finalStateRequest Flag indicating if this is part of final state resolution for a
+ * transaction.
+ * @param reason Reason for performing the action.
+ *
+ * @return The {@link ActivityClientRecord} that was resumed, {@code null} otherwise.
+ */
+ @VisibleForTesting
+ public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
String reason) {
- ActivityClientRecord r = mActivities.get(token);
- if (localLOGV) Slog.v(TAG, "Performing resume of " + r
- + " finished=" + r.activity.mFinished);
- if (r != null && !r.activity.mFinished) {
- if (r.getLifecycleState() == ON_RESUME) {
- if (!finalStateRequest) {
- final RuntimeException e = new IllegalStateException(
- "Trying to resume activity which is already resumed");
- Slog.e(TAG, e.getMessage(), e);
- Slog.e(TAG, r.getStateString());
- // TODO(lifecycler): A double resume request is possible when an activity
- // receives two consequent transactions with relaunch requests and "resumed"
- // final state requests and the second relaunch is omitted. We still try to
- // handle two resume requests for the final state. For cases other than this
- // one, we don't expect it to happen.
- }
- return null;
+ final ActivityClientRecord r = mActivities.get(token);
+ if (localLOGV) {
+ Slog.v(TAG, "Performing resume of " + r + " finished=" + r.activity.mFinished);
+ }
+ if (r == null || r.activity.mFinished) {
+ return null;
+ }
+ if (r.getLifecycleState() == ON_RESUME) {
+ if (!finalStateRequest) {
+ final RuntimeException e = new IllegalStateException(
+ "Trying to resume activity which is already resumed");
+ Slog.e(TAG, e.getMessage(), e);
+ Slog.e(TAG, r.getStateString());
+ // TODO(lifecycler): A double resume request is possible when an activity
+ // receives two consequent transactions with relaunch requests and "resumed"
+ // final state requests and the second relaunch is omitted. We still try to
+ // handle two resume requests for the final state. For cases other than this
+ // one, we don't expect it to happen.
}
- if (finalStateRequest) {
- r.hideForNow = false;
- r.activity.mStartedActivity = false;
+ return null;
+ }
+ if (finalStateRequest) {
+ r.hideForNow = false;
+ r.activity.mStartedActivity = false;
+ }
+ try {
+ r.activity.onStateNotSaved();
+ r.activity.mFragments.noteStateNotSaved();
+ checkAndBlockForNetworkAccess();
+ if (r.pendingIntents != null) {
+ deliverNewIntents(r, r.pendingIntents);
+ r.pendingIntents = null;
}
- try {
- r.activity.onStateNotSaved();
- r.activity.mFragments.noteStateNotSaved();
- checkAndBlockForNetworkAccess();
- if (r.pendingIntents != null) {
- deliverNewIntents(r, r.pendingIntents);
- r.pendingIntents = null;
- }
- if (r.pendingResults != null) {
- deliverResults(r, r.pendingResults);
- r.pendingResults = null;
- }
- r.activity.performResume(r.startsNotResumed, reason);
+ if (r.pendingResults != null) {
+ deliverResults(r, r.pendingResults);
+ r.pendingResults = null;
+ }
+ r.activity.performResume(r.startsNotResumed, reason);
- r.state = null;
- r.persistentState = null;
- r.setState(ON_RESUME);
- } catch (Exception e) {
- if (!mInstrumentation.onException(r.activity, e)) {
- throw new RuntimeException(
- "Unable to resume activity "
- + r.intent.getComponent().toShortString()
- + ": " + e.toString(), e);
- }
+ r.state = null;
+ r.persistentState = null;
+ r.setState(ON_RESUME);
+ } catch (Exception e) {
+ if (!mInstrumentation.onException(r.activity, e)) {
+ throw new RuntimeException("Unable to resume activity "
+ + r.intent.getComponent().toShortString() + ": " + e.toString(), e);
}
}
return r;
@@ -3803,126 +3826,115 @@
// TODO Push resumeArgs into the activity for consideration
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
+ if (r == null) {
+ // We didn't actually resume the activity, so skipping any follow-up actions.
+ return;
+ }
- if (r != null) {
- final Activity a = r.activity;
+ final Activity a = r.activity;
- if (localLOGV) Slog.v(
- TAG, "Resume " + r + " started activity: " +
- a.mStartedActivity + ", hideForNow: " + r.hideForNow
- + ", finished: " + a.mFinished);
+ if (localLOGV) {
+ Slog.v(TAG, "Resume " + r + " started activity: " + a.mStartedActivity
+ + ", hideForNow: " + r.hideForNow + ", finished: " + a.mFinished);
+ }
- final int forwardBit = isForward ?
- WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
+ final int forwardBit = isForward
+ ? WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
- // If the window hasn't yet been added to the window manager,
- // and this guy didn't finish itself or start another activity,
- // then go ahead and add the window.
- boolean willBeVisible = !a.mStartedActivity;
- if (!willBeVisible) {
- try {
- willBeVisible = ActivityManager.getService().willActivityBeVisible(
- a.getActivityToken());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ // If the window hasn't yet been added to the window manager,
+ // and this guy didn't finish itself or start another activity,
+ // then go ahead and add the window.
+ boolean willBeVisible = !a.mStartedActivity;
+ if (!willBeVisible) {
+ try {
+ willBeVisible = ActivityManager.getService().willActivityBeVisible(
+ a.getActivityToken());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ if (r.window == null && !a.mFinished && willBeVisible) {
+ r.window = r.activity.getWindow();
+ View decor = r.window.getDecorView();
+ decor.setVisibility(View.INVISIBLE);
+ ViewManager wm = a.getWindowManager();
+ WindowManager.LayoutParams l = r.window.getAttributes();
+ a.mDecor = decor;
+ l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+ l.softInputMode |= forwardBit;
+ if (r.mPreserveWindow) {
+ a.mWindowAdded = true;
+ r.mPreserveWindow = false;
+ // Normally the ViewRoot sets up callbacks with the Activity
+ // in addView->ViewRootImpl#setView. If we are instead reusing
+ // the decor view we have to notify the view root that the
+ // callbacks may have changed.
+ ViewRootImpl impl = decor.getViewRootImpl();
+ if (impl != null) {
+ impl.notifyChildRebuilt();
}
}
- if (r.window == null && !a.mFinished && willBeVisible) {
- r.window = r.activity.getWindow();
- View decor = r.window.getDecorView();
- decor.setVisibility(View.INVISIBLE);
- ViewManager wm = a.getWindowManager();
- WindowManager.LayoutParams l = r.window.getAttributes();
- a.mDecor = decor;
- l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
- l.softInputMode |= forwardBit;
- if (r.mPreserveWindow) {
+ if (a.mVisibleFromClient) {
+ if (!a.mWindowAdded) {
a.mWindowAdded = true;
- r.mPreserveWindow = false;
- // Normally the ViewRoot sets up callbacks with the Activity
- // in addView->ViewRootImpl#setView. If we are instead reusing
- // the decor view we have to notify the view root that the
- // callbacks may have changed.
- ViewRootImpl impl = decor.getViewRootImpl();
- if (impl != null) {
- impl.notifyChildRebuilt();
- }
+ wm.addView(decor, l);
+ } else {
+ // The activity will get a callback for this {@link LayoutParams} change
+ // earlier. However, at that time the decor will not be set (this is set
+ // in this method), so no action will be taken. This call ensures the
+ // callback occurs with the decor set.
+ a.onWindowAttributesChanged(l);
}
- if (a.mVisibleFromClient) {
- if (!a.mWindowAdded) {
- a.mWindowAdded = true;
- wm.addView(decor, l);
- } else {
- // The activity will get a callback for this {@link LayoutParams} change
- // earlier. However, at that time the decor will not be set (this is set
- // in this method), so no action will be taken. This call ensures the
- // callback occurs with the decor set.
- a.onWindowAttributesChanged(l);
- }
- }
+ }
// If the window has already been added, but during resume
// we started another activity, then don't yet make the
// window visible.
- } else if (!willBeVisible) {
- if (localLOGV) Slog.v(
- TAG, "Launch " + r + " mStartedActivity set");
- r.hideForNow = true;
+ } else if (!willBeVisible) {
+ if (localLOGV) Slog.v(TAG, "Launch " + r + " mStartedActivity set");
+ r.hideForNow = true;
+ }
+
+ // Get rid of anything left hanging around.
+ cleanUpPendingRemoveWindows(r, false /* force */);
+
+ // The window is now visible if it has been added, we are not
+ // simply finishing, and we are not starting another activity.
+ if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
+ if (r.newConfig != null) {
+ performConfigurationChangedForActivity(r, r.newConfig);
+ if (DEBUG_CONFIGURATION) {
+ Slog.v(TAG, "Resuming activity " + r.activityInfo.name + " with newConfig "
+ + r.activity.mCurrentConfig);
+ }
+ r.newConfig = null;
}
-
- // Get rid of anything left hanging around.
- cleanUpPendingRemoveWindows(r, false /* force */);
-
- // The window is now visible if it has been added, we are not
- // simply finishing, and we are not starting another activity.
- if (!r.activity.mFinished && willBeVisible
- && r.activity.mDecor != null && !r.hideForNow) {
- if (r.newConfig != null) {
- performConfigurationChangedForActivity(r, r.newConfig);
- if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
- + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
- r.newConfig = null;
- }
- if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward="
- + isForward);
- WindowManager.LayoutParams l = r.window.getAttributes();
- if ((l.softInputMode
- & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
- != forwardBit) {
- l.softInputMode = (l.softInputMode
- & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
- | forwardBit;
- if (r.activity.mVisibleFromClient) {
- ViewManager wm = a.getWindowManager();
- View decor = r.window.getDecorView();
- wm.updateViewLayout(decor, l);
- }
- }
-
- r.activity.mVisibleFromServer = true;
- mNumVisibleActivities++;
+ if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward=" + isForward);
+ WindowManager.LayoutParams l = r.window.getAttributes();
+ if ((l.softInputMode
+ & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
+ != forwardBit) {
+ l.softInputMode = (l.softInputMode
+ & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
+ | forwardBit;
if (r.activity.mVisibleFromClient) {
- r.activity.makeVisible();
+ ViewManager wm = a.getWindowManager();
+ View decor = r.window.getDecorView();
+ wm.updateViewLayout(decor, l);
}
}
- r.nextIdle = mNewActivities;
- mNewActivities = r;
- if (localLOGV) {
- Slog.v(TAG, "Scheduling idle handler for " + r);
- }
- Looper.myQueue().addIdleHandler(new Idler());
- } else {
- // If an exception was thrown when trying to resume, then
- // just end this activity.
- try {
- ActivityManager.getService()
- .finishActivity(token, Activity.RESULT_CANCELED, null,
- Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
+ r.activity.mVisibleFromServer = true;
+ mNumVisibleActivities++;
+ if (r.activity.mVisibleFromClient) {
+ r.activity.makeVisible();
}
}
+
+ r.nextIdle = mNewActivities;
+ mNewActivities = r;
+ if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r);
+ Looper.myQueue().addIdleHandler(new Idler());
}
@Override
@@ -4723,15 +4735,22 @@
return;
}
- // TODO(b/73747058): Investigate converting this to use transaction to relaunch.
- handleRelaunchActivityInner(r, 0 /* configChanges */, null /* pendingResults */,
- null /* pendingIntents */, null /* pendingActions */, prevState != ON_RESUME,
- r.overrideConfig, "handleRelaunchActivityLocally");
- // Restore back to the previous state before relaunch if needed.
- if (prevState != r.getLifecycleState()) {
- mTransactionExecutor.cycleToPath(r, prevState);
- }
+ // Initialize a relaunch request.
+ final MergedConfiguration mergedConfiguration = new MergedConfiguration(
+ r.createdConfig != null ? r.createdConfig : mConfiguration,
+ r.overrideConfig);
+ final ActivityRelaunchItem activityRelaunchItem = ActivityRelaunchItem.obtain(
+ null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */,
+ mergedConfiguration, r.mPreserveWindow);
+ // Make sure to match the existing lifecycle state in the end of the transaction.
+ final ActivityLifecycleItem lifecycleRequest =
+ TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
+ // Schedule the transaction.
+ final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
+ transaction.addCallback(activityRelaunchItem);
+ transaction.setLifecycleStateRequest(lifecycleRequest);
+ executeTransaction(transaction);
}
private void handleRelaunchActivityInner(ActivityClientRecord r, int configChanges,
diff --git a/core/java/android/app/AppComponentFactory.java b/core/java/android/app/AppComponentFactory.java
index 4df7379..cfaeec9 100644
--- a/core/java/android/app/AppComponentFactory.java
+++ b/core/java/android/app/AppComponentFactory.java
@@ -36,6 +36,10 @@
* Allows application to override the creation of the application object. This can be used to
* perform things such as dependency injection or class loader changes to these
* classes.
+ * <p>
+ * This method is only intended to provide a hook for instantiation. It does not provide
+ * earlier access to the Application object. The returned object will not be initialized
+ * as a Context yet and should not be used to interact with other android APIs.
*
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
@@ -50,6 +54,10 @@
* Allows application to override the creation of activities. This can be used to
* perform things such as dependency injection or class loader changes to these
* classes.
+ * <p>
+ * This method is only intended to provide a hook for instantiation. It does not provide
+ * earlier access to the Activity object. The returned object will not be initialized
+ * as a Context yet and should not be used to interact with other android APIs.
*
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
@@ -80,6 +88,10 @@
* Allows application to override the creation of services. This can be used to
* perform things such as dependency injection or class loader changes to these
* classes.
+ * <p>
+ * This method is only intended to provide a hook for instantiation. It does not provide
+ * earlier access to the Service object. The returned object will not be initialized
+ * as a Context yet and should not be used to interact with other android APIs.
*
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
@@ -95,6 +107,10 @@
* Allows application to override the creation of providers. This can be used to
* perform things such as dependency injection or class loader changes to these
* classes.
+ * <p>
+ * This method is only intended to provide a hook for instantiation. It does not provide
+ * earlier access to the ContentProvider object. The returned object will not be initialized
+ * with a Context yet and should not be used to interact with other android APIs.
*
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
@@ -108,5 +124,5 @@
/**
* @hide
*/
- public static AppComponentFactory DEFAULT = new AppComponentFactory();
+ public static final AppComponentFactory DEFAULT = new AppComponentFactory();
}
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index ea8c71c..ab0001c 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -272,8 +272,10 @@
public static final int OP_ACCEPT_HANDOVER = 74;
/** @hide Create and Manage IPsec Tunnels */
public static final int OP_MANAGE_IPSEC_TUNNELS = 75;
+ /** @hide Any app start foreground service. */
+ public static final int OP_START_FOREGROUND = 76;
/** @hide */
- public static final int _NUM_OP = 76;
+ public static final int _NUM_OP = 77;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -512,6 +514,9 @@
/** @hide */
@SystemApi @TestApi
public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
+ /** @hide */
+ @SystemApi @TestApi
+ public static final String OPSTR_START_FOREGROUND = "android:start_foreground";
// Warning: If an permission is added here it also has to be added to
// com.android.packageinstaller.permission.utils.EventLogger
@@ -560,6 +565,7 @@
OP_SYSTEM_ALERT_WINDOW,
OP_WRITE_SETTINGS,
OP_REQUEST_INSTALL_PACKAGES,
+ OP_START_FOREGROUND,
};
/**
@@ -647,6 +653,7 @@
OP_BIND_ACCESSIBILITY_SERVICE,
OP_ACCEPT_HANDOVER,
OP_MANAGE_IPSEC_TUNNELS,
+ OP_START_FOREGROUND,
};
/**
@@ -729,6 +736,7 @@
OPSTR_BIND_ACCESSIBILITY_SERVICE,
OPSTR_ACCEPT_HANDOVER,
OPSTR_MANAGE_IPSEC_TUNNELS,
+ OPSTR_START_FOREGROUND,
};
/**
@@ -812,6 +820,7 @@
"BIND_ACCESSIBILITY_SERVICE",
"ACCEPT_HANDOVER",
"MANAGE_IPSEC_TUNNELS",
+ "START_FOREGROUND",
};
/**
@@ -895,6 +904,7 @@
Manifest.permission.BIND_ACCESSIBILITY_SERVICE,
Manifest.permission.ACCEPT_HANDOVER,
null, // no permission for OP_MANAGE_IPSEC_TUNNELS
+ Manifest.permission.FOREGROUND_SERVICE,
};
/**
@@ -979,6 +989,7 @@
null, // OP_BIND_ACCESSIBILITY_SERVICE
null, // ACCEPT_HANDOVER
null, // MANAGE_IPSEC_TUNNELS
+ null, // START_FOREGROUND
};
/**
@@ -1062,6 +1073,7 @@
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
false, // MANAGE_IPSEC_HANDOVERS
+ false, // START_FOREGROUND
};
/**
@@ -1137,13 +1149,14 @@
AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_PICTURE_IN_PICTURE
AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND
- AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS
+ AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS
AppOpsManager.MODE_ALLOWED, // OP_RUN_ANY_IN_BACKGROUND
AppOpsManager.MODE_ALLOWED, // OP_CHANGE_WIFI_STATE
AppOpsManager.MODE_ALLOWED, // REQUEST_DELETE_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_BIND_ACCESSIBILITY_SERVICE
AppOpsManager.MODE_ALLOWED, // ACCEPT_HANDOVER
AppOpsManager.MODE_ERRORED, // MANAGE_IPSEC_TUNNELS
+ AppOpsManager.MODE_ALLOWED, // OP_START_FOREGROUND
};
/**
@@ -1230,6 +1243,7 @@
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
false, // MANAGE_IPSEC_TUNNELS
+ false, // START_FOREGROUND
};
/**
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index f38c80c..a68136b 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2167,15 +2167,16 @@
@Override
public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
try {
- return mPM.getPackageSuspendedAppExtras(packageName, mContext.getUserId());
+ return mPM.getSuspendedPackageAppExtras(packageName, mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@Override
- public PersistableBundle getSuspendedPackageAppExtras() {
- return getSuspendedPackageAppExtras(mContext.getOpPackageName());
+ public Bundle getSuspendedPackageAppExtras() {
+ final PersistableBundle extras = getSuspendedPackageAppExtras(mContext.getOpPackageName());
+ return extras != null ? new Bundle(extras.deepCopy()) : null;
}
@Override
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index 961bca2..0639b00 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -17,12 +17,14 @@
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.PendingTransactionActions;
+import android.app.servertransaction.TransactionExecutor;
import android.content.pm.ApplicationInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.os.IBinder;
import android.util.MergedConfiguration;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.ReferrerIntent;
import java.io.PrintWriter;
@@ -43,6 +45,23 @@
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
+ /**
+ * Execute transaction immediately without scheduling it. This is used for local requests, so
+ * it will also recycle the transaction.
+ */
+ @VisibleForTesting
+ public void executeTransaction(ClientTransaction transaction) {
+ transaction.preExecute(this);
+ getTransactionExecutor().execute(transaction);
+ transaction.recycle();
+ }
+
+ /**
+ * Get the {@link TransactionExecutor} that will be performing lifecycle transitions and
+ * callbacks for activities.
+ */
+ abstract TransactionExecutor getTransactionExecutor();
+
abstract void sendMessage(int what, Object obj);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index f5e138c..71b88fa 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1713,6 +1713,9 @@
Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " holds " + permission);
return PackageManager.PERMISSION_GRANTED;
}
+ Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " does not hold "
+ + permission);
+ return PackageManager.PERMISSION_DENIED;
}
try {
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 4a168fe..e4a0583 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -321,16 +321,20 @@
}
WindowManager.LayoutParams l = mWindow.getAttributes();
+ boolean restoreSoftInputMode = false;
if ((l.softInputMode
& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
- WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
- nl.copyFrom(l);
- nl.softInputMode |=
+ l.softInputMode |=
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
- l = nl;
+ restoreSoftInputMode = true;
}
mWindowManager.addView(mDecor, l);
+ if (restoreSoftInputMode) {
+ l.softInputMode &=
+ ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
+ }
+
mShowing = true;
sendShowMessage();
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 99efecd..e1a02fa 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -94,6 +94,7 @@
void registerUidObserver(in IUidObserver observer, int which, int cutpoint,
String callingPackage);
void unregisterUidObserver(in IUidObserver observer);
+ boolean isUidActive(int uid, String callingPackage);
// =============== End of transactions used on native side as well ============================
// Special low-level communication with activity manager.
@@ -322,12 +323,14 @@
/**
* Informs ActivityManagerService that the keyguard is showing.
*
- * @param showing True if the keyguard is showing, false otherwise.
+ * @param showingKeyguard True if the keyguard is showing, false otherwise.
+ * @param showingAod True if AOD is showing, false otherwise.
* @param secondaryDisplayShowing The displayId of the secondary display on which the keyguard
* is showing, or INVALID_DISPLAY if there is no such display. Only meaningful if
* showing is true.
*/
- void setLockScreenShown(boolean showing, int secondaryDisplayShowing);
+ void setLockScreenShown(boolean showingKeyguard, boolean showingAod,
+ int secondaryDisplayShowing);
boolean finishActivityAffinity(in IBinder token);
// This is not public because you need to be very careful in how you
// manage your activity to make sure it is always the uid you expect.
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index d3c1e99..4326ee3 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1219,11 +1219,11 @@
public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName";
/**
- * This is set on the notification shown by the activity manager about all apps
- * running in the background. It indicates that the notification should be shown
- * only if any of the given apps do not already have a {@link #FLAG_FOREGROUND_SERVICE}
- * notification currently visible to the user. This is a string array of all
- * package names of the apps.
+ * This is set on the notifications shown by system_server about apps running foreground
+ * services. It indicates that the notification should be shown
+ * only if any of the given apps do not already have a properly tagged
+ * {@link #FLAG_FOREGROUND_SERVICE} notification currently visible to the user.
+ * This is a string array of all package names of the apps.
* @hide
*/
public static final String EXTRA_FOREGROUND_APPS = "android.foregroundApps";
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 30f2697..4a7cf62 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -463,7 +463,11 @@
/**
* Returns the user specified importance e.g. {@link NotificationManager#IMPORTANCE_LOW} for
- * notifications posted to this channel.
+ * notifications posted to this channel. Note: This value might be >
+ * {@link NotificationManager#IMPORTANCE_NONE}, but notifications posted to this channel will
+ * not be shown to the user if the parent {@link NotificationChannelGroup} or app is blocked.
+ * See {@link NotificationChannelGroup#isBlocked()} and
+ * {@link NotificationManager#areNotificationsEnabled()}.
*/
public int getImportance() {
return mImportance;
diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java
index 16166f7..0fa3c7f 100644
--- a/core/java/android/app/NotificationChannelGroup.java
+++ b/core/java/android/app/NotificationChannelGroup.java
@@ -145,7 +145,9 @@
/**
* Returns whether or not notifications posted to {@link NotificationChannel channels} belonging
- * to this group are blocked.
+ * to this group are blocked. This value is independent of
+ * {@link NotificationManager#areNotificationsEnabled()} and
+ * {@link NotificationChannel#getImportance()}.
*/
public boolean isBlocked() {
return mBlocked;
diff --git a/core/java/android/app/RemoteAction.java b/core/java/android/app/RemoteAction.java
index e7fe407..47741c0 100644
--- a/core/java/android/app/RemoteAction.java
+++ b/core/java/android/app/RemoteAction.java
@@ -18,14 +18,9 @@
import android.annotation.NonNull;
import android.graphics.drawable.Icon;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
import android.os.Parcel;
import android.os.Parcelable;
-import android.os.RemoteException;
import android.text.TextUtils;
-import android.util.Log;
import java.io.PrintWriter;
@@ -42,6 +37,7 @@
private final CharSequence mContentDescription;
private final PendingIntent mActionIntent;
private boolean mEnabled;
+ private boolean mShouldShowIcon;
RemoteAction(Parcel in) {
mIcon = Icon.CREATOR.createFromParcel(in);
@@ -49,6 +45,7 @@
mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mActionIntent = PendingIntent.CREATOR.createFromParcel(in);
mEnabled = in.readBoolean();
+ mShouldShowIcon = in.readBoolean();
}
public RemoteAction(@NonNull Icon icon, @NonNull CharSequence title,
@@ -62,6 +59,7 @@
mContentDescription = contentDescription;
mActionIntent = intent;
mEnabled = true;
+ mShouldShowIcon = true;
}
/**
@@ -79,6 +77,20 @@
}
/**
+ * Sets whether the icon should be shown.
+ */
+ public void setShouldShowIcon(boolean shouldShowIcon) {
+ mShouldShowIcon = shouldShowIcon;
+ }
+
+ /**
+ * Return whether the icon should be shown.
+ */
+ public boolean shouldShowIcon() {
+ return mShouldShowIcon;
+ }
+
+ /**
* Return an icon representing the action.
*/
public @NonNull Icon getIcon() {
@@ -125,6 +137,7 @@
TextUtils.writeToParcel(mContentDescription, out, flags);
mActionIntent.writeToParcel(out, flags);
out.writeBoolean(mEnabled);
+ out.writeBoolean(mShouldShowIcon);
}
public void dump(String prefix, PrintWriter pw) {
@@ -134,6 +147,7 @@
pw.print(" contentDescription=" + mContentDescription);
pw.print(" icon=" + mIcon);
pw.print(" action=" + mActionIntent.getIntent());
+ pw.print(" shouldShowIcon=" + mShouldShowIcon);
pw.println();
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 1776eac..95e4f93 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -279,12 +279,12 @@
}});
registerService(Context.IPSEC_SERVICE, IpSecManager.class,
- new StaticServiceFetcher<IpSecManager>() {
+ new CachedServiceFetcher<IpSecManager>() {
@Override
- public IpSecManager createService() {
+ public IpSecManager createService(ContextImpl ctx) throws ServiceNotFoundException {
IBinder b = ServiceManager.getService(Context.IPSEC_SERVICE);
IIpSecService service = IIpSecService.Stub.asInterface(b);
- return new IpSecManager(service);
+ return new IpSecManager(ctx, service);
}});
registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 8f01685..bd4933a 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -24,7 +24,6 @@
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.graphics.Bitmap;
-import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
@@ -47,6 +46,7 @@
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityInteractionConnection;
+
import libcore.io.IoUtils;
import java.io.IOException;
@@ -876,15 +876,35 @@
}
/**
+ * Grants a runtime permission to a package.
+ * @param packageName The package to which to grant.
+ * @param permission The permission to grant.
+ * @throws SecurityException if unable to grant the permission.
+ */
+ public void grantRuntimePermission(String packageName, String permission) {
+ grantRuntimePermissionAsUser(packageName, permission, android.os.Process.myUserHandle());
+ }
+
+ /**
+ * @deprecated replaced by
+ * {@link #grantRuntimePermissionAsUser(String, String, UserHandle)}.
+ * @hide
+ */
+ @Deprecated
+ @TestApi
+ public boolean grantRuntimePermission(String packageName, String permission,
+ UserHandle userHandle) {
+ grantRuntimePermissionAsUser(packageName, permission, userHandle);
+ return true;
+ }
+
+ /**
* Grants a runtime permission to a package for a user.
* @param packageName The package to which to grant.
* @param permission The permission to grant.
- * @return Whether granting succeeded.
- *
- * @hide
+ * @throws SecurityException if unable to grant the permission.
*/
- @TestApi
- public boolean grantRuntimePermission(String packageName, String permission,
+ public void grantRuntimePermissionAsUser(String packageName, String permission,
UserHandle userHandle) {
synchronized (mLock) {
throwIfNotConnectedLocked();
@@ -896,25 +916,42 @@
// Calling out without a lock held.
mUiAutomationConnection.grantRuntimePermission(packageName,
permission, userHandle.getIdentifier());
- // TODO: The package manager API should return boolean.
- return true;
- } catch (RemoteException re) {
- Log.e(LOG_TAG, "Error granting runtime permission", re);
+ } catch (Exception e) {
+ throw new SecurityException("Error granting runtime permission", e);
}
- return false;
}
/**
- * Revokes a runtime permission from a package for a user.
- * @param packageName The package from which to revoke.
- * @param permission The permission to revoke.
- * @return Whether revoking succeeded.
- *
+ * Revokes a runtime permission from a package.
+ * @param packageName The package to which to grant.
+ * @param permission The permission to grant.
+ * @throws SecurityException if unable to revoke the permission.
+ */
+ public void revokeRuntimePermission(String packageName, String permission) {
+ revokeRuntimePermissionAsUser(packageName, permission, android.os.Process.myUserHandle());
+ }
+
+ /**
+ * @deprecated replaced by
+ * {@link #revokeRuntimePermissionAsUser(String, String, UserHandle)}.
* @hide
*/
+ @Deprecated
@TestApi
public boolean revokeRuntimePermission(String packageName, String permission,
UserHandle userHandle) {
+ revokeRuntimePermissionAsUser(packageName, permission, userHandle);
+ return true;
+ }
+
+ /**
+ * Revokes a runtime permission from a package.
+ * @param packageName The package to which to grant.
+ * @param permission The permission to grant.
+ * @throws SecurityException if unable to revoke the permission.
+ */
+ public void revokeRuntimePermissionAsUser(String packageName, String permission,
+ UserHandle userHandle) {
synchronized (mLock) {
throwIfNotConnectedLocked();
}
@@ -925,12 +962,9 @@
// Calling out without a lock held.
mUiAutomationConnection.revokeRuntimePermission(packageName,
permission, userHandle.getIdentifier());
- // TODO: The package manager API should return boolean.
- return true;
- } catch (RemoteException re) {
- Log.e(LOG_TAG, "Error revoking runtime permission", re);
+ } catch (Exception e) {
+ throw new SecurityException("Error granting runtime permission", e);
}
- return false;
}
/**
@@ -949,6 +983,7 @@
synchronized (mLock) {
throwIfNotConnectedLocked();
}
+ warnIfBetterCommand(command);
ParcelFileDescriptor source = null;
ParcelFileDescriptor sink = null;
@@ -991,6 +1026,7 @@
synchronized (mLock) {
throwIfNotConnectedLocked();
}
+ warnIfBetterCommand(command);
ParcelFileDescriptor source_read = null;
ParcelFileDescriptor sink_read = null;
@@ -1056,6 +1092,16 @@
}
}
+ private void warnIfBetterCommand(String cmd) {
+ if (cmd.startsWith("pm grant ")) {
+ Log.w(LOG_TAG, "UiAutomation.grantRuntimePermission() "
+ + "is more robust and should be used instead of 'pm grant'");
+ } else if (cmd.startsWith("pm revoke ")) {
+ Log.w(LOG_TAG, "UiAutomation.revokeRuntimePermission() "
+ + "is more robust and should be used instead of 'pm revoke'");
+ }
+ }
+
private class IAccessibilityServiceClientImpl extends IAccessibilityServiceClientWrapper {
public IAccessibilityServiceClientImpl(Looper looper) {
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 19240e2..465340f 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -57,10 +57,7 @@
import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.service.wallpaper.WallpaperService;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
@@ -444,6 +441,9 @@
synchronized (this) {
mCachedWallpaper = null;
mCachedWallpaperUserId = 0;
+ if (mDefaultWallpaper != null) {
+ mDefaultWallpaper.recycle();
+ }
mDefaultWallpaper = null;
}
}
@@ -915,9 +915,14 @@
/**
* Get the primary colors of a wallpaper.
*
- * <p>You can expect null if:
- * • Colors are still being processed by the system.
- * • A live wallpaper doesn't implement {@link WallpaperService.Engine#onComputeColors()}.
+ * <p>This method can return {@code null} when:
+ * <ul>
+ * <li>Colors are still being processed by the system.</li>
+ * <li>The user has chosen to use a live wallpaper: live wallpapers might not
+ * implement
+ * {@link android.service.wallpaper.WallpaperService.Engine#onComputeColors()
+ * WallpaperService.Engine#onComputeColors()}.</li>
+ * </ul>
*
* @param which Wallpaper type. Must be either {@link #FLAG_SYSTEM} or
* {@link #FLAG_LOCK}.
@@ -929,7 +934,7 @@
}
/**
- * Get the primary colors of a wallpaper
+ * Get the primary colors of the wallpaper configured in the given user.
* @param which wallpaper type. Must be either {@link #FLAG_SYSTEM} or
* {@link #FLAG_LOCK}
* @param userId Owner of the wallpaper.
@@ -1559,11 +1564,13 @@
* Specify extra padding that the wallpaper should have outside of the display.
* That is, the given padding supplies additional pixels the wallpaper should extend
* outside of the display itself.
+ *
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#SET_WALLPAPER_HINTS}.
+ *
* @param padding The number of pixels the wallpaper should extend beyond the display,
* on its left, top, right, and bottom sides.
- * @hide
*/
- @SystemApi
@RequiresPermission(android.Manifest.permission.SET_WALLPAPER_HINTS)
public void setDisplayPadding(Rect padding) {
try {
@@ -1600,11 +1607,11 @@
}
/**
- * Clear the wallpaper.
+ * Reset all wallpaper to the factory default.
*
- * @hide
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#SET_WALLPAPER}.
*/
- @SystemApi
@RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void clearWallpaper() {
clearWallpaper(FLAG_LOCK, mContext.getUserId());
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 4cb7f89..b64aae5 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -124,6 +124,7 @@
@SystemService(Context.DEVICE_POLICY_SERVICE)
@RequiresFeature(PackageManager.FEATURE_DEVICE_ADMIN)
public class DevicePolicyManager {
+
private static String TAG = "DevicePolicyManager";
private final Context mContext;
@@ -1612,8 +1613,6 @@
* <li>keyguard
* </ul>
*
- * This is the default configuration for LockTask.
- *
* @see #setLockTaskFeatures(ComponentName, int)
*/
public static final int LOCK_TASK_FEATURE_NONE = 0;
@@ -1631,7 +1630,10 @@
/**
* Enable notifications during LockTask mode. This includes notification icons on the status
* bar, heads-up notifications, and the expandable notification shade. Note that the Quick
- * Settings panel will still be disabled.
+ * Settings panel remains disabled. This feature flag can only be used in combination with
+ * {@link #LOCK_TASK_FEATURE_HOME}. {@link #setLockTaskFeatures(ComponentName, int)}
+ * throws an {@link IllegalArgumentException} if this feature flag is defined without
+ * {@link #LOCK_TASK_FEATURE_HOME}.
*
* @see #setLockTaskFeatures(ComponentName, int)
*/
@@ -1664,6 +1666,9 @@
* the user long-presses the power button, for example. Note that the user may not be able to
* power off the device if this flag is not set.
*
+ * <p>This flag is enabled by default until {@link #setLockTaskFeatures(ComponentName, int)} is
+ * called for the first time.
+ *
* @see #setLockTaskFeatures(ComponentName, int)
*/
public static final int LOCK_TASK_FEATURE_GLOBAL_ACTIONS = 1 << 4;
@@ -1747,6 +1752,25 @@
public static final int ID_TYPE_MEID = 8;
/**
+ * Specifies that the calling app should be granted access to the installed credentials
+ * immediately. Otherwise, access to the credentials will be gated by user approval.
+ * For use with {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, int)}
+ *
+ * @see #installKeyPair(ComponentName, PrivateKey, Certificate[], String, int)
+ */
+ public static final int INSTALLKEY_REQUEST_CREDENTIALS_ACCESS = 1;
+
+ /**
+ * Specifies that a user can select the key via the Certificate Selection prompt.
+ * If this flag is not set when calling {@link #installKeyPair}, the key can only be granted
+ * access by implementing {@link android.app.admin.DeviceAdminReceiver#onChoosePrivateKeyAlias}.
+ * For use with {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, int)}
+ *
+ * @see #installKeyPair(ComponentName, PrivateKey, Certificate[], String, int)
+ */
+ public static final int INSTALLKEY_SET_USER_SELECTABLE = 2;
+
+ /**
* Broadcast action: sent when the profile owner is set, changed or cleared.
*
* This broadcast is sent only to the user managed by the new profile owner.
@@ -2723,110 +2747,6 @@
}
/**
- * The maximum number of characters allowed in the password blacklist.
- */
- private static final int PASSWORD_BLACKLIST_CHARACTER_LIMIT = 128 * 1000;
-
- /**
- * Throws an exception if the password blacklist is too large.
- *
- * @hide
- */
- public static void enforcePasswordBlacklistSize(List<String> blacklist) {
- if (blacklist == null) {
- return;
- }
- long characterCount = 0;
- for (final String item : blacklist) {
- characterCount += item.length();
- }
- if (characterCount > PASSWORD_BLACKLIST_CHARACTER_LIMIT) {
- throw new IllegalArgumentException("128 thousand blacklist character limit exceeded by "
- + (characterCount - PASSWORD_BLACKLIST_CHARACTER_LIMIT) + " characters");
- }
- }
-
- /**
- * Called by an application that is administering the device to blacklist passwords.
- * <p>
- * Any blacklisted password or PIN is prevented from being enrolled by the user or the admin.
- * Note that the match against the blacklist is case insensitive. The blacklist applies for all
- * password qualities requested by {@link #setPasswordQuality} however it is not taken into
- * consideration by {@link #isActivePasswordSufficient}.
- * <p>
- * The blacklist can be cleared by passing {@code null} or an empty list. The blacklist is
- * given a name that is used to track which blacklist is currently set by calling {@link
- * #getPasswordBlacklistName}. If the blacklist is being cleared, the name is ignored and {@link
- * #getPasswordBlacklistName} will return {@code null}. The name can only be {@code null} when
- * the blacklist is being cleared.
- * <p>
- * The blacklist is limited to a total of 128 thousand characters rather than limiting to a
- * number of entries.
- * <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
- * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
- * profile.
- *
- * @param admin the {@link DeviceAdminReceiver} this request is associated with
- * @param name name to associate with the blacklist
- * @param blacklist list of passwords to blacklist or {@code null} to clear the blacklist
- * @return whether the new blacklist was successfully installed
- * @throws SecurityException if {@code admin} is not a device or profile owner
- * @throws IllegalArgumentException if the blacklist surpasses the character limit
- * @throws NullPointerException if {@code name} is {@code null} when setting a non-empty list
- *
- * @see #getPasswordBlacklistName
- * @see #isActivePasswordSufficient
- * @see #resetPasswordWithToken
- */
- public boolean setPasswordBlacklist(@NonNull ComponentName admin, @Nullable String name,
- @Nullable List<String> blacklist) {
- enforcePasswordBlacklistSize(blacklist);
-
- try {
- return mService.setPasswordBlacklist(admin, name, blacklist, mParentInstance);
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
-
- /**
- * Get the name of the password blacklist set by the given admin.
- *
- * @param admin the {@link DeviceAdminReceiver} this request is associated with
- * @return the name of the blacklist or {@code null} if no blacklist is set
- *
- * @see #setPasswordBlacklist
- */
- public @Nullable String getPasswordBlacklistName(@NonNull ComponentName admin) {
- try {
- return mService.getPasswordBlacklistName(admin, myUserId(), mParentInstance);
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
-
- /**
- * Test if a given password is blacklisted.
- *
- * @param userId the user to valiate for
- * @param password the password to check against the blacklist
- * @return whether the password is blacklisted
- *
- * @see #setPasswordBlacklist
- *
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.TEST_BLACKLISTED_PASSWORD)
- public boolean isPasswordBlacklisted(@UserIdInt int userId, @NonNull String password) {
- try {
- return mService.isPasswordBlacklisted(userId, password);
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
-
- /**
* Determine whether the current password the user has set is sufficient to meet the policy
* requirements (e.g. quality, minimum length) that have been requested by the admins of this
* user and its participating profiles. Restrictions on profiles that have a separate challenge
@@ -3742,7 +3662,7 @@
public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4;
/**
- * Disable fingerprint sensor on keyguard secure screens (e.g. PIN/Pattern/Password).
+ * Disable fingerprint authentication on keyguard secure screens (e.g. PIN/Pattern/Password).
*/
public static final int KEYGUARD_DISABLE_FINGERPRINT = 1 << 5;
@@ -3752,6 +3672,25 @@
public static final int KEYGUARD_DISABLE_REMOTE_INPUT = 1 << 6;
/**
+ * Disable face authentication on keyguard secure screens (e.g. PIN/Pattern/Password).
+ */
+ public static final int KEYGUARD_DISABLE_FACE = 1 << 7;
+
+ /**
+ * Disable iris authentication on keyguard secure screens (e.g. PIN/Pattern/Password).
+ */
+ public static final int KEYGUARD_DISABLE_IRIS = 1 << 8;
+
+ /**
+ * Disable all biometric authentication on keyguard secure screens (e.g. PIN/Pattern/Password).
+ */
+ public static final int KEYGUARD_DISABLE_BIOMETRICS =
+ DevicePolicyManager.KEYGUARD_DISABLE_FACE
+ | DevicePolicyManager.KEYGUARD_DISABLE_IRIS
+ | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
+
+
+ /**
* Disable all current and future keyguard customizations.
*/
public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff;
@@ -4103,7 +4042,11 @@
*/
public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
@NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess) {
- return installKeyPair(admin, privKey, certs, alias, requestAccess, true);
+ int flags = INSTALLKEY_SET_USER_SELECTABLE;
+ if (requestAccess) {
+ flags |= INSTALLKEY_REQUEST_CREDENTIALS_ACCESS;
+ }
+ return installKeyPair(admin, privKey, certs, alias, flags);
}
/**
@@ -4127,13 +4070,9 @@
* {@link android.security.KeyChain#getCertificateChain}.
* @param alias The private key alias under which to install the certificate. If a certificate
* with that alias already exists, it will be overwritten.
- * @param requestAccess {@code true} to request that the calling app be granted access to the
- * credentials immediately. Otherwise, access to the credentials will be gated by user
- * approval.
- * @param isUserSelectable {@code true} to indicate that a user can select this key via the
- * Certificate Selection prompt, false to indicate that this key can only be granted
- * access by implementing
- * {@link android.app.admin.DeviceAdminReceiver#onChoosePrivateKeyAlias}.
+ * @param flags Flags to request that the calling app be granted access to the credentials
+ * and set the key to be user-selectable. See {@link #INSTALLKEY_SET_USER_SELECTABLE} and
+ * {@link #INSTALLKEY_REQUEST_CREDENTIALS_ACCESS}.
* @return {@code true} if the keys were installed, {@code false} otherwise.
* @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
* owner.
@@ -4142,9 +4081,12 @@
* @see #DELEGATION_CERT_INSTALL
*/
public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
- @NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess,
- boolean isUserSelectable) {
+ @NonNull Certificate[] certs, @NonNull String alias, int flags) {
throwIfParentInstance("installKeyPair");
+ boolean requestAccess = (flags & INSTALLKEY_REQUEST_CREDENTIALS_ACCESS)
+ == INSTALLKEY_REQUEST_CREDENTIALS_ACCESS;
+ boolean isUserSelectable = (flags & INSTALLKEY_SET_USER_SELECTABLE)
+ == INSTALLKEY_SET_USER_SELECTABLE;
try {
final byte[] pemCert = Credentials.convertToPem(certs[0]);
byte[] pemChain = null;
@@ -4223,6 +4165,8 @@
* algorithm specification in {@code keySpec} is not {@code RSAKeyGenParameterSpec}
* or {@code ECGenParameterSpec}, or if Device ID attestation was requested but the
* {@code keySpec} does not contain an attestation challenge.
+ * @throws UnsupportedOperationException if Device ID attestation was requested but the
+ * underlying hardware does not support it.
* @see KeyGenParameterSpec.Builder#setAttestationChallenge(byte[])
*/
public AttestedKeyPair generateKeyPair(@Nullable ComponentName admin,
@@ -6340,6 +6284,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
public @Nullable List<String> getPermittedInputMethodsForCurrentUser() {
throwIfParentInstance("getPermittedInputMethodsForCurrentUser");
if (mService != null) {
@@ -7167,30 +7112,24 @@
}
/**
- * Sets which system features to enable for LockTask mode.
- * <p>
- * Feature flags set through this method will only take effect for the duration when the device
- * is in LockTask mode. If this method is not called, none of the features listed here will be
- * enabled.
- * <p>
- * This function can only be called by the device owner, a profile owner of an affiliated user
- * or profile, or the profile owner when no device owner is set. See {@link #isAffiliatedUser}.
- * Any features set via this method will be cleared if the user becomes unaffiliated.
+ * Sets which system features are enabled when the device runs in lock task mode. This method
+ * doesn't affect the features when lock task mode is inactive. Any system features not included
+ * in {@code flags} are implicitly disabled when calling this method. By default, only
+ * {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS} is enabled—all the other features are disabled. To
+ * disable the global actions dialog, call this method omitting
+ * {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS}.
+ *
+ * <p>This method can only be called by the device owner, a profile owner of an affiliated
+ * user or profile, or the profile owner when no device owner is set. See
+ * {@link #isAffiliatedUser}.
+ * Any features set using this method are cleared if the user becomes unaffiliated.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @param flags Bitfield of feature flags:
- * {@link #LOCK_TASK_FEATURE_NONE} (default),
- * {@link #LOCK_TASK_FEATURE_SYSTEM_INFO},
- * {@link #LOCK_TASK_FEATURE_NOTIFICATIONS},
- * {@link #LOCK_TASK_FEATURE_HOME},
- * {@link #LOCK_TASK_FEATURE_OVERVIEW},
- * {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS},
- * {@link #LOCK_TASK_FEATURE_KEYGUARD}
+ * @param flags The system features enabled during lock task mode.
* @throws SecurityException if {@code admin} is not the device owner, the profile owner of an
* affiliated user or profile, or the profile owner when no device owner is set.
* @see #isAffiliatedUser
- * @throws SecurityException if {@code admin} is not the device owner or the profile owner.
- */
+ **/
public void setLockTaskFeatures(@NonNull ComponentName admin, @LockTaskFeature int flags) {
throwIfParentInstance("setLockTaskFeatures");
if (mService != null) {
@@ -7283,11 +7222,12 @@
public @interface SystemSettingsWhitelist {}
/**
- * Called by device owner to update {@link android.provider.Settings.System} settings.
- * Validation that the value of the setting is in the correct form for the setting type should
- * be performed by the caller.
+ * Called by a device or profile owner to update {@link android.provider.Settings.System}
+ * settings. Validation that the value of the setting is in the correct form for the setting
+ * type should be performed by the caller.
* <p>
- * The settings that can be updated with this method are:
+ * The settings that can be updated by a device owner or profile owner of secondary user with
+ * this method are:
* <ul>
* <li>{@link android.provider.Settings.System#SCREEN_BRIGHTNESS}</li>
* <li>{@link android.provider.Settings.System#SCREEN_BRIGHTNESS_MODE}</li>
@@ -7299,7 +7239,7 @@
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param setting The name of the setting to update.
* @param value The value to update the setting to.
- * @throws SecurityException if {@code admin} is not a device owner.
+ * @throws SecurityException if {@code admin} is not a device or profile owner.
*/
public void setSystemSetting(@NonNull ComponentName admin,
@NonNull @SystemSettingsWhitelist String setting, String value) {
@@ -8363,12 +8303,12 @@
* @return a list of package names which could not be restricted.
* @throws SecurityException if {@code admin} is not a device or profile owner.
*/
- public @NonNull List<String> setMeteredDataDisabled(@NonNull ComponentName admin,
+ public @NonNull List<String> setMeteredDataDisabledPackages(@NonNull ComponentName admin,
@NonNull List<String> packageNames) {
throwIfParentInstance("setMeteredDataDisabled");
if (mService != null) {
try {
- return mService.setMeteredDataDisabled(admin, packageNames);
+ return mService.setMeteredDataDisabledPackages(admin, packageNames);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -8384,11 +8324,11 @@
* @return the list of restricted package names.
* @throws SecurityException if {@code admin} is not a device or profile owner.
*/
- public @NonNull List<String> getMeteredDataDisabled(@NonNull ComponentName admin) {
+ public @NonNull List<String> getMeteredDataDisabledPackages(@NonNull ComponentName admin) {
throwIfParentInstance("getMeteredDataDisabled");
if (mService != null) {
try {
- return mService.getMeteredDataDisabled(admin);
+ return mService.getMeteredDataDisabledPackages(admin);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -8407,12 +8347,12 @@
* @throws SecurityException if the caller doesn't run with {@link Process#SYSTEM_UID}
* @hide
*/
- public boolean isMeteredDataDisabledForUser(@NonNull ComponentName admin, String packageName,
- @UserIdInt int userId) {
+ public boolean isMeteredDataDisabledPackageForUser(@NonNull ComponentName admin,
+ String packageName, @UserIdInt int userId) {
throwIfParentInstance("getMeteredDataDisabledForUser");
if (mService != null) {
try {
- return mService.isMeteredDataDisabledForUser(admin, packageName, userId);
+ return mService.isMeteredDataDisabledPackageForUser(admin, packageName, userId);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -8610,6 +8550,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
@UserProvisioningState
public int getUserProvisioningState() {
throwIfParentInstance("getUserProvisioningState");
@@ -8754,6 +8695,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
public boolean isDeviceProvisioned() {
try {
return mService.isDeviceProvisioned();
@@ -9418,7 +9360,21 @@
* <p>This method may returns {@code -1} if {@code apnSetting} conflicts with an existing
* override APN. Update the existing conflicted APN with
* {@link #updateOverrideApn(ComponentName, int, ApnSetting)} instead of adding a new entry.
- * <p>See {@link ApnSetting} for the definition of conflict.
+ * <p>Two override APNs are considered to conflict when all the following APIs return
+ * the same values on both override APNs:
+ * <ul>
+ * <li>{@link ApnSetting#getOperatorNumeric()}</li>
+ * <li>{@link ApnSetting#getApnName()}</li>
+ * <li>{@link ApnSetting#getProxyAddress()}</li>
+ * <li>{@link ApnSetting#getProxyPort()}</li>
+ * <li>{@link ApnSetting#getMmsProxyAddress()}</li>
+ * <li>{@link ApnSetting#getMmsProxyPort()}</li>
+ * <li>{@link ApnSetting#getMmsc()}</li>
+ * <li>{@link ApnSetting#isEnabled()}</li>
+ * <li>{@link ApnSetting#getMvnoType()}</li>
+ * <li>{@link ApnSetting#getProtocol()}</li>
+ * <li>{@link ApnSetting#getRoamingProtocol()}</li>
+ * </ul>
*
* @param admin which {@link DeviceAdminReceiver} this request is associated with
* @param apnSetting the override APN to insert
@@ -9447,7 +9403,7 @@
* {@code apnId}.
* <p>This method may also returns {@code false} if {@code apnSetting} conflicts with an
* existing override APN. Update the existing conflicted APN instead.
- * <p>See {@link ApnSetting} for the definition of conflict.
+ * <p>See {@link #addOverrideApn} for the definition of conflict.
*
* @param admin which {@link DeviceAdminReceiver} this request is associated with
* @param apnId the {@code id} of the override APN to update
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index c46402f..37508cd 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -79,10 +79,6 @@
long getPasswordExpiration(in ComponentName who, int userHandle, boolean parent);
- boolean setPasswordBlacklist(in ComponentName who, String name, in List<String> blacklist, boolean parent);
- String getPasswordBlacklistName(in ComponentName who, int userId, boolean parent);
- boolean isPasswordBlacklisted(int userId, String password);
-
boolean isActivePasswordSufficient(int userHandle, boolean parent);
boolean isProfileActivePasswordSufficientForParent(int userHandle);
boolean isUsingUnifiedPassword(in ComponentName admin);
@@ -404,8 +400,8 @@
CharSequence getStartUserSessionMessage(in ComponentName admin);
CharSequence getEndUserSessionMessage(in ComponentName admin);
- List<String> setMeteredDataDisabled(in ComponentName admin, in List<String> packageNames);
- List<String> getMeteredDataDisabled(in ComponentName admin);
+ List<String> setMeteredDataDisabledPackages(in ComponentName admin, in List<String> packageNames);
+ List<String> getMeteredDataDisabledPackages(in ComponentName admin);
int addOverrideApn(in ComponentName admin, in ApnSetting apnSetting);
boolean updateOverrideApn(in ComponentName admin, int apnId, in ApnSetting apnSetting);
@@ -414,5 +410,5 @@
void setOverrideApnsEnabled(in ComponentName admin, boolean enabled);
boolean isOverrideApnEnabled(in ComponentName admin);
- boolean isMeteredDataDisabledForUser(in ComponentName admin, String packageName, int userId);
+ boolean isMeteredDataDisabledPackageForUser(in ComponentName admin, String packageName, int userId);
}
diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java
index fb1c2d0..b7a8da5 100644
--- a/core/java/android/app/backup/FullBackup.java
+++ b/core/java/android/app/backup/FullBackup.java
@@ -84,6 +84,8 @@
public static final String FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION = "clientSideEncryption";
public static final String FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER = "deviceToDeviceTransfer";
+ public static final String FLAG_REQUIRED_FAKE_CLIENT_SIDE_ENCRYPTION =
+ "fakeClientSideEncryption";
/**
* @hide
@@ -600,6 +602,8 @@
case FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER:
flags |= BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER;
break;
+ case FLAG_REQUIRED_FAKE_CLIENT_SIDE_ENCRYPTION:
+ flags |= BackupAgent.FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED;
default:
Log.w(TAG, "Unrecognized requiredFlag provided, value: \"" + f + "\"");
}
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index ee13880..02afcc7 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -65,7 +65,6 @@
NETWORK_TYPE_UNMETERED,
NETWORK_TYPE_NOT_ROAMING,
NETWORK_TYPE_CELLULAR,
- NETWORK_TYPE_METERED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface NetworkType {}
@@ -253,7 +252,7 @@
/**
* @hide
*/
- public static final int FLAG_IS_PREFETCH = 1 << 2;
+ public static final int FLAG_PREFETCH = 1 << 2;
/**
* This job needs to be exempted from the app standby throttling. Only the system (UID 1000)
@@ -296,7 +295,8 @@
private final boolean hasEarlyConstraint;
private final boolean hasLateConstraint;
private final NetworkRequest networkRequest;
- private final long networkBytes;
+ private final long networkDownloadBytes;
+ private final long networkUploadBytes;
private final long minLatencyMillis;
private final long maxExecutionDelayMillis;
private final boolean isPeriodic;
@@ -317,30 +317,28 @@
}
/**
- * Bundle of extras which are returned to your application at execution time.
+ * @see JobInfo.Builder#setExtras(PersistableBundle)
*/
public @NonNull PersistableBundle getExtras() {
return extras;
}
/**
- * Bundle of transient extras which are returned to your application at execution time,
- * but not persisted by the system.
+ * @see JobInfo.Builder#setTransientExtras(Bundle)
*/
public @NonNull Bundle getTransientExtras() {
return transientExtras;
}
/**
- * ClipData of information that is returned to your application at execution time,
- * but not persisted by the system.
+ * @see JobInfo.Builder#setClipData(ClipData, int)
*/
public @Nullable ClipData getClipData() {
return clipData;
}
/**
- * Permission grants that go along with {@link #getClipData}.
+ * @see JobInfo.Builder#setClipData(ClipData, int)
*/
public int getClipGrantFlags() {
return clipGrantFlags;
@@ -369,32 +367,28 @@
}
/**
- * Whether this job requires that the device be charging (or be a non-battery-powered
- * device connected to permanent power, such as Android TV devices).
+ * @see JobInfo.Builder#setRequiresCharging(boolean)
*/
public boolean isRequireCharging() {
return (constraintFlags & CONSTRAINT_FLAG_CHARGING) != 0;
}
/**
- * Whether this job needs the device's battery level to not be at below the critical threshold.
+ * @see JobInfo.Builder#setRequiresBatteryNotLow(boolean)
*/
public boolean isRequireBatteryNotLow() {
return (constraintFlags & CONSTRAINT_FLAG_BATTERY_NOT_LOW) != 0;
}
/**
- * Whether this job requires that the user <em>not</em> be interacting with the device.
- *
- * <p class="note">This is <em>not</em> the same as "doze" or "device idle";
- * it is purely about the user's direct interactions.</p>
+ * @see JobInfo.Builder#setRequiresDeviceIdle(boolean)
*/
public boolean isRequireDeviceIdle() {
return (constraintFlags & CONSTRAINT_FLAG_DEVICE_IDLE) != 0;
}
/**
- * Whether this job needs the device's storage to not be low.
+ * @see JobInfo.Builder#setRequiresStorageNotLow(boolean)
*/
public boolean isRequireStorageNotLow() {
return (constraintFlags & CONSTRAINT_FLAG_STORAGE_NOT_LOW) != 0;
@@ -410,6 +404,7 @@
/**
* Which content: URIs must change for the job to be scheduled. Returns null
* if there are none required.
+ * @see JobInfo.Builder#addTriggerContentUri(TriggerContentUri)
*/
public @Nullable TriggerContentUri[] getTriggerContentUris() {
return triggerContentUris;
@@ -418,6 +413,7 @@
/**
* When triggering on content URI changes, this is the delay from when a change
* is detected until the job is scheduled.
+ * @see JobInfo.Builder#setTriggerContentUpdateDelay(long)
*/
public long getTriggerContentUpdateDelay() {
return triggerContentUpdateDelay;
@@ -426,6 +422,7 @@
/**
* When triggering on content URI changes, this is the maximum delay we will
* use before scheduling the job.
+ * @see JobInfo.Builder#setTriggerContentMaxDelay(long)
*/
public long getTriggerContentMaxDelay() {
return triggerContentMaxDelay;
@@ -466,28 +463,59 @@
}
/**
- * Return the estimated size of network traffic that will be performed by
+ * @deprecated replaced by {@link #getEstimatedNetworkDownloadBytes()} and
+ * {@link #getEstimatedNetworkUploadBytes()}.
+ * @removed
+ */
+ @Deprecated
+ public @BytesLong long getEstimatedNetworkBytes() {
+ if (networkDownloadBytes == NETWORK_BYTES_UNKNOWN
+ && networkUploadBytes == NETWORK_BYTES_UNKNOWN) {
+ return NETWORK_BYTES_UNKNOWN;
+ } else if (networkDownloadBytes == NETWORK_BYTES_UNKNOWN) {
+ return networkUploadBytes;
+ } else if (networkUploadBytes == NETWORK_BYTES_UNKNOWN) {
+ return networkDownloadBytes;
+ } else {
+ return networkDownloadBytes + networkUploadBytes;
+ }
+ }
+
+ /**
+ * Return the estimated size of download traffic that will be performed by
* this job, in bytes.
*
- * @return Estimated size of network traffic, or
+ * @return Estimated size of download traffic, or
* {@link #NETWORK_BYTES_UNKNOWN} when unknown.
- * @see Builder#setEstimatedNetworkBytes(long)
+ * @see Builder#setEstimatedNetworkBytes(long, long)
*/
- public @BytesLong long getEstimatedNetworkBytes() {
- return networkBytes;
+ public @BytesLong long getEstimatedNetworkDownloadBytes() {
+ return networkDownloadBytes;
+ }
+
+ /**
+ * Return the estimated size of upload traffic that will be performed by
+ * this job, in bytes.
+ *
+ * @return Estimated size of upload traffic, or
+ * {@link #NETWORK_BYTES_UNKNOWN} when unknown.
+ * @see Builder#setEstimatedNetworkBytes(long, long)
+ */
+ public @BytesLong long getEstimatedNetworkUploadBytes() {
+ return networkUploadBytes;
}
/**
* Set for a job that does not recur periodically, to specify a delay after which the job
* will be eligible for execution. This value is not set if the job recurs periodically.
+ * @see JobInfo.Builder#setMinimumLatency(long)
*/
public long getMinLatencyMillis() {
return minLatencyMillis;
}
/**
- * See {@link Builder#setOverrideDeadline(long)}. This value is not set if the job recurs
- * periodically.
+ * @see JobInfo.Builder#setOverrideDeadline(long)
*/
public long getMaxExecutionDelayMillis() {
return maxExecutionDelayMillis;
@@ -495,13 +523,15 @@
/**
* Track whether this job will repeat with a given period.
+ * @see JobInfo.Builder#setPeriodic(long)
+ * @see JobInfo.Builder#setPeriodic(long, long)
*/
public boolean isPeriodic() {
return isPeriodic;
}
/**
- * @return Whether or not this job should be persisted across device reboots.
+ * @see JobInfo.Builder#setPersisted(boolean)
*/
public boolean isPersisted() {
return isPersisted;
@@ -510,6 +540,8 @@
/**
* Set to the interval between occurrences of this job. This value is <b>not</b> set if the
* job does not recur periodically.
+ * @see JobInfo.Builder#setPeriodic(long)
+ * @see JobInfo.Builder#setPeriodic(long, long)
*/
public long getIntervalMillis() {
return intervalMillis;
@@ -518,6 +550,8 @@
/**
* Flex time for this job. Only valid if this is a periodic job. The job can
* execute at any time in a window of flex length at the end of the period.
+ * @see JobInfo.Builder#setPeriodic(long)
+ * @see JobInfo.Builder#setPeriodic(long, long)
*/
public long getFlexMillis() {
return flexMillis;
@@ -527,6 +561,7 @@
* The amount of time the JobScheduler will wait before rescheduling a failed job. This value
* will be increased depending on the backoff policy specified at job creation time. Defaults
* to 30 seconds, minimum is currently 10 seconds.
+ * @see JobInfo.Builder#setBackoffCriteria(long, int)
*/
public long getInitialBackoffMillis() {
return initialBackoffMillis;
@@ -534,12 +569,27 @@
/**
* Return the backoff policy of this job.
+ * @see JobInfo.Builder#setBackoffCriteria(long, int)
*/
public @BackoffPolicy int getBackoffPolicy() {
return backoffPolicy;
}
/**
+ * @see JobInfo.Builder#setImportantWhileForeground(boolean)
+ */
+ public boolean isImportantWhileForeground() {
+ return (flags & FLAG_IMPORTANT_WHILE_FOREGROUND) != 0;
+ }
+
+ /**
+ * @see JobInfo.Builder#setPrefetch(boolean)
+ */
+ public boolean isPrefetch() {
+ return (flags & FLAG_PREFETCH) != 0;
+ }
+
+ /**
* User can specify an early constraint of 0L, which is valid, so we keep track of whether the
* function was called at all.
* @hide
@@ -610,7 +660,10 @@
if (!Objects.equals(networkRequest, j.networkRequest)) {
return false;
}
- if (networkBytes != j.networkBytes) {
+ if (networkDownloadBytes != j.networkDownloadBytes) {
+ return false;
+ }
+ if (networkUploadBytes != j.networkUploadBytes) {
return false;
}
if (minLatencyMillis != j.minLatencyMillis) {
@@ -673,7 +726,8 @@
if (networkRequest != null) {
hashCode = 31 * hashCode + networkRequest.hashCode();
}
- hashCode = 31 * hashCode + Long.hashCode(networkBytes);
+ hashCode = 31 * hashCode + Long.hashCode(networkDownloadBytes);
+ hashCode = 31 * hashCode + Long.hashCode(networkUploadBytes);
hashCode = 31 * hashCode + Long.hashCode(minLatencyMillis);
hashCode = 31 * hashCode + Long.hashCode(maxExecutionDelayMillis);
hashCode = 31 * hashCode + Boolean.hashCode(isPeriodic);
@@ -708,7 +762,8 @@
} else {
networkRequest = null;
}
- networkBytes = in.readLong();
+ networkDownloadBytes = in.readLong();
+ networkUploadBytes = in.readLong();
minLatencyMillis = in.readLong();
maxExecutionDelayMillis = in.readLong();
isPeriodic = in.readInt() == 1;
@@ -737,7 +792,8 @@
triggerContentUpdateDelay = b.mTriggerContentUpdateDelay;
triggerContentMaxDelay = b.mTriggerContentMaxDelay;
networkRequest = b.mNetworkRequest;
- networkBytes = b.mNetworkBytes;
+ networkDownloadBytes = b.mNetworkDownloadBytes;
+ networkUploadBytes = b.mNetworkUploadBytes;
minLatencyMillis = b.mMinLatencyMillis;
maxExecutionDelayMillis = b.mMaxExecutionDelayMillis;
isPeriodic = b.mIsPeriodic;
@@ -780,7 +836,8 @@
} else {
out.writeInt(0);
}
- out.writeLong(networkBytes);
+ out.writeLong(networkDownloadBytes);
+ out.writeLong(networkUploadBytes);
out.writeLong(minLatencyMillis);
out.writeLong(maxExecutionDelayMillis);
out.writeInt(isPeriodic ? 1 : 0);
@@ -914,7 +971,8 @@
// Requirements.
private int mConstraintFlags;
private NetworkRequest mNetworkRequest;
- private long mNetworkBytes = NETWORK_BYTES_UNKNOWN;
+ private long mNetworkDownloadBytes = NETWORK_BYTES_UNKNOWN;
+ private long mNetworkUploadBytes = NETWORK_BYTES_UNKNOWN;
private ArrayList<TriggerContentUri> mTriggerContentUris;
private long mTriggerContentUpdateDelay = -1;
private long mTriggerContentMaxDelay = -1;
@@ -965,6 +1023,7 @@
/**
* Set optional extras. This is persisted, so we only allow primitive types.
* @param extras Bundle containing extras you want the scheduler to hold on to for you.
+ * @see JobInfo#getExtras()
*/
public Builder setExtras(@NonNull PersistableBundle extras) {
mExtras = extras;
@@ -979,6 +1038,7 @@
* {@link android.app.job.JobInfo.Builder#build()} is called.</p>
*
* @param extras Bundle containing extras you want the scheduler to hold on to for you.
+ * @see JobInfo#getTransientExtras()
*/
public Builder setTransientExtras(@NonNull Bundle extras) {
mTransientExtras = extras;
@@ -1006,6 +1066,8 @@
* a combination of {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION},
* {@link android.content.Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, and
* {@link android.content.Intent#FLAG_GRANT_PREFIX_URI_PERMISSION}.
+ * @see JobInfo#getClipData()
+ * @see JobInfo#getClipGrantFlags()
*/
public Builder setClipData(@Nullable ClipData clip, int grantFlags) {
mClipData = clip;
@@ -1096,6 +1158,16 @@
}
/**
+ * @deprecated replaced by
+ * {@link #setEstimatedNetworkBytes(long, long)}.
+ * @removed
+ */
+ @Deprecated
+ public Builder setEstimatedNetworkBytes(@BytesLong long networkBytes) {
+ return setEstimatedNetworkBytes(networkBytes, NETWORK_BYTES_UNKNOWN);
+ }
+
+ /**
* Set the estimated size of network traffic that will be performed by
* this job, in bytes.
* <p>
@@ -1112,23 +1184,30 @@
* <li>A job that synchronizes email could end up using an extreme range
* of data, from under 1KB when nothing has changed, to dozens of MB
* when there are new emails with attachments. Jobs that cannot provide
- * reasonable estimates should leave this estimated value undefined.
+ * reasonable estimates should use the sentinel value
+ * {@link JobInfo#NETWORK_BYTES_UNKNOWN}.
* </ul>
* Note that the system may choose to delay jobs with large network
* usage estimates when the device has a poor network connection, in
* order to save battery.
+ * <p>
+ * The values provided here only reflect the traffic that will be
+ * performed by the base job; if you're using {@link JobWorkItem} then
+ * you also need to define the network traffic used by each work item
+ * when constructing them.
*
- * @param networkBytes The estimated size of network traffic that will
- * be performed by this job, in bytes. This value only
- * reflects the traffic that will be performed by the base
- * job; if you're using {@link JobWorkItem} then you also
- * need to define the network traffic used by each work item
- * when constructing them.
- * @see JobInfo#getEstimatedNetworkBytes()
- * @see JobWorkItem#JobWorkItem(android.content.Intent, long)
+ * @param downloadBytes The estimated size of network traffic that will
+ * be downloaded by this job, in bytes.
+ * @param uploadBytes The estimated size of network traffic that will be
+ * uploaded by this job, in bytes.
+ * @see JobInfo#getEstimatedNetworkDownloadBytes()
+ * @see JobInfo#getEstimatedNetworkUploadBytes()
+ * @see JobWorkItem#JobWorkItem(android.content.Intent, long, long)
*/
- public Builder setEstimatedNetworkBytes(@BytesLong long networkBytes) {
- mNetworkBytes = networkBytes;
+ public Builder setEstimatedNetworkBytes(@BytesLong long downloadBytes,
+ @BytesLong long uploadBytes) {
+ mNetworkDownloadBytes = downloadBytes;
+ mNetworkUploadBytes = uploadBytes;
return this;
}
@@ -1146,6 +1225,7 @@
*
* @param requiresCharging Pass {@code true} to require that the device be
* charging in order to run the job.
+ * @see JobInfo#isRequireCharging()
*/
public Builder setRequiresCharging(boolean requiresCharging) {
mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_CHARGING)
@@ -1159,6 +1239,7 @@
* is not low, which is generally the point where the user is given a "low battery"
* warning.
* @param batteryNotLow Whether or not the device's battery level must not be low.
+ * @see JobInfo#isRequireBatteryNotLow()
*/
public Builder setRequiresBatteryNotLow(boolean batteryNotLow) {
mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_BATTERY_NOT_LOW)
@@ -1183,6 +1264,7 @@
*
* @param requiresDeviceIdle Pass {@code true} to prevent the job from running
* while the device is being used interactively.
+ * @see JobInfo#isRequireDeviceIdle()
*/
public Builder setRequiresDeviceIdle(boolean requiresDeviceIdle) {
mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_DEVICE_IDLE)
@@ -1196,6 +1278,7 @@
* in a low storage state, which is generally the point where the user is given a
* "low storage" warning.
* @param storageNotLow Whether or not the device's available storage must not be low.
+ * @see JobInfo#isRequireStorageNotLow()
*/
public Builder setRequiresStorageNotLow(boolean storageNotLow) {
mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_STORAGE_NOT_LOW)
@@ -1228,6 +1311,7 @@
* job}
*
* @param uri The content: URI to monitor.
+ * @see JobInfo#getTriggerContentUris()
*/
public Builder addTriggerContentUri(@NonNull TriggerContentUri uri) {
if (mTriggerContentUris == null) {
@@ -1242,6 +1326,7 @@
* the job is scheduled. If there are more changes during that time, the delay
* will be reset to start at the time of the most recent change.
* @param durationMs Delay after most recent content change, in milliseconds.
+ * @see JobInfo#getTriggerContentUpdateDelay()
*/
public Builder setTriggerContentUpdateDelay(long durationMs) {
mTriggerContentUpdateDelay = durationMs;
@@ -1252,6 +1337,7 @@
* Set the maximum total delay (in milliseconds) that is allowed from the first
* time a content change is detected until the job is scheduled.
* @param durationMs Delay after initial content change, in milliseconds.
+ * @see JobInfo#getTriggerContentMaxDelay()
*/
public Builder setTriggerContentMaxDelay(long durationMs) {
mTriggerContentMaxDelay = durationMs;
@@ -1265,6 +1351,8 @@
* Setting this function on the builder with {@link #setMinimumLatency(long)} or
* {@link #setOverrideDeadline(long)} will result in an error.
* @param intervalMillis Millisecond interval for which this job will repeat.
+ * @see JobInfo#getIntervalMillis()
+ * @see JobInfo#getFlexMillis()
*/
public Builder setPeriodic(long intervalMillis) {
return setPeriodic(intervalMillis, intervalMillis);
@@ -1278,6 +1366,8 @@
* @param flexMillis Millisecond flex for this job. Flex is clamped to be at least
* {@link #getMinFlexMillis()} or 5 percent of the period, whichever is
* higher.
+ * @see JobInfo#getIntervalMillis()
+ * @see JobInfo#getFlexMillis()
*/
public Builder setPeriodic(long intervalMillis, long flexMillis) {
final long minPeriod = getMinPeriodMillis();
@@ -1309,6 +1399,7 @@
* {@link android.app.job.JobInfo.Builder#build()} is called.
* @param minLatencyMillis Milliseconds before which this job will not be considered for
* execution.
+ * @see JobInfo#getMinLatencyMillis()
*/
public Builder setMinimumLatency(long minLatencyMillis) {
mMinLatencyMillis = minLatencyMillis;
@@ -1322,6 +1413,7 @@
* this property on a periodic job, doing so will throw an
* {@link java.lang.IllegalArgumentException} when
* {@link android.app.job.JobInfo.Builder#build()} is called.
+ * @see JobInfo#getMaxExecutionDelayMillis()
*/
public Builder setOverrideDeadline(long maxExecutionDelayMillis) {
mMaxExecutionDelayMillis = maxExecutionDelayMillis;
@@ -1341,6 +1433,8 @@
* mode.
* @param initialBackoffMillis Millisecond time interval to wait initially when job has
* failed.
+ * @see JobInfo#getInitialBackoffMillis()
+ * @see JobInfo#getBackoffPolicy()
*/
public Builder setBackoffCriteria(long initialBackoffMillis,
@BackoffPolicy int backoffPolicy) {
@@ -1371,6 +1465,7 @@
*
* @param importantWhileForeground whether to relax doze restrictions for this job when the
* app is in the foreground. False by default.
+ * @see JobInfo#isImportantWhileForeground()
*/
public Builder setImportantWhileForeground(boolean importantWhileForeground) {
if (importantWhileForeground) {
@@ -1382,6 +1477,15 @@
}
/**
+ * @removed
+ * @deprecated replaced with {@link #setPrefetch(boolean)}
+ */
+ @Deprecated
+ public Builder setIsPrefetch(boolean isPrefetch) {
+ return setPrefetch(isPrefetch);
+ }
+
+ /**
* Setting this to true indicates that this job is designed to prefetch
* content that will make a material improvement to the experience of
* the specific user of this device. For example, fetching top headlines
@@ -1393,12 +1497,13 @@
* network when there is a surplus of metered data available. The system
* may also use this signal in combination with end user usage patterns
* to ensure data is prefetched before the user launches your app.
+ * @see JobInfo#isPrefetch()
*/
- public Builder setIsPrefetch(boolean isPrefetch) {
- if (isPrefetch) {
- mFlags |= FLAG_IS_PREFETCH;
+ public Builder setPrefetch(boolean prefetch) {
+ if (prefetch) {
+ mFlags |= FLAG_PREFETCH;
} else {
- mFlags &= (~FLAG_IS_PREFETCH);
+ mFlags &= (~FLAG_PREFETCH);
}
return this;
}
@@ -1408,6 +1513,7 @@
*
* @param isPersisted True to indicate that the job will be written to
* disk and loaded at boot.
+ * @see JobInfo#isPersisted()
*/
@RequiresPermission(android.Manifest.permission.RECEIVE_BOOT_COMPLETED)
public Builder setPersisted(boolean isPersisted) {
@@ -1427,7 +1533,7 @@
"constraints, this is not allowed.");
}
// Check that network estimates require network type
- if (mNetworkBytes > 0 && mNetworkRequest == null) {
+ if ((mNetworkDownloadBytes > 0 || mNetworkUploadBytes > 0) && mNetworkRequest == null) {
throw new IllegalArgumentException(
"Can't provide estimated network usage without requiring a network");
}
diff --git a/core/java/android/app/job/JobWorkItem.java b/core/java/android/app/job/JobWorkItem.java
index 1c46e8e..995f522 100644
--- a/core/java/android/app/job/JobWorkItem.java
+++ b/core/java/android/app/job/JobWorkItem.java
@@ -16,6 +16,8 @@
package android.app.job;
+import static android.app.job.JobInfo.NETWORK_BYTES_UNKNOWN;
+
import android.annotation.BytesLong;
import android.content.Intent;
import android.os.Parcel;
@@ -28,7 +30,8 @@
*/
final public class JobWorkItem implements Parcelable {
final Intent mIntent;
- final long mNetworkBytes;
+ final long mNetworkDownloadBytes;
+ final long mNetworkUploadBytes;
int mDeliveryCount;
int mWorkId;
Object mGrants;
@@ -41,22 +44,36 @@
*/
public JobWorkItem(Intent intent) {
mIntent = intent;
- mNetworkBytes = JobInfo.NETWORK_BYTES_UNKNOWN;
+ mNetworkDownloadBytes = NETWORK_BYTES_UNKNOWN;
+ mNetworkUploadBytes = NETWORK_BYTES_UNKNOWN;
+ }
+
+ /**
+ * @deprecated replaced by {@link #JobWorkItem(Intent, long, long)}
+ * @removed
+ */
+ @Deprecated
+ public JobWorkItem(Intent intent, @BytesLong long networkBytes) {
+ this(intent, networkBytes, NETWORK_BYTES_UNKNOWN);
}
/**
* Create a new piece of work, which can be submitted to
* {@link JobScheduler#enqueue JobScheduler.enqueue}.
+ * <p>
+ * See {@link JobInfo.Builder#setEstimatedNetworkBytes(long, long)} for
+ * details about how to estimate network traffic.
*
* @param intent The general Intent describing this work.
- * @param networkBytes The estimated size of network traffic that will be
- * performed by this job work item, in bytes. See
- * {@link JobInfo.Builder#setEstimatedNetworkBytes(long)} for
- * details about how to estimate.
+ * @param downloadBytes The estimated size of network traffic that will be
+ * downloaded by this job work item, in bytes.
+ * @param uploadBytes The estimated size of network traffic that will be
+ * uploaded by this job work item, in bytes.
*/
- public JobWorkItem(Intent intent, @BytesLong long networkBytes) {
+ public JobWorkItem(Intent intent, @BytesLong long downloadBytes, @BytesLong long uploadBytes) {
mIntent = intent;
- mNetworkBytes = networkBytes;
+ mNetworkDownloadBytes = downloadBytes;
+ mNetworkUploadBytes = uploadBytes;
}
/**
@@ -67,14 +84,44 @@
}
/**
- * Return the estimated size of network traffic that will be performed by
+ * @deprecated replaced by {@link #getEstimatedNetworkDownloadBytes()} and
+ * {@link #getEstimatedNetworkUploadBytes()}.
+ * @removed
+ */
+ @Deprecated
+ public @BytesLong long getEstimatedNetworkBytes() {
+ if (mNetworkDownloadBytes == NETWORK_BYTES_UNKNOWN
+ && mNetworkUploadBytes == NETWORK_BYTES_UNKNOWN) {
+ return NETWORK_BYTES_UNKNOWN;
+ } else if (mNetworkDownloadBytes == NETWORK_BYTES_UNKNOWN) {
+ return mNetworkUploadBytes;
+ } else if (mNetworkUploadBytes == NETWORK_BYTES_UNKNOWN) {
+ return mNetworkDownloadBytes;
+ } else {
+ return mNetworkDownloadBytes + mNetworkUploadBytes;
+ }
+ }
+
+ /**
+ * Return the estimated size of download traffic that will be performed by
+ * this job, in bytes.
+ *
+ * @return Estimated size of download traffic, or
+ * {@link JobInfo#NETWORK_BYTES_UNKNOWN} when unknown.
+ */
+ public @BytesLong long getEstimatedNetworkDownloadBytes() {
+ return mNetworkDownloadBytes;
+ }
+
+ /**
+ * Return the estimated size of upload traffic that will be performed by
* this job work item, in bytes.
*
- * @return estimated size, or {@link JobInfo#NETWORK_BYTES_UNKNOWN} when
- * unknown.
+ * @return Estimated size of upload traffic, or
+ * {@link JobInfo#NETWORK_BYTES_UNKNOWN} when unknown.
*/
- public @BytesLong long getEstimatedNetworkBytes() {
- return mNetworkBytes;
+ public @BytesLong long getEstimatedNetworkUploadBytes() {
+ return mNetworkUploadBytes;
}
/**
@@ -128,9 +175,13 @@
sb.append(mWorkId);
sb.append(" intent=");
sb.append(mIntent);
- if (mNetworkBytes != JobInfo.NETWORK_BYTES_UNKNOWN) {
- sb.append(" networkBytes=");
- sb.append(mNetworkBytes);
+ if (mNetworkDownloadBytes != NETWORK_BYTES_UNKNOWN) {
+ sb.append(" downloadBytes=");
+ sb.append(mNetworkDownloadBytes);
+ }
+ if (mNetworkUploadBytes != NETWORK_BYTES_UNKNOWN) {
+ sb.append(" uploadBytes=");
+ sb.append(mNetworkUploadBytes);
}
if (mDeliveryCount != 0) {
sb.append(" dcount=");
@@ -151,7 +202,8 @@
} else {
out.writeInt(0);
}
- out.writeLong(mNetworkBytes);
+ out.writeLong(mNetworkDownloadBytes);
+ out.writeLong(mNetworkUploadBytes);
out.writeInt(mDeliveryCount);
out.writeInt(mWorkId);
}
@@ -173,7 +225,8 @@
} else {
mIntent = null;
}
- mNetworkBytes = in.readLong();
+ mNetworkDownloadBytes = in.readLong();
+ mNetworkUploadBytes = in.readLong();
mDeliveryCount = in.readInt();
mWorkId = in.readInt();
}
diff --git a/core/java/android/app/servertransaction/TransactionExecutorHelper.java b/core/java/android/app/servertransaction/TransactionExecutorHelper.java
index 7e66fd7..01b13a2 100644
--- a/core/java/android/app/servertransaction/TransactionExecutorHelper.java
+++ b/core/java/android/app/servertransaction/TransactionExecutorHelper.java
@@ -26,7 +26,7 @@
import static android.app.servertransaction.ActivityLifecycleItem.PRE_ON_CREATE;
import static android.app.servertransaction.ActivityLifecycleItem.UNDEFINED;
-import android.app.ActivityThread;
+import android.app.ActivityThread.ActivityClientRecord;
import android.util.IntArray;
import com.android.internal.annotations.VisibleForTesting;
@@ -124,7 +124,7 @@
* {@link ActivityLifecycleItem#UNDEFINED} if there is not path.
*/
@VisibleForTesting
- public int getClosestPreExecutionState(ActivityThread.ActivityClientRecord r,
+ public int getClosestPreExecutionState(ActivityClientRecord r,
int postExecutionState) {
switch (postExecutionState) {
case UNDEFINED:
@@ -147,7 +147,7 @@
* were provided or there is not path.
*/
@VisibleForTesting
- public int getClosestOfStates(ActivityThread.ActivityClientRecord r, int[] finalStates) {
+ public int getClosestOfStates(ActivityClientRecord r, int[] finalStates) {
if (finalStates == null || finalStates.length == 0) {
return UNDEFINED;
}
@@ -168,6 +168,27 @@
return closestState;
}
+ /** Get the lifecycle state request to match the current state in the end of a transaction. */
+ public static ActivityLifecycleItem getLifecycleRequestForCurrentState(ActivityClientRecord r) {
+ final int prevState = r.getLifecycleState();
+ final ActivityLifecycleItem lifecycleItem;
+ switch (prevState) {
+ // TODO(lifecycler): Extend to support all possible states.
+ case ON_PAUSE:
+ lifecycleItem = PauseActivityItem.obtain();
+ break;
+ case ON_STOP:
+ lifecycleItem = StopActivityItem.obtain(r.isVisibleFromServer(),
+ 0 /* configChanges */);
+ break;
+ default:
+ lifecycleItem = ResumeActivityItem.obtain(false /* isForward */);
+ break;
+ }
+
+ return lifecycleItem;
+ }
+
/**
* Check if there is a destruction involved in the path. We want to avoid a lifecycle sequence
* that involves destruction and recreation if there is another path.
diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl
index 74e3c3e..a2aaf12 100644
--- a/core/java/android/app/slice/ISliceManager.aidl
+++ b/core/java/android/app/slice/ISliceManager.aidl
@@ -25,7 +25,8 @@
void unpinSlice(String pkg, in Uri uri, in IBinder token);
boolean hasSliceAccess(String pkg);
SliceSpec[] getPinnedSpecs(in Uri uri, String pkg);
- int checkSlicePermission(in Uri uri, String pkg, int pid, int uid);
+ int checkSlicePermission(in Uri uri, String pkg, int pid, int uid,
+ in String[] autoGrantPermissions);
void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices);
Uri[] getPinnedSlices(String pkg);
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 61679cb..bf3398a 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -66,8 +66,11 @@
HINT_HORIZONTAL,
HINT_PARTIAL,
HINT_SEE_MORE,
- HINT_KEY_WORDS,
+ HINT_KEYWORDS,
HINT_ERROR,
+ HINT_TTL,
+ HINT_LAST_UPDATED,
+ HINT_PERMISSION_REQUEST,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SliceHint {}
@@ -84,6 +87,7 @@
SUBTYPE_SOURCE,
SUBTYPE_TOGGLE,
SUBTYPE_VALUE,
+ SUBTYPE_LAYOUT_DIRECTION,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SliceSubtype {}
@@ -168,12 +172,31 @@
* related to the parent slice.
* Expected to be on an item of format {@link SliceItem#FORMAT_SLICE}.
*/
- public static final String HINT_KEY_WORDS = "key_words";
+ public static final String HINT_KEYWORDS = "keywords";
/**
* A hint to indicate that this slice represents an error.
*/
public static final String HINT_ERROR = "error";
/**
+ * Hint indicating an item representing a time-to-live for the content.
+ */
+ public static final String HINT_TTL = "ttl";
+ /**
+ * Hint indicating an item representing when the content was created or last updated.
+ */
+ public static final String HINT_LAST_UPDATED = "last_updated";
+ /**
+ * A hint to indicate that this slice represents a permission request for showing
+ * slices.
+ */
+ public static final String HINT_PERMISSION_REQUEST = "permission_request";
+ /**
+ * Subtype to indicate that this item indicates the layout direction for content
+ * in the slice.
+ * Expected to be an item of format {@link SliceItem#FORMAT_INT}.
+ */
+ public static final String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
+ /**
* Key to retrieve an extra added to an intent when a control is changed.
*/
public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
@@ -243,6 +266,11 @@
* Expected to be on an item of format {@link SliceItem#FORMAT_TEXT}.
*/
public static final String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
+ /**
+ * Subtype to tag an item as representing a time in milliseconds since midnight,
+ * January 1, 1970 UTC.
+ */
+ public static final String SUBTYPE_MILLIS = "millis";
private final SliceItem[] mItems;
private final @SliceHint String[] mHints;
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index 1afe53d..0285e9f 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.PermissionResult;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Binder;
@@ -81,6 +82,17 @@
* An activity can be statically linked to a slice uri by including a meta-data item
* for this key that contains a valid slice uri for the same application declaring
* the activity.
+ *
+ * <pre class="prettyprint">
+ * {@literal
+ * <activity android:name="com.example.mypkg.MyActivity">
+ * <meta-data android:name="android.metadata.SLICE_URI"
+ * android:value="content://com.example.mypkg/main_slice" />
+ * </activity>}
+ * </pre>
+ *
+ * @see #mapIntentToUri(Intent)
+ * @see SliceProvider#onMapIntentToUri(Intent)
*/
public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
@@ -257,16 +269,17 @@
* <p>
* This goes through a several stage resolution process to determine if any slice
* can represent this intent.
- * - If the intent contains data that {@link ContentResolver#getType} is
- * {@link SliceProvider#SLICE_TYPE} then the data will be returned.
- * - If the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
+ * <ol>
+ * <li> If the intent contains data that {@link ContentResolver#getType} is
+ * {@link SliceProvider#SLICE_TYPE} then the data will be returned.</li>
+ * <li>If the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
* the provider will be asked to {@link SliceProvider#onMapIntentToUri} and that result
- * will be returned.
- * - Lastly, if the intent explicitly points at an activity, and that activity has
+ * will be returned.</li>
+ * <li>Lastly, if the intent explicitly points at an activity, and that activity has
* meta-data for key {@link #SLICE_METADATA_KEY}, then the Uri specified there will be
- * returned.
- * - If no slice is found, then {@code null} is returned.
- *
+ * returned.</li>
+ * <li>If no slice is found, then {@code null} is returned.</li>
+ * </ol>
* @param intent The intent associated with a slice.
* @return The Slice Uri provided by the app or null if none exists.
* @see Slice
@@ -389,10 +402,70 @@
}
/**
+ * Determine whether a particular process and user ID has been granted
+ * permission to access a specific slice URI.
+ *
+ * @param uri The uri that is being checked.
+ * @param pid The process ID being checked against. Must be > 0.
+ * @param uid The user ID being checked against. A uid of 0 is the root
+ * user, which will pass every permission check.
+ *
+ * @return {@link PackageManager#PERMISSION_GRANTED} if the given
+ * pid/uid is allowed to access that uri, or
+ * {@link PackageManager#PERMISSION_DENIED} if it is not.
+ *
+ * @see #grantSlicePermission(String, Uri)
+ */
+ public @PermissionResult int checkSlicePermission(@NonNull Uri uri, int pid, int uid) {
+ // TODO: Switch off Uri permissions.
+ return mContext.checkUriPermission(uri, pid, uid,
+ Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ }
+
+ /**
+ * Grant permission to access a specific slice Uri to another package.
+ *
+ * @param toPackage The package you would like to allow to access the Uri.
+ * @param uri The Uri you would like to grant access to.
+ *
+ * @see #revokeSlicePermission
+ */
+ public void grantSlicePermission(@NonNull String toPackage, @NonNull Uri uri) {
+ // TODO: Switch off Uri permissions.
+ mContext.grantUriPermission(toPackage, uri,
+ Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+ }
+
+ /**
+ * Remove permissions to access a particular content provider Uri
+ * that were previously added with {@link #grantSlicePermission} for a specific target
+ * package. The given Uri will match all previously granted Uris that are the same or a
+ * sub-path of the given Uri. That is, revoking "content://foo/target" will
+ * revoke both "content://foo/target" and "content://foo/target/sub", but not
+ * "content://foo". It will not remove any prefix grants that exist at a
+ * higher level.
+ *
+ * @param toPackage The package you would like to allow to access the Uri.
+ * @param uri The Uri you would like to revoke access to.
+ *
+ * @see #grantSlicePermission
+ */
+ public void revokeSlicePermission(@NonNull String toPackage, @NonNull Uri uri) {
+ // TODO: Switch off Uri permissions.
+ mContext.revokeUriPermission(toPackage, uri,
+ Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+ }
+
+ /**
* Does the permission check to see if a caller has access to a specific slice.
* @hide
*/
- public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid) {
+ public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid,
+ String[] autoGrantPermissions) {
try {
if (UserHandle.isSameApp(uid, Process.myUid())) {
return;
@@ -400,7 +473,7 @@
if (pkg == null) {
throw new SecurityException("No pkg specified");
}
- int result = mService.checkSlicePermission(uri, pkg, pid, uid);
+ int result = mService.checkSlicePermission(uri, pkg, pid, uid, autoGrantPermissions);
if (result == PERMISSION_DENIED) {
throw new SecurityException("User " + uid + " does not have slice permission for "
+ uri + ".");
@@ -412,6 +485,8 @@
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+ // Notify a change has happened because we just granted a permission.
+ mContext.getContentResolver().notifyChange(uri, null);
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/app/slice/SliceMetrics.java b/core/java/android/app/slice/SliceMetrics.java
index a7069bc..20c1390 100644
--- a/core/java/android/app/slice/SliceMetrics.java
+++ b/core/java/android/app/slice/SliceMetrics.java
@@ -25,7 +25,7 @@
/**
* Metrics interface for slices.
*
- * This is called by SliceView, so Slice develoers should
+ * This is called by SliceView, so Slice developers should
* not need to reference this class.
*
* @see androidx.slice.widget.SliceView
@@ -55,9 +55,18 @@
}
/**
- * To be called whenever the use interacts with a slice.
- *@param subSlice The URI of the sub-slice that is the subject of the interaction.
+ * To be called whenever the user invokes a discrete action via a slice.
+ *
+ * <P>
+ * Use this for discrete events like a tap or the end of a drag,
+ * not for a continuous streams of events, such as the motion during a gesture.
+ * </P>
+ *
+ * @see androidx.slice.widget.EventInfo#actionType
+ *
+ * @param actionType The type of the event.
+ * @param subSlice The URI of the sub-slice that is the subject of the interaction.
*/
- public void logTouch(@NonNull Uri subSlice) {
+ public void logTouch(int actionType, @NonNull Uri subSlice) {
}
}
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index bf856b7..fe5742d 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -149,10 +149,31 @@
private static final boolean DEBUG = false;
private static final long SLICE_BIND_ANR = 2000;
+ private final String[] mAutoGrantPermissions;
private String mCallback;
private SliceManager mSliceManager;
+ /**
+ * A version of constructing a SliceProvider that allows autogranting slice permissions
+ * to apps that hold specific platform permissions.
+ * <p>
+ * When an app tries to bind a slice from this provider that it does not have access to,
+ * This provider will check if the caller holds permissions to any of the autoGrantPermissions
+ * specified, if they do they will be granted persisted uri access to all slices of this
+ * provider.
+ *
+ * @param autoGrantPermissions List of permissions that holders are auto-granted access
+ * to slices.
+ */
+ public SliceProvider(@NonNull String... autoGrantPermissions) {
+ mAutoGrantPermissions = autoGrantPermissions;
+ }
+
+ public SliceProvider() {
+ mAutoGrantPermissions = new String[0];
+ }
+
@Override
public void attachInfo(Context context, ProviderInfo info) {
super.attachInfo(context, info);
@@ -402,7 +423,7 @@
: getContext().getPackageManager().getNameForUid(callingUid);
try {
mSliceManager.enforceSlicePermission(sliceUri, pkg,
- callingPid, callingUid);
+ callingPid, callingUid, mAutoGrantPermissions);
} catch (SecurityException e) {
return createPermissionSlice(getContext(), sliceUri, pkg);
}
@@ -428,15 +449,17 @@
} finally {
Handler.getMain().removeCallbacks(mAnr);
}
- return new Slice.Builder(sliceUri)
- .addAction(action,
- new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
- .addText(getPermissionString(context, callingPackage), null,
- Collections.emptyList())
- .build(),
- null)
- .addHints(Arrays.asList(Slice.HINT_LIST_ITEM))
- .build();
+ Slice.Builder parent = new Slice.Builder(sliceUri);
+ Slice.Builder childAction = new Slice.Builder(parent)
+ .addHints(Arrays.asList(Slice.HINT_TITLE, Slice.HINT_SHORTCUT))
+ .addAction(action, new Slice.Builder(parent).build(), null);
+
+ parent.addSubSlice(new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
+ .addText(getPermissionString(context, callingPackage), null,
+ Collections.emptyList())
+ .addSubSlice(childAction.build(), null)
+ .build(), null);
+ return parent.addHints(Arrays.asList(Slice.HINT_PERMISSION_REQUEST)).build();
}
/**
diff --git a/core/java/android/app/usage/EventStats.java b/core/java/android/app/usage/EventStats.java
new file mode 100644
index 0000000..ea95a05
--- /dev/null
+++ b/core/java/android/app/usage/EventStats.java
@@ -0,0 +1,181 @@
+/**
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package android.app.usage;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Contains usage statistics for an event type for a specific
+ * time range.
+ */
+public final class EventStats implements Parcelable {
+
+ /**
+ * {@hide}
+ */
+ public int mEventType;
+
+ /**
+ * {@hide}
+ */
+ public long mBeginTimeStamp;
+
+ /**
+ * {@hide}
+ */
+ public long mEndTimeStamp;
+
+ /**
+ * {@hide}
+ */
+ public long mLastEventTime;
+
+ /**
+ * {@hide}
+ */
+ public long mTotalTime;
+
+ /**
+ * {@hide}
+ */
+ public int mCount;
+
+ /**
+ * {@hide}
+ */
+ public EventStats() {
+ }
+
+ public EventStats(EventStats stats) {
+ mEventType = stats.mEventType;
+ mBeginTimeStamp = stats.mBeginTimeStamp;
+ mEndTimeStamp = stats.mEndTimeStamp;
+ mLastEventTime = stats.mLastEventTime;
+ mTotalTime = stats.mTotalTime;
+ mCount = stats.mCount;
+ }
+
+ /**
+ * Return the type of event this is usage for. May be one of the event
+ * constants in {@link UsageEvents.Event}.
+ */
+ public int getEventType() {
+ return mEventType;
+ }
+
+ /**
+ * Get the beginning of the time range this {@link android.app.usage.EventStats} represents,
+ * measured in milliseconds since the epoch.
+ * <p/>
+ * See {@link System#currentTimeMillis()}.
+ */
+ public long getFirstTimeStamp() {
+ return mBeginTimeStamp;
+ }
+
+ /**
+ * Get the end of the time range this {@link android.app.usage.EventStats} represents,
+ * measured in milliseconds since the epoch.
+ * <p/>
+ * See {@link System#currentTimeMillis()}.
+ */
+ public long getLastTimeStamp() {
+ return mEndTimeStamp;
+ }
+
+ /**
+ * Get the last time this event triggered, measured in milliseconds since the epoch.
+ * <p/>
+ * See {@link System#currentTimeMillis()}.
+ */
+ public long getLastEventTime() {
+ return mLastEventTime;
+ }
+
+ /**
+ * Return the number of times that this event occurred over the interval.
+ */
+ public int getCount() {
+ return mCount;
+ }
+
+ /**
+ * Get the total time this event was active, measured in milliseconds.
+ */
+ public long getTotalTime() {
+ return mTotalTime;
+ }
+
+ /**
+ * Add the statistics from the right {@link EventStats} to the left. The event type for
+ * both {@link UsageStats} objects must be the same.
+ * @param right The {@link EventStats} object to merge into this one.
+ * @throws java.lang.IllegalArgumentException if the event types of the two
+ * {@link UsageStats} objects are different.
+ */
+ public void add(EventStats right) {
+ if (mEventType != right.mEventType) {
+ throw new IllegalArgumentException("Can't merge EventStats for event #"
+ + mEventType + " with EventStats for event #" + right.mEventType);
+ }
+
+ // We use the mBeginTimeStamp due to a bug where UsageStats files can overlap with
+ // regards to their mEndTimeStamp.
+ if (right.mBeginTimeStamp > mBeginTimeStamp) {
+ mLastEventTime = Math.max(mLastEventTime, right.mLastEventTime);
+ }
+ mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
+ mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp);
+ mTotalTime += right.mTotalTime;
+ mCount += right.mCount;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mEventType);
+ dest.writeLong(mBeginTimeStamp);
+ dest.writeLong(mEndTimeStamp);
+ dest.writeLong(mLastEventTime);
+ dest.writeLong(mTotalTime);
+ dest.writeInt(mCount);
+ }
+
+ public static final Creator<EventStats> CREATOR = new Creator<EventStats>() {
+ @Override
+ public EventStats createFromParcel(Parcel in) {
+ EventStats stats = new EventStats();
+ stats.mEventType = in.readInt();
+ stats.mBeginTimeStamp = in.readLong();
+ stats.mEndTimeStamp = in.readLong();
+ stats.mLastEventTime = in.readLong();
+ stats.mTotalTime = in.readLong();
+ stats.mCount = in.readInt();
+ return stats;
+ }
+
+ @Override
+ public EventStats[] newArray(int size) {
+ return new EventStats[size];
+ }
+ };
+}
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index d52bd37..00d8711 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -32,6 +32,8 @@
String callingPackage);
ParceledListSlice queryConfigurationStats(int bucketType, long beginTime, long endTime,
String callingPackage);
+ ParceledListSlice queryEventStats(int bucketType, long beginTime, long endTime,
+ String callingPackage);
UsageEvents queryEvents(long beginTime, long endTime, String callingPackage);
UsageEvents queryEventsForPackage(long beginTime, long endTime, String callingPackage);
void setAppInactive(String packageName, boolean inactive, int userId);
diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java
index da36157..7252f02 100644
--- a/core/java/android/app/usage/NetworkStats.java
+++ b/core/java/android/app/usage/NetworkStats.java
@@ -24,7 +24,6 @@
import android.net.NetworkTemplate;
import android.net.TrafficStats;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.util.IntArray;
import android.util.Log;
@@ -69,6 +68,11 @@
private int mTag = android.net.NetworkStats.TAG_NONE;
/**
+ * State in case it was not specified in the query.
+ */
+ private int mState = Bucket.STATE_ALL;
+
+ /**
* The session while the query requires it, null if all the stats have been collected or close()
* has been called.
*/
@@ -98,9 +102,8 @@
/** @hide */
NetworkStats(Context context, NetworkTemplate template, int flags, long startTimestamp,
- long endTimestamp) throws RemoteException, SecurityException {
- final INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
+ long endTimestamp, INetworkStatsService statsService)
+ throws RemoteException, SecurityException {
// Open network stats session
mSession = statsService.openSessionForUsageStats(flags, context.getOpPackageName());
mCloseGuard.open("close");
@@ -269,6 +272,15 @@
private long mTxBytes;
private long mTxPackets;
+ private static int convertSet(@State int state) {
+ switch (state) {
+ case STATE_ALL: return android.net.NetworkStats.SET_ALL;
+ case STATE_DEFAULT: return android.net.NetworkStats.SET_DEFAULT;
+ case STATE_FOREGROUND: return android.net.NetworkStats.SET_FOREGROUND;
+ }
+ return 0;
+ }
+
private static @State int convertState(int networkStatsSet) {
switch (networkStatsSet) {
case android.net.NetworkStats.SET_ALL : return STATE_ALL;
@@ -529,20 +541,13 @@
/**
* Collects history results for uid and resets history enumeration index.
*/
- void startHistoryEnumeration(int uid) {
- startHistoryEnumeration(uid, android.net.NetworkStats.TAG_NONE);
- }
-
- /**
- * Collects history results for uid and resets history enumeration index.
- */
- void startHistoryEnumeration(int uid, int tag) {
+ void startHistoryEnumeration(int uid, int tag, int state) {
mHistory = null;
try {
mHistory = mSession.getHistoryIntervalForUid(mTemplate, uid,
- android.net.NetworkStats.SET_ALL, tag,
- NetworkStatsHistory.FIELD_ALL, mStartTimeStamp, mEndTimeStamp);
- setSingleUidTag(uid, tag);
+ Bucket.convertSet(state), tag, NetworkStatsHistory.FIELD_ALL,
+ mStartTimeStamp, mEndTimeStamp);
+ setSingleUidTagState(uid, tag, state);
} catch (RemoteException e) {
Log.w(TAG, e);
// Leaving mHistory null
@@ -638,6 +643,7 @@
fillBucketFromSummaryEntry(bucket);
return bucket;
}
+
/**
* Getting the next item in a history enumeration.
* @param bucketOut Next item will be set here.
@@ -650,7 +656,7 @@
mRecycledHistoryEntry);
bucketOut.mUid = Bucket.convertUid(getUid());
bucketOut.mTag = Bucket.convertTag(mTag);
- bucketOut.mState = Bucket.STATE_ALL;
+ bucketOut.mState = mState;
bucketOut.mDefaultNetwork = Bucket.DEFAULT_NETWORK_ALL;
bucketOut.mMetered = Bucket.METERED_ALL;
bucketOut.mRoaming = Bucket.ROAMING_ALL;
@@ -693,9 +699,10 @@
return mUidOrUidIndex;
}
- private void setSingleUidTag(int uid, int tag) {
+ private void setSingleUidTagState(int uid, int tag, int state) {
mUidOrUidIndex = uid;
mTag = tag;
+ mState = state;
}
private void stepUid() {
diff --git a/core/java/android/app/usage/NetworkStatsManager.java b/core/java/android/app/usage/NetworkStatsManager.java
index 5576e86..b2fe958 100644
--- a/core/java/android/app/usage/NetworkStatsManager.java
+++ b/core/java/android/app/usage/NetworkStatsManager.java
@@ -37,6 +37,8 @@
import android.os.ServiceManager.ServiceNotFoundException;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
/**
* Provides access to network usage history and statistics. Usage data is collected in
* discrete bins of time called 'Buckets'. See {@link NetworkStats.Bucket} for details.
@@ -107,9 +109,15 @@
* {@hide}
*/
public NetworkStatsManager(Context context) throws ServiceNotFoundException {
+ this(context, INetworkStatsService.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.NETWORK_STATS_SERVICE)));
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ public NetworkStatsManager(Context context, INetworkStatsService service) {
mContext = context;
- mService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getServiceOrThrow(Context.NETWORK_STATS_SERVICE));
+ mService = service;
setPollOnOpen(true);
}
@@ -135,7 +143,8 @@
public Bucket querySummaryForDevice(NetworkTemplate template,
long startTime, long endTime) throws SecurityException, RemoteException {
Bucket bucket = null;
- NetworkStats stats = new NetworkStats(mContext, template, mFlags, startTime, endTime);
+ NetworkStats stats = new NetworkStats(mContext, template, mFlags, startTime, endTime,
+ mService);
bucket = stats.getDeviceSummaryForNetwork();
stats.close();
@@ -208,7 +217,7 @@
}
NetworkStats stats;
- stats = new NetworkStats(mContext, template, mFlags, startTime, endTime);
+ stats = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
stats.startSummaryEnumeration();
stats.close();
@@ -245,7 +254,7 @@
}
NetworkStats result;
- result = new NetworkStats(mContext, template, mFlags, startTime, endTime);
+ result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
result.startSummaryEnumeration();
return result;
@@ -254,20 +263,31 @@
/**
* Query network usage statistics details for a given uid.
*
- * #see queryDetailsForUidTag(int, String, long, long, int, int)
+ * #see queryDetailsForUidTagState(int, String, long, long, int, int, int)
*/
public NetworkStats queryDetailsForUid(int networkType, String subscriberId,
- long startTime, long endTime, int uid) throws SecurityException, RemoteException {
- return queryDetailsForUidTag(networkType, subscriberId, startTime, endTime, uid,
- NetworkStats.Bucket.TAG_NONE);
+ long startTime, long endTime, int uid) throws SecurityException {
+ return queryDetailsForUidTagState(networkType, subscriberId, startTime, endTime, uid,
+ NetworkStats.Bucket.TAG_NONE, NetworkStats.Bucket.STATE_ALL);
}
/**
- * Query network usage statistics details for a given uid and tag. Only usable for uids
- * belonging to calling user. Result is aggregated over state but not aggregated over time.
- * This means buckets' start and end timestamps are going to be between 'startTime' and
- * 'endTime' parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, uid the
- * same as the 'uid' parameter and tag the same as 'tag' parameter.
+ * Query network usage statistics details for a given uid and tag.
+ *
+ * #see queryDetailsForUidTagState(int, String, long, long, int, int, int)
+ */
+ public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId,
+ long startTime, long endTime, int uid, int tag) throws SecurityException {
+ return queryDetailsForUidTagState(networkType, subscriberId, startTime, endTime, uid,
+ tag, NetworkStats.Bucket.STATE_ALL);
+ }
+
+ /**
+ * Query network usage statistics details for a given uid, tag, and state. Only usable for uids
+ * belonging to calling user. Result is not aggregated over time. This means buckets' start and
+ * end timestamps are going to be between 'startTime' and 'endTime' parameters. The uid is going
+ * to be the same as the 'uid' parameter, the tag the same as the 'tag' parameter, and the state
+ * the same as the 'state' parameter.
* defaultNetwork is going to be {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
* metered is going to be {@link NetworkStats.Bucket#METERED_ALL}, and
* roaming is going to be {@link NetworkStats.Bucket#ROAMING_ALL}.
@@ -288,17 +308,18 @@
* @return Statistics object or null if an error happened during statistics collection.
* @throws SecurityException if permissions are insufficient to read network statistics.
*/
- public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId,
- long startTime, long endTime, int uid, int tag) throws SecurityException {
+ public NetworkStats queryDetailsForUidTagState(int networkType, String subscriberId,
+ long startTime, long endTime, int uid, int tag, int state) throws SecurityException {
NetworkTemplate template;
template = createTemplate(networkType, subscriberId);
NetworkStats result;
try {
- result = new NetworkStats(mContext, template, mFlags, startTime, endTime);
- result.startHistoryEnumeration(uid, tag);
+ result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
+ result.startHistoryEnumeration(uid, tag, state);
} catch (RemoteException e) {
- Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag, e);
+ Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag
+ + " state=" + state, e);
return null;
}
@@ -341,7 +362,7 @@
}
NetworkStats result;
- result = new NetworkStats(mContext, template, mFlags, startTime, endTime);
+ result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
result.startUserUidEnumeration();
return result;
}
@@ -451,19 +472,20 @@
}
private static NetworkTemplate createTemplate(int networkType, String subscriberId) {
- NetworkTemplate template = null;
+ final NetworkTemplate template;
switch (networkType) {
- case ConnectivityManager.TYPE_MOBILE: {
- template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
- } break;
- case ConnectivityManager.TYPE_WIFI: {
+ case ConnectivityManager.TYPE_MOBILE:
+ template = subscriberId == null
+ ? NetworkTemplate.buildTemplateMobileWildcard()
+ : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ break;
+ case ConnectivityManager.TYPE_WIFI:
template = NetworkTemplate.buildTemplateWifiWildcard();
- } break;
- default: {
+ break;
+ default:
throw new IllegalArgumentException("Cannot create template for network type "
+ networkType + ", subscriberId '"
+ NetworkIdentity.scrubSubscriberId(subscriberId) + "'.");
- }
}
return template;
}
diff --git a/core/java/android/app/usage/TimeSparseArray.java b/core/java/android/app/usage/TimeSparseArray.java
index 5764fa8..9ef88e4 100644
--- a/core/java/android/app/usage/TimeSparseArray.java
+++ b/core/java/android/app/usage/TimeSparseArray.java
@@ -81,12 +81,17 @@
@Override
public void put(long key, E value) {
final long origKey = key;
- while (indexOfKey(key) >= 0) {
- key++;
- }
- if (origKey != key) {
- Slog.w(TAG, "Value " + value + " supposed to be inserted at " + origKey
- + " displaced to " + key);
+ int keyIndex = indexOfKey(key);
+ if (keyIndex >= 0) {
+ final long sz = size();
+ while (keyIndex < sz && keyAt(keyIndex) == key) {
+ key++;
+ keyIndex++;
+ }
+ if (key >= origKey + 10) {
+ Slog.w(TAG, "Value " + value + " supposed to be inserted at " + origKey
+ + " displaced to " + key);
+ }
}
super.put(key, value);
}
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index b354e81..84f57a3 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -139,6 +139,31 @@
@SystemApi
public static final int SLICE_PINNED = 14;
+ /**
+ * An event type denoting that the screen has gone in to an interactive state (turned
+ * on for full user interaction, not ambient display or other non-interactive state).
+ */
+ public static final int SCREEN_INTERACTIVE = 15;
+
+ /**
+ * An event type denoting that the screen has gone in to a non-interactive state
+ * (completely turned off or turned on only in a non-interactive state like ambient
+ * display).
+ */
+ public static final int SCREEN_NON_INTERACTIVE = 16;
+
+ /**
+ * An event type denoting that the screen's keyguard has been shown, whether or not
+ * the screen is off.
+ */
+ public static final int KEYGUARD_SHOWN = 17;
+
+ /**
+ * An event type denoting that the screen's keyguard has been hidden. This typically
+ * happens when the user unlocks their phone after turning it on.
+ */
+ public static final int KEYGUARD_HIDDEN = 18;
+
/** @hide */
public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 4744147..7fb97d3 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -179,6 +179,16 @@
public static final int REASON_SUB_USAGE_ACTIVE_TIMEOUT = 0x0007;
/** @hide */
public static final int REASON_SUB_USAGE_SYNC_ADAPTER = 0x0008;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_SLICE_PINNED = 0x0009;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_SLICE_PINNED_PRIV = 0x000A;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_EXEMPTED_SYNC_START = 0x000B;
+
+ /** @hide */
+ public static final int REASON_SUB_PREDICTED_RESTORED = 0x0001;
+
/** @hide */
@IntDef(flag = false, prefix = { "STANDBY_BUCKET_" }, value = {
@@ -301,6 +311,46 @@
}
/**
+ * Gets aggregated event stats for the given time range, aggregated by the specified interval.
+ * <p>The returned list will contain a {@link EventStats} object for each event type that
+ * is being aggregated and has data for an interval that is a subset of the time range given.
+ *
+ * <p>The current event types that will be aggregated here are:</p>
+ * <ul>
+ * <li>{@link UsageEvents.Event#SCREEN_INTERACTIVE}</li>
+ * <li>{@link UsageEvents.Event#SCREEN_NON_INTERACTIVE}</li>
+ * <li>{@link UsageEvents.Event#KEYGUARD_SHOWN}</li>
+ * <li>{@link UsageEvents.Event#KEYGUARD_HIDDEN}</li>
+ * </ul>
+ *
+ * <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
+ *
+ * @param intervalType The time interval by which the stats are aggregated.
+ * @param beginTime The inclusive beginning of the range of stats to include in the results.
+ * @param endTime The exclusive end of the range of stats to include in the results.
+ * @return A list of {@link EventStats}
+ *
+ * @see #INTERVAL_DAILY
+ * @see #INTERVAL_WEEKLY
+ * @see #INTERVAL_MONTHLY
+ * @see #INTERVAL_YEARLY
+ * @see #INTERVAL_BEST
+ */
+ public List<EventStats> queryEventStats(int intervalType, long beginTime, long endTime) {
+ try {
+ @SuppressWarnings("unchecked")
+ ParceledListSlice<EventStats> slice = mService.queryEventStats(intervalType, beginTime,
+ endTime, mContext.getOpPackageName());
+ if (slice != null) {
+ return slice.getList();
+ }
+ } catch (RemoteException e) {
+ // fallthrough and return the empty list.
+ }
+ return Collections.emptyList();
+ }
+
+ /**
* Query for events in the given time range. Events are only kept by the system for a few
* days.
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
@@ -578,36 +628,50 @@
break;
case REASON_MAIN_PREDICTED:
sb.append("p");
+ switch (standbyReason & REASON_SUB_MASK) {
+ case REASON_SUB_PREDICTED_RESTORED:
+ sb.append("-r");
+ break;
+ }
break;
case REASON_MAIN_TIMEOUT:
sb.append("t");
break;
case REASON_MAIN_USAGE:
- sb.append("u-");
+ sb.append("u");
switch (standbyReason & REASON_SUB_MASK) {
case REASON_SUB_USAGE_SYSTEM_INTERACTION:
- sb.append("si");
+ sb.append("-si");
break;
case REASON_SUB_USAGE_NOTIFICATION_SEEN:
- sb.append("ns");
+ sb.append("-ns");
break;
case REASON_SUB_USAGE_USER_INTERACTION:
- sb.append("ui");
+ sb.append("-ui");
break;
case REASON_SUB_USAGE_MOVE_TO_FOREGROUND:
- sb.append("mf");
+ sb.append("-mf");
break;
case REASON_SUB_USAGE_MOVE_TO_BACKGROUND:
- sb.append("mb");
+ sb.append("-mb");
break;
case REASON_SUB_USAGE_SYSTEM_UPDATE:
- sb.append("su");
+ sb.append("-su");
break;
case REASON_SUB_USAGE_ACTIVE_TIMEOUT:
- sb.append("at");
+ sb.append("-at");
break;
case REASON_SUB_USAGE_SYNC_ADAPTER:
- sb.append("sa");
+ sb.append("-sa");
+ break;
+ case REASON_SUB_USAGE_SLICE_PINNED:
+ sb.append("slp");
+ break;
+ case REASON_SUB_USAGE_SLICE_PINNED_PRIV:
+ sb.append("slpp");
+ break;
+ case REASON_SUB_USAGE_EXEMPTED_SYNC_START:
+ sb.append("es");
break;
}
break;
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 09ced26..b8628a4 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -243,4 +243,12 @@
*/
public abstract void reportAppJobState(String packageName, @UserIdInt int userId,
int numDeferredJobs, long timeSinceLastJobRun);
+
+ /**
+ * Report a sync that was scheduled by an active app is about to be executed.
+ *
+ * @param packageName name of the package that owns the sync adapter.
+ * @param userId which user the app is associated with
+ */
+ public abstract void reportExemptedSyncStart(String packageName, @UserIdInt int userId);
}
diff --git a/core/java/android/bluetooth/BluetoothHidDevice.java b/core/java/android/bluetooth/BluetoothHidDevice.java
index cb1d106..af99bf7 100644
--- a/core/java/android/bluetooth/BluetoothHidDevice.java
+++ b/core/java/android/bluetooth/BluetoothHidDevice.java
@@ -701,29 +701,6 @@
}
/**
- * Sends Virtual Cable Unplug to currently connected host.
- *
- * @return
- * {@hide}
- */
- public boolean unplug(BluetoothDevice device) {
- boolean result = false;
-
- final IBluetoothHidDevice service = mService;
- if (service != null) {
- try {
- result = service.unplug(device);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- } else {
- Log.w(TAG, "Proxy not attached to service");
- }
-
- return result;
- }
-
- /**
* Initiates connection to host which is currently paired with this device. If the application
* is not registered, #connect(BluetoothDevice) will fail. The connection state should be
* tracked by the application by handling callback from Callback#onConnectionStateChanged. The
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 440103a..9f3df37 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -166,24 +166,13 @@
public static final String SYNC_EXTRAS_DISALLOW_METERED = "allow_metered";
/**
- * {@hide} Flag only used by the requestsync command to treat a request as if it was made by
- * a foreground app.
+ * {@hide} Integer extra containing a SyncExemption flag.
*
* Only the system and the shell user can set it.
*
* This extra is "virtual". Once passed to the system server, it'll be removed from the bundle.
*/
- public static final String SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC = "force_fg_sync";
-
- /**
- * {@hide} Flag only used by the requestsync command to treat a request as if it was made by
- * a background app.
- *
- * Only the system and the shell user can set it.
- *
- * This extra is "virtual". Once passed to the system server, it'll be removed from the bundle.
- */
- public static final String SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC = "force_bg_sync";
+ public static final String SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG = "v_exemption";
/**
* Set by the SyncManager to request that the SyncAdapter initialize itself for
@@ -525,6 +514,38 @@
*/
public static final int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS = 1<<1;
+ /**
+ * No exception, throttled by app standby normally.
+ * @hide
+ */
+ public static final int SYNC_EXEMPTION_NONE = 0;
+
+ /**
+ * When executing a sync with this exemption, we'll put the target app in the ACTIVE bucket
+ * for 10 minutes. This will allow the sync adapter to schedule/run further syncs and jobs.
+ *
+ * Note this will still *not* let RARE apps to run syncs, because they still won't get network
+ * connection.
+ * @hide
+ */
+ public static final int SYNC_EXEMPTION_ACTIVE = 1;
+
+ /**
+ * In addition to {@link #SYNC_EXEMPTION_ACTIVE}, we put the sync adapter app in the
+ * temp whitelist for 10 minutes, so that even RARE apps can run syncs right away.
+ * @hide
+ */
+ public static final int SYNC_EXEMPTION_ACTIVE_WITH_TEMP = 2;
+
+ /** @hide */
+ @IntDef(flag = false, prefix = { "SYNC_EXEMPTION_" }, value = {
+ SYNC_EXEMPTION_NONE,
+ SYNC_EXEMPTION_ACTIVE,
+ SYNC_EXEMPTION_ACTIVE_WITH_TEMP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SyncExemption {}
+
// Always log queries which take 500ms+; shorter queries are
// sampled accordingly.
private static final boolean ENABLE_CONTENT_SAMPLE = false;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index ce32278..000912c 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -266,8 +266,8 @@
* </ul>
*
* <p>For example, consider the Note Pad sample application that
- * allows user to browse through a list of notes data and view details about
- * individual items. Text in italics indicate places were you would replace a
+ * allows a user to browse through a list of notes data and view details about
+ * individual items. Text in italics indicates places where you would replace a
* name with one specific to your own package.</p>
*
* <pre> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
@@ -1814,6 +1814,17 @@
public static final String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME";
/**
+ * Intent extra: A {@link Bundle} of extras for a package being suspended. Will be sent with
+ * {@link #ACTION_MY_PACKAGE_SUSPENDED}.
+ *
+ * @see #ACTION_MY_PACKAGE_SUSPENDED
+ * @see #ACTION_MY_PACKAGE_UNSUSPENDED
+ * @see PackageManager#isPackageSuspended()
+ * @see PackageManager#getSuspendedPackageAppExtras()
+ */
+ public static final String EXTRA_SUSPENDED_PACKAGE_EXTRAS = "android.intent.extra.SUSPENDED_PACKAGE_EXTRAS";
+
+ /**
* Intent extra: An app split name.
* <p>
* Type: String
@@ -1841,6 +1852,17 @@
public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
/**
+ * Intent extra: A {@link Bundle} of extras supplied for the launcher when any packages on
+ * device are suspended. Will be sent with {@link #ACTION_PACKAGES_SUSPENDED}.
+ *
+ * @see PackageManager#isPackageSuspended()
+ * @see #ACTION_PACKAGES_SUSPENDED
+ *
+ * @hide
+ */
+ public static final String EXTRA_LAUNCHER_EXTRAS = "android.intent.extra.LAUNCHER_EXTRAS";
+
+ /**
* Activity action: Launch UI to manage which apps have a given permission.
* <p>
* Input: {@link #EXTRA_PERMISSION_NAME} specifies the permission access
@@ -2237,6 +2259,43 @@
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
+
+ /**
+ * Broadcast Action: Sent to a package that has been suspended by the system. This is sent
+ * whenever a package is put into a suspended state or any of its app extras change while in the
+ * suspended state.
+ * <p> Optionally includes the following extras:
+ * <ul>
+ * <li> {@link #EXTRA_SUSPENDED_PACKAGE_EXTRAS} which is a {@link Bundle} which will contain
+ * useful information for the app being suspended.
+ * </ul>
+ * <p class="note">This is a protected intent that can only be sent
+ * by the system. <em>This will be delivered to {@link BroadcastReceiver} components declared in
+ * the manifest.</em>
+ *
+ * @see #ACTION_MY_PACKAGE_UNSUSPENDED
+ * @see #EXTRA_SUSPENDED_PACKAGE_EXTRAS
+ * @see PackageManager#isPackageSuspended()
+ * @see PackageManager#getSuspendedPackageAppExtras()
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED";
+
+ /**
+ * Broadcast Action: Sent to a package that has been unsuspended.
+ *
+ * <p class="note">This is a protected intent that can only be sent
+ * by the system. <em>This will be delivered to {@link BroadcastReceiver} components declared in
+ * the manifest.</em>
+ *
+ * @see #ACTION_MY_PACKAGE_SUSPENDED
+ * @see #EXTRA_SUSPENDED_PACKAGE_EXTRAS
+ * @see PackageManager#isPackageSuspended()
+ * @see PackageManager#getSuspendedPackageAppExtras()
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED";
+
/**
* Broadcast Action: A user ID has been removed from the system. The user
* ID number is stored in the extra data under {@link #EXTRA_UID}.
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 387a836..e85058d 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1101,6 +1101,58 @@
/** @hide */
public String[] splitClassLoaderNames;
+ /**
+ * Represents the default policy. The actual policy used will depend on other properties of
+ * the application, e.g. the target SDK version.
+ * @hide
+ */
+ public static final int HIDDEN_API_ENFORCEMENT_DEFAULT = -1;
+ /**
+ * No API enforcement; the app can access the entire internal private API. Only for use by
+ * system apps.
+ * @hide
+ */
+ public static final int HIDDEN_API_ENFORCEMENT_NONE = 0;
+ /**
+ * Light grey list enforcement, the strictest option. Enforces the light grey, dark grey and
+ * black lists.
+ * @hide
+ * */
+ public static final int HIDDEN_API_ENFORCEMENT_ALL_LISTS = 1;
+ /**
+ * Dark grey list enforcement. Enforces the dark grey and black lists
+ * @hide
+ */
+ public static final int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK = 2;
+ /**
+ * Blacklist enforcement only.
+ * @hide
+ */
+ public static final int HIDDEN_API_ENFORCEMENT_BLACK = 3;
+
+ private static final int HIDDEN_API_ENFORCEMENT_MAX = HIDDEN_API_ENFORCEMENT_BLACK;
+
+ /**
+ * Values in this IntDef MUST be kept in sync with enum hiddenapi::EnforcementPolicy in
+ * art/runtime/hidden_api.h
+ * @hide
+ */
+ @IntDef(prefix = { "HIDDEN_API_ENFORCEMENT_" }, value = {
+ HIDDEN_API_ENFORCEMENT_DEFAULT,
+ HIDDEN_API_ENFORCEMENT_NONE,
+ HIDDEN_API_ENFORCEMENT_ALL_LISTS,
+ HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK,
+ HIDDEN_API_ENFORCEMENT_BLACK,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface HiddenApiEnforcementPolicy {}
+
+ private boolean isValidHiddenApiEnforcementPolicy(int policy) {
+ return policy >= HIDDEN_API_ENFORCEMENT_DEFAULT && policy <= HIDDEN_API_ENFORCEMENT_MAX;
+ }
+
+ private int mHiddenApiPolicy = HIDDEN_API_ENFORCEMENT_DEFAULT;
+
public void dump(Printer pw, String prefix) {
dump(pw, prefix, DUMP_FLAG_ALL);
}
@@ -1188,7 +1240,7 @@
if (category != CATEGORY_UNDEFINED) {
pw.println(prefix + "category=" + category);
}
- pw.println(prefix + "isAllowedToUseHiddenApi=" + isAllowedToUseHiddenApi());
+ pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy());
}
super.dumpBack(pw, prefix);
}
@@ -1386,6 +1438,7 @@
appComponentFactory = orig.appComponentFactory;
compileSdkVersion = orig.compileSdkVersion;
compileSdkVersionCodename = orig.compileSdkVersionCodename;
+ mHiddenApiPolicy = orig.mHiddenApiPolicy;
}
public String toString() {
@@ -1459,6 +1512,7 @@
dest.writeInt(compileSdkVersion);
dest.writeString(compileSdkVersionCodename);
dest.writeString(appComponentFactory);
+ dest.writeInt(mHiddenApiPolicy);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1529,6 +1583,7 @@
compileSdkVersion = source.readInt();
compileSdkVersionCodename = source.readString();
appComponentFactory = source.readString();
+ mHiddenApiPolicy = source.readInt();
}
/**
@@ -1599,13 +1654,31 @@
}
}
+ private boolean isPackageWhitelistedForHiddenApis() {
+ return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
+ }
+
/**
* @hide
*/
- public boolean isAllowedToUseHiddenApi() {
- boolean whitelisted =
- SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
- return whitelisted && (isSystemApp() || isUpdatedSystemApp());
+ public @HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
+ if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
+ return mHiddenApiPolicy;
+ }
+ if (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp())) {
+ return HIDDEN_API_ENFORCEMENT_NONE;
+ }
+ return HIDDEN_API_ENFORCEMENT_BLACK;
+ }
+
+ /**
+ * @hide
+ */
+ public void setHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) {
+ if (!isValidHiddenApiEnforcementPolicy(policy)) {
+ throw new IllegalArgumentException("Invalid API enforcement policy: " + policy);
+ }
+ mHiddenApiPolicy = policy;
}
/**
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index c08bd1d..ae1c207 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -49,6 +49,7 @@
String callingPackage, in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
boolean isPackageEnabled(String callingPackage, String packageName, in UserHandle user);
+ Bundle getSuspendedPackageLauncherExtras(String packageName, in UserHandle user);
boolean isActivityEnabled(
String callingPackage, in ComponentName component, in UserHandle user);
ApplicationInfo getApplicationInfo(
diff --git a/core/java/android/content/pm/IOnAppsChangedListener.aidl b/core/java/android/content/pm/IOnAppsChangedListener.aidl
index e6525af..fcb1de0 100644
--- a/core/java/android/content/pm/IOnAppsChangedListener.aidl
+++ b/core/java/android/content/pm/IOnAppsChangedListener.aidl
@@ -17,6 +17,7 @@
package android.content.pm;
import android.content.pm.ParceledListSlice;
+import android.os.Bundle;
import android.os.UserHandle;
/**
@@ -28,7 +29,8 @@
void onPackageChanged(in UserHandle user, String packageName);
void onPackagesAvailable(in UserHandle user, in String[] packageNames, boolean replacing);
void onPackagesUnavailable(in UserHandle user, in String[] packageNames, boolean replacing);
- void onPackagesSuspended(in UserHandle user, in String[] packageNames);
+ void onPackagesSuspended(in UserHandle user, in String[] packageNames,
+ in Bundle launcherExtras);
void onPackagesUnsuspended(in UserHandle user, in String[] packageNames);
void onShortcutChanged(in UserHandle user, String packageName, in ParceledListSlice shortcuts);
}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index d43d80f..277738b 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -278,7 +278,7 @@
boolean isPackageSuspendedForUser(String packageName, int userId);
- PersistableBundle getPackageSuspendedAppExtras(String pacakgeName, int userId);
+ PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId);
void setSuspendedPackageAppExtras(String packageName, in PersistableBundle appExtras,
int userId);
@@ -619,6 +619,8 @@
in String[] packageNames, int userId);
void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
in String[] packageNames, int userId);
+ void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
+ void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId);
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 21ede16..9aace2e 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -211,6 +211,10 @@
* example, this can happen when a Device Administrator suspends
* an applicaton.
*
+ * <p>Note: On devices running {@link android.os.Build.VERSION_CODES#P Android P} or higher,
+ * any apps that override {@link #onPackagesSuspended(String[], Bundle, UserHandle)} will
+ * not receive this callback.
+ *
* @param packageNames The names of the packages that have just been
* suspended.
* @param user The UserHandle of the profile that generated the change.
@@ -219,6 +223,22 @@
}
/**
+ * Indicates that one or more packages have been suspended. A device administrator or an app
+ * with {@code android.permission.SUSPEND_APPS} can do this.
+ *
+ * @param packageNames The names of the packages that have just been suspended.
+ * @param launcherExtras A {@link Bundle} of extras for the launcher.
+ * @param user the user for which the given packages were suspended.
+ *
+ * @see PackageManager#isPackageSuspended()
+ * @see #getSuspendedPackageLauncherExtras(String, UserHandle)
+ */
+ public void onPackagesSuspended(String[] packageNames, @Nullable Bundle launcherExtras,
+ UserHandle user) {
+ onPackagesSuspended(packageNames, user);
+ }
+
+ /**
* Indicates that one or more packages have been unsuspended. For
* example, this can happen when a Device Administrator unsuspends
* an applicaton.
@@ -638,6 +658,31 @@
}
/**
+ * Gets the launcher extras supplied to the system when the given package was suspended via
+ * {@code PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
+ * PersistableBundle, String)}.
+ *
+ * <p>Note: This just returns whatever extras were provided to the system, <em>which might
+ * even be {@code null}.</em>
+ *
+ * @param packageName The package for which to fetch the launcher extras.
+ * @param user The {@link UserHandle} of the profile.
+ * @return A {@link Bundle} of launcher extras. Or {@code null} if the package is not currently
+ * suspended.
+ *
+ * @see Callback#onPackagesSuspended(String[], Bundle, UserHandle)
+ * @see PackageManager#isPackageSuspended()
+ */
+ public @Nullable Bundle getSuspendedPackageLauncherExtras(String packageName, UserHandle user) {
+ logErrorForInvalidProfileAccess(user);
+ try {
+ return mService.getSuspendedPackageLauncherExtras(packageName, user);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns {@link ApplicationInfo} about an application installed for a specific user profile.
*
* @param packageName The package name of the application
@@ -652,7 +697,7 @@
@ApplicationInfoFlags int flags, @NonNull UserHandle user)
throws PackageManager.NameNotFoundException {
Preconditions.checkNotNull(packageName, "packageName");
- Preconditions.checkNotNull(packageName, "user");
+ Preconditions.checkNotNull(user, "user");
logErrorForInvalidProfileAccess(user);
try {
final ApplicationInfo ai = mService
@@ -1163,14 +1208,15 @@
}
@Override
- public void onPackagesSuspended(UserHandle user, String[] packageNames)
+ public void onPackagesSuspended(UserHandle user, String[] packageNames,
+ Bundle launcherExtras)
throws RemoteException {
if (DEBUG) {
Log.d(TAG, "onPackagesSuspended " + user.getIdentifier() + "," + packageNames);
}
synchronized (LauncherApps.this) {
for (CallbackMessageHandler callback : mCallbacks) {
- callback.postOnPackagesSuspended(packageNames, user);
+ callback.postOnPackagesSuspended(packageNames, launcherExtras, user);
}
}
}
@@ -1218,6 +1264,7 @@
private static class CallbackInfo {
String[] packageNames;
String packageName;
+ Bundle launcherExtras;
boolean replacing;
UserHandle user;
List<ShortcutInfo> shortcuts;
@@ -1251,7 +1298,8 @@
mCallback.onPackagesUnavailable(info.packageNames, info.user, info.replacing);
break;
case MSG_SUSPENDED:
- mCallback.onPackagesSuspended(info.packageNames, info.user);
+ mCallback.onPackagesSuspended(info.packageNames, info.launcherExtras,
+ info.user);
break;
case MSG_UNSUSPENDED:
mCallback.onPackagesUnsuspended(info.packageNames, info.user);
@@ -1301,10 +1349,12 @@
obtainMessage(MSG_UNAVAILABLE, info).sendToTarget();
}
- public void postOnPackagesSuspended(String[] packageNames, UserHandle user) {
+ public void postOnPackagesSuspended(String[] packageNames, Bundle launcherExtras,
+ UserHandle user) {
CallbackInfo info = new CallbackInfo();
info.packageNames = packageNames;
info.user = user;
+ info.launcherExtras = launcherExtras;
obtainMessage(MSG_SUSPENDED, info).sendToTarget();
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 314eb98..491f0af 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -5513,7 +5513,7 @@
* Puts the package in a suspended state, where attempts at starting activities are denied.
*
* <p>It doesn't remove the data or the actual package file. The application's notifications
- * will be hidden, any of the it's started activities will be stopped and it will not be able to
+ * will be hidden, any of its started activities will be stopped and it will not be able to
* show toasts or dialogs or ring the device. When the user tries to launch a suspended app, a
* system dialog with the given {@code dialogMessage} will be shown instead.</p>
*
@@ -5577,11 +5577,26 @@
}
/**
- * Apps can query this to know if they have been suspended.
+ * Apps can query this to know if they have been suspended. A system app with the permission
+ * {@code android.permission.SUSPEND_APPS} can put any app on the device into a suspended state.
+ *
+ * <p>While in this state, the application's notifications will be hidden, any of its started
+ * activities will be stopped and it will not be able to show toasts or dialogs or ring the
+ * device. When the user tries to launch a suspended app, the system will, instead, show a
+ * dialog to the user informing them that they cannot use this app while it is suspended.
+ *
+ * <p>When an app is put into this state, the broadcast action
+ * {@link Intent#ACTION_MY_PACKAGE_SUSPENDED} will be delivered to any of its broadcast
+ * receivers that included this action in their intent-filters, <em>including manifest
+ * receivers.</em> Similarly, a broadcast action {@link Intent#ACTION_MY_PACKAGE_UNSUSPENDED}
+ * is delivered when a previously suspended app is taken out of this state.
+ * </p>
*
* @return {@code true} if the calling package has been suspended, {@code false} otherwise.
*
* @see #getSuspendedPackageAppExtras()
+ * @see Intent#ACTION_MY_PACKAGE_SUSPENDED
+ * @see Intent#ACTION_MY_PACKAGE_UNSUSPENDED
*/
public boolean isPackageSuspended() {
throw new UnsupportedOperationException("isPackageSuspended not implemented");
@@ -5602,7 +5617,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.SUSPEND_APPS)
- public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
+ public @Nullable PersistableBundle getSuspendedPackageAppExtras(String packageName) {
throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
}
@@ -5631,15 +5646,17 @@
* Returns any extra information supplied as {@code appExtras} to the system when the calling
* app was suspended.
*
- * <p> Note: This just returns whatever {@link PersistableBundle} was passed to the system via
- * {@code setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
- * String)} when suspending the package, <em> which might be {@code null}. </em></p>
+ * <p>Note: If no extras were supplied to the system, this method will return {@code null}, even
+ * when the calling app has been suspended.</p>
*
- * @return A {@link PersistableBundle} containing the extras for the app, or {@code null} if the
+ * @return A {@link Bundle} containing the extras for the app, or {@code null} if the
* package is not currently suspended.
+ *
* @see #isPackageSuspended()
+ * @see Intent#ACTION_MY_PACKAGE_UNSUSPENDED
+ * @see Intent#ACTION_MY_PACKAGE_SUSPENDED
*/
- public @Nullable PersistableBundle getSuspendedPackageAppExtras() {
+ public @Nullable Bundle getSuspendedPackageAppExtras() {
throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
}
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index dff51f7..c9b78c0 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -26,6 +26,7 @@
import android.content.pm.PackageManager.PackageInfoFlags;
import android.content.pm.PackageManager.ResolveInfoFlags;
import android.os.Bundle;
+import android.os.PersistableBundle;
import android.util.SparseArray;
import java.lang.annotation.Retention;
@@ -188,6 +189,22 @@
@PackageInfoFlags int flags, int filterCallingUid, int userId);
/**
+ * Retrieve launcher extras for a suspended package provided to the system in
+ * {@link PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
+ * PersistableBundle, String)}
+ *
+ * @param packageName The package for which to return launcher extras.
+ * @param userId The user for which to check,
+ * @return The launcher extras.
+ *
+ * @see PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
+ * PersistableBundle, String)
+ * @see PackageManager#isPackageSuspended()
+ */
+ public abstract Bundle getSuspendedPackageLauncherExtras(String packageName,
+ int userId);
+
+ /**
* Do a straight uid lookup for the given package/application in the given user.
* @see PackageManager#getPackageUidAsUser(String, int, int)
* @return The app's uid, or < 0 if the package was not found in that user
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index bc7540f..2f0faf2 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -5701,7 +5701,8 @@
flag = true,
value = {CertCapabilities.INSTALLED_DATA,
CertCapabilities.SHARED_USER_ID,
- CertCapabilities.PERMISSION })
+ CertCapabilities.PERMISSION,
+ CertCapabilities.ROLLBACK})
public @interface CertCapabilities {
/** accept data from already installed pkg with this cert */
@@ -5712,6 +5713,9 @@
/** grant SIGNATURE permissions to pkgs with this cert */
int PERMISSION = 4;
+
+ /** allow pkg to update to one signed by this certificate */
+ int ROLLBACK = 8;
}
/**
diff --git a/core/java/android/content/pm/dex/PackageOptimizationInfo.java b/core/java/android/content/pm/dex/PackageOptimizationInfo.java
index b650457..7e7d29e 100644
--- a/core/java/android/content/pm/dex/PackageOptimizationInfo.java
+++ b/core/java/android/content/pm/dex/PackageOptimizationInfo.java
@@ -22,19 +22,19 @@
* @hide
*/
public class PackageOptimizationInfo {
- private final String mCompilationFilter;
- private final String mCompilationReason;
+ private final int mCompilationFilter;
+ private final int mCompilationReason;
- public PackageOptimizationInfo(String compilerFilter, String compilationReason) {
+ public PackageOptimizationInfo(int compilerFilter, int compilationReason) {
this.mCompilationReason = compilationReason;
this.mCompilationFilter = compilerFilter;
}
- public String getCompilationReason() {
+ public int getCompilationReason() {
return mCompilationReason;
}
- public String getCompilationFilter() {
+ public int getCompilationFilter() {
return mCompilationFilter;
}
@@ -42,6 +42,6 @@
* Create a default optimization info object for the case when we have no information.
*/
public static PackageOptimizationInfo createWithNoInfo() {
- return new PackageOptimizationInfo("no-info", "no-info");
+ return new PackageOptimizationInfo(-1, -1);
}
}
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 56cba79..c6c676f 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -31,7 +31,7 @@
import java.util.regex.Pattern;
/**
- * This is a convience class that helps build SQL queries to be sent to
+ * This is a convenience class that helps build SQL queries to be sent to
* {@link SQLiteDatabase} objects.
*/
public class SQLiteQueryBuilder
diff --git a/core/java/android/hardware/biometrics/BiometricConstants.java b/core/java/android/hardware/biometrics/BiometricConstants.java
new file mode 100644
index 0000000..a037289
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricConstants.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics;
+
+
+/**
+ * Interface containing all of the biometric modality agnostic constants.
+ * @hide
+ */
+public interface BiometricConstants {
+ //
+ // Error messages from biometric hardware during initilization, enrollment, authentication or
+ // removal.
+ //
+
+ /**
+ * The hardware is unavailable. Try again later.
+ */
+ int BIOMETRIC_ERROR_HW_UNAVAILABLE = 1;
+
+ /**
+ * Error state returned when the sensor was unable to process the current image.
+ */
+ int BIOMETRIC_ERROR_UNABLE_TO_PROCESS = 2;
+
+ /**
+ * Error state returned when the current request has been running too long. This is intended to
+ * prevent programs from waiting for the biometric sensor indefinitely. The timeout is platform
+ * and sensor-specific, but is generally on the order of 30 seconds.
+ */
+ int BIOMETRIC_ERROR_TIMEOUT = 3;
+
+ /**
+ * Error state returned for operations like enrollment; the operation cannot be completed
+ * because there's not enough storage remaining to complete the operation.
+ */
+ int BIOMETRIC_ERROR_NO_SPACE = 4;
+
+ /**
+ * The operation was canceled because the biometric sensor is unavailable. For example, this may
+ * happen when the user is switched, the device is locked or another pending operation prevents
+ * or disables it.
+ */
+ int BIOMETRIC_ERROR_CANCELED = 5;
+
+ /**
+ * The {@link BiometricManager#remove} call failed. Typically this will happen when the provided
+ * biometric id was incorrect.
+ *
+ * @hide
+ */
+ int BIOMETRIC_ERROR_UNABLE_TO_REMOVE = 6;
+
+ /**
+ * The operation was canceled because the API is locked out due to too many attempts.
+ * This occurs after 5 failed attempts, and lasts for 30 seconds.
+ */
+ int BIOMETRIC_ERROR_LOCKOUT = 7;
+
+ /**
+ * Hardware vendors may extend this list if there are conditions that do not fall under one of
+ * the above categories. Vendors are responsible for providing error strings for these errors.
+ * These messages are typically reserved for internal operations such as enrollment, but may be
+ * used to express vendor errors not otherwise covered. Applications are expected to show the
+ * error message string if they happen, but are advised not to rely on the message id since they
+ * will be device and vendor-specific
+ */
+ int BIOMETRIC_ERROR_VENDOR = 8;
+
+ /**
+ * The operation was canceled because BIOMETRIC_ERROR_LOCKOUT occurred too many times.
+ * Biometric authentication is disabled until the user unlocks with strong authentication
+ * (PIN/Pattern/Password)
+ */
+ int BIOMETRIC_ERROR_LOCKOUT_PERMANENT = 9;
+
+ /**
+ * The user canceled the operation. Upon receiving this, applications should use alternate
+ * authentication (e.g. a password). The application should also provide the means to return to
+ * biometric authentication, such as a "use <biometric>" button.
+ */
+ int BIOMETRIC_ERROR_USER_CANCELED = 10;
+
+ /**
+ * The user does not have any biometrics enrolled.
+ */
+ int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
+
+ /**
+ * The device does not have a biometric sensor.
+ */
+ int BIOMETRIC_ERROR_HW_NOT_PRESENT = 12;
+
+ /**
+ * @hide
+ */
+ int BIOMETRIC_ERROR_VENDOR_BASE = 1000;
+
+ //
+ // Image acquisition messages.
+ //
+
+ /**
+ * The image acquired was good.
+ */
+ int BIOMETRIC_ACQUIRED_GOOD = 0;
+
+ /**
+ * Only a partial biometric image was detected. During enrollment, the user should be informed
+ * on what needs to happen to resolve this problem, e.g. "press firmly on sensor." (for
+ * fingerprint)
+ */
+ int BIOMETRIC_ACQUIRED_PARTIAL = 1;
+
+ /**
+ * The biometric image was too noisy to process due to a detected condition or a possibly dirty
+ * sensor (See {@link #BIOMETRIC_ACQUIRED_IMAGER_DIRTY}).
+ */
+ int BIOMETRIC_ACQUIRED_INSUFFICIENT = 2;
+
+ /**
+ * The biometric image was too noisy due to suspected or detected dirt on the sensor. For
+ * example, it's reasonable return this after multiple {@link #BIOMETRIC_ACQUIRED_INSUFFICIENT}
+ * or actual detection of dirt on the sensor (stuck pixels, swaths, etc.). The user is expected
+ * to take action to clean the sensor when this is returned.
+ */
+ int BIOMETRIC_ACQUIRED_IMAGER_DIRTY = 3;
+
+ /**
+ * The biometric image was unreadable due to lack of motion.
+ */
+ int BIOMETRIC_ACQUIRED_TOO_SLOW = 4;
+
+ /**
+ * The biometric image was incomplete due to quick motion. For example, this could also happen
+ * if the user moved during acquisition. The user should be asked to repeat the operation more
+ * slowly.
+ */
+ int BIOMETRIC_ACQUIRED_TOO_FAST = 5;
+
+ /**
+ * Hardware vendors may extend this list if there are conditions that do not fall under one of
+ * the above categories. Vendors are responsible for providing error strings for these errors.
+ * @hide
+ */
+ int BIOMETRIC_ACQUIRED_VENDOR = 6;
+ /**
+ * @hide
+ */
+ int BIOMETRICT_ACQUIRED_VENDOR_BASE = 1000;
+}
diff --git a/core/java/android/hardware/biometrics/BiometricDialog.java b/core/java/android/hardware/biometrics/BiometricDialog.java
new file mode 100644
index 0000000..dd848a3
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricDialog.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics;
+
+import static android.Manifest.permission.USE_BIOMETRIC;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.text.TextUtils;
+
+import java.security.Signature;
+import java.util.concurrent.Executor;
+
+import javax.crypto.Cipher;
+import javax.crypto.Mac;
+
+/**
+ * A class that manages a system-provided biometric dialog.
+ */
+public class BiometricDialog implements BiometricAuthenticator, BiometricConstants {
+
+ /**
+ * @hide
+ */
+ public static final String KEY_TITLE = "title";
+ /**
+ * @hide
+ */
+ public static final String KEY_SUBTITLE = "subtitle";
+ /**
+ * @hide
+ */
+ public static final String KEY_DESCRIPTION = "description";
+ /**
+ * @hide
+ */
+ public static final String KEY_POSITIVE_TEXT = "positive_text";
+ /**
+ * @hide
+ */
+ public static final String KEY_NEGATIVE_TEXT = "negative_text";
+
+ /**
+ * Error/help message will show for this amount of time.
+ * For error messages, the dialog will also be dismissed after this amount of time.
+ * Error messages will be propagated back to the application via AuthenticationCallback
+ * after this amount of time.
+ * @hide
+ */
+ public static final int HIDE_DIALOG_DELAY = 2000; // ms
+ /**
+ * @hide
+ */
+ public static final int DISMISSED_REASON_POSITIVE = 1;
+
+ /**
+ * @hide
+ */
+ public static final int DISMISSED_REASON_NEGATIVE = 2;
+
+ /**
+ * @hide
+ */
+ public static final int DISMISSED_REASON_USER_CANCEL = 3;
+
+ private static class ButtonInfo {
+ Executor executor;
+ DialogInterface.OnClickListener listener;
+ ButtonInfo(Executor ex, DialogInterface.OnClickListener l) {
+ executor = ex;
+ listener = l;
+ }
+ }
+
+ /**
+ * A builder that collects arguments to be shown on the system-provided biometric dialog.
+ **/
+ public static class Builder {
+ private final Bundle mBundle;
+ private ButtonInfo mPositiveButtonInfo;
+ private ButtonInfo mNegativeButtonInfo;
+ private Context mContext;
+
+ /**
+ * Creates a builder for a biometric dialog.
+ * @param context
+ */
+ public Builder(Context context) {
+ mBundle = new Bundle();
+ mContext = context;
+ }
+
+ /**
+ * Required: Set the title to display.
+ * @param title
+ * @return
+ */
+ public Builder setTitle(@NonNull CharSequence title) {
+ mBundle.putCharSequence(KEY_TITLE, title);
+ return this;
+ }
+
+ /**
+ * Optional: Set the subtitle to display.
+ * @param subtitle
+ * @return
+ */
+ public Builder setSubtitle(@NonNull CharSequence subtitle) {
+ mBundle.putCharSequence(KEY_SUBTITLE, subtitle);
+ return this;
+ }
+
+ /**
+ * Optional: Set the description to display.
+ * @param description
+ * @return
+ */
+ public Builder setDescription(@NonNull CharSequence description) {
+ mBundle.putCharSequence(KEY_DESCRIPTION, description);
+ return this;
+ }
+
+ /**
+ * Optional: Set the text for the positive button. If not set, the positive button
+ * will not show.
+ * @param text
+ * @return
+ * @hide
+ */
+ public Builder setPositiveButton(@NonNull CharSequence text,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull DialogInterface.OnClickListener listener) {
+ if (TextUtils.isEmpty(text)) {
+ throw new IllegalArgumentException("Text must be set and non-empty");
+ }
+ if (executor == null) {
+ throw new IllegalArgumentException("Executor must not be null");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener must not be null");
+ }
+ mBundle.putCharSequence(KEY_POSITIVE_TEXT, text);
+ mPositiveButtonInfo = new ButtonInfo(executor, listener);
+ return this;
+ }
+
+ /**
+ * Required: Set the text for the negative button. This would typically be used as a
+ * "Cancel" button, but may be also used to show an alternative method for authentication,
+ * such as screen that asks for a backup password.
+ * @param text
+ * @return
+ */
+ public Builder setNegativeButton(@NonNull CharSequence text,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull DialogInterface.OnClickListener listener) {
+ if (TextUtils.isEmpty(text)) {
+ throw new IllegalArgumentException("Text must be set and non-empty");
+ }
+ if (executor == null) {
+ throw new IllegalArgumentException("Executor must not be null");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener must not be null");
+ }
+ mBundle.putCharSequence(KEY_NEGATIVE_TEXT, text);
+ mNegativeButtonInfo = new ButtonInfo(executor, listener);
+ return this;
+ }
+
+ /**
+ * Creates a {@link BiometricDialog}.
+ * @return a {@link BiometricDialog}
+ * @throws IllegalArgumentException if any of the required fields are not set.
+ */
+ public BiometricDialog build() {
+ final CharSequence title = mBundle.getCharSequence(KEY_TITLE);
+ final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);
+
+ if (TextUtils.isEmpty(title)) {
+ throw new IllegalArgumentException("Title must be set and non-empty");
+ } else if (TextUtils.isEmpty(negative)) {
+ throw new IllegalArgumentException("Negative text must be set and non-empty");
+ }
+ return new BiometricDialog(mContext, mBundle, mPositiveButtonInfo, mNegativeButtonInfo);
+ }
+ }
+
+ private PackageManager mPackageManager;
+ private FingerprintManager mFingerprintManager;
+ private Bundle mBundle;
+ private ButtonInfo mPositiveButtonInfo;
+ private ButtonInfo mNegativeButtonInfo;
+
+ IBiometricDialogReceiver mDialogReceiver = new IBiometricDialogReceiver.Stub() {
+ @Override
+ public void onDialogDismissed(int reason) {
+ // Check the reason and invoke OnClickListener(s) if necessary
+ if (reason == DISMISSED_REASON_POSITIVE) {
+ mPositiveButtonInfo.executor.execute(() -> {
+ mPositiveButtonInfo.listener.onClick(null, DialogInterface.BUTTON_POSITIVE);
+ });
+ } else if (reason == DISMISSED_REASON_NEGATIVE) {
+ mNegativeButtonInfo.executor.execute(() -> {
+ mNegativeButtonInfo.listener.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+ });
+ }
+ }
+ };
+
+ private BiometricDialog(Context context, Bundle bundle,
+ ButtonInfo positiveButtonInfo, ButtonInfo negativeButtonInfo) {
+ mBundle = bundle;
+ mPositiveButtonInfo = positiveButtonInfo;
+ mNegativeButtonInfo = negativeButtonInfo;
+ mFingerprintManager = context.getSystemService(FingerprintManager.class);
+ mPackageManager = context.getPackageManager();
+ }
+
+ /**
+ * A wrapper class for the crypto objects supported by BiometricDialog. Currently the framework
+ * supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
+ */
+ public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
+ public CryptoObject(@NonNull Signature signature) {
+ super(signature);
+ }
+
+ public CryptoObject(@NonNull Cipher cipher) {
+ super(cipher);
+ }
+
+ public CryptoObject(@NonNull Mac mac) {
+ super(mac);
+ }
+
+ /**
+ * Get {@link Signature} object.
+ * @return {@link Signature} object or null if this doesn't contain one.
+ */
+ public Signature getSignature() {
+ return super.getSignature();
+ }
+
+ /**
+ * Get {@link Cipher} object.
+ * @return {@link Cipher} object or null if this doesn't contain one.
+ */
+ public Cipher getCipher() {
+ return super.getCipher();
+ }
+
+ /**
+ * Get {@link Mac} object.
+ * @return {@link Mac} object or null if this doesn't contain one.
+ */
+ public Mac getMac() {
+ return super.getMac();
+ }
+ }
+
+ /**
+ * Container for callback data from {@link #authenticate( CancellationSignal, Executor,
+ * AuthenticationCallback)} and {@link #authenticate(CryptoObject, CancellationSignal, Executor,
+ * AuthenticationCallback)}
+ */
+ public static class AuthenticationResult extends BiometricAuthenticator.AuthenticationResult {
+ /**
+ * Authentication result
+ * @param crypto
+ * @param identifier
+ * @param userId
+ * @hide
+ */
+ public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier,
+ int userId) {
+ super(crypto, identifier, userId);
+ }
+ /**
+ * Obtain the crypto object associated with this transaction
+ * @return crypto object provided to {@link #authenticate( CryptoObject, CancellationSignal,
+ * Executor, AuthenticationCallback)}
+ */
+ public CryptoObject getCryptoObject() {
+ return (CryptoObject) super.getCryptoObject();
+ }
+ }
+
+ /**
+ * Callback structure provided to {@link BiometricDialog#authenticate(CancellationSignal,
+ * Executor, AuthenticationCallback)} or {@link BiometricDialog#authenticate(CryptoObject,
+ * CancellationSignal, Executor, AuthenticationCallback)}. Users must provide an implementation
+ * of this for listening to authentication events.
+ */
+ public abstract static class AuthenticationCallback extends
+ BiometricAuthenticator.AuthenticationCallback {
+ /**
+ * Called when an unrecoverable error has been encountered and the operation is complete.
+ * No further actions will be made on this object.
+ * @param errorCode An integer identifying the error message
+ * @param errString A human-readable error string that can be shown on an UI
+ */
+ @Override
+ public void onAuthenticationError(int errorCode, CharSequence errString) {}
+
+ /**
+ * Called when a recoverable error has been encountered during authentication. The help
+ * string is provided to give the user guidance for what went wrong, such as "Sensor dirty,
+ * please clean it."
+ * @param helpCode An integer identifying the error message
+ * @param helpString A human-readable string that can be shown on an UI
+ */
+ @Override
+ public void onAuthenticationHelp(int helpCode, CharSequence helpString) {}
+
+ /**
+ * Called when a biometric is recognized.
+ * @param result An object containing authentication-related data
+ */
+ public void onAuthenticationSucceeded(AuthenticationResult result) {}
+
+ /**
+ * Called when a biometric is valid but not recognized.
+ */
+ @Override
+ public void onAuthenticationFailed() {}
+
+ /**
+ * Called when a biometric has been acquired, but hasn't been processed yet.
+ * @hide
+ */
+ @Override
+ public void onAuthenticationAcquired(int acquireInfo) {}
+
+ /**
+ * @param result An object containing authentication-related data
+ * @hide
+ */
+ @Override
+ public void onAuthenticationSucceeded(BiometricAuthenticator.AuthenticationResult result) {
+ onAuthenticationSucceeded(new AuthenticationResult(
+ (CryptoObject) result.getCryptoObject(),
+ result.getId(),
+ result.getUserId()));
+ }
+ }
+
+ /**
+ * @param crypto Object associated with the call
+ * @param cancel An object that can be used to cancel authentication
+ * @param executor An executor to handle callback events
+ * @param callback An object to receive authentication events
+ * @hide
+ */
+ @Override
+ public void authenticate(@NonNull android.hardware.biometrics.CryptoObject crypto,
+ @NonNull CancellationSignal cancel,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
+ if (!(callback instanceof BiometricDialog.AuthenticationCallback)) {
+ throw new IllegalArgumentException("Callback cannot be casted");
+ }
+ authenticate(crypto, cancel, executor, (AuthenticationCallback) callback);
+ }
+
+ /**
+ *
+ * @param cancel An object that can be used to cancel authentication
+ * @param executor An executor to handle callback events
+ * @param callback An object to receive authentication events
+ * @hide
+ */
+ @Override
+ public void authenticate(@NonNull CancellationSignal cancel,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
+ if (!(callback instanceof BiometricDialog.AuthenticationCallback)) {
+ throw new IllegalArgumentException("Callback cannot be casted");
+ }
+ authenticate(cancel, executor, (AuthenticationCallback) callback);
+ }
+
+ /**
+ * This call warms up the fingerprint hardware, displays a system-provided dialog, and starts
+ * scanning for a fingerprint. It terminates when {@link
+ * AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when {@link
+ * AuthenticationCallback#onAuthenticationSucceeded( AuthenticationResult)}, or when the user
+ * dismisses the system-provided dialog, at which point the crypto object becomes invalid. This
+ * operation can be canceled by using the provided cancel object. The application will receive
+ * authentication errors through {@link AuthenticationCallback}, and button events through the
+ * corresponding callback set in {@link Builder#setNegativeButton(CharSequence, Executor,
+ * DialogInterface.OnClickListener)}. It is safe to reuse the {@link BiometricDialog} object,
+ * and calling {@link BiometricDialog#authenticate( CancellationSignal, Executor,
+ * AuthenticationCallback)} while an existing authentication attempt is occurring will stop the
+ * previous client and start a new authentication. The interrupted client will receive a
+ * cancelled notification through {@link AuthenticationCallback#onAuthenticationError(int,
+ * CharSequence)}.
+ *
+ * @throws IllegalArgumentException If any of the arguments are null
+ *
+ * @param crypto Object associated with the call
+ * @param cancel An object that can be used to cancel authentication
+ * @param executor An executor to handle callback events
+ * @param callback An object to receive authentication events
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public void authenticate(@NonNull CryptoObject crypto,
+ @NonNull CancellationSignal cancel,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull AuthenticationCallback callback) {
+ if (handlePreAuthenticationErrors(callback, executor)) {
+ return;
+ }
+ mFingerprintManager.authenticate(crypto, cancel, mBundle, executor, mDialogReceiver,
+ callback);
+ }
+
+ /**
+ * This call warms up the fingerprint hardware, displays a system-provided dialog, and starts
+ * scanning for a fingerprint. It terminates when {@link
+ * AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when {@link
+ * AuthenticationCallback#onAuthenticationSucceeded( AuthenticationResult)} is called, or when
+ * the user dismisses the system-provided dialog. This operation can be canceled by using the
+ * provided cancel object. The application will receive authentication errors through {@link
+ * AuthenticationCallback}, and button events through the corresponding callback set in {@link
+ * Builder#setNegativeButton(CharSequence, Executor, DialogInterface.OnClickListener)}. It is
+ * safe to reuse the {@link BiometricDialog} object, and calling {@link
+ * BiometricDialog#authenticate(CancellationSignal, Executor, AuthenticationCallback)} while
+ * an existing authentication attempt is occurring will stop the previous client and start a new
+ * authentication. The interrupted client will receive a cancelled notification through {@link
+ * AuthenticationCallback#onAuthenticationError(int, CharSequence)}.
+ *
+ * @throws IllegalArgumentException If any of the arguments are null
+ *
+ * @param cancel An object that can be used to cancel authentication
+ * @param executor An executor to handle callback events
+ * @param callback An object to receive authentication events
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public void authenticate(@NonNull CancellationSignal cancel,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull AuthenticationCallback callback) {
+ if (handlePreAuthenticationErrors(callback, executor)) {
+ return;
+ }
+ mFingerprintManager.authenticate(cancel, mBundle, executor, mDialogReceiver, callback);
+ }
+
+ private boolean handlePreAuthenticationErrors(AuthenticationCallback callback,
+ Executor executor) {
+ if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
+ sendError(BiometricDialog.BIOMETRIC_ERROR_HW_NOT_PRESENT, callback,
+ executor);
+ return true;
+ } else if (!mFingerprintManager.isHardwareDetected()) {
+ sendError(BiometricDialog.BIOMETRIC_ERROR_HW_UNAVAILABLE, callback,
+ executor);
+ return true;
+ } else if (!mFingerprintManager.hasEnrolledFingerprints()) {
+ sendError(BiometricDialog.BIOMETRIC_ERROR_NO_BIOMETRICS, callback,
+ executor);
+ return true;
+ }
+ return false;
+ }
+
+ private void sendError(int error, AuthenticationCallback callback, Executor executor) {
+ executor.execute(() -> {
+ callback.onAuthenticationError(error, mFingerprintManager.getErrorString(
+ error, 0 /* vendorCode */));
+ });
+ }
+}
diff --git a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
new file mode 100644
index 0000000..e528aa7
--- /dev/null
+++ b/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.biometrics;
+
+import android.os.Bundle;
+import android.os.UserHandle;
+
+/**
+ * Communication channel from the BiometricDialog (SysUI) back to AuthenticationClient.
+ * @hide
+ */
+oneway interface IBiometricDialogReceiver {
+ void onDialogDismissed(int reason);
+}
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 390b83f..4279b19 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1708,6 +1708,7 @@
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO CONSTRAINED_HIGH_SPEED_VIDEO}</li>
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING MOTION_TRACKING}</li>
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA LOGICAL_MULTI_CAMERA}</li>
+ * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME MONOCHROME}</li>
* </ul></p>
* <p>This key is available on all devices.</p>
*
@@ -1724,6 +1725,7 @@
* @see #REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
* @see #REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING
* @see #REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
+ * @see #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
*/
@PublicKey
public static final Key<int[]> REQUEST_AVAILABLE_CAPABILITIES =
@@ -3392,6 +3394,21 @@
public static final Key<Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE =
new Key<Integer>("android.logicalMultiCamera.sensorSyncType", int.class);
+ /**
+ * <p>List of distortion correction modes for {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} that are
+ * supported by this camera device.</p>
+ * <p>No device is required to support this API; such devices will always list only 'OFF'.
+ * All devices that support this API will list both FAST and HIGH_QUALITY.</p>
+ * <p><b>Range of valid values:</b><br>
+ * Any value listed in {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode}</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
+ */
+ @PublicKey
+ public static final Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES =
+ new Key<int[]>("android.distortionCorrection.availableModes", int[].class);
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 4124536..7ebe0f9 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -43,6 +43,9 @@
import android.util.Log;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
@@ -924,6 +927,37 @@
idCount++;
}
}
+
+ // The sort logic must match the logic in
+ // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
+ Arrays.sort(cameraIds, new Comparator<String>() {
+ @Override
+ public int compare(String s1, String s2) {
+ int s1Int = 0, s2Int = 0;
+ try {
+ s1Int = Integer.parseInt(s1);
+ } catch (NumberFormatException e) {
+ s1Int = -1;
+ }
+
+ try {
+ s2Int = Integer.parseInt(s2);
+ } catch (NumberFormatException e) {
+ s2Int = -1;
+ }
+
+ // Uint device IDs first
+ if (s1Int >= 0 && s2Int >= 0) {
+ return s1Int - s2Int;
+ } else if (s1Int >= 0) {
+ return -1;
+ } else if (s2Int >= 0) {
+ return 1;
+ } else {
+ // Simple string compare if both id are not uint
+ return s1.compareTo(s2);
+ }
+ }});
return cameraIds;
}
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 7669c01..1a5d3ac 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -862,6 +862,13 @@
*/
public static final int REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA = 11;
+ /**
+ * <p>The camera device is a monochrome camera that doesn't contain a color filter array,
+ * and the pixel values on U and Y planes are all 128.</p>
+ * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
+ */
+ public static final int REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME = 12;
+
//
// Enumeration values for CameraCharacteristics#SCALER_CROPPING_TYPE
//
@@ -2730,6 +2737,31 @@
public static final int TONEMAP_PRESET_CURVE_REC709 = 1;
//
+ // Enumeration values for CaptureRequest#DISTORTION_CORRECTION_MODE
+ //
+
+ /**
+ * <p>No distortion correction is applied.</p>
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
+ */
+ public static final int DISTORTION_CORRECTION_MODE_OFF = 0;
+
+ /**
+ * <p>Lens distortion correction is applied without reducing frame rate
+ * relative to sensor output. It may be the same as OFF if distortion correction would
+ * reduce frame rate relative to sensor.</p>
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
+ */
+ public static final int DISTORTION_CORRECTION_MODE_FAST = 1;
+
+ /**
+ * <p>High-quality distortion correction is applied, at the cost of
+ * possibly reduced frame rate relative to sensor output.</p>
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
+ */
+ public static final int DISTORTION_CORRECTION_MODE_HIGH_QUALITY = 2;
+
+ //
// Enumeration values for CaptureResult#CONTROL_AE_STATE
//
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index b0cbec7..411a97e 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -2105,8 +2105,8 @@
* the thumbnail data will also be rotated.</p>
* <p>Note that this orientation is relative to the orientation of the camera sensor, given
* by {@link CameraCharacteristics#SENSOR_ORIENTATION android.sensor.orientation}.</p>
- * <p>To translate from the device orientation given by the Android sensor APIs, the following
- * sample code may be used:</p>
+ * <p>To translate from the device orientation given by the Android sensor APIs for camera
+ * sensors which are not EXTERNAL, the following sample code may be used:</p>
* <pre><code>private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
* if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
* int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
@@ -2125,6 +2125,8 @@
* return jpegOrientation;
* }
* </code></pre>
+ * <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
+ * also be set to EXTERNAL. The above code is not relevant in such case.</p>
* <p><b>Units</b>: Degrees in multiples of 90</p>
* <p><b>Range of valid values:</b><br>
* 0, 90, 180, 270</p>
@@ -2853,6 +2855,8 @@
* of points can be less than max (that is, the request doesn't have to
* always provide a curve with number of points equivalent to
* {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).</p>
+ * <p>For devices with MONOCHROME capability, only red channel is used. Green and blue channels
+ * are ignored.</p>
* <p>A few examples, and their corresponding graphical mappings; these
* only specify the red channel and the precision is limited to 4
* digits, for conciseness.</p>
@@ -2915,6 +2919,8 @@
* of points can be less than max (that is, the request doesn't have to
* always provide a curve with number of points equivalent to
* {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).</p>
+ * <p>For devices with MONOCHROME capability, only red channel is used. Green and blue channels
+ * are ignored.</p>
* <p>A few examples, and their corresponding graphical mappings; these
* only specify the red channel and the precision is limited to 4
* digits, for conciseness.</p>
@@ -3167,6 +3173,49 @@
public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR =
new Key<Float>("android.reprocess.effectiveExposureFactor", float.class);
+ /**
+ * <p>Mode of operation for the lens distortion correction block.</p>
+ * <p>The lens distortion correction block attempts to improve image quality by fixing
+ * radial, tangential, or other geometric aberrations in the camera device's optics. If
+ * available, the {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} field documents the lens's distortion parameters.</p>
+ * <p>OFF means no distortion correction is done.</p>
+ * <p>FAST/HIGH_QUALITY both mean camera device determined distortion correction will be
+ * applied. HIGH_QUALITY mode indicates that the camera device will use the highest-quality
+ * correction algorithms, even if it slows down capture rate. FAST means the camera device
+ * will not slow down capture rate when applying correction. FAST may be the same as OFF if
+ * any correction at all would slow down capture rate. Every output stream will have a
+ * similar amount of enhancement applied.</p>
+ * <p>The correction only applies to processed outputs such as YUV, JPEG, or DEPTH16; it is not
+ * applied to any RAW output. Metadata coordinates such as face rectangles or metering
+ * regions are also not affected by correction.</p>
+ * <p>Applications enabling distortion correction need to pay extra attention when converting
+ * image coordinates between corrected output buffers and the sensor array. For example, if
+ * the app supports tap-to-focus and enables correction, it then has to apply the distortion
+ * model described in {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} to the image buffer tap coordinates to properly
+ * calculate the tap position on the sensor active array to be used with
+ * {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}. The same applies in reverse to detected face rectangles if
+ * they need to be drawn on top of the corrected output buffers.</p>
+ * <p><b>Possible values:</b>
+ * <ul>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_OFF OFF}</li>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_FAST FAST}</li>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li>
+ * </ul></p>
+ * <p><b>Available values for this device:</b><br>
+ * {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_AF_REGIONS
+ * @see CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES
+ * @see CameraCharacteristics#LENS_DISTORTION
+ * @see #DISTORTION_CORRECTION_MODE_OFF
+ * @see #DISTORTION_CORRECTION_MODE_FAST
+ * @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
+ */
+ @PublicKey
+ public static final Key<Integer> DISTORTION_CORRECTION_MODE =
+ new Key<Integer>("android.distortionCorrection.mode", int.class);
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 6331942..c156616 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2422,8 +2422,8 @@
* the thumbnail data will also be rotated.</p>
* <p>Note that this orientation is relative to the orientation of the camera sensor, given
* by {@link CameraCharacteristics#SENSOR_ORIENTATION android.sensor.orientation}.</p>
- * <p>To translate from the device orientation given by the Android sensor APIs, the following
- * sample code may be used:</p>
+ * <p>To translate from the device orientation given by the Android sensor APIs for camera
+ * sensors which are not EXTERNAL, the following sample code may be used:</p>
* <pre><code>private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
* if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
* int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
@@ -2442,6 +2442,8 @@
* return jpegOrientation;
* }
* </code></pre>
+ * <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
+ * also be set to EXTERNAL. The above code is not relevant in such case.</p>
* <p><b>Units</b>: Degrees in multiples of 90</p>
* <p><b>Range of valid values:</b><br>
* 0, 90, 180, 270</p>
@@ -4096,6 +4098,8 @@
* of points can be less than max (that is, the request doesn't have to
* always provide a curve with number of points equivalent to
* {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).</p>
+ * <p>For devices with MONOCHROME capability, only red channel is used. Green and blue channels
+ * are ignored.</p>
* <p>A few examples, and their corresponding graphical mappings; these
* only specify the red channel and the precision is limited to 4
* digits, for conciseness.</p>
@@ -4158,6 +4162,8 @@
* of points can be less than max (that is, the request doesn't have to
* always provide a curve with number of points equivalent to
* {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).</p>
+ * <p>For devices with MONOCHROME capability, only red channel is used. Green and blue channels
+ * are ignored.</p>
* <p>A few examples, and their corresponding graphical mappings; these
* only specify the red channel and the precision is limited to 4
* digits, for conciseness.</p>
@@ -4450,6 +4456,49 @@
public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR =
new Key<Float>("android.reprocess.effectiveExposureFactor", float.class);
+ /**
+ * <p>Mode of operation for the lens distortion correction block.</p>
+ * <p>The lens distortion correction block attempts to improve image quality by fixing
+ * radial, tangential, or other geometric aberrations in the camera device's optics. If
+ * available, the {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} field documents the lens's distortion parameters.</p>
+ * <p>OFF means no distortion correction is done.</p>
+ * <p>FAST/HIGH_QUALITY both mean camera device determined distortion correction will be
+ * applied. HIGH_QUALITY mode indicates that the camera device will use the highest-quality
+ * correction algorithms, even if it slows down capture rate. FAST means the camera device
+ * will not slow down capture rate when applying correction. FAST may be the same as OFF if
+ * any correction at all would slow down capture rate. Every output stream will have a
+ * similar amount of enhancement applied.</p>
+ * <p>The correction only applies to processed outputs such as YUV, JPEG, or DEPTH16; it is not
+ * applied to any RAW output. Metadata coordinates such as face rectangles or metering
+ * regions are also not affected by correction.</p>
+ * <p>Applications enabling distortion correction need to pay extra attention when converting
+ * image coordinates between corrected output buffers and the sensor array. For example, if
+ * the app supports tap-to-focus and enables correction, it then has to apply the distortion
+ * model described in {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} to the image buffer tap coordinates to properly
+ * calculate the tap position on the sensor active array to be used with
+ * {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}. The same applies in reverse to detected face rectangles if
+ * they need to be drawn on top of the corrected output buffers.</p>
+ * <p><b>Possible values:</b>
+ * <ul>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_OFF OFF}</li>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_FAST FAST}</li>
+ * <li>{@link #DISTORTION_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li>
+ * </ul></p>
+ * <p><b>Available values for this device:</b><br>
+ * {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_AF_REGIONS
+ * @see CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES
+ * @see CameraCharacteristics#LENS_DISTORTION
+ * @see #DISTORTION_CORRECTION_MODE_OFF
+ * @see #DISTORTION_CORRECTION_MODE_FAST
+ * @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
+ */
+ @PublicKey
+ public static final Key<Integer> DISTORTION_CORRECTION_MODE =
+ new Key<Integer>("android.distortionCorrection.mode", int.class);
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
diff --git a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
index 93d6001..55130c8 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
@@ -62,14 +62,14 @@
* exceptions.</p>
*
* @param errorFlag error to throw as an exception.
- * @throws {@link BufferQueueAbandonedException} for -ENODEV.
+ * @throws {@link BufferQueueAbandonedException} for BAD_VALUE.
* @throws {@link UnsupportedOperationException} for an unknown negative error code.
* @return {@code errorFlag} if the value was non-negative, throws otherwise.
*/
public static int throwOnError(int errorFlag) throws BufferQueueAbandonedException {
if (errorFlag == NO_ERROR) {
return NO_ERROR;
- } else if (errorFlag == -ENODEV) {
+ } else if (errorFlag == BAD_VALUE) {
throw new BufferQueueAbandonedException();
}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index a3b2d22..efb9517 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -535,6 +535,19 @@
}
/**
+ * Set the level of color saturation to apply to the display.
+ * @param level The amount of saturation to apply, between 0 and 1 inclusive.
+ * 0 produces a grayscale image, 1 is normal.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_SATURATION)
+ public void setSaturationLevel(float level) {
+ mGlobal.setSaturationLevel(level);
+ }
+
+ /**
* Creates a virtual display.
*
* @see #createVirtualDisplay(String, int, int, int, Surface, int,
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 1f67a6b..2d0ef2f 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -384,6 +384,17 @@
}
}
+ /**
+ * Set the level of color saturation to apply to the display.
+ */
+ public void setSaturationLevel(float level) {
+ try {
+ mDm.setSaturationLevel(level);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
public VirtualDisplay createVirtualDisplay(Context context, MediaProjection projection,
String name, int width, int height, int densityDpi, Surface surface, int flags,
VirtualDisplay.Callback callback, Handler handler, String uniqueId) {
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 9fcb9d3..b77de748 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -65,6 +65,9 @@
// Requires CONFIGURE_DISPLAY_COLOR_MODE
void requestColorMode(int displayId, int colorMode);
+ // Requires CONTROL_DISPLAY_SATURATION
+ void setSaturationLevel(float level);
+
// Requires CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT, or an appropriate
// MediaProjection token for certain combinations of flags.
int createVirtualDisplay(in IVirtualDisplayCallback callback,
diff --git a/core/java/android/hardware/fingerprint/FingerprintDialog.java b/core/java/android/hardware/fingerprint/FingerprintDialog.java
deleted file mode 100644
index 49835963..0000000
--- a/core/java/android/hardware/fingerprint/FingerprintDialog.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.fingerprint;
-
-import static android.Manifest.permission.USE_FINGERPRINT;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.NonNull;
-import android.annotation.RequiresPermission;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.pm.PackageManager;
-import android.hardware.biometrics.BiometricAuthenticator;
-import android.hardware.biometrics.BiometricFingerprintConstants;
-import android.hardware.biometrics.CryptoObject;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
-import android.os.Bundle;
-import android.os.CancellationSignal;
-import android.text.TextUtils;
-
-import java.security.Signature;
-import java.util.concurrent.Executor;
-
-import javax.crypto.Cipher;
-import javax.crypto.Mac;
-
-/**
- * A class that manages a system-provided fingerprint dialog.
- */
-public class FingerprintDialog implements BiometricAuthenticator, BiometricFingerprintConstants {
-
- /**
- * @hide
- */
- public static final String KEY_TITLE = "title";
- /**
- * @hide
- */
- public static final String KEY_SUBTITLE = "subtitle";
- /**
- * @hide
- */
- public static final String KEY_DESCRIPTION = "description";
- /**
- * @hide
- */
- public static final String KEY_POSITIVE_TEXT = "positive_text";
- /**
- * @hide
- */
- public static final String KEY_NEGATIVE_TEXT = "negative_text";
-
- /**
- * Error/help message will show for this amount of time.
- * For error messages, the dialog will also be dismissed after this amount of time.
- * Error messages will be propagated back to the application via AuthenticationCallback
- * after this amount of time.
- * @hide
- */
- public static final int HIDE_DIALOG_DELAY = 3000; // ms
- /**
- * @hide
- */
- public static final int DISMISSED_REASON_POSITIVE = 1;
-
- /**
- * @hide
- */
- public static final int DISMISSED_REASON_NEGATIVE = 2;
-
- /**
- * @hide
- */
- public static final int DISMISSED_REASON_USER_CANCEL = 3;
-
- private static class ButtonInfo {
- Executor executor;
- DialogInterface.OnClickListener listener;
- ButtonInfo(Executor ex, DialogInterface.OnClickListener l) {
- executor = ex;
- listener = l;
- }
- }
-
- /**
- * A builder that collects arguments, to be shown on the system-provided fingerprint dialog.
- **/
- public static class Builder {
- private final Bundle bundle;
- private ButtonInfo positiveButtonInfo;
- private ButtonInfo negativeButtonInfo;
-
- /**
- * Creates a builder for a fingerprint dialog.
- */
- public Builder() {
- bundle = new Bundle();
- }
-
- /**
- * Required: Set the title to display.
- * @param title
- * @return
- */
- public Builder setTitle(@NonNull CharSequence title) {
- bundle.putCharSequence(KEY_TITLE, title);
- return this;
- }
-
- /**
- * Optional: Set the subtitle to display.
- * @param subtitle
- * @return
- */
- public Builder setSubtitle(@NonNull CharSequence subtitle) {
- bundle.putCharSequence(KEY_SUBTITLE, subtitle);
- return this;
- }
-
- /**
- * Optional: Set the description to display.
- * @param description
- * @return
- */
- public Builder setDescription(@NonNull CharSequence description) {
- bundle.putCharSequence(KEY_DESCRIPTION, description);
- return this;
- }
-
- /**
- * Optional: Set the text for the positive button. If not set, the positive button
- * will not show.
- * @param text
- * @return
- * @hide
- */
- public Builder setPositiveButton(@NonNull CharSequence text,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull DialogInterface.OnClickListener listener) {
- if (TextUtils.isEmpty(text)) {
- throw new IllegalArgumentException("Text must be set and non-empty");
- }
- if (executor == null) {
- throw new IllegalArgumentException("Executor must not be null");
- }
- if (listener == null) {
- throw new IllegalArgumentException("Listener must not be null");
- }
- bundle.putCharSequence(KEY_POSITIVE_TEXT, text);
- positiveButtonInfo = new ButtonInfo(executor, listener);
- return this;
- }
-
- /**
- * Required: Set the text for the negative button.
- * @param text
- * @return
- */
- public Builder setNegativeButton(@NonNull CharSequence text,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull DialogInterface.OnClickListener listener) {
- if (TextUtils.isEmpty(text)) {
- throw new IllegalArgumentException("Text must be set and non-empty");
- }
- if (executor == null) {
- throw new IllegalArgumentException("Executor must not be null");
- }
- if (listener == null) {
- throw new IllegalArgumentException("Listener must not be null");
- }
- bundle.putCharSequence(KEY_NEGATIVE_TEXT, text);
- negativeButtonInfo = new ButtonInfo(executor, listener);
- return this;
- }
-
- /**
- * Creates a {@link FingerprintDialog} with the arguments supplied to this builder.
- * @param context
- * @return a {@link FingerprintDialog}
- * @throws IllegalArgumentException if any of the required fields are not set.
- */
- public FingerprintDialog build(Context context) {
- final CharSequence title = bundle.getCharSequence(KEY_TITLE);
- final CharSequence negative = bundle.getCharSequence(KEY_NEGATIVE_TEXT);
-
- if (TextUtils.isEmpty(title)) {
- throw new IllegalArgumentException("Title must be set and non-empty");
- } else if (TextUtils.isEmpty(negative)) {
- throw new IllegalArgumentException("Negative text must be set and non-empty");
- }
- return new FingerprintDialog(context, bundle, positiveButtonInfo, negativeButtonInfo);
- }
- }
-
- private PackageManager mPackageManager;
- private FingerprintManager mFingerprintManager;
- private Bundle mBundle;
- private ButtonInfo mPositiveButtonInfo;
- private ButtonInfo mNegativeButtonInfo;
-
- IFingerprintDialogReceiver mDialogReceiver = new IFingerprintDialogReceiver.Stub() {
- @Override
- public void onDialogDismissed(int reason) {
- // Check the reason and invoke OnClickListener(s) if necessary
- if (reason == DISMISSED_REASON_POSITIVE) {
- mPositiveButtonInfo.executor.execute(() -> {
- mPositiveButtonInfo.listener.onClick(null, DialogInterface.BUTTON_POSITIVE);
- });
- } else if (reason == DISMISSED_REASON_NEGATIVE) {
- mNegativeButtonInfo.executor.execute(() -> {
- mNegativeButtonInfo.listener.onClick(null, DialogInterface.BUTTON_NEGATIVE);
- });
- }
- }
- };
-
- private FingerprintDialog(Context context, Bundle bundle,
- ButtonInfo positiveButtonInfo, ButtonInfo negativeButtonInfo) {
- mBundle = bundle;
- mPositiveButtonInfo = positiveButtonInfo;
- mNegativeButtonInfo = negativeButtonInfo;
- mFingerprintManager = context.getSystemService(FingerprintManager.class);
- mPackageManager = context.getPackageManager();
- }
-
- /**
- * A wrapper class for the crypto objects supported by FingerprintManager. Currently the
- * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
- */
- public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
- public CryptoObject(@NonNull Signature signature) {
- super(signature);
- }
-
- public CryptoObject(@NonNull Cipher cipher) {
- super(cipher);
- }
-
- public CryptoObject(@NonNull Mac mac) {
- super(mac);
- }
-
- /**
- * Get {@link Signature} object.
- * @return {@link Signature} object or null if this doesn't contain one.
- */
- public Signature getSignature() {
- return super.getSignature();
- }
-
- /**
- * Get {@link Cipher} object.
- * @return {@link Cipher} object or null if this doesn't contain one.
- */
- public Cipher getCipher() {
- return super.getCipher();
- }
-
- /**
- * Get {@link Mac} object.
- * @return {@link Mac} object or null if this doesn't contain one.
- */
- public Mac getMac() {
- return super.getMac();
- }
- }
-
- /**
- * Container for callback data from {@link #authenticate(
- * CancellationSignal, Executor, AuthenticationCallback)} and
- * {@link #authenticate(CryptoObject, CancellationSignal, Executor,
- * AuthenticationCallback)}
- */
- public static class AuthenticationResult extends BiometricAuthenticator.AuthenticationResult {
- /**
- * Authentication result
- * @param crypto
- * @param identifier
- * @param userId
- * @hide
- */
- public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier,
- int userId) {
- super(crypto, identifier, userId);
- }
- /**
- * Obtain the crypto object associated with this transaction
- * @return crypto object provided to {@link #authenticate(
- * CryptoObject, CancellationSignal, Executor, AuthenticationCallback)}
- */
- public CryptoObject getCryptoObject() {
- return (CryptoObject) super.getCryptoObject();
- }
- }
-
- /**
- * Callback structure provided to {@link FingerprintDialog#authenticate(CancellationSignal,
- * Executor, AuthenticationCallback)} or {@link FingerprintDialog#authenticate(CryptoObject,
- * CancellationSignal, Executor, AuthenticationCallback)}. Users must provide an implementation
- * of this for listening to authentication events.
- */
- public static abstract class AuthenticationCallback extends
- BiometricAuthenticator.AuthenticationCallback {
- /**
- * Called when an unrecoverable error has been encountered and the operation is complete.
- * No further actions will be made on this object.
- * @param errorCode An integer identifying the error message
- * @param errString A human-readable error string that can be shown on an UI
- */
- @Override
- public void onAuthenticationError(int errorCode, CharSequence errString) {}
-
- /**
- * Called when a recoverable error has been encountered during authentication. The help
- * string is provided to give the user guidance for what went wrong, such as "Sensor dirty,
- * please clean it."
- * @param helpCode An integer identifying the error message
- * @param helpString A human-readable string that can be shown on an UI
- */
- @Override
- public void onAuthenticationHelp(int helpCode, CharSequence helpString) {}
-
- /**
- * Called when a biometric is recognized.
- * @param result An object containing authentication-related data
- */
- public void onAuthenticationSucceeded(AuthenticationResult result) {}
-
- /**
- * Called when a biometric is valid but not recognized.
- */
- @Override
- public void onAuthenticationFailed() {}
-
- /**
- * Called when a biometric has been acquired, but hasn't been processed yet.
- * @hide
- */
- @Override
- public void onAuthenticationAcquired(int acquireInfo) {}
-
- /**
- * @param result An object containing authentication-related data
- * @hide
- */
- @Override
- public void onAuthenticationSucceeded(BiometricAuthenticator.AuthenticationResult result) {
- onAuthenticationSucceeded(new AuthenticationResult(
- (CryptoObject) result.getCryptoObject(),
- result.getId(),
- result.getUserId()));
- }
- }
-
-
- /**
- * @param crypto Object associated with the call
- * @param cancel An object that can be used to cancel authentication
- * @param executor An executor to handle callback events
- * @param callback An object to receive authentication events
- * @hide
- */
- @Override
- public void authenticate(@NonNull android.hardware.biometrics.CryptoObject crypto,
- @NonNull CancellationSignal cancel,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
- if (!(callback instanceof FingerprintDialog.AuthenticationCallback)) {
- throw new IllegalArgumentException("Callback cannot be casted");
- }
- authenticate(crypto, cancel, executor, (AuthenticationCallback) callback);
- }
-
- /**
- *
- * @param cancel An object that can be used to cancel authentication
- * @param executor An executor to handle callback events
- * @param callback An object to receive authentication events
- * @hide
- */
- @Override
- public void authenticate(@NonNull CancellationSignal cancel,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
- if (!(callback instanceof FingerprintDialog.AuthenticationCallback)) {
- throw new IllegalArgumentException("Callback cannot be casted");
- }
- authenticate(cancel, executor, (AuthenticationCallback) callback);
- }
-
-
- /**
- * This call warms up the fingerprint hardware, displays a system-provided dialog,
- * and starts scanning for a fingerprint. It terminates when
- * {@link AuthenticationCallback#onAuthenticationError(int,
- * CharSequence)} is called, when
- * {@link AuthenticationCallback#onAuthenticationSucceeded(
- * AuthenticationResult)}, or when the user dismisses the system-provided dialog, at which point
- * the crypto object becomes invalid. This operation can be canceled by using the provided
- * cancel object. The application will receive authentication errors through
- * {@link AuthenticationCallback}, and button events through the
- * corresponding callback set in {@link Builder#setNegativeButton(CharSequence,
- * Executor, DialogInterface.OnClickListener)}. It is safe to reuse the
- * {@link FingerprintDialog} object, and calling {@link FingerprintDialog#authenticate(
- * CancellationSignal, Executor, AuthenticationCallback)} while an
- * existing authentication attempt is occurring will stop the previous client and start a
- * new authentication. The interrupted client will receive a cancelled notification through
- * {@link AuthenticationCallback#onAuthenticationError(int,
- * CharSequence)}.
- *
- * @throws IllegalArgumentException If any of the arguments are null
- *
- * @param crypto Object associated with the call
- * @param cancel An object that can be used to cancel authentication
- * @param executor An executor to handle callback events
- * @param callback An object to receive authentication events
- */
- @RequiresPermission(USE_FINGERPRINT)
- public void authenticate(@NonNull CryptoObject crypto,
- @NonNull CancellationSignal cancel,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull AuthenticationCallback callback) {
- if (handlePreAuthenticationErrors(callback, executor)) {
- return;
- }
- mFingerprintManager.authenticate(crypto, cancel, mBundle, executor, mDialogReceiver,
- callback);
- }
-
- /**
- * This call warms up the fingerprint hardware, displays a system-provided dialog,
- * and starts scanning for a fingerprint. It terminates when
- * {@link AuthenticationCallback#onAuthenticationError(int,
- * CharSequence)} is called, when
- * {@link AuthenticationCallback#onAuthenticationSucceeded(
- * AuthenticationResult)} is called, or when the user dismisses the system-provided dialog.
- * This operation can be canceled by using the provided cancel object. The application will
- * receive authentication errors through {@link AuthenticationCallback},
- * and button events through the corresponding callback set in
- * {@link Builder#setNegativeButton(CharSequence, Executor, DialogInterface.OnClickListener)}.
- * It is safe to reuse the {@link FingerprintDialog} object, and calling
- * {@link FingerprintDialog#authenticate(CancellationSignal, Executor,
- * AuthenticationCallback)} while an existing authentication attempt is
- * occurring will stop the previous client and start a new authentication. The interrupted
- * client will receive a cancelled notification through
- * {@link AuthenticationCallback#onAuthenticationError(int,
- * CharSequence)}.
- *
- * @throws IllegalArgumentException If any of the arguments are null
- *
- * @param cancel An object that can be used to cancel authentication
- * @param executor An executor to handle callback events
- * @param callback An object to receive authentication events
- */
- @RequiresPermission(USE_FINGERPRINT)
- public void authenticate(@NonNull CancellationSignal cancel,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull AuthenticationCallback callback) {
- if (handlePreAuthenticationErrors(callback, executor)) {
- return;
- }
- mFingerprintManager.authenticate(cancel, mBundle, executor, mDialogReceiver, callback);
- }
-
- private boolean handlePreAuthenticationErrors(AuthenticationCallback callback,
- Executor executor) {
- if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
- sendError(FINGERPRINT_ERROR_HW_NOT_PRESENT, callback, executor);
- return true;
- } else if (!mFingerprintManager.isHardwareDetected()) {
- sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, callback, executor);
- return true;
- } else if (!mFingerprintManager.hasEnrolledFingerprints()) {
- sendError(FINGERPRINT_ERROR_NO_FINGERPRINTS, callback, executor);
- return true;
- }
- return false;
- }
-
- private void sendError(int error, AuthenticationCallback callback, Executor executor) {
- executor.execute(() -> {
- callback.onAuthenticationError(error, mFingerprintManager.getErrorString(
- error, 0 /* vendorCode */));
- });
- }
-}
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 8048099c..a6c8c67 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -18,6 +18,7 @@
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
+import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_FINGERPRINT;
import android.annotation.CallbackExecutor;
@@ -30,7 +31,9 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricDialog;
import android.hardware.biometrics.BiometricFingerprintConstants;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.os.Binder;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -54,10 +57,10 @@
/**
* A class that coordinates access to the fingerprint hardware.
- * @deprecated See {@link FingerprintDialog} which shows a system-provided dialog upon starting
- * authentication. In a world where devices may have in-display fingerprint sensors, it's much
- * more realistic to have a system-provided authentication dialog since the in-display sensor
- * location may vary by vendor/device.
+ * @deprecated See {@link BiometricDialog} which shows a system-provided dialog upon starting
+ * authentication. In a world where devices may have different types of biometric authentication,
+ * it's much more realistic to have a system-provided authentication dialog since the method may
+ * vary by vendor/device.
*/
@Deprecated
@SystemService(Context.FINGERPRINT_SERVICE)
@@ -108,7 +111,7 @@
/**
* A wrapper class for the crypto objects supported by FingerprintManager. Currently the
* framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
- * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.CryptoObject}
+ * @deprecated See {@link android.hardware.biometrics.BiometricDialog.CryptoObject}
*/
@Deprecated
public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
@@ -152,7 +155,7 @@
/**
* Container for callback data from {@link FingerprintManager#authenticate(CryptoObject,
* CancellationSignal, int, AuthenticationCallback, Handler)}.
- * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationResult}
+ * @deprecated See {@link android.hardware.biometrics.BiometricDialog.AuthenticationResult}
*/
@Deprecated
public static class AuthenticationResult {
@@ -201,7 +204,7 @@
* FingerprintManager#authenticate(CryptoObject, CancellationSignal,
* int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to
* fingerprint events.
- * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback}
+ * @deprecated See {@link android.hardware.biometrics.BiometricDialog.AuthenticationCallback}
*/
@Deprecated
public static abstract class AuthenticationCallback
@@ -375,13 +378,13 @@
* by <a href="{@docRoot}training/articles/keystore.html">Android Keystore
* facility</a>.
* @throws IllegalStateException if the crypto primitive is not initialized.
- * @deprecated See {@link FingerprintDialog#authenticate(CancellationSignal, Executor,
- * FingerprintDialog.AuthenticationCallback)} and {@link FingerprintDialog#authenticate(
- * FingerprintDialog.CryptoObject, CancellationSignal, Executor,
- * FingerprintDialog.AuthenticationCallback)}
+ * @deprecated See {@link BiometricDialog#authenticate(CancellationSignal, Executor,
+ * BiometricDialog.AuthenticationCallback)} and {@link BiometricDialog#authenticate(
+ * BiometricDialog.CryptoObject, CancellationSignal, Executor,
+ * BiometricDialog.AuthenticationCallback)}
*/
@Deprecated
- @RequiresPermission(USE_FINGERPRINT)
+ @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT})
public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) {
authenticate(crypto, cancel, flags, callback, handler, mContext.getUserId());
@@ -405,7 +408,7 @@
* @param userId the user ID that the fingerprint hardware will authenticate for.
* @hide
*/
- @RequiresPermission(USE_FINGERPRINT)
+ @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT})
public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
int flags, @NonNull AuthenticationCallback callback, Handler handler, int userId) {
if (callback == null) {
@@ -441,7 +444,7 @@
/**
* Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
- * CancellationSignal, Bundle, Executor, IFingerprintDialogReceiver, AuthenticationCallback)}
+ * CancellationSignal, Bundle, Executor, IBiometricDialogReceiver, AuthenticationCallback)}
* @param userId the user ID that the fingerprint hardware will authenticate for.
*/
private void authenticate(int userId,
@@ -449,7 +452,7 @@
@NonNull CancellationSignal cancel,
@NonNull Bundle bundle,
@NonNull @CallbackExecutor Executor executor,
- @NonNull IFingerprintDialogReceiver receiver,
+ @NonNull IBiometricDialogReceiver receiver,
@NonNull BiometricAuthenticator.AuthenticationCallback callback) {
mCryptoObject = crypto;
if (cancel.isCanceled()) {
@@ -477,8 +480,8 @@
}
/**
- * Private method, see {@link FingerprintDialog#authenticate(CancellationSignal, Executor,
- * AuthenticationCallback)}
+ * Private method, see {@link BiometricDialog#authenticate(CancellationSignal, Executor,
+ * BiometricDialog.AuthenticationCallback)}
* @param cancel
* @param executor
* @param callback
@@ -488,7 +491,7 @@
@NonNull CancellationSignal cancel,
@NonNull Bundle bundle,
@NonNull @CallbackExecutor Executor executor,
- @NonNull IFingerprintDialogReceiver receiver,
+ @NonNull IBiometricDialogReceiver receiver,
@NonNull BiometricAuthenticator.AuthenticationCallback callback) {
if (cancel == null) {
throw new IllegalArgumentException("Must supply a cancellation signal");
@@ -509,8 +512,8 @@
}
/**
- * Private method, see {@link FingerprintDialog#authenticate(CryptoObject, CancellationSignal,
- * Executor, AuthenticationCallback)}
+ * Private method, see {@link BiometricDialog#authenticate(BiometricDialog.CryptoObject,
+ * CancellationSignal, Executor, BiometricDialog.AuthenticationCallback)}
* @param crypto
* @param cancel
* @param executor
@@ -521,7 +524,7 @@
@NonNull CancellationSignal cancel,
@NonNull Bundle bundle,
@NonNull @CallbackExecutor Executor executor,
- @NonNull IFingerprintDialogReceiver receiver,
+ @NonNull IBiometricDialogReceiver receiver,
@NonNull BiometricAuthenticator.AuthenticationCallback callback) {
if (crypto == null) {
throw new IllegalArgumentException("Must supply a crypto object");
@@ -740,8 +743,8 @@
* Determine if there is at least one fingerprint enrolled.
*
* @return true if at least one fingerprint is enrolled, false otherwise
- * @deprecated See {@link FingerprintDialog} and
- * {@link FingerprintDialog#FINGERPRINT_ERROR_NO_FINGERPRINTS}
+ * @deprecated See {@link BiometricDialog} and
+ * {@link FingerprintManager#FINGERPRINT_ERROR_NO_FINGERPRINTS}
*/
@Deprecated
@RequiresPermission(USE_FINGERPRINT)
@@ -774,8 +777,8 @@
* Determine if fingerprint hardware is present and functional.
*
* @return true if hardware is present and functional, false otherwise.
- * @deprecated See {@link FingerprintDialog} and
- * {@link FingerprintDialog#FINGERPRINT_ERROR_HW_UNAVAILABLE}
+ * @deprecated See {@link BiometricDialog} and
+ * {@link FingerprintManager#FINGERPRINT_ERROR_HW_UNAVAILABLE}
*/
@Deprecated
@RequiresPermission(USE_FINGERPRINT)
@@ -1155,9 +1158,22 @@
@Override // binder call
public void onError(long deviceId, int error, int vendorCode) {
if (mExecutor != null) {
- mExecutor.execute(() -> {
- sendErrorResult(deviceId, error, vendorCode);
- });
+ // BiometricDialog case
+ if (error == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED) {
+ // User tapped somewhere to cancel, the biometric dialog is already dismissed.
+ mExecutor.execute(() -> {
+ sendErrorResult(deviceId, error, vendorCode);
+ });
+ } else {
+ // User got an error that needs to be displayed on the dialog, post a delayed
+ // runnable on the FingerprintManager handler that sends the error message after
+ // FingerprintDialog.HIDE_DIALOG_DELAY to send the error to the application.
+ mHandler.postDelayed(() -> {
+ mExecutor.execute(() -> {
+ sendErrorResult(deviceId, error, vendorCode);
+ });
+ }, BiometricDialog.HIDE_DIALOG_DELAY);
+ }
} else {
mHandler.obtainMessage(MSG_ERROR, error, vendorCode, deviceId).sendToTarget();
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintDialogReceiver.aidl b/core/java/android/hardware/fingerprint/IFingerprintDialogReceiver.aidl
deleted file mode 100644
index 13e7974..0000000
--- a/core/java/android/hardware/fingerprint/IFingerprintDialogReceiver.aidl
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.fingerprint;
-
-import android.hardware.fingerprint.Fingerprint;
-import android.os.Bundle;
-import android.os.UserHandle;
-
-/**
- * Communication channel from the FingerprintDialog (SysUI) back to AuthenticationClient.
- * @hide
- */
-oneway interface IFingerprintDialogReceiver {
- void onDialogDismissed(int reason);
-}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index f1502e4..78d01e5 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -16,8 +16,8 @@
package android.hardware.fingerprint;
import android.os.Bundle;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.hardware.fingerprint.Fingerprint;
@@ -31,7 +31,7 @@
// Authenticate the given sessionId with a fingerprint
void authenticate(IBinder token, long sessionId, int userId,
IFingerprintServiceReceiver receiver, int flags, String opPackageName,
- in Bundle bundle, IFingerprintDialogReceiver dialogReceiver);
+ in Bundle bundle, IBiometricDialogReceiver dialogReceiver);
// Cancel authentication for the given sessionId
void cancelAuthentication(IBinder token, String opPackageName);
diff --git a/core/java/android/hardware/radio/ProgramList.java b/core/java/android/hardware/radio/ProgramList.java
index b2aa9ba..e6f523c 100644
--- a/core/java/android/hardware/radio/ProgramList.java
+++ b/core/java/android/hardware/radio/ProgramList.java
@@ -263,6 +263,17 @@
/**
* @hide for framework use only
*/
+ public Filter() {
+ mIdentifierTypes = Collections.emptySet();
+ mIdentifiers = Collections.emptySet();
+ mIncludeCategories = false;
+ mExcludeModifications = false;
+ mVendorFilter = null;
+ }
+
+ /**
+ * @hide for framework use only
+ */
public Filter(@Nullable Map<String, String> vendorFilter) {
mIdentifierTypes = Collections.emptySet();
mIdentifiers = Collections.emptySet();
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 8fde82e..8263bb8 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -211,6 +211,7 @@
private final String mSerial;
private final int mNumTuners;
private final int mNumAudioSources;
+ private final boolean mIsInitializationRequired;
private final boolean mIsCaptureSupported;
private final BandDescriptor[] mBands;
private final boolean mIsBgScanSupported;
@@ -222,7 +223,8 @@
/** @hide */
public ModuleProperties(int id, String serviceName, int classId, String implementor,
String product, String version, String serial, int numTuners, int numAudioSources,
- boolean isCaptureSupported, BandDescriptor[] bands, boolean isBgScanSupported,
+ boolean isInitializationRequired, boolean isCaptureSupported,
+ BandDescriptor[] bands, boolean isBgScanSupported,
@ProgramSelector.ProgramType int[] supportedProgramTypes,
@ProgramSelector.IdentifierType int[] supportedIdentifierTypes,
@Nullable Map<String, Integer> dabFrequencyTable,
@@ -236,6 +238,7 @@
mSerial = serial;
mNumTuners = numTuners;
mNumAudioSources = numAudioSources;
+ mIsInitializationRequired = isInitializationRequired;
mIsCaptureSupported = isCaptureSupported;
mBands = bands;
mIsBgScanSupported = isBgScanSupported;
@@ -329,6 +332,18 @@
return mNumAudioSources;
}
+ /**
+ * Checks, if BandConfig initialization (after {@link RadioManager#openTuner})
+ * is required to be done before other operations or not.
+ *
+ * If it is, the client has to wait for {@link RadioTuner.Callback#onConfigurationChanged}
+ * callback before executing any other operations. Otherwise, such operation will fail
+ * returning {@link RadioManager#STATUS_INVALID_OPERATION} error code.
+ */
+ public boolean isInitializationRequired() {
+ return mIsInitializationRequired;
+ }
+
/** {@code true} if audio capture is possible from radio tuner output.
* This indicates if routing to audio devices not connected to the same HAL as the FM radio
* is possible (e.g. to USB) or DAR (Digital Audio Recorder) feature can be implemented.
@@ -419,6 +434,7 @@
mSerial = in.readString();
mNumTuners = in.readInt();
mNumAudioSources = in.readInt();
+ mIsInitializationRequired = in.readInt() == 1;
mIsCaptureSupported = in.readInt() == 1;
Parcelable[] tmp = in.readParcelableArray(BandDescriptor.class.getClassLoader());
mBands = new BandDescriptor[tmp.length];
@@ -454,6 +470,7 @@
dest.writeString(mSerial);
dest.writeInt(mNumTuners);
dest.writeInt(mNumAudioSources);
+ dest.writeInt(mIsInitializationRequired ? 1 : 0);
dest.writeInt(mIsCaptureSupported ? 1 : 0);
dest.writeParcelableArray(mBands, flags);
dest.writeInt(mIsBgScanSupported ? 1 : 0);
@@ -476,6 +493,7 @@
+ ", mVersion=" + mVersion + ", mSerial=" + mSerial
+ ", mNumTuners=" + mNumTuners
+ ", mNumAudioSources=" + mNumAudioSources
+ + ", mIsInitializationRequired=" + mIsInitializationRequired
+ ", mIsCaptureSupported=" + mIsCaptureSupported
+ ", mIsBgScanSupported=" + mIsBgScanSupported
+ ", mBands=" + Arrays.toString(mBands) + "]";
@@ -484,8 +502,8 @@
@Override
public int hashCode() {
return Objects.hash(mId, mServiceName, mClassId, mImplementor, mProduct, mVersion,
- mSerial, mNumTuners, mNumAudioSources, mIsCaptureSupported, mBands,
- mIsBgScanSupported, mDabFrequencyTable, mVendorInfo);
+ mSerial, mNumTuners, mNumAudioSources, mIsInitializationRequired,
+ mIsCaptureSupported, mBands, mIsBgScanSupported, mDabFrequencyTable, mVendorInfo);
}
@Override
@@ -503,6 +521,7 @@
if (!Objects.equals(mSerial, other.mSerial)) return false;
if (mNumTuners != other.mNumTuners) return false;
if (mNumAudioSources != other.mNumAudioSources) return false;
+ if (mIsInitializationRequired != other.mIsInitializationRequired) return false;
if (mIsCaptureSupported != other.mIsCaptureSupported) return false;
if (!Objects.equals(mBands, other.mBands)) return false;
if (mIsBgScanSupported != other.mIsBgScanSupported) return false;
diff --git a/core/java/android/hardware/radio/TunerAdapter.java b/core/java/android/hardware/radio/TunerAdapter.java
index 85f3115..be2846f 100644
--- a/core/java/android/hardware/radio/TunerAdapter.java
+++ b/core/java/android/hardware/radio/TunerAdapter.java
@@ -60,6 +60,7 @@
mLegacyListProxy.close();
mLegacyListProxy = null;
}
+ mCallback.close();
}
try {
mTuner.close();
@@ -278,6 +279,7 @@
try {
mTuner.startProgramListUpdates(filter);
} catch (UnsupportedOperationException ex) {
+ Log.i(TAG, "Program list is not supported with this hardware");
return null;
} catch (RemoteException ex) {
mCallback.setProgramListObserver(null, () -> { });
diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java
index 7437c40..0fb93e5 100644
--- a/core/java/android/hardware/radio/TunerCallbackAdapter.java
+++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java
@@ -53,6 +53,12 @@
}
}
+ void close() {
+ synchronized (mLock) {
+ if (mProgramList != null) mProgramList.close();
+ }
+ }
+
void setProgramListObserver(@Nullable ProgramList programList,
@NonNull ProgramList.OnCloseListener closeListener) {
Objects.requireNonNull(closeListener);
diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl
index 91bbdc7..6d9c913 100644
--- a/core/java/android/hardware/usb/IUsbManager.aidl
+++ b/core/java/android/hardware/usb/IUsbManager.aidl
@@ -105,6 +105,12 @@
/* Gets the current screen unlocked functions. */
long getScreenUnlockedFunctions();
+ /* Get the functionfs control handle for the given function. Usb
+ * descriptors will already be written, and the handle will be
+ * ready to use.
+ */
+ ParcelFileDescriptor getControlFd(long function);
+
/* Allow USB debugging from the attached host. If alwaysAllow is true, add the
* the public key to list of host keys that the user has approved.
*/
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 572c585..46142e3 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -192,14 +192,6 @@
public static final String USB_DATA_UNLOCKED = "unlocked";
/**
- * Boolean extra indicating whether the intent represents a change in the usb
- * configuration (as opposed to a state update).
- *
- * {@hide}
- */
- public static final String USB_CONFIG_CHANGED = "config_changed";
-
- /**
* A placeholder indicating that no USB function is being specified.
* Used for compatibility with old init scripts to indicate no functions vs. charging function.
*
@@ -471,6 +463,25 @@
}
/**
+ * Gets the functionfs control file descriptor for the given function, with
+ * the usb descriptors and strings already written. The file descriptor is used
+ * by the function implementation to handle events and control requests.
+ *
+ * @param function to get control fd for. Currently {@link #FUNCTION_MTP} and
+ * {@link #FUNCTION_PTP} are supported.
+ * @return A ParcelFileDescriptor holding the valid fd, or null if the fd was not found.
+ *
+ * {@hide}
+ */
+ public ParcelFileDescriptor getControlFd(long function) {
+ try {
+ return mService.getControlFd(function);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns true if the caller has permission to access the device.
* Permission might have been granted temporarily via
* {@link #requestPermission(UsbDevice, PendingIntent)} or
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index e07f586..80b1c3d 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -861,6 +861,10 @@
* You should always check {@link NetworkInfo#isConnected()} before initiating
* network traffic. This may return {@code null} when there is no default
* network.
+ * Note that if the default network is a VPN, this method will return the
+ * NetworkInfo for one of its underlying networks instead, or null if the
+ * VPN agent did not specify any. Apps interested in learning about VPNs
+ * should use {@link #getNetworkInfo(android.net.Network)} instead.
*
* @return a {@link NetworkInfo} object for the current default network
* or {@code null} if no default network is currently active
@@ -1018,7 +1022,11 @@
* which you're interested.
* @return a {@link NetworkInfo} object for the requested
* network type or {@code null} if the type is not
- * supported by the device.
+ * supported by the device. If {@code networkType} is
+ * TYPE_VPN and a VPN is active for the calling app,
+ * then this method will try to return one of the
+ * underlying networks for the VPN or null if the
+ * VPN agent didn't specify any.
*
* @deprecated This method does not support multiple connected networks
* of the same type. Use {@link #getAllNetworks} and
diff --git a/core/java/android/net/IIpSecService.aidl b/core/java/android/net/IIpSecService.aidl
index 3a3ddcc..d6774d4 100644
--- a/core/java/android/net/IIpSecService.aidl
+++ b/core/java/android/net/IIpSecService.aidl
@@ -45,25 +45,31 @@
in String localAddr,
in String remoteAddr,
in Network underlyingNetwork,
- in IBinder binder);
+ in IBinder binder,
+ in String callingPackage);
void addAddressToTunnelInterface(
int tunnelResourceId,
- in LinkAddress localAddr);
+ in LinkAddress localAddr,
+ in String callingPackage);
void removeAddressFromTunnelInterface(
int tunnelResourceId,
- in LinkAddress localAddr);
+ in LinkAddress localAddr,
+ in String callingPackage);
- void deleteTunnelInterface(int resourceId);
+ void deleteTunnelInterface(int resourceId, in String callingPackage);
- IpSecTransformResponse createTransform(in IpSecConfig c, in IBinder binder);
+ IpSecTransformResponse createTransform(
+ in IpSecConfig c, in IBinder binder, in String callingPackage);
void deleteTransform(int transformId);
- void applyTransportModeTransform(in ParcelFileDescriptor socket, int direction, int transformId);
+ void applyTransportModeTransform(
+ in ParcelFileDescriptor socket, int direction, int transformId);
- void applyTunnelModeTransform(int tunnelResourceId, int direction, int transformResourceId);
+ void applyTunnelModeTransform(
+ int tunnelResourceId, int direction, int transformResourceId, in String callingPackage);
void removeTransportModeTransforms(in ParcelFileDescriptor socket);
}
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 476e2f4..e92302a 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -37,8 +37,6 @@
int getUidPolicy(int uid);
int[] getUidsWithPolicy(int policy);
- boolean isUidForeground(int uid);
-
void registerListener(INetworkPolicyListener listener);
void unregisterListener(INetworkPolicyListener listener);
diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl
index 381cfb6..8e6f272 100644
--- a/core/java/android/net/INetworkStatsService.aidl
+++ b/core/java/android/net/INetworkStatsService.aidl
@@ -41,6 +41,16 @@
/** Return data layer snapshot of UID network usage. */
NetworkStats getDataLayerSnapshotForUid(int uid);
+
+ /** Get a detailed snapshot of stats since boot for all UIDs.
+ *
+ * <p>Results will not always be limited to stats on requiredIfaces when specified: stats for
+ * interfaces stacked on the specified interfaces, or for interfaces on which the specified
+ * interfaces are stacked on, will also be included.
+ * @param requiredIfaces Interface names to get data for, or {@link NetworkStats#INTERFACES_ALL}.
+ */
+ NetworkStats getDetailedUidStats(in String[] requiredIfaces);
+
/** Return set of any ifaces associated with mobile networks since boot. */
String[] getMobileIfaces();
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index 57f0588..8034bb6 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -56,7 +56,8 @@
* new applications and is provided for legacy compatibility with 3gpp infrastructure.</b>
*
* <p>Keys for this algorithm must be 128 bits in length.
- * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 128.
+ *
+ * <p>Valid truncation lengths are multiples of 8 bits from 96 to 128.
*/
public static final String AUTH_HMAC_MD5 = "hmac(md5)";
@@ -65,7 +66,8 @@
* new applications and is provided for legacy compatibility with 3gpp infrastructure.</b>
*
* <p>Keys for this algorithm must be 160 bits in length.
- * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 160.
+ *
+ * <p>Valid truncation lengths are multiples of 8 bits from 96 to 160.
*/
public static final String AUTH_HMAC_SHA1 = "hmac(sha1)";
@@ -73,7 +75,8 @@
* SHA256 HMAC Authentication/Integrity Algorithm.
*
* <p>Keys for this algorithm must be 256 bits in length.
- * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 256.
+ *
+ * <p>Valid truncation lengths are multiples of 8 bits from 96 to 256.
*/
public static final String AUTH_HMAC_SHA256 = "hmac(sha256)";
@@ -81,7 +84,8 @@
* SHA384 HMAC Authentication/Integrity Algorithm.
*
* <p>Keys for this algorithm must be 384 bits in length.
- * <p>Valid truncation lengths are multiples of 8 bits from 192 to (default) 384.
+ *
+ * <p>Valid truncation lengths are multiples of 8 bits from 192 to 384.
*/
public static final String AUTH_HMAC_SHA384 = "hmac(sha384)";
@@ -89,7 +93,8 @@
* SHA512 HMAC Authentication/Integrity Algorithm.
*
* <p>Keys for this algorithm must be 512 bits in length.
- * <p>Valid truncation lengths are multiples of 8 bits from 256 to (default) 512.
+ *
+ * <p>Valid truncation lengths are multiples of 8 bits from 256 to 512.
*/
public static final String AUTH_HMAC_SHA512 = "hmac(sha512)";
@@ -112,6 +117,7 @@
AUTH_HMAC_MD5,
AUTH_HMAC_SHA1,
AUTH_HMAC_SHA256,
+ AUTH_HMAC_SHA384,
AUTH_HMAC_SHA512,
AUTH_CRYPT_AES_GCM
})
@@ -126,11 +132,14 @@
* Creates an IpSecAlgorithm of one of the supported types. Supported algorithm names are
* defined as constants in this class.
*
+ * <p>For algorithms that produce an integrity check value, the truncation length is a required
+ * parameter. See {@link #IpSecAlgorithm(String algorithm, byte[] key, int truncLenBits)}
+ *
* @param algorithm name of the algorithm.
* @param key key padded to a multiple of 8 bits.
*/
public IpSecAlgorithm(@NonNull @AlgorithmName String algorithm, @NonNull byte[] key) {
- this(algorithm, key, key.length * 8);
+ this(algorithm, key, 0);
}
/**
@@ -228,6 +237,7 @@
case AUTH_CRYPT_AES_GCM:
// The keying material for GCM is a key plus a 32-bit salt
isValidLen = keyLen == 128 + 32 || keyLen == 192 + 32 || keyLen == 256 + 32;
+ isValidTruncLen = truncLen == 64 || truncLen == 96 || truncLen == 128;
break;
default:
throw new IllegalArgumentException("Couldn't find an algorithm: " + name);
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index 972b9c0..e0654fd 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -140,6 +140,7 @@
}
}
+ private final Context mContext;
private final IIpSecService mService;
/**
@@ -274,7 +275,8 @@
*
* @param destinationAddress the destination address for traffic bearing the requested SPI.
* For inbound traffic, the destination should be an address currently assigned on-device.
- * @param requestedSpi the requested SPI, or '0' to allocate a random SPI
+ * @param requestedSpi the requested SPI, or '0' to allocate a random SPI. The range 1-255 is
+ * reserved and may not be used. See RFC 4303 Section 2.1.
* @return the reserved SecurityParameterIndex
* @throws {@link #ResourceUnavailableException} indicating that too many SPIs are
* currently allocated for this user
@@ -305,6 +307,19 @@
* will throw IOException if the user deactivates the transform (by calling {@link
* IpSecTransform#close()}) without calling {@link #removeTransportModeTransforms}.
*
+ * <p>Note that when applied to TCP sockets, calling {@link IpSecTransform#close()} on an
+ * applied transform before completion of graceful shutdown may result in the shutdown sequence
+ * failing to complete. As such, applications requiring graceful shutdown MUST close the socket
+ * prior to deactivating the applied transform. Socket closure may be performed asynchronously
+ * (in batches), so the returning of a close function does not guarantee shutdown of a socket.
+ * Setting an SO_LINGER timeout results in socket closure being performed synchronously, and is
+ * sufficient to ensure shutdown.
+ *
+ * Specifically, if the transform is deactivated (by calling {@link IpSecTransform#close()}),
+ * prior to the socket being closed, the standard [FIN - FIN/ACK - ACK], or the reset [RST]
+ * packets are dropped due to the lack of a valid Transform. Similarly, if a socket without the
+ * SO_LINGER option set is closed, the delayed/batched FIN packets may be dropped.
+ *
* <h4>Rekey Procedure</h4>
*
* <p>When applying a new tranform to a socket in the outbound direction, the previous transform
@@ -373,6 +388,19 @@
* will throw IOException if the user deactivates the transform (by calling {@link
* IpSecTransform#close()}) without calling {@link #removeTransportModeTransforms}.
*
+ * <p>Note that when applied to TCP sockets, calling {@link IpSecTransform#close()} on an
+ * applied transform before completion of graceful shutdown may result in the shutdown sequence
+ * failing to complete. As such, applications requiring graceful shutdown MUST close the socket
+ * prior to deactivating the applied transform. Socket closure may be performed asynchronously
+ * (in batches), so the returning of a close function does not guarantee shutdown of a socket.
+ * Setting an SO_LINGER timeout results in socket closure being performed synchronously, and is
+ * sufficient to ensure shutdown.
+ *
+ * Specifically, if the transform is deactivated (by calling {@link IpSecTransform#close()}),
+ * prior to the socket being closed, the standard [FIN - FIN/ACK - ACK], or the reset [RST]
+ * packets are dropped due to the lack of a valid Transform. Similarly, if a socket without the
+ * SO_LINGER option set is closed, the delayed/batched FIN packets may be dropped.
+ *
* <h4>Rekey Procedure</h4>
*
* <p>When applying a new tranform to a socket in the outbound direction, the previous transform
@@ -476,7 +504,7 @@
* signalling and UDP encapsulated IPsec traffic. Instances can be obtained by calling {@link
* IpSecManager#openUdpEncapsulationSocket}. The provided socket cannot be re-bound by the
* caller. The caller should not close the {@code FileDescriptor} returned by {@link
- * #getSocket}, but should use {@link #close} instead.
+ * #getFileDescriptor}, but should use {@link #close} instead.
*
* <p>Allowing the user to close or unbind a UDP encapsulation socket could impact the traffic
* of the next user who binds to that port. To prevent this scenario, these sockets are held
@@ -515,8 +543,8 @@
mCloseGuard.open("constructor");
}
- /** Get the wrapped socket. */
- public FileDescriptor getSocket() {
+ /** Get the encapsulation socket's file descriptor. */
+ public FileDescriptor getFileDescriptor() {
if (mPfd == null) {
return null;
}
@@ -634,6 +662,7 @@
*/
@SystemApi
public static final class IpSecTunnelInterface implements AutoCloseable {
+ private final String mOpPackageName;
private final IIpSecService mService;
private final InetAddress mRemoteAddress;
private final InetAddress mLocalAddress;
@@ -661,7 +690,8 @@
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public void addAddress(@NonNull LinkAddress address) throws IOException {
try {
- mService.addAddressToTunnelInterface(mResourceId, address);
+ mService.addAddressToTunnelInterface(
+ mResourceId, address, mOpPackageName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -679,16 +709,18 @@
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public void removeAddress(@NonNull LinkAddress address) throws IOException {
try {
- mService.removeAddressFromTunnelInterface(mResourceId, address);
+ mService.removeAddressFromTunnelInterface(
+ mResourceId, address, mOpPackageName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
- private IpSecTunnelInterface(@NonNull IIpSecService service,
+ private IpSecTunnelInterface(@NonNull Context ctx, @NonNull IIpSecService service,
@NonNull InetAddress localAddress, @NonNull InetAddress remoteAddress,
@NonNull Network underlyingNetwork)
throws ResourceUnavailableException, IOException {
+ mOpPackageName = ctx.getOpPackageName();
mService = service;
mLocalAddress = localAddress;
mRemoteAddress = remoteAddress;
@@ -700,7 +732,8 @@
localAddress.getHostAddress(),
remoteAddress.getHostAddress(),
underlyingNetwork,
- new Binder());
+ new Binder(),
+ mOpPackageName);
switch (result.status) {
case Status.OK:
break;
@@ -729,7 +762,7 @@
@Override
public void close() {
try {
- mService.deleteTunnelInterface(mResourceId);
+ mService.deleteTunnelInterface(mResourceId, mOpPackageName);
mResourceId = INVALID_RESOURCE_ID;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -774,7 +807,8 @@
public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
@NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork)
throws ResourceUnavailableException, IOException {
- return new IpSecTunnelInterface(mService, localAddress, remoteAddress, underlyingNetwork);
+ return new IpSecTunnelInterface(
+ mContext, mService, localAddress, remoteAddress, underlyingNetwork);
}
/**
@@ -800,7 +834,8 @@
@PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
try {
mService.applyTunnelModeTransform(
- tunnel.getResourceId(), direction, transform.getResourceId());
+ tunnel.getResourceId(), direction,
+ transform.getResourceId(), mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -812,7 +847,8 @@
* @param context the application context for this manager
* @hide
*/
- public IpSecManager(IIpSecService service) {
+ public IpSecManager(Context ctx, IIpSecService service) {
+ mContext = ctx;
mService = checkNotNull(service, "missing service");
}
}
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 099fe02..fb5f46c 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -130,7 +130,8 @@
synchronized (this) {
try {
IIpSecService svc = getIpSecService();
- IpSecTransformResponse result = svc.createTransform(mConfig, new Binder());
+ IpSecTransformResponse result = svc.createTransform(
+ mConfig, new Binder(), mContext.getOpPackageName());
int status = result.status;
checkResultStatus(status);
mResourceId = result.resourceId;
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 5df168d..15a0ee5 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -26,6 +26,8 @@
import com.android.okhttp.internalandroidapi.Dns;
import com.android.okhttp.internalandroidapi.HttpURLConnectionFactory;
+import libcore.io.IoUtils;
+
import java.io.FileDescriptor;
import java.io.IOException;
import java.net.DatagramSocket;
@@ -77,6 +79,11 @@
httpKeepAlive ? Integer.parseInt(System.getProperty("http.maxConnections", "5")) : 0;
private static final long httpKeepAliveDurationMs =
Long.parseLong(System.getProperty("http.keepAliveDuration", "300000")); // 5 minutes.
+ // Value used to obfuscate network handle longs.
+ // The HANDLE_MAGIC value MUST be kept in sync with the corresponding
+ // value in the native/android/net.c NDK implementation.
+ private static final long HANDLE_MAGIC = 0xcafed00dL;
+ private static final int HANDLE_MAGIC_SIZE = 32;
/**
* @hide
@@ -137,9 +144,15 @@
for (int i = 0; i < hostAddresses.length; i++) {
try {
Socket socket = createSocket();
- if (localAddress != null) socket.bind(localAddress);
- socket.connect(new InetSocketAddress(hostAddresses[i], port));
- return socket;
+ boolean failed = true;
+ try {
+ if (localAddress != null) socket.bind(localAddress);
+ socket.connect(new InetSocketAddress(hostAddresses[i], port));
+ failed = false;
+ return socket;
+ } finally {
+ if (failed) IoUtils.closeQuietly(socket);
+ }
} catch (IOException e) {
if (i == (hostAddresses.length - 1)) throw e;
}
@@ -156,15 +169,27 @@
public Socket createSocket(InetAddress address, int port, InetAddress localAddress,
int localPort) throws IOException {
Socket socket = createSocket();
- socket.bind(new InetSocketAddress(localAddress, localPort));
- socket.connect(new InetSocketAddress(address, port));
+ boolean failed = true;
+ try {
+ socket.bind(new InetSocketAddress(localAddress, localPort));
+ socket.connect(new InetSocketAddress(address, port));
+ failed = false;
+ } finally {
+ if (failed) IoUtils.closeQuietly(socket);
+ }
return socket;
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
Socket socket = createSocket();
- socket.connect(new InetSocketAddress(host, port));
+ boolean failed = true;
+ try {
+ socket.connect(new InetSocketAddress(host, port));
+ failed = false;
+ } finally {
+ if (failed) IoUtils.closeQuietly(socket);
+ }
return socket;
}
@@ -176,7 +201,13 @@
@Override
public Socket createSocket() throws IOException {
Socket socket = new Socket();
- bindSocket(socket);
+ boolean failed = true;
+ try {
+ bindSocket(socket);
+ failed = false;
+ } finally {
+ if (failed) IoUtils.closeQuietly(socket);
+ }
return socket;
}
}
@@ -335,6 +366,25 @@
}
/**
+ * Returns a {@link Network} object given a handle returned from {@link #getNetworkHandle}.
+ *
+ * @param networkHandle a handle returned from {@link #getNetworkHandle}.
+ * @return A {@link Network} object derived from {@code networkHandle}.
+ */
+ public static Network fromNetworkHandle(long networkHandle) {
+ if (networkHandle == 0) {
+ throw new IllegalArgumentException(
+ "Network.fromNetworkHandle refusing to instantiate NETID_UNSET Network.");
+ }
+ if ((networkHandle & ((1L << HANDLE_MAGIC_SIZE) - 1)) != HANDLE_MAGIC
+ || networkHandle < 0) {
+ throw new IllegalArgumentException(
+ "Value passed to fromNetworkHandle() is not a network handle.");
+ }
+ return new Network((int) (networkHandle >> HANDLE_MAGIC_SIZE));
+ }
+
+ /**
* Returns a handle representing this {@code Network}, for use with the NDK API.
*/
public long getNetworkHandle() {
@@ -356,14 +406,10 @@
// At some future date it may be desirable to realign the handle with
// Multiple Provisioning Domains API recommendations, as made by the
// IETF mif working group.
- //
- // The handleMagic value MUST be kept in sync with the corresponding
- // value in the native/android/net.c NDK implementation.
if (netId == 0) {
return 0L; // make this zero condition obvious for debugging
}
- final long handleMagic = 0xcafed00dL;
- return (((long) netId) << 32) | handleMagic;
+ return (((long) netId) << HANDLE_MAGIC_SIZE) | HANDLE_MAGIC;
}
// implement the Parcelable interface
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index ef58f94..374b3ab 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -277,6 +277,7 @@
* this network can be used by system apps to upload telemetry data.
* @hide
*/
+ @SystemApi
public static final int NET_CAPABILITY_OEM_PAID = 22;
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 2c5a021..bf6b7e0 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -107,6 +107,9 @@
private static final boolean ALLOW_PLATFORM_APP_POLICY = true;
+ public static final int FOREGROUND_THRESHOLD_STATE =
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+
/**
* {@link Intent} extra that indicates which {@link NetworkTemplate} rule it
* applies to.
@@ -331,7 +334,7 @@
* to access network when the device is idle or in battery saver mode. Otherwise, false.
*/
public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
- return procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ return procState <= FOREGROUND_THRESHOLD_STATE;
}
/**
@@ -339,7 +342,7 @@
* to access network when the device is in data saver mode. Otherwise, false.
*/
public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
- return procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ return procState <= FOREGROUND_THRESHOLD_STATE;
}
public static String resolveNetworkId(WifiConfiguration config) {
diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java
index 4f92fa6..3d9d6e2 100644
--- a/core/java/android/net/NetworkRequest.java
+++ b/core/java/android/net/NetworkRequest.java
@@ -17,6 +17,8 @@
package android.net;
import android.annotation.NonNull;
+import android.net.NetworkCapabilities.NetCapability;
+import android.net.NetworkCapabilities.Transport;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
@@ -229,7 +231,6 @@
*
* @param capability The capability to add to unwanted capability list.
* @return The builder to facilitate chaining.
- * @hide
*/
public Builder addUnwantedCapability(@NetworkCapabilities.NetCapability int capability) {
mNetworkCapabilities.addUnwantedCapability(capability);
@@ -427,6 +428,20 @@
return type == Type.BACKGROUND_REQUEST;
}
+ /**
+ * @see Builder#addCapability(int)
+ */
+ public boolean hasCapability(@NetCapability int capability) {
+ return networkCapabilities.hasCapability(capability);
+ }
+
+ /**
+ * @see Builder#addTransportType(int)
+ */
+ public boolean hasTransport(@Transport int transportType) {
+ return networkCapabilities.hasTransport(transportType);
+ }
+
public String toString() {
return "NetworkRequest [ " + type + " id=" + requestId +
(legacyType != ConnectivityManager.TYPE_NONE ? ", legacyType=" + legacyType : "") +
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 16fb858..f0dd262 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -31,6 +31,7 @@
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.Map;
import java.util.Objects;
/**
@@ -64,6 +65,9 @@
/** Debug {@link #set} value when the VPN stats are moved out of a vpn UID. */
public static final int SET_DBG_VPN_OUT = 1002;
+ /** Include all interfaces when filtering */
+ public static final String[] INTERFACES_ALL = null;
+
/** {@link #tag} value for total data across all tags. */
// TODO: Rename TAG_NONE to TAG_ALL.
public static final int TAG_NONE = 0;
@@ -94,6 +98,11 @@
/** Denotes a request for stats at the interface and UID level. */
public static final int STATS_PER_UID = 1;
+ private static final String CLATD_INTERFACE_PREFIX = "v4-";
+ // Delta between IPv4 header (20b) and IPv6 header (40b).
+ // Used for correct stats accounting on clatd interfaces.
+ private static final int IPV4V6_HEADER_DELTA = 20;
+
// TODO: move fields to "mVariable" notation
/**
@@ -366,23 +375,27 @@
capacity = newLength;
}
- iface[size] = entry.iface;
- uid[size] = entry.uid;
- set[size] = entry.set;
- tag[size] = entry.tag;
- metered[size] = entry.metered;
- roaming[size] = entry.roaming;
- defaultNetwork[size] = entry.defaultNetwork;
- rxBytes[size] = entry.rxBytes;
- rxPackets[size] = entry.rxPackets;
- txBytes[size] = entry.txBytes;
- txPackets[size] = entry.txPackets;
- operations[size] = entry.operations;
+ setValues(size, entry);
size++;
return this;
}
+ private void setValues(int i, Entry entry) {
+ iface[i] = entry.iface;
+ uid[i] = entry.uid;
+ set[i] = entry.set;
+ tag[i] = entry.tag;
+ metered[i] = entry.metered;
+ roaming[i] = entry.roaming;
+ defaultNetwork[i] = entry.defaultNetwork;
+ rxBytes[i] = entry.rxBytes;
+ rxPackets[i] = entry.rxPackets;
+ txBytes[i] = entry.txBytes;
+ txPackets[i] = entry.txPackets;
+ operations[i] = entry.operations;
+ }
+
/**
* Return specific stats entry.
*/
@@ -752,6 +765,75 @@
}
/**
+ * Calculate and apply adjustments to captured statistics for 464xlat traffic counted twice.
+ *
+ * <p>This mutates both base and stacked traffic stats, to account respectively for
+ * double-counted traffic and IPv4/IPv6 header size difference.
+ *
+ * <p>For 464xlat traffic, xt_qtaguid sees every IPv4 packet twice, once as a native IPv4
+ * packet on the stacked interface, and once as translated to an IPv6 packet on the
+ * base interface. For correct stats accounting on the base interface, every 464xlat
+ * packet needs to be subtracted from the root UID on the base interface both for tx
+ * and rx traffic (http://b/12249687, http:/b/33681750).
+ *
+ * <p>This method will behave fine if {@code stackedIfaces} is an non-synchronized but add-only
+ * {@code ConcurrentHashMap}
+ * @param baseTraffic Traffic on the base interfaces. Will be mutated.
+ * @param stackedTraffic Stats with traffic stacked on top of our ifaces. Will also be mutated.
+ * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
+ */
+ public static void apply464xlatAdjustments(NetworkStats baseTraffic,
+ NetworkStats stackedTraffic, Map<String, String> stackedIfaces) {
+ // Total 464xlat traffic to subtract from uid 0 on all base interfaces.
+ // stackedIfaces may grow afterwards, but NetworkStats will just be resized automatically.
+ final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size());
+
+ // For recycling
+ Entry entry = null;
+ Entry adjust = new NetworkStats.Entry(IFACE_ALL, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L, 0L);
+
+ for (int i = 0; i < stackedTraffic.size; i++) {
+ entry = stackedTraffic.getValues(i, entry);
+ if (entry.iface == null || !entry.iface.startsWith(CLATD_INTERFACE_PREFIX)) {
+ continue;
+ }
+ final String baseIface = stackedIfaces.get(entry.iface);
+ if (baseIface == null) {
+ continue;
+ }
+ // Subtract any 464lat traffic seen for the root UID on the current base interface.
+ adjust.iface = baseIface;
+ adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
+ adjust.txBytes = -(entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
+ adjust.rxPackets = -entry.rxPackets;
+ adjust.txPackets = -entry.txPackets;
+ adjustments.combineValues(adjust);
+
+ // For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent
+ // on the stacked interface with prefix "v4-" and drops the IPv6 header size after
+ // unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
+ // difference for all packets (http://b/12249687, http:/b/33681750).
+ entry.rxBytes += entry.rxPackets * IPV4V6_HEADER_DELTA;
+ entry.txBytes += entry.txPackets * IPV4V6_HEADER_DELTA;
+ stackedTraffic.setValues(i, entry);
+ }
+
+ baseTraffic.combineAllValues(adjustments);
+ }
+
+ /**
+ * Calculate and apply adjustments to captured statistics for 464xlat traffic counted twice.
+ *
+ * <p>This mutates the object this method is called on. Equivalent to calling
+ * {@link #apply464xlatAdjustments(NetworkStats, NetworkStats, Map)} with {@code this} as
+ * base and stacked traffic.
+ * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
+ */
+ public void apply464xlatAdjustments(Map<String, String> stackedIfaces) {
+ apply464xlatAdjustments(this, this, stackedIfaces);
+ }
+
+ /**
* Return total statistics grouped by {@link #iface}; doesn't mutate the
* original structure.
*/
@@ -831,6 +913,39 @@
return stats;
}
+ /**
+ * Only keep entries that match all specified filters.
+ *
+ * <p>This mutates the original structure in place. After this method is called,
+ * size is the number of matching entries, and capacity is the previous capacity.
+ * @param limitUid UID to filter for, or {@link #UID_ALL}.
+ * @param limitIfaces Interfaces to filter for, or {@link #INTERFACES_ALL}.
+ * @param limitTag Tag to filter for, or {@link #TAG_ALL}.
+ */
+ public void filter(int limitUid, String[] limitIfaces, int limitTag) {
+ if (limitUid == UID_ALL && limitTag == TAG_ALL && limitIfaces == INTERFACES_ALL) {
+ return;
+ }
+
+ Entry entry = new Entry();
+ int nextOutputEntry = 0;
+ for (int i = 0; i < size; i++) {
+ entry = getValues(i, entry);
+ final boolean matches =
+ (limitUid == UID_ALL || limitUid == entry.uid)
+ && (limitTag == TAG_ALL || limitTag == entry.tag)
+ && (limitIfaces == INTERFACES_ALL
+ || ArrayUtils.contains(limitIfaces, entry.iface));
+
+ if (matches) {
+ setValues(nextOutputEntry, entry);
+ nextOutputEntry++;
+ }
+ }
+
+ size = nextOutputEntry;
+ }
+
public void dump(String prefix, PrintWriter pw) {
pw.print(prefix);
pw.print("NetworkStats: elapsedRealtime="); pw.println(elapsedRealtime);
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index 7922276..40d53b7 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -16,7 +16,6 @@
package android.net;
-import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.TestApi;
@@ -259,30 +258,47 @@
/**
* Set specific UID to use when accounting {@link Socket} traffic
* originating from the current thread. Designed for use when performing an
- * operation on behalf of another application.
+ * operation on behalf of another application, or when another application
+ * is performing operations on your behalf.
+ * <p>
+ * Any app can <em>accept</em> blame for traffic performed on a socket
+ * originally created by another app by calling this method with the
+ * {@link android.system.Os#getuid()} value. However, only apps holding the
+ * {@code android.Manifest.permission#UPDATE_DEVICE_STATS} permission may
+ * <em>assign</em> blame to another UIDs.
* <p>
* Changes only take effect during subsequent calls to
* {@link #tagSocket(Socket)}.
- * <p>
- * To take effect, caller must hold
- * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission.
- *
- * @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
+ @SuppressLint("Doclava125")
public static void setThreadStatsUid(int uid) {
NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
}
/**
+ * Get the active UID used when accounting {@link Socket} traffic originating
+ * from the current thread. Only one active tag per thread is supported.
+ * {@link #tagSocket(Socket)}.
+ *
+ * @see #setThreadStatsUid(int)
+ */
+ public static int getThreadStatsUid() {
+ return NetworkManagementSocketTagger.getThreadSocketStatsUid();
+ }
+
+ /**
* Set specific UID to use when accounting {@link Socket} traffic
* originating from the current thread as the calling UID. Designed for use
* when another application is performing operations on your behalf.
* <p>
* Changes only take effect during subsequent calls to
* {@link #tagSocket(Socket)}.
+ *
+ * @removed
+ * @deprecated use {@link #setThreadStatsUid(int)} instead.
*/
+ @Deprecated
public static void setThreadStatsUidSelf() {
setThreadStatsUid(android.os.Process.myUid());
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index f528d63..6ebb102 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -1585,6 +1585,7 @@
public static final int STATE2_CAMERA_FLAG = 1<<21;
public static final int STATE2_BLUETOOTH_SCAN_FLAG = 1 << 20;
public static final int STATE2_CELLULAR_HIGH_TX_POWER_FLAG = 1 << 19;
+ public static final int STATE2_USB_DATA_LINK_FLAG = 1 << 18;
public static final int MOST_INTERESTING_STATES2 =
STATE2_POWER_SAVE_FLAG | STATE2_WIFI_ON_FLAG | STATE2_DEVICE_IDLE_MASK
@@ -2363,8 +2364,7 @@
SCREEN_BRIGHTNESS_NAMES, SCREEN_BRIGHTNESS_SHORT_NAMES),
};
- public static final BitDescription[] HISTORY_STATE2_DESCRIPTIONS
- = new BitDescription[] {
+ public static final BitDescription[] HISTORY_STATE2_DESCRIPTIONS = new BitDescription[] {
new BitDescription(HistoryItem.STATE2_POWER_SAVE_FLAG, "power_save", "ps"),
new BitDescription(HistoryItem.STATE2_VIDEO_ON_FLAG, "video", "v"),
new BitDescription(HistoryItem.STATE2_WIFI_RUNNING_FLAG, "wifi_running", "Ww"),
@@ -2375,6 +2375,7 @@
new String[] { "off", "light", "full", "???" },
new String[] { "off", "light", "full", "???" }),
new BitDescription(HistoryItem.STATE2_CHARGING_FLAG, "charging", "ch"),
+ new BitDescription(HistoryItem.STATE2_USB_DATA_LINK_FLAG, "usb_data", "Ud"),
new BitDescription(HistoryItem.STATE2_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"),
new BitDescription(HistoryItem.STATE2_BLUETOOTH_ON_FLAG, "bluetooth", "b"),
new BitDescription(HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_MASK,
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index df6ce8e..8378a82 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -242,7 +242,9 @@
* Possible values are defined in {@link Build.VERSION_CODES}.
*
* @see #SDK_INT
+ * @hide
*/
+ @TestApi
public static final int FIRST_SDK_INT = SystemProperties
.getInt("ro.product.first_api_level", 0);
@@ -293,8 +295,10 @@
/**
* The current lowest supported value of app target SDK. Applications targeting
- * lower values will fail to install and run. Its possible values are defined
- * in {@link Build.VERSION_CODES}.
+ * lower values may not function on devices running this SDK version. Its possible
+ * values are defined in {@link Build.VERSION_CODES}.
+ *
+ * @hide
*/
public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt(
"ro.build.version.min_supported_target_sdk", 0);
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 1160415..88d6e84 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -411,6 +411,9 @@
checkpoint = 0;
}
}
+ if (listener != null) {
+ listener.onProgress(progress);
+ }
return progress;
}
@@ -440,6 +443,9 @@
checkpoint = 0;
}
}
+ if (listener != null) {
+ listener.onProgress(progress);
+ }
return progress;
}
@@ -479,6 +485,9 @@
checkpoint = 0;
}
}
+ if (listener != null) {
+ listener.onProgress(progress);
+ }
return progress;
}
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 2437ed1..31dbafa 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -268,10 +268,12 @@
NetworkStats getNetworkStatsDetail();
/**
- * Return detailed network statistics for the requested UID,
+ * Return detailed network statistics for the requested UID and interfaces,
* including interface and tag details.
+ * @param uid UID to obtain statistics for, or {@link NetworkStats#UID_ALL}.
+ * @param ifaces Interfaces to obtain statistics for, or {@link NetworkStats#INTERFACES_ALL}.
*/
- NetworkStats getNetworkStatsUidDetail(int uid);
+ NetworkStats getNetworkStatsUidDetail(int uid, in String[] ifaces);
/**
* Return summary of network statistics all tethering interfaces.
diff --git a/core/java/android/os/IStatsCompanionService.aidl b/core/java/android/os/IStatsCompanionService.aidl
index 402c995..116262e 100644
--- a/core/java/android/os/IStatsCompanionService.aidl
+++ b/core/java/android/os/IStatsCompanionService.aidl
@@ -47,10 +47,10 @@
* Uses AlarmManager.setRepeating API, so if the timestamp is in past, alarm fires immediately,
* and alarm is inexact.
*/
- oneway void setPullingAlarms(long timestampMs, long intervalMs);
+ oneway void setPullingAlarm(long nextPullTimeMs);
/** Cancel any repeating pulling alarm. */
- oneway void cancelPullingAlarms();
+ oneway void cancelPullingAlarm();
/**
* Register an alarm when we want to trigger subscribers at the given
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 62bb385..e3c4870 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -2803,8 +2803,8 @@
Class<?> parcelableClass = Class.forName(name, false /* initialize */,
parcelableClassLoader);
if (!Parcelable.class.isAssignableFrom(parcelableClass)) {
- throw new BadParcelableException("Parcelable protocol requires that the "
- + "class implements Parcelable");
+ throw new BadParcelableException("Parcelable protocol requires subclassing "
+ + "from Parcelable on class " + name);
}
Field f = parcelableClass.getField("CREATOR");
if ((f.getModifiers() & Modifier.STATIC) == 0) {
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index 0f70427..b254166 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -269,6 +269,7 @@
* time or throw.
*
* @throws DateTimeException when no accurate network time can be provided.
+ * @hide
*/
public static long currentNetworkTimeMillis() {
final IAlarmManager mgr = IAlarmManager.Stub
@@ -302,6 +303,7 @@
* time or throw.
*
* @throws DateTimeException when no accurate network time can be provided.
+ * @hide
*/
public static @NonNull Clock currentNetworkTimeClock() {
return new SimpleClock(ZoneOffset.UTC) {
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 5be72bc..094f004 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -158,7 +158,7 @@
* @hide
*/
public static boolean isCore(int uid) {
- if (uid > 0) {
+ if (uid >= 0) {
final int appId = getAppId(uid);
return appId < Process.FIRST_APPLICATION_UID;
} else {
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index ca4c796..b9dd376 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -32,6 +32,7 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.UUID;
@@ -158,6 +159,13 @@
private final Object mLock = new Object();
/**
+ * List of exemptions to the API blacklist. These are prefix matches on the runtime format
+ * symbol signature. Any matching symbol is treated by the runtime as being on the light grey
+ * list.
+ */
+ private List<String> mApiBlacklistExemptions = Collections.emptyList();
+
+ /**
* The state of the connection to the primary zygote.
*/
private ZygoteState primaryZygoteState;
@@ -175,7 +183,7 @@
* The process will continue running after this function returns.
*
* <p>If processes are not enabled, a new thread in the caller's
- * process is created and main() of <var>processClass</var> called there.
+ * process is created and main() of <var>processclass</var> called there.
*
* <p>The niceName parameter, if not an empty string, is a custom name to
* give to the process instead of using processClass. This allows you to
@@ -454,6 +462,49 @@
}
/**
+ * Push hidden API blacklisting exemptions into the zygote process(es).
+ *
+ * <p>The list of exemptions will take affect for all new processes forked from the zygote after
+ * this call.
+ *
+ * @param exemptions List of hidden API exemption prefixes.
+ */
+ public void setApiBlacklistExemptions(List<String> exemptions) {
+ synchronized (mLock) {
+ mApiBlacklistExemptions = exemptions;
+ maybeSetApiBlacklistExemptions(primaryZygoteState, true);
+ maybeSetApiBlacklistExemptions(secondaryZygoteState, true);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void maybeSetApiBlacklistExemptions(ZygoteState state, boolean sendIfEmpty) {
+ if (state == null || state.isClosed()) {
+ return;
+ }
+ if (!sendIfEmpty && mApiBlacklistExemptions.isEmpty()) {
+ return;
+ }
+ try {
+ state.writer.write(Integer.toString(mApiBlacklistExemptions.size() + 1));
+ state.writer.newLine();
+ state.writer.write("--set-api-blacklist-exemptions");
+ state.writer.newLine();
+ for (int i = 0; i < mApiBlacklistExemptions.size(); ++i) {
+ state.writer.write(mApiBlacklistExemptions.get(i));
+ state.writer.newLine();
+ }
+ state.writer.flush();
+ int status = state.inputStream.readInt();
+ if (status != 0) {
+ Slog.e(LOG_TAG, "Failed to set API blacklist exemptions; status " + status);
+ }
+ } catch (IOException ioe) {
+ Slog.e(LOG_TAG, "Failed to set API blacklist exemptions", ioe);
+ }
+ }
+
+ /**
* Tries to open socket to Zygote process if not already open. If
* already open, does nothing. May block and retry. Requires that mLock be held.
*/
@@ -467,8 +518,8 @@
} catch (IOException ioe) {
throw new ZygoteStartFailedEx("Error connecting to primary zygote", ioe);
}
+ maybeSetApiBlacklistExemptions(primaryZygoteState, false);
}
-
if (primaryZygoteState.matches(abi)) {
return primaryZygoteState;
}
@@ -480,6 +531,7 @@
} catch (IOException ioe) {
throw new ZygoteStartFailedEx("Error connecting to secondary zygote", ioe);
}
+ maybeSetApiBlacklistExemptions(secondaryZygoteState, false);
}
if (secondaryZygoteState.matches(abi)) {
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index bf20e6a..8905ad1 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -756,10 +756,15 @@
}
try {
for (VolumeInfo vol : mStorageManager.getVolumes(0)) {
- if (vol.path != null && FileUtils.contains(vol.path, pathString)) {
+ if (vol.path != null && FileUtils.contains(vol.path, pathString)
+ && vol.type != VolumeInfo.TYPE_PUBLIC) {
// TODO: verify that emulated adopted devices have UUID of
// underlying volume
- return convert(vol.fsUuid);
+ try {
+ return convert(vol.fsUuid);
+ } catch (IllegalArgumentException e) {
+ continue;
+ }
}
}
} catch (RemoteException e) {
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index d3877ca..9e3e386 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -269,22 +269,7 @@
return (mountFlags & MOUNT_FLAG_VISIBLE) != 0;
}
- public boolean isVisibleForRead(int userId) {
- if (type == TYPE_PUBLIC) {
- if (isPrimary() && mountUserId != userId) {
- // Primary physical is only visible to single user
- return false;
- } else {
- return isVisible();
- }
- } else if (type == TYPE_EMULATED) {
- return isVisible();
- } else {
- return false;
- }
- }
-
- public boolean isVisibleForWrite(int userId) {
+ public boolean isVisibleForUser(int userId) {
if (type == TYPE_PUBLIC && mountUserId == userId) {
return isVisible();
} else if (type == TYPE_EMULATED) {
@@ -294,6 +279,14 @@
}
}
+ public boolean isVisibleForRead(int userId) {
+ return isVisibleForUser(userId);
+ }
+
+ public boolean isVisibleForWrite(int userId) {
+ return isVisibleForUser(userId);
+ }
+
public File getPath() {
return (path != null) ? new File(path) : null;
}
@@ -319,7 +312,7 @@
* {@link android.Manifest.permission#WRITE_MEDIA_STORAGE}.
*/
public File getInternalPathForUser(int userId) {
- if (type == TYPE_PUBLIC) {
+ if (type == TYPE_PUBLIC && !isVisible()) {
// TODO: plumb through cleaner path from vold
return new File(path.replace("/storage/", "/mnt/media_rw/"));
} else {
@@ -409,9 +402,9 @@
* Build an intent to browse the contents of this volume. Only valid for
* {@link #TYPE_EMULATED} or {@link #TYPE_PUBLIC}.
*/
- public Intent buildBrowseIntent() {
+ public @Nullable Intent buildBrowseIntent() {
final Uri uri;
- if (type == VolumeInfo.TYPE_PUBLIC) {
+ if (type == VolumeInfo.TYPE_PUBLIC && mountUserId == UserHandle.myUserId()) {
uri = DocumentsContract.buildRootUri(DOCUMENT_AUTHORITY, fsUuid);
} else if (type == VolumeInfo.TYPE_EMULATED && isPrimary()) {
uri = DocumentsContract.buildRootUri(DOCUMENT_AUTHORITY,
diff --git a/core/java/android/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder.java b/core/java/android/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder.java
index 219868d..dd97f1e 100644
--- a/core/java/android/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder.java
+++ b/core/java/android/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder.java
@@ -19,6 +19,7 @@
import android.privacy.DifferentialPrivacyEncoder;
import android.privacy.internal.rappor.RapporConfig;
import android.privacy.internal.rappor.RapporEncoder;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -48,6 +49,9 @@
*/
public class LongitudinalReportingEncoder implements DifferentialPrivacyEncoder {
+ private static final String TAG = "LongitudinalEncoder";
+ private static final boolean DEBUG = false;
+
// Suffix that will be added to Rappor's encoder id. There's a (relatively) small risk some
// other Rappor encoder may re-use the same encoder id.
private static final String PRR1_ENCODER_ID = "prr1_encoder_id";
@@ -121,11 +125,18 @@
@Override
public byte[] encodeBoolean(boolean original) {
+ if (DEBUG) {
+ Log.d(TAG, "encodeBoolean, encoderId:" + mConfig.getEncoderId() + ", original: "
+ + original);
+ }
if (mFakeValue != null) {
// Use the fake value generated in PRR.
original = mFakeValue.booleanValue();
+ if (DEBUG) Log.d(TAG, "Use fake value: " + original);
}
- return mIRREncoder.encodeBoolean(original);
+ byte[] result = mIRREncoder.encodeBoolean(original);
+ if (DEBUG) Log.d(TAG, "result: " + ((result[0] & 0x1) != 0));
+ return result;
}
@Override
diff --git a/core/java/android/provider/BlockedNumberContract.java b/core/java/android/provider/BlockedNumberContract.java
index 8aef012..67c6fb9 100644
--- a/core/java/android/provider/BlockedNumberContract.java
+++ b/core/java/android/provider/BlockedNumberContract.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
+import android.telecom.Log;
/**
* <p>
@@ -261,9 +262,16 @@
*/
@WorkerThread
public static boolean isBlocked(Context context, String phoneNumber) {
- final Bundle res = context.getContentResolver().call(
- AUTHORITY_URI, METHOD_IS_BLOCKED, phoneNumber, null);
- return res != null && res.getBoolean(RES_NUMBER_IS_BLOCKED, false);
+ try {
+ final Bundle res = context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_IS_BLOCKED, phoneNumber, null);
+ return res != null && res.getBoolean(RES_NUMBER_IS_BLOCKED, false);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "isBlocked: provider not ready.");
+ return false;
+ }
}
/**
@@ -297,9 +305,16 @@
* @return {@code true} if the current user can block numbers.
*/
public static boolean canCurrentUserBlockNumbers(Context context) {
- final Bundle res = context.getContentResolver().call(
- AUTHORITY_URI, METHOD_CAN_CURRENT_USER_BLOCK_NUMBERS, null, null);
- return res != null && res.getBoolean(RES_CAN_BLOCK_NUMBERS, false);
+ try {
+ final Bundle res = context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_CAN_CURRENT_USER_BLOCK_NUMBERS, null, null);
+ return res != null && res.getBoolean(RES_CAN_BLOCK_NUMBERS, false);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "canCurrentUserBlockNumbers: provider not ready.");
+ return false;
+ }
}
/**
@@ -368,8 +383,14 @@
* the provider unless {@link #endBlockSuppression(Context)} is called.
*/
public static void notifyEmergencyContact(Context context) {
- context.getContentResolver().call(
- AUTHORITY_URI, METHOD_NOTIFY_EMERGENCY_CONTACT, null, null);
+ try {
+ context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_NOTIFY_EMERGENCY_CONTACT, null, null);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "notifyEmergencyContact: provider not ready.");
+ }
}
/**
@@ -394,9 +415,16 @@
*/
public static boolean shouldSystemBlockNumber(Context context, String phoneNumber,
Bundle extras) {
- final Bundle res = context.getContentResolver().call(
- AUTHORITY_URI, METHOD_SHOULD_SYSTEM_BLOCK_NUMBER, phoneNumber, extras);
- return res != null && res.getBoolean(RES_NUMBER_IS_BLOCKED, false);
+ try {
+ final Bundle res = context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_SHOULD_SYSTEM_BLOCK_NUMBER, phoneNumber, extras);
+ return res != null && res.getBoolean(RES_NUMBER_IS_BLOCKED, false);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "shouldSystemBlockNumber: provider not ready.");
+ return false;
+ }
}
/**
@@ -416,9 +444,16 @@
* @return {@code true} if should show emergency call notification. {@code false} otherwise.
*/
public static boolean shouldShowEmergencyCallNotification(Context context) {
- final Bundle res = context.getContentResolver().call(
- AUTHORITY_URI, METHOD_SHOULD_SHOW_EMERGENCY_CALL_NOTIFICATION, null, null);
- return res != null && res.getBoolean(RES_SHOW_EMERGENCY_CALL_NOTIFICATION, false);
+ try {
+ final Bundle res = context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_SHOULD_SHOW_EMERGENCY_CALL_NOTIFICATION, null, null);
+ return res != null && res.getBoolean(RES_SHOW_EMERGENCY_CALL_NOTIFICATION, false);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "shouldShowEmergencyCallNotification: provider not ready.");
+ return false;
+ }
}
/**
@@ -436,9 +471,16 @@
public static boolean getEnhancedBlockSetting(Context context, String key) {
Bundle extras = new Bundle();
extras.putString(EXTRA_ENHANCED_SETTING_KEY, key);
- final Bundle res = context.getContentResolver().call(
- AUTHORITY_URI, METHOD_GET_ENHANCED_BLOCK_SETTING, null, extras);
- return res != null && res.getBoolean(RES_ENHANCED_SETTING_IS_ENABLED, false);
+ try {
+ final Bundle res = context.getContentResolver().call(
+ AUTHORITY_URI, METHOD_GET_ENHANCED_BLOCK_SETTING, null, extras);
+ return res != null && res.getBoolean(RES_ENHANCED_SETTING_IS_ENABLED, false);
+ } catch (NullPointerException | IllegalArgumentException ex) {
+ // The content resolver can throw an NPE or IAE; we don't want to crash Telecom if
+ // either of these happen.
+ Log.w(null, "getEnhancedBlockSetting: provider not ready.");
+ return false;
+ }
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index b58e5b3..68fc6c1 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1348,10 +1348,18 @@
= "android.settings.NOTIFICATION_SETTINGS";
/**
+ * Activity Action: Show app listing settings, filtered by those that send notifications.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_ALL_APPS_NOTIFICATION_SETTINGS =
+ "android.settings.ALL_APPS_NOTIFICATION_SETTINGS";
+
+ /**
* Activity Action: Show notification settings for a single app.
* <p>
- * Input: {@link #EXTRA_APP_PACKAGE}, the package containing the channel to display.
- * Input: Optionally, {@link #EXTRA_CHANNEL_ID}, to highlight that channel.
+ * Input: {@link #EXTRA_APP_PACKAGE}, the package to display.
* <p>
* Output: Nothing.
*/
@@ -7793,6 +7801,22 @@
"low_power_warning_acknowledged";
/**
+ * 0 (default) Auto battery saver suggestion has not been suppressed. 1) it has been
+ * suppressed.
+ * @hide
+ */
+ public static final String SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION =
+ "suppress_auto_battery_saver_suggestion";
+
+ /**
+ * List of packages, which data need to be unconditionally cleared before full restore.
+ * Type: string
+ * @hide
+ */
+ public static final String PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE =
+ "packages_to_clear_data_before_full_restore";
+
+ /**
* This are the settings to be backed up.
*
* NOTE: Settings are backed up and restored in the order they appear
@@ -9196,8 +9220,8 @@
public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
/**
- * Map of package name to application names. Package names must be lower cased as they are
- * used as a key in the map. The application names cannot and will not be localized.
+ * Map of package name to application names. The application names cannot and will not be
+ * localized. App names may not contain colons or semicolons.
*
* The value is "packageName1:appName1;packageName2:appName2;..."
* @hide
@@ -11037,7 +11061,14 @@
*/
public static final String LOW_POWER_MODE_TRIGGER_LEVEL_MAX = "low_power_trigger_level_max";
- /**
+ /**
+ * See com.android.settingslib.fuelgauge.BatterySaverUtils.
+ * @hide
+ */
+ public static final String LOW_POWER_MODE_SUGGESTION_PARAMS =
+ "low_power_mode_suggestion_params";
+
+ /**
* If not 0, the activity manager will aggressively finish activities and
* processes as soon as they are no longer needed. If 0, the normal
* extended lifetime is used.
diff --git a/core/java/android/se/omapi/Channel.java b/core/java/android/se/omapi/Channel.java
index 65ce67f..5db3c1a 100644
--- a/core/java/android/se/omapi/Channel.java
+++ b/core/java/android/se/omapi/Channel.java
@@ -39,7 +39,7 @@
*
* @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
*/
-public class Channel {
+public final class Channel implements java.nio.channels.Channel {
private static final String TAG = "OMAPI.Channel";
private Session mSession;
@@ -47,7 +47,8 @@
private final SEService mService;
private final Object mLock = new Object();
- Channel(SEService service, Session session, ISecureElementChannel channel) {
+ Channel(@NonNull SEService service, @NonNull Session session,
+ @NonNull ISecureElementChannel channel) {
if (service == null || session == null || channel == null) {
throw new IllegalArgumentException("Parameters cannot be null");
}
@@ -63,7 +64,7 @@
* before closing the channel.
*/
public void close() {
- if (!isClosed()) {
+ if (isOpen()) {
synchronized (mLock) {
try {
mChannel.close();
@@ -75,21 +76,21 @@
}
/**
- * Tells if this channel is closed.
+ * Tells if this channel is open.
*
- * @return <code>true</code> if the channel is closed or in case of an error.
- * <code>false</code> otherwise.
+ * @return <code>false</code> if the channel is closed or in case of an error.
+ * <code>true</code> otherwise.
*/
- public boolean isClosed() {
+ public boolean isOpen() {
if (!mService.isConnected()) {
Log.e(TAG, "service not connected to system");
- return true;
+ return false;
}
try {
- return mChannel.isClosed();
+ return !mChannel.isClosed();
} catch (RemoteException e) {
Log.e(TAG, "Exception in isClosed()");
- return true;
+ return false;
}
}
@@ -158,7 +159,7 @@
* @throws SecurityException if the command is filtered by the security policy.
* @throws NullPointerException if command is NULL.
*/
- public @NonNull byte[] transmit(byte[] command) throws IOException {
+ public @NonNull byte[] transmit(@NonNull byte[] command) throws IOException {
if (!mService.isConnected()) {
throw new IllegalStateException("service not connected to system");
}
diff --git a/core/java/android/se/omapi/ISecureElementListener.aidl b/core/java/android/se/omapi/ISecureElementListener.aidl
index e0c6e04..e9dd181 100644
--- a/core/java/android/se/omapi/ISecureElementListener.aidl
+++ b/core/java/android/se/omapi/ISecureElementListener.aidl
@@ -24,8 +24,4 @@
* @hide
*/
interface ISecureElementListener {
- /**
- * Called by the framework when the service is connected.
- */
- void serviceConnected();
}
diff --git a/core/java/android/se/omapi/Reader.java b/core/java/android/se/omapi/Reader.java
index 3dec976..80262f7 100644
--- a/core/java/android/se/omapi/Reader.java
+++ b/core/java/android/se/omapi/Reader.java
@@ -37,7 +37,7 @@
*
* @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
*/
-public class Reader {
+public final class Reader {
private static final String TAG = "OMAPI.Reader";
private final String mName;
@@ -46,7 +46,7 @@
private final Object mLock = new Object();
- Reader(SEService service, String name, ISecureElementReader reader) {
+ Reader(@NonNull SEService service, @NonNull String name, @NonNull ISecureElementReader reader) {
if (reader == null || service == null || name == null) {
throw new IllegalArgumentException("Parameters cannot be null");
}
diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java
index d59e86a..14727f0 100644
--- a/core/java/android/se/omapi/SEService.java
+++ b/core/java/android/se/omapi/SEService.java
@@ -32,6 +32,7 @@
import android.util.Log;
import java.util.HashMap;
+import java.util.concurrent.Executor;
/**
* The SEService realises the communication to available Secure Elements on the
@@ -40,7 +41,7 @@
*
* @see <a href="http://simalliance.org">SIMalliance Open Mobile API v3.0</a>
*/
-public class SEService {
+public final class SEService {
/**
* Error code used with ServiceSpecificException.
@@ -62,17 +63,38 @@
/**
* Interface to send call-backs to the application when the service is connected.
*/
- public abstract static class SecureElementListener extends ISecureElementListener.Stub {
+ public interface OnConnectedListener {
+ /**
+ * Called by the framework when the service is connected.
+ */
+ void onConnected();
+ }
+
+ /**
+ * Listener object that allows the notification of the caller if this
+ * SEService could be bound to the backend.
+ */
+ private class SEListener extends ISecureElementListener.Stub {
+ public OnConnectedListener mListener = null;
+ public Executor mExecutor = null;
+
@Override
public IBinder asBinder() {
return this;
}
- /**
- * Called by the framework when the service is connected.
- */
- public void serviceConnected() {};
+ public void onConnected() {
+ if (mListener != null && mExecutor != null) {
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ mListener.onConnected();
+ }
+ });
+ }
+ }
}
+ private SEListener mSEListener = new SEListener();
private static final String TAG = "OMAPI.SEService";
@@ -95,34 +117,32 @@
private final HashMap<String, Reader> mReaders = new HashMap<String, Reader>();
/**
- * Listener object that allows the notification of the caller if this
- * SEService could be bound to the backend.
- */
- private ISecureElementListener mSEListener;
-
- /**
* Establishes a new connection that can be used to connect to all the
* Secure Elements available in the system. The connection process can be
* quite long, so it happens in an asynchronous way. It is usable only if
* the specified listener is called or if isConnected() returns
* <code>true</code>. <br>
* The call-back object passed as a parameter will have its
- * serviceConnected() method called when the connection actually happen.
+ * onConnected() method called when the connection actually happen.
*
* @param context
* the context of the calling application. Cannot be
* <code>null</code>.
* @param listener
- * a SecureElementListener object. Can be <code>null</code>.
+ * a OnConnectedListener object.
+ * @param executor
+ * an Executor which will be used when invoking the callback.
*/
- public SEService(Context context, SecureElementListener listener) {
+ public SEService(@NonNull Context context, @NonNull Executor executor,
+ @NonNull OnConnectedListener listener) {
- if (context == null) {
- throw new NullPointerException("context must not be null");
+ if (context == null || listener == null || executor == null) {
+ throw new NullPointerException("Arguments must not be null");
}
mContext = context;
- mSEListener = listener;
+ mSEListener.mListener = listener;
+ mSEListener.mExecutor = executor;
mConnection = new ServiceConnection() {
@@ -131,9 +151,7 @@
mSecureElementService = ISecureElementService.Stub.asInterface(service);
if (mSEListener != null) {
- try {
- mSEListener.serviceConnected();
- } catch (RemoteException ignore) { }
+ mSEListener.onConnected();
}
Log.i(TAG, "Service onServiceConnected");
}
@@ -164,12 +182,12 @@
}
/**
- * Returns the list of available Secure Element readers.
+ * Returns an array of available Secure Element readers.
* There must be no duplicated objects in the returned list.
* All available readers shall be listed even if no card is inserted.
*
- * @return The readers list, as an array of Readers. If there are no
- * readers the returned array is of length 0.
+ * @return An array of Readers. If there are no readers the returned array
+ * is of length 0.
*/
public @NonNull Reader[] getReaders() {
if (mSecureElementService == null) {
@@ -205,7 +223,8 @@
* (including any binding to an underlying service).
* As a result isConnected() will return false after shutdown() was called.
* After this method call, the SEService object is not connected.
- * It is recommended to call this method in the termination method of the calling application
+ * This method should be called when connection to the Secure Element is not needed
+ * or in the termination method of the calling application
* (or part of this application) which is bound to this SEService.
*/
public void shutdown() {
@@ -233,7 +252,7 @@
*
* @return String containing the OpenMobile API version (e.g. "3.0").
*/
- public String getVersion() {
+ public @NonNull String getVersion() {
return "3.2";
}
diff --git a/core/java/android/se/omapi/Session.java b/core/java/android/se/omapi/Session.java
index 3d8b74b..d5f8c82 100644
--- a/core/java/android/se/omapi/Session.java
+++ b/core/java/android/se/omapi/Session.java
@@ -39,7 +39,7 @@
*
* @see <a href="http://simalliance.org">SIMalliance Open Mobile API v3.0</a>
*/
-public class Session {
+public final class Session {
private final Object mLock = new Object();
private final SEService mService;
@@ -47,7 +47,8 @@
private final ISecureElementSession mSession;
private static final String TAG = "OMAPI.Session";
- Session(SEService service, ISecureElementSession session, Reader reader) {
+ Session(@NonNull SEService service, @NonNull ISecureElementSession session,
+ @NonNull Reader reader) {
if (service == null || reader == null || session == null) {
throw new IllegalArgumentException("Parameters cannot be null");
}
@@ -195,7 +196,8 @@
* supported by the device
* @return an instance of Channel if available or null.
*/
- public @Nullable Channel openBasicChannel(byte[] aid, byte p2) throws IOException {
+ public @Nullable Channel openBasicChannel(@Nullable byte[] aid, @Nullable byte p2)
+ throws IOException {
if (!mService.isConnected()) {
throw new IllegalStateException("service not connected to system");
}
@@ -244,7 +246,7 @@
* supported by the device
* @return an instance of Channel if available or null.
*/
- public @Nullable Channel openBasicChannel(byte[] aid) throws IOException {
+ public @Nullable Channel openBasicChannel(@Nullable byte[] aid) throws IOException {
return openBasicChannel(aid, (byte) 0x00);
}
@@ -300,7 +302,8 @@
* @return an instance of Channel. Null if the Secure Element is unable to
* provide a new logical channel.
*/
- public @Nullable Channel openLogicalChannel(byte[] aid, byte p2) throws IOException {
+ public @Nullable Channel openLogicalChannel(@Nullable byte[] aid, @Nullable byte p2)
+ throws IOException {
if (!mService.isConnected()) {
throw new IllegalStateException("service not connected to system");
}
@@ -352,7 +355,7 @@
* @return an instance of Channel. Null if the Secure Element is unable to
* provide a new logical channel.
*/
- public @Nullable Channel openLogicalChannel(byte[] aid) throws IOException {
+ public @Nullable Channel openLogicalChannel(@Nullable byte[] aid) throws IOException {
return openLogicalChannel(aid, (byte) 0x00);
}
}
diff --git a/core/java/android/security/Scrypt.java b/core/java/android/security/Scrypt.java
new file mode 100644
index 0000000..edf8d31
--- /dev/null
+++ b/core/java/android/security/Scrypt.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security;
+
+/**
+ * A Java wrapper for the JNI function to perform the password hashing algorithm SCRYPT.
+ *
+ * @hide
+ */
+public class Scrypt {
+
+ native byte[] nativeScrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen);
+
+ /** Computes the password hashing algorithm SCRYPT. */
+ public byte[] scrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen) {
+ return nativeScrypt(password, salt, n, r, p, outLen);
+ }
+}
diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java
index 1d13335..f4dcce1 100644
--- a/core/java/android/security/keymaster/KeymasterDefs.java
+++ b/core/java/android/security/keymaster/KeymasterDefs.java
@@ -75,6 +75,7 @@
public static final int KM_TAG_ALLOW_WHILE_ON_BODY = KM_BOOL | 506;
public static final int KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED = KM_BOOL | 507;
public static final int KM_TAG_TRUSTED_CONFIRMATION_REQUIRED = KM_BOOL | 508;
+ public static final int KM_TAG_UNLOCKED_DEVICE_REQUIRED = KM_BOOL | 509;
public static final int KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600;
public static final int KM_TAG_APPLICATION_ID = KM_BYTES | 601;
@@ -216,6 +217,7 @@
public static final int KM_ERROR_MISSING_MIN_MAC_LENGTH = -58;
public static final int KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59;
public static final int KM_ERROR_CANNOT_ATTEST_IDS = -66;
+ public static final int KM_ERROR_DEVICE_LOCKED = -72;
public static final int KM_ERROR_UNIMPLEMENTED = -100;
public static final int KM_ERROR_VERSION_MISMATCH = -101;
public static final int KM_ERROR_UNKNOWN_ERROR = -1000;
@@ -262,6 +264,7 @@
sErrorCodeToString.put(KM_ERROR_INVALID_MAC_LENGTH,
"Invalid MAC or authentication tag length");
sErrorCodeToString.put(KM_ERROR_CANNOT_ATTEST_IDS, "Unable to attest device ids");
+ sErrorCodeToString.put(KM_ERROR_DEVICE_LOCKED, "Device locked");
sErrorCodeToString.put(KM_ERROR_UNIMPLEMENTED, "Not implemented");
sErrorCodeToString.put(KM_ERROR_UNKNOWN_ERROR, "Unknown error");
}
diff --git a/core/java/android/security/keystore/RecoveryController.java b/core/java/android/security/keystore/RecoveryController.java
index d50424d..ca67e35b 100644
--- a/core/java/android/security/keystore/RecoveryController.java
+++ b/core/java/android/security/keystore/RecoveryController.java
@@ -21,7 +21,6 @@
import android.app.PendingIntent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.util.Log;
@@ -99,12 +98,11 @@
}
/**
+ * Deprecated.
* Gets a new instance of the class.
*/
public static RecoveryController getInstance() {
- ILockSettings lockSettings =
- ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings"));
- return new RecoveryController(lockSettings);
+ throw new UnsupportedOperationException("using Deprecated RecoveryController version");
}
/**
@@ -128,16 +126,8 @@
public void initRecoveryService(
@NonNull String rootCertificateAlias, @NonNull byte[] signedPublicKeyList)
throws BadCertificateFormatException, InternalRecoveryServiceException {
- try {
- mBinder.initRecoveryService(rootCertificateAlias, signedPublicKeyList);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- if (e.errorCode == ERROR_BAD_CERTIFICATE_FORMAT) {
- throw new BadCertificateFormatException(e.getMessage());
- }
- throw wrapUnexpectedServiceSpecificException(e);
- }
+ throw new UnsupportedOperationException("Deprecated initRecoveryService method called");
+
}
/**
@@ -443,16 +433,7 @@
*/
public byte[] generateAndStoreKey(@NonNull String alias)
throws InternalRecoveryServiceException, LockScreenRequiredException {
- try {
- return mBinder.generateAndStoreKey(alias);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- if (e.errorCode == ERROR_INSECURE_USER) {
- throw new LockScreenRequiredException(e.getMessage());
- }
- throw wrapUnexpectedServiceSpecificException(e);
- }
+ throw new UnsupportedOperationException();
}
/**
diff --git a/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java b/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
index 2a66206..4af1af5 100644
--- a/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
+++ b/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
@@ -50,6 +50,22 @@
*/
@SystemApi
public final class KeyChainProtectionParams implements Parcelable {
+
+ // IMPORTANT! PLEASE READ!
+ // -----------------------
+ // If you edit this file (e.g., to add new fields), please MAKE SURE to also do the following:
+ // - Update the #writeToParcel(Parcel) method below
+ // - Update the #(Parcel) constructor below
+ // - Update android.security.keystore.recovery.KeyChainSnapshotTest to make sure nobody
+ // accidentally breaks your fields in the Parcel in the future.
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly serialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly deserialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeychainSnapshotSerializerTest to make sure nobody breaks serialization of your field
+ // in the future.
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"TYPE_"}, value = {TYPE_LOCKSCREEN})
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index 24ff182..9334aa9 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -48,6 +48,22 @@
*/
@SystemApi
public final class KeyChainSnapshot implements Parcelable {
+
+ // IMPORTANT! PLEASE READ!
+ // -----------------------
+ // If you edit this file (e.g., to add new fields), please MAKE SURE to also do the following:
+ // - Update the #writeToParcel(Parcel) method below
+ // - Update the #(Parcel) constructor below
+ // - Update android.security.keystore.recovery.KeyChainSnapshotTest to make sure nobody
+ // accidentally breaks your fields in the Parcel in the future.
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly serialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly deserialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeychainSnapshotSerializerTest to make sure nobody breaks serialization of your field
+ // in the future.
+
private static final int DEFAULT_MAX_ATTEMPTS = 10;
private static final long DEFAULT_COUNTER_ID = 1L;
@@ -62,23 +78,8 @@
private byte[] mEncryptedRecoveryKeyBlob;
/**
- * @hide
- * Deprecated, consider using builder.
+ * Use builder to create an instance of the class.
*/
- public KeyChainSnapshot(
- int snapshotVersion,
- @NonNull List<KeyChainProtectionParams> keyChainProtectionParams,
- @NonNull List<WrappedApplicationKey> wrappedApplicationKeys,
- @NonNull byte[] encryptedRecoveryKeyBlob) {
- mSnapshotVersion = snapshotVersion;
- mKeyChainProtectionParams =
- Preconditions.checkCollectionElementsNotNull(keyChainProtectionParams,
- "KeyChainProtectionParams");
- mEntryRecoveryData = Preconditions.checkCollectionElementsNotNull(wrappedApplicationKeys,
- "wrappedApplicationKeys");
- mEncryptedRecoveryKeyBlob = Preconditions.checkNotNull(encryptedRecoveryKeyBlob);
- }
-
private KeyChainSnapshot() {
}
@@ -92,7 +93,7 @@
}
/**
- * Number of user secret guesses allowed during Keychain recovery.
+ * Number of user secret guesses allowed during KeyChain recovery.
*/
public int getMaxAttempts() {
return mMaxAttempts;
diff --git a/core/java/android/security/keystore/recovery/KeyDerivationParams.java b/core/java/android/security/keystore/recovery/KeyDerivationParams.java
index 225b592..5165f0c 100644
--- a/core/java/android/security/keystore/recovery/KeyDerivationParams.java
+++ b/core/java/android/security/keystore/recovery/KeyDerivationParams.java
@@ -35,6 +35,22 @@
*/
@SystemApi
public final class KeyDerivationParams implements Parcelable {
+
+ // IMPORTANT! PLEASE READ!
+ // -----------------------
+ // If you edit this file (e.g., to add new fields), please MAKE SURE to also do the following:
+ // - Update the #writeToParcel(Parcel) method below
+ // - Update the #(Parcel) constructor below
+ // - Update android.security.keystore.recovery.KeyChainSnapshotTest to make sure nobody
+ // accidentally breaks your fields in the Parcel in the future.
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly serialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly deserialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeychainSnapshotSerializerTest to make sure nobody breaks serialization of your field
+ // in the future.
+
private final int mAlgorithm;
private final byte[] mSalt;
private final int mMemoryDifficulty;
@@ -59,7 +75,7 @@
* Creates instance of the class to to derive keys using salted SHA256 hash.
*
* <p>The salted SHA256 hash is computed over the concatenation of four byte strings, salt_len +
- * salt + key_material_len + key_material, where salt_len and key_material_len are one-byte, and
+ * salt + key_material_len + key_material, where salt_len and key_material_len are 4-byte, and
* denote the number of bytes for salt and key_material, respectively.
*/
public static @NonNull KeyDerivationParams createSha256Params(@NonNull byte[] salt) {
@@ -90,7 +106,7 @@
/**
* @hide
*/
- KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt,
+ private KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt,
int memoryDifficulty) {
mAlgorithm = algorithm;
mSalt = Preconditions.checkNotNull(salt);
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index ab52d32..281822a 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -41,21 +41,133 @@
import java.util.Map;
/**
- * An assistant for generating {@link javax.crypto.SecretKey} instances that can be recovered by
- * other Android devices belonging to the user. The exported keychain is protected by the user's
- * lock screen.
+ * Backs up cryptographic keys to remote secure hardware, encrypted with the user's lock screen.
*
- * <p>The RecoveryController must be paired with a recovery agent. The recovery agent is responsible
- * for transporting the keychain to remote trusted hardware. This hardware must prevent brute force
- * attempts against the user's lock screen by limiting the number of allowed guesses (to, e.g., 10).
- * After that number of incorrect guesses, the trusted hardware no longer allows access to the
- * key chain.
+ * <p>A system app with the {@code android.permission.RECOVER_KEYSTORE} permission may generate or
+ * import recoverable keys using this class. To generate a key, the app must call
+ * {@link #generateKey(String)} with the desired alias for the key. This returns an AndroidKeyStore
+ * reference to a 256-bit {@link javax.crypto.SecretKey}, which can be used for AES/GCM/NoPadding.
+ * In order to get the same key again at a later time, the app can call {@link #getKey(String)} with
+ * the same alias. If a key is generated in this way the key's raw material is never directly
+ * exposed to the calling app. The system app may also import key material using
+ * {@link #importKey(String, byte[])}. The app may only generate and import keys for its own
+ * {@code uid}.
*
- * <p>Only the recovery agent itself is able to create keys, so it is expected that the recovery
- * agent is itself the system app.
+ * <p>The same system app must also register a Recovery Agent to manage syncing recoverable keys to
+ * remote secure hardware. The Recovery Agent is a service that registers itself with the controller
+ * as follows:
*
- * <p>A recovery agent requires the privileged permission
- * {@code android.Manifest.permission#RECOVER_KEYSTORE}.
+ * <ul>
+ * <li>Invokes {@link #initRecoveryService(String, byte[], byte[])}
+ * <ul>
+ * <li>The first argument is the alias of the root certificate used to verify trusted
+ * hardware modules. Each trusted hardware module must have a public key signed with this
+ * root of trust. Roots of trust must be shipped with the framework. The app can list all
+ * valid roots of trust by calling {@link #getRootCertificates()}.
+ * <li>The second argument is the UTF-8 bytes of the XML listing file. It lists the X509
+ * certificates containing the public keys of all available remote trusted hardware modules.
+ * Each of the X509 certificates can be validated against the chosen root of trust.
+ * <li>The third argument is the UTF-8 bytes of the XML signing file. The file contains a
+ * signature of the XML listing file. The signature can be validated against the chosen root
+ * of trust.
+ * </ul>
+ * <p>This will cause the controller to choose a random public key from the list. From then
+ * on the controller will attempt to sync the key chain with the trusted hardware module to whom
+ * that key belongs.
+ * <li>Invokes {@link #setServerParams(byte[])} with a byte string that identifies the device
+ * to a remote server. This server may act as the front-end to the trusted hardware modules. It
+ * is up to the Recovery Agent to decide how best to identify devices, but this could be, e.g.,
+ * based on the <a href="https://developers.google.com/instance-id/">Instance ID</a> of the
+ * system app.
+ * <li>Invokes {@link #setRecoverySecretTypes(int[])} with a list of types of secret used to
+ * secure the recoverable key chain. For now only
+ * {@link KeyChainProtectionParams#TYPE_LOCKSCREEN} is supported.
+ * <li>Invokes {@link #setSnapshotCreatedPendingIntent(PendingIntent)} with a
+ * {@link PendingIntent} that is to be invoked whenever a new snapshot is created. Although the
+ * controller can create snapshots without the Recovery Agent registering this intent, it is a
+ * good idea to register the intent so that the Recovery Agent is able to sync this snapshot to
+ * the trusted hardware module as soon as it is available.
+ * </ul>
+ *
+ * <p>The trusted hardware module's public key MUST be generated on secure hardware with protections
+ * equivalent to those described in the
+ * <a href="https://developer.android.com/preview/features/security/ckv-whitepaper.html">Google
+ * Cloud Key Vault Service whitepaper</a>. The trusted hardware module itself must protect the key
+ * chain from brute-forcing using the methods also described in the whitepaper: i.e., it should
+ * limit the number of allowed attempts to enter the lock screen. If the number of attempts is
+ * exceeded the key material must no longer be recoverable.
+ *
+ * <p>A recoverable key chain snapshot is considered pending if any of the following conditions
+ * are met:
+ *
+ * <ul>
+ * <li>The system app mutates the key chain. i.e., generates, imports, or removes a key.
+ * <li>The user changes their lock screen.
+ * </ul>
+ *
+ * <p>Whenever the user unlocks their device, if a snapshot is pending, the Recovery Controller
+ * generates a new snapshot. It follows these steps to do so:
+ *
+ * <ul>
+ * <li>Generates a 256-bit AES key using {@link java.security.SecureRandom}. This is the
+ * Recovery Key.
+ * <li>Wraps the key material of all keys in the recoverable key chain with the Recovery Key.
+ * <li>Encrypts the Recovery Key with both the public key of the trusted hardware module and a
+ * symmetric key derived from the user's lock screen.
+ * </ul>
+ *
+ * <p>The controller then writes this snapshot to disk, and uses the {@link PendingIntent} that was
+ * set by the Recovery Agent during initialization to inform it that a new snapshot is available.
+ * The snapshot only contains keys for that Recovery Agent's {@code uid} - i.e., keys the agent's
+ * app itself generated. If multiple Recovery Agents exist on the device, each will be notified of
+ * their new snapshots, and each snapshots' keys will be only those belonging to the same
+ * {@code uid}.
+ *
+ * <p>The Recovery Agent retrieves its most recent snapshot by calling
+ * {@link #getKeyChainSnapshot()}. It syncs the snapshot to the remote server. The snapshot contains
+ * the public key used for encryption, which the server uses to forward the encrypted recovery key
+ * to the correct trusted hardware module. The snapshot also contains the server params, which are
+ * used to identify this device to the server.
+ *
+ * <p>The client uses the server params to identify a device whose key chain it wishes to restore.
+ * This may be on a different device to the device that originally synced the key chain. The client
+ * sends the server params identifying the previous device to the server. The server returns the
+ * X509 certificate identifying the trusted hardware module in which the encrypted Recovery Key is
+ * stored. It also returns some vault parameters identifying that particular Recovery Key to the
+ * trusted hardware module. And it also returns a vault challenge, which is used as part of the
+ * vault opening protocol to ensure the recovery claim is fresh. See the whitepaper for more
+ * details.
+ *
+ * <p>The key chain is recovered via a {@link RecoverySession}. A Recovery Agent creates one by
+ * invoking {@link #createRecoverySession()}. It then invokes
+ * {@link RecoverySession#start(String, CertPath, byte[], byte[], List)} with these arguments:
+ *
+ * <ul>
+ * <li>The alias of the root of trust used to verify the trusted hardware module.
+ * <li>The X509 certificate of the trusted hardware module.
+ * <li>The vault parameters used to identify the Recovery Key to the trusted hardware module.
+ * <li>The vault challenge, as issued by the trusted hardware module.
+ * <li>A list of secrets, corresponding to the secrets used to protect the key chain. At the
+ * moment this is a single {@link KeyChainProtectionParams} containing the lock screen of the
+ * device whose key chain is to be recovered.
+ * </ul>
+ *
+ * <p>This method returns a byte array containing the Recovery Claim, which can be issued to the
+ * remote trusted hardware module. It is encrypted with the trusted hardware module's public key
+ * (which has itself been certified with the root of trust). It also contains an ephemeral symmetric
+ * key generated for this recovery session, which the remote trusted hardware module uses to encrypt
+ * its responses. This is the Session Key.
+ *
+ * <p>If the lock screen provided is correct, the remote trusted hardware module decrypts one of the
+ * layers of lock-screen encryption from the Recovery Key. It then returns this key, encrypted with
+ * the Session Key to the Recovery Agent. As the Recovery Agent does not know the Session Key, it
+ * must then invoke {@link RecoverySession#recoverKeyChainSnapshot(byte[], List)} with the encrypted
+ * Recovery Key and the list of wrapped application keys. The controller then decrypts the layer of
+ * encryption provided by the Session Key, and uses the lock screen to decrypt the final layer of
+ * encryption. It then uses the Recovery Key to decrypt all of the wrapped application keys, and
+ * imports them into its own KeyStore. The Recovery Agent's app may then access these keys by
+ * calling {@link #getKey(String)}. Only this app's {@code uid} may access the keys that have been
+ * recovered.
*
* @hide
*/
@@ -180,7 +292,7 @@
} catch (ServiceSpecificException e) {
if (e.errorCode == ERROR_BAD_CERTIFICATE_FORMAT
|| e.errorCode == ERROR_INVALID_CERTIFICATE) {
- throw new CertificateException(e.getMessage());
+ throw new CertificateException("Invalid certificate for recovery service", e);
}
throw wrapUnexpectedServiceSpecificException(e);
}
@@ -226,7 +338,7 @@
} catch (ServiceSpecificException e) {
if (e.errorCode == ERROR_BAD_CERTIFICATE_FORMAT
|| e.errorCode == ERROR_INVALID_CERTIFICATE) {
- throw new CertificateException(e.getMessage());
+ throw new CertificateException("Invalid certificate for recovery service", e);
}
throw wrapUnexpectedServiceSpecificException(e);
}
@@ -465,16 +577,7 @@
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public byte[] generateAndStoreKey(@NonNull String alias, byte[] account)
throws InternalRecoveryServiceException, LockScreenRequiredException {
- try {
- return mBinder.generateAndStoreKey(alias);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- if (e.errorCode == ERROR_INSECURE_USER) {
- throw new LockScreenRequiredException(e.getMessage());
- }
- throw wrapUnexpectedServiceSpecificException(e);
- }
+ throw new UnsupportedOperationException("Operation is not supported, use generateKey");
}
/**
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 0690bd5..8353389 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -102,7 +102,7 @@
} catch (ServiceSpecificException e) {
if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT
|| e.errorCode == RecoveryController.ERROR_INVALID_CERTIFICATE) {
- throw new CertificateException(e.getMessage());
+ throw new CertificateException("Invalid certificate for recovery session", e);
}
throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
}
@@ -137,7 +137,7 @@
} catch (ServiceSpecificException e) {
if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT
|| e.errorCode == RecoveryController.ERROR_INVALID_CERTIFICATE) {
- throw new CertificateException(e.getMessage());
+ throw new CertificateException("Invalid certificate for recovery session", e);
}
throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
}
@@ -157,8 +157,8 @@
* @param vaultChallenge Data passed from server for this recovery session and used to prevent
* replay attacks.
* @param secrets Secrets provided by user, the method only uses type and secret fields.
- * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is
- * encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric
+ * @return The binary blob with recovery claim. It is encrypted with verifierPublicKey
+ * and contains a proof of user secrets possession, session symmetric
* key and parameters necessary to identify the counter with the number of failed recovery
* attempts.
* @throws CertificateException if the {@code verifierCertPath} is invalid.
@@ -191,7 +191,7 @@
} catch (ServiceSpecificException e) {
if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT
|| e.errorCode == RecoveryController.ERROR_INVALID_CERTIFICATE) {
- throw new CertificateException(e.getMessage());
+ throw new CertificateException("Invalid certificate for recovery session", e);
}
throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
}
@@ -228,7 +228,8 @@
*
* @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
* @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
- * and session.
+ * and session key generated by {@link #start}.
+ * @return {@code Map} from recovered keys aliases to their references.
* @throws SessionExpiredException if {@code session} has since been closed.
* @throws DecryptionFailedException if unable to decrypt the snapshot.
* @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
@@ -288,8 +289,7 @@
}
/**
- * Deletes all data associated with {@code session}. Should not be invoked directly but via
- * {@link RecoverySession#close()}.
+ * Deletes all data associated with {@code session}.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@Override
diff --git a/core/java/android/security/keystore/recovery/TrustedRootCertificates.java b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
index 383af42..a96dab6 100644
--- a/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
+++ b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
@@ -37,6 +37,40 @@
public static final String GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS =
"GoogleCloudKeyVaultServiceV1";
+ /**
+ * Certificate used for client-side end-to-end encryption tests.
+ * When recovery controller is initialized with the certificate, recovery snapshots will only
+ * contain application keys started with {@link #INSECURE_KEY_ALIAS_PREFIX}.
+ * Recovery snapshot will only be created if device is unlocked with password started with
+ * {@link #INSECURE_PASSWORD_PREFIX}.
+ *
+ * @hide
+ */
+ public static final String TEST_ONLY_INSECURE_CERTIFICATE_ALIAS =
+ "TEST_ONLY_INSECURE_CERTIFICATE_ALIAS";
+
+ /**
+ * TODO: Add insecure certificate to TestApi.
+ * @hide
+ */
+ public static @NonNull X509Certificate getTestOnlyInsecureCertificate() {
+ return parseBase64Certificate(TEST_ONLY_INSECURE_CERTIFICATE_BASE64);
+ }
+ /**
+ * Keys, which alias starts with the prefix are not protected if
+ * recovery agent uses {@link #TEST_ONLY_INSECURE_CERTIFICATE_ALIAS} root certificate.
+ * @hide
+ */
+ public static final String INSECURE_KEY_ALIAS_PREFIX =
+ "INSECURE_KEY_ALIAS_KEY_MATERIAL_IS_NOT_PROTECTED_";
+ /**
+ * Prefix for insecure passwords with length 14.
+ * Passwords started with the prefix are not protected if recovery agent uses
+ * {@link #TEST_ONLY_INSECURE_CERTIFICATE_ALIAS} root certificate.
+ * @hide
+ */
+ public static final String INSECURE_PASSWORD_PREFIX =
+ "INSECURE_PSWD_";
private static final String GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_BASE64 = ""
+ "MIIFJjCCAw6gAwIBAgIJAIobXsJlzhNdMA0GCSqGSIb3DQEBDQUAMCAxHjAcBgNV"
@@ -68,13 +102,43 @@
+ "/oM58v0orUWINtIc2hBlka36PhATYQiLf+AiWKnwhCaaHExoYKfQlMtXBodNvOK8"
+ "xqx69x05q/qbHKEcTHrsss630vxrp1niXvA=";
+ private static final String TEST_ONLY_INSECURE_CERTIFICATE_BASE64 = ""
+ + "MIIFMDCCAxigAwIBAgIJAIZ9/G8KQie9MA0GCSqGSIb3DQEBDQUAMCUxIzAhBgNV"
+ + "BAMMGlRlc3QgT25seSBVbnNlY3VyZSBSb290IENBMB4XDTE4MDMyODAwMzIyM1oX"
+ + "DTM4MDMyMzAwMzIyM1owJTEjMCEGA1UEAwwaVGVzdCBPbmx5IFVuc2VjdXJlIFJv"
+ + "b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGxFNzAEyzSPmw"
+ + "E5gfuBXdXq++bl9Ep62V7Xn1UiejvmS+pRHT39pf/M7sl4Zr9ezanJTrFvf9+B85"
+ + "VGehdsD32TgfEjThcqaoQCI6pKkHYsUo7FZ5n+G3eE8oabWRZJMVo3QDjnnFYp7z"
+ + "20vnpjDofI2oQyxHcb/1yep+ca1+4lIvbUp/ybhNFqhRXAMcDXo7pyH38eUQ1JdK"
+ + "Q/QlBbShpFEqx1Y6KilKfTDf7Wenqr67LkaEim//yLZjlHzn/BpuRTrpo+XmJZx1"
+ + "P9CX9LGOXTtmsaCcYgD4yijOvV8aEsIJaf1kCIO558oH0oQc+0JG5aXeLN7BDlyZ"
+ + "vH0RdSx5nQLS9kj2I6nthOw/q00/L+S6A0m5jyNZOAl1SY78p+wO0d9eHbqQzJwf"
+ + "EsSq3qGAqlgQyyjp6oxHBqT9hZtN4rxw+iq0K1S4kmTLNF1FvmIB1BE+lNvvoGdY"
+ + "5G0b6Pe4R5JFn9LV3C3PEmSYnae7iG0IQlKmRADIuvfJ7apWAVanJPJAAWh2Akfp"
+ + "8Uxr02cHoY6o7vsEhJJOeMkipaBHThESm/XeFVubQzNfZ9gjQnB9ZX2v+lyj+WYZ"
+ + "SAz3RuXx6TlLrmWccMpQDR1ibcgyyjLUtX3kwZl2OxmJXitjuD7xlxvAXYob15N+"
+ + "K4xKHgxUDrbt2zU/tY0vgepAUg/xbwIDAQABo2MwYTAdBgNVHQ4EFgQUwyeNpYgs"
+ + "XXYvh9z0/lFrja7sV+swHwYDVR0jBBgwFoAUwyeNpYgsXXYvh9z0/lFrja7sV+sw"
+ + "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQENBQAD"
+ + "ggIBAGuOsvMN5SD3RIQnMJtBpcHNrxun+QFjPZFlYCLfIPrUkHpn5O1iIIq8tVLd"
+ + "2V+12VKnToUEANsYBD3MP8XjP+6GZ7ZQ2rwLGvUABKSX4YXvmjEEXZUZp0y3tIV4"
+ + "kUDlbACzguPneZDp5Qo7YWH4orgqzHkn0sD/ikO5XrAqmzc245ewJlrf+V11mjcu"
+ + "ELfDrEejpPhi7Hk/ZNR0ftP737Hs/dNoCLCIaVNgYzBZhgo4kd220TeJu2ttW0XZ"
+ + "ldyShtpcOmyWKBgVseixR6L/3sspPHyAPXkSuRo0Eh1xvzDKCg9ttb0qoacTlXMF"
+ + "GkBpNzmVq67NWFGGa9UElift1mv6RfktPCAGZ+Ai8xUiKAUB0Eookpt/8gX9Senq"
+ + "yP/jMxkxXmHWxUu8+KnLvj6WLrfftuuD7u3cfc7j5kkrheDz3O4h4477GnqL5wdo"
+ + "9DuEsNc4FxJVz8Iy8RS6cJuW4pihYpM1Tyn7uopLnImpYzEY+R5aQqqr+q/A1diq"
+ + "ogbEKPH6oUiqJUwq3nD70gPBUKJmIzS4vLwLouqUHEm1k/MgHV/BkEU0uVHszPFa"
+ + "XUMMCHb0iT9P8LuZ7Ajer3SR/0TRVApCrk/6OV68e+6k/OFpM5kcZnNMD5ANyBri"
+ + "Tsz3NrDwSw4i4+Dsfh6A9dB/cEghw4skLaBxnQLQIgVeqCzK";
+
/**
* The X509 certificate of the trusted root CA cert for the recoverable key store service.
*
* TODO: Change it to the production certificate root CA before the final launch.
*/
private static final X509Certificate GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_CERTIFICATE =
- parseGoogleCloudKeyVaultServiceV1Certificate();
+ parseBase64Certificate(GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_BASE64);
private static final int NUMBER_OF_ROOT_CERTIFICATES = 1;
@@ -107,9 +171,9 @@
return certificates;
}
- private static X509Certificate parseGoogleCloudKeyVaultServiceV1Certificate() {
+ private static X509Certificate parseBase64Certificate(String base64Certificate) {
try {
- return decodeBase64Cert(GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_BASE64);
+ return decodeBase64Cert(base64Certificate);
} catch (CertificateException e) {
// Should not happen
throw new RuntimeException(e);
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index 714e35a..32952db 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -42,6 +42,21 @@
// The only supported format is AES-256 symmetric key.
private byte[] mEncryptedKeyMaterial;
+ // IMPORTANT! PLEASE READ!
+ // -----------------------
+ // If you edit this file (e.g., to add new fields), please MAKE SURE to also do the following:
+ // - Update the #writeToParcel(Parcel) method below
+ // - Update the #(Parcel) constructor below
+ // - Update android.security.keystore.recovery.KeyChainSnapshotTest to make sure nobody
+ // accidentally breaks your fields in the Parcel in the future.
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly serialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeyChainSnapshotSerializer to correctly deserialize your new field
+ // - Update com.android.server.locksettings.recoverablekeystore.serialization
+ // .KeychainSnapshotSerializerTest to make sure nobody breaks serialization of your field
+ // in the future.
+
/**
* Builder for creating {@link WrappedApplicationKey}.
*/
diff --git a/core/java/android/service/autofill/AutofillFieldClassificationService.java b/core/java/android/service/autofill/AutofillFieldClassificationService.java
index cf16749..1cd76d2 100644
--- a/core/java/android/service/autofill/AutofillFieldClassificationService.java
+++ b/core/java/android/service/autofill/AutofillFieldClassificationService.java
@@ -41,11 +41,11 @@
*
* <p>A field classification score is a {@code float} representing how well an
* {@link AutofillValue} filled matches a expected value predicted by an autofill service
- * —a full-match is {@code 1.0} (representing 100%), while a full mismatch is {@code 0.0}.
+ * —a full match is {@code 1.0} (representing 100%), while a full mismatch is {@code 0.0}.
*
- * <p>The exact score depends on the algorithm used to calculate it— the service must provide
+ * <p>The exact score depends on the algorithm used to calculate it—the service must provide
* at least one default algorithm (which is used when the algorithm is not specified or is invalid),
- * but it could provide more (in which case the algorithm name should be specifiied by the caller
+ * but it could provide more (in which case the algorithm name should be specified by the caller
* when calculating the scores).
*
* {@hide}
@@ -113,23 +113,67 @@
/**
* Calculates field classification scores in a batch.
*
- * <p>See {@link AutofillFieldClassificationService} for more info about field classification
- * scores.
+ * <p>A field classification score is a {@code float} representing how well an
+ * {@link AutofillValue} filled matches a expected value predicted by an autofill service
+ * —a full match is {@code 1.0} (representing 100%), while a full mismatch is {@code 0.0}.
*
- * @param algorithm name of the algorithm to be used to calculate the scores. If invalid, the
- * default algorithm will be used instead.
- * @param args optional arguments to be passed to the algorithm.
+ * <p>The exact score depends on the algorithm used to calculate it—the service must
+ * provide at least one default algorithm (which is used when the algorithm is not specified
+ * or is invalid), but it could provide more (in which case the algorithm name should be
+ * specified by the caller when calculating the scores).
+ *
+ * <p>For example, if the service provides an algorithm named {@code EXACT_MATCH} that
+ * returns {@code 1.0} if all characters match or {@code 0.0} otherwise, a call to:
+ *
+ * <pre>
+ * service.onGetScores("EXACT_MATCH", null,
+ * Arrays.asList(AutofillValue.forText("email1"), AutofillValue.forText("PHONE1")),
+ * Arrays.asList("email1", "phone1"));
+ * </pre>
+ *
+ * <p>Returns:
+ *
+ * <pre>
+ * [
+ * [1.0, 0.0], // "email1" compared against ["email1", "phone1"]
+ * [0.0, 0.0] // "PHONE1" compared against ["email1", "phone1"]
+ * ];
+ * </pre>
+ *
+ * <p>If the same algorithm allows the caller to specify whether the comparisons should be
+ * case sensitive by passing a boolean option named {@code "case_sensitive"}, then a call to:
+ *
+ * <pre>
+ * Bundle algorithmOptions = new Bundle();
+ * algorithmOptions.putBoolean("case_sensitive", false);
+ *
+ * service.onGetScores("EXACT_MATCH", algorithmOptions,
+ * Arrays.asList(AutofillValue.forText("email1"), AutofillValue.forText("PHONE1")),
+ * Arrays.asList("email1", "phone1"));
+ * </pre>
+ *
+ * <p>Returns:
+ *
+ * <pre>
+ * [
+ * [1.0, 0.0], // "email1" compared against ["email1", "phone1"]
+ * [0.0, 1.0] // "PHONE1" compared against ["email1", "phone1"]
+ * ];
+ * </pre>
+ *
+ * @param algorithm name of the algorithm to be used to calculate the scores. If invalid or
+ * {@code null}, the default algorithm is used instead.
+ * @param algorithmOptions optional arguments to be passed to the algorithm.
* @param actualValues values entered by the user.
* @param userDataValues values predicted from the user data.
- * @return the calculated scores, with the first dimension representing actual values and the
- * second dimension values from {@link UserData}.
+ * @return the calculated scores of {@code actualValues} x {@code userDataValues}.
*
* {@hide}
*/
@Nullable
@SystemApi
public float[][] onGetScores(@Nullable String algorithm,
- @Nullable Bundle args, @NonNull List<AutofillValue> actualValues,
+ @Nullable Bundle algorithmOptions, @NonNull List<AutofillValue> actualValues,
@NonNull List<String> userDataValues) {
Log.e(TAG, "service implementation (" + getClass() + " does not implement onGetScore()");
return null;
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index df62446..6e5bacf 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -424,7 +424,7 @@
* @return map map whose key is the id of the manually-entered field, and value is the
* ids of the datasets that have that value but were not selected by the user.
*/
- @Nullable public Map<AutofillId, Set<String>> getManuallyEnteredField() {
+ @NonNull public Map<AutofillId, Set<String>> getManuallyEnteredField() {
if (mManuallyFilledFieldIds == null || mManuallyFilledDatasetIds == null) {
return Collections.emptyMap();
}
diff --git a/core/java/android/service/notification/ScheduleCalendar.java b/core/java/android/service/notification/ScheduleCalendar.java
index 8a7ff4d..0128710 100644
--- a/core/java/android/service/notification/ScheduleCalendar.java
+++ b/core/java/android/service/notification/ScheduleCalendar.java
@@ -144,7 +144,8 @@
}
return mSchedule.exitAtAlarm
&& mSchedule.nextAlarm != 0
- && time >= mSchedule.nextAlarm;
+ && time >= mSchedule.nextAlarm
+ && isInSchedule(mSchedule.nextAlarm);
}
private boolean isInSchedule(int daysOffset, long time, long start, long end) {
diff --git a/core/java/android/service/textclassifier/ITextClassifierService.aidl b/core/java/android/service/textclassifier/ITextClassifierService.aidl
index 25e9d45..7ac72c7 100644
--- a/core/java/android/service/textclassifier/ITextClassifierService.aidl
+++ b/core/java/android/service/textclassifier/ITextClassifierService.aidl
@@ -21,30 +21,41 @@
import android.service.textclassifier.ITextSelectionCallback;
import android.view.textclassifier.SelectionEvent;
import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationContext;
+import android.view.textclassifier.TextClassificationSessionId;
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
/**
* TextClassifierService binder interface.
- * See TextClassifier (and TextClassifier.Logger) for interface documentation.
+ * See TextClassifier for interface documentation.
* {@hide}
*/
oneway interface ITextClassifierService {
void onSuggestSelection(
- in CharSequence text, int selectionStartIndex, int selectionEndIndex,
- in TextSelection.Options options,
- in ITextSelectionCallback c);
+ in TextClassificationSessionId sessionId,
+ in TextSelection.Request request,
+ in ITextSelectionCallback callback);
void onClassifyText(
- in CharSequence text, int startIndex, int endIndex,
- in TextClassification.Options options,
- in ITextClassificationCallback c);
+ in TextClassificationSessionId sessionId,
+ in TextClassification.Request request,
+ in ITextClassificationCallback callback);
void onGenerateLinks(
- in CharSequence text,
- in TextLinks.Options options,
- in ITextLinksCallback c);
+ in TextClassificationSessionId sessionId,
+ in TextLinks.Request request,
+ in ITextLinksCallback callback);
- void onSelectionEvent(in SelectionEvent event);
+ void onSelectionEvent(
+ in TextClassificationSessionId sessionId,
+ in SelectionEvent event);
+
+ void onCreateTextClassificationSession(
+ in TextClassificationContext context,
+ in TextClassificationSessionId sessionId);
+
+ void onDestroyTextClassificationSession(
+ in TextClassificationSessionId sessionId);
}
diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java
index 88e29b0..f1bb72c 100644
--- a/core/java/android/service/textclassifier/TextClassifierService.java
+++ b/core/java/android/service/textclassifier/TextClassifierService.java
@@ -17,7 +17,6 @@
package android.service.textclassifier;
import android.Manifest;
-import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
@@ -35,11 +34,15 @@
import android.util.Slog;
import android.view.textclassifier.SelectionEvent;
import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationContext;
import android.view.textclassifier.TextClassificationManager;
+import android.view.textclassifier.TextClassificationSessionId;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
+import com.android.internal.util.Preconditions;
+
/**
* Abstract base class for the TextClassifier service.
*
@@ -88,11 +91,13 @@
/** {@inheritDoc} */
@Override
public void onSuggestSelection(
- CharSequence text, int selectionStartIndex, int selectionEndIndex,
- TextSelection.Options options, ITextSelectionCallback callback)
+ TextClassificationSessionId sessionId,
+ TextSelection.Request request, ITextSelectionCallback callback)
throws RemoteException {
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
TextClassifierService.this.onSuggestSelection(
- text, selectionStartIndex, selectionEndIndex, options, mCancellationSignal,
+ sessionId, request, mCancellationSignal,
new Callback<TextSelection>() {
@Override
public void onSuccess(TextSelection result) {
@@ -119,11 +124,13 @@
/** {@inheritDoc} */
@Override
public void onClassifyText(
- CharSequence text, int startIndex, int endIndex,
- TextClassification.Options options, ITextClassificationCallback callback)
+ TextClassificationSessionId sessionId,
+ TextClassification.Request request, ITextClassificationCallback callback)
throws RemoteException {
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
TextClassifierService.this.onClassifyText(
- text, startIndex, endIndex, options, mCancellationSignal,
+ sessionId, request, mCancellationSignal,
new Callback<TextClassification>() {
@Override
public void onSuccess(TextClassification result) {
@@ -148,10 +155,13 @@
/** {@inheritDoc} */
@Override
public void onGenerateLinks(
- CharSequence text, TextLinks.Options options, ITextLinksCallback callback)
+ TextClassificationSessionId sessionId,
+ TextLinks.Request request, ITextLinksCallback callback)
throws RemoteException {
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
TextClassifierService.this.onGenerateLinks(
- text, options, mCancellationSignal,
+ sessionId, request, mCancellationSignal,
new Callback<TextLinks>() {
@Override
public void onSuccess(TextLinks result) {
@@ -175,8 +185,28 @@
/** {@inheritDoc} */
@Override
- public void onSelectionEvent(SelectionEvent event) throws RemoteException {
- TextClassifierService.this.onSelectionEvent(event);
+ public void onSelectionEvent(
+ TextClassificationSessionId sessionId,
+ SelectionEvent event) throws RemoteException {
+ Preconditions.checkNotNull(event);
+ TextClassifierService.this.onSelectionEvent(sessionId, event);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void onCreateTextClassificationSession(
+ TextClassificationContext context, TextClassificationSessionId sessionId)
+ throws RemoteException {
+ Preconditions.checkNotNull(context);
+ Preconditions.checkNotNull(sessionId);
+ TextClassifierService.this.onCreateTextClassificationSession(context, sessionId);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void onDestroyTextClassificationSession(TextClassificationSessionId sessionId)
+ throws RemoteException {
+ TextClassifierService.this.onDestroyTextClassificationSession(sessionId);
}
};
@@ -193,19 +223,14 @@
* Returns suggested text selection start and end indices, recognized entity types, and their
* associated confidence scores. The entity types are ordered from highest to lowest scoring.
*
- * @param text text providing context for the selected text (which is specified
- * by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
- * @param selectionStartIndex start index of the selected part of text
- * @param selectionEndIndex end index of the selected part of text
- * @param options optional input parameters
+ * @param sessionId the session id
+ * @param request the text selection request
* @param cancellationSignal object to watch for canceling the current operation
* @param callback the callback to return the result to
*/
public abstract void onSuggestSelection(
- @NonNull CharSequence text,
- @IntRange(from = 0) int selectionStartIndex,
- @IntRange(from = 0) int selectionEndIndex,
- @Nullable TextSelection.Options options,
+ @Nullable TextClassificationSessionId sessionId,
+ @NonNull TextSelection.Request request,
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextSelection> callback);
@@ -213,19 +238,14 @@
* Classifies the specified text and returns a {@link TextClassification} object that can be
* used to generate a widget for handling the classified text.
*
- * @param text text providing context for the text to classify (which is specified
- * by the sub sequence starting at startIndex and ending at endIndex)
- * @param startIndex start index of the text to classify
- * @param endIndex end index of the text to classify
- * @param options optional input parameters
+ * @param sessionId the session id
+ * @param request the text classification request
* @param cancellationSignal object to watch for canceling the current operation
* @param callback the callback to return the result to
*/
public abstract void onClassifyText(
- @NonNull CharSequence text,
- @IntRange(from = 0) int startIndex,
- @IntRange(from = 0) int endIndex,
- @Nullable TextClassification.Options options,
+ @Nullable TextClassificationSessionId sessionId,
+ @NonNull TextClassification.Request request,
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextClassification> callback);
@@ -233,14 +253,14 @@
* Generates and returns a {@link TextLinks} that may be applied to the text to annotate it with
* links information.
*
- * @param text the text to generate annotations for
- * @param options configuration for link generation
+ * @param sessionId the session id
+ * @param request the text classification request
* @param cancellationSignal object to watch for canceling the current operation
* @param callback the callback to return the result to
*/
public abstract void onGenerateLinks(
- @NonNull CharSequence text,
- @Nullable TextLinks.Options options,
+ @Nullable TextClassificationSessionId sessionId,
+ @NonNull TextLinks.Request request,
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextLinks> callback);
@@ -250,8 +270,30 @@
* happened.
*
* <p>The default implementation ignores the event.
+ *
+ * @param sessionId the session id
+ * @param event the selection event
*/
- public void onSelectionEvent(@NonNull SelectionEvent event) {}
+ public void onSelectionEvent(
+ @Nullable TextClassificationSessionId sessionId, @NonNull SelectionEvent event) {}
+
+ /**
+ * Creates a new text classification session for the specified context.
+ *
+ * @param context the text classification context
+ * @param sessionId the session's Id
+ */
+ public abstract void onCreateTextClassificationSession(
+ @NonNull TextClassificationContext context,
+ @NonNull TextClassificationSessionId sessionId);
+
+ /**
+ * Destroys the text classification session identified by the specified sessionId.
+ *
+ * @param sessionId the id of the session to destroy
+ */
+ public abstract void onDestroyTextClassificationSession(
+ @NonNull TextClassificationSessionId sessionId);
/**
* Returns a TextClassifier that runs in this service's process.
diff --git a/core/java/android/text/InputType.java b/core/java/android/text/InputType.java
index f38482e..7f903b6 100644
--- a/core/java/android/text/InputType.java
+++ b/core/java/android/text/InputType.java
@@ -24,7 +24,7 @@
* <h3>Examples</h3>
*
* <dl>
- * <dt>A password field with with the password visible to the user:
+ * <dt>A password field with the password visible to the user:
* <dd>inputType = TYPE_CLASS_TEXT |
* TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
*
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index a107cab..96edfa3 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -540,9 +540,6 @@
private void applyStyleRun(@IntRange(from = 0) int start, // inclusive, in copied buffer
@IntRange(from = 0) int end, // exclusive, in copied buffer
/* Maybe Zero */ long nativeBuilderPtr) {
- if (nativeBuilderPtr != 0) {
- mCachedPaint.getFontMetricsInt(mCachedFm);
- }
if (mLtrWithoutBidi) {
// If the whole text is LTR direction, just apply whole region.
@@ -614,6 +611,10 @@
final int startInCopiedBuffer = start - mTextStart;
final int endInCopiedBuffer = end - mTextStart;
+ if (nativeBuilderPtr != 0) {
+ mCachedPaint.getFontMetricsInt(mCachedFm);
+ }
+
if (replacement != null) {
applyReplacementRun(replacement, startInCopiedBuffer, endInCopiedBuffer,
nativeBuilderPtr);
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index 413df05..44789d6 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -16,6 +16,7 @@
package android.text;
+import android.annotation.FloatRange;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -44,13 +45,17 @@
* <pre>
* An example usage is:
* <code>
- * void asyncSetText(final TextView textView, final String longString, Handler bgThreadHandler) {
+ * static void asyncSetText(TextView textView, final String longString, Executor bgExecutor) {
* // construct precompute related parameters using the TextView that we will set the text on.
- * final PrecomputedText.Params params = textView.getTextParams();
- * bgThreadHandler.post(() -> {
- * final PrecomputedText precomputedText =
- * PrecomputedText.create(expensiveLongString, params);
+ * final PrecomputedText.Params params = textView.getTextMetricsParams();
+ * final Reference textViewRef = new WeakReference<>(textView);
+ * bgExecutor.submit(() -> {
+ * TextView textView = textViewRef.get();
+ * if (textView == null) return;
+ * final PrecomputedText precomputedText = PrecomputedText.create(longString, params);
* textView.post(() -> {
+ * TextView textView = textViewRef.get();
+ * if (textView == null) return;
* textView.setText(precomputedText);
* });
* });
@@ -363,6 +368,7 @@
/**
* Return the underlying text.
+ * @hide
*/
public @NonNull CharSequence getText() {
return mText;
@@ -451,27 +457,61 @@
+ ", gave " + pos);
}
- /** @hide */
- public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) {
+ /**
+ * Returns text width for the given range.
+ * Both {@code start} and {@code end} offset need to be in the same paragraph, otherwise
+ * IllegalArgumentException will be thrown.
+ *
+ * @param start the inclusive start offset in the text
+ * @param end the exclusive end offset in the text
+ * @return the text width
+ * @throws IllegalArgumentException if start and end offset are in the different paragraph.
+ */
+ public @FloatRange(from = 0) float getWidth(@IntRange(from = 0) int start,
+ @IntRange(from = 0) int end) {
+ Preconditions.checkArgument(0 <= start && start <= mText.length(), "invalid start offset");
+ Preconditions.checkArgument(0 <= end && end <= mText.length(), "invalid end offset");
+ Preconditions.checkArgument(start <= end, "start offset can not be larger than end offset");
+
+ if (start == end) {
+ return 0;
+ }
final int paraIndex = findParaIndex(start);
final int paraStart = getParagraphStart(paraIndex);
final int paraEnd = getParagraphEnd(paraIndex);
if (start < paraStart || paraEnd < end) {
- throw new RuntimeException("Cannot measured across the paragraph:"
+ throw new IllegalArgumentException("Cannot measured across the paragraph:"
+ "para: (" + paraStart + ", " + paraEnd + "), "
+ "request: (" + start + ", " + end + ")");
}
return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart);
}
- /** @hide */
+ /**
+ * Retrieves the text bounding box for the given range.
+ * Both {@code start} and {@code end} offset need to be in the same paragraph, otherwise
+ * IllegalArgumentException will be thrown.
+ *
+ * @param start the inclusive start offset in the text
+ * @param end the exclusive end offset in the text
+ * @param bounds the output rectangle
+ * @throws IllegalArgumentException if start and end offset are in the different paragraph.
+ */
public void getBounds(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
@NonNull Rect bounds) {
+ Preconditions.checkArgument(0 <= start && start <= mText.length(), "invalid start offset");
+ Preconditions.checkArgument(0 <= end && end <= mText.length(), "invalid end offset");
+ Preconditions.checkArgument(start <= end, "start offset can not be larger than end offset");
+ Preconditions.checkNotNull(bounds);
+ if (start == end) {
+ bounds.set(0, 0, 0, 0);
+ return;
+ }
final int paraIndex = findParaIndex(start);
final int paraStart = getParagraphStart(paraIndex);
final int paraEnd = getParagraphEnd(paraIndex);
if (start < paraStart || paraEnd < end) {
- throw new RuntimeException("Cannot measured across the paragraph:"
+ throw new IllegalArgumentException("Cannot measured across the paragraph:"
+ "para: (" + paraStart + ", " + paraEnd + "), "
+ "request: (" + start + ", " + end + ")");
}
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index 435e324..9c6a3f5 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -33,6 +33,7 @@
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextLinks.TextLinkSpan;
+import android.view.textclassifier.TextLinksParams;
import android.webkit.WebView;
import android.widget.TextView;
@@ -55,7 +56,6 @@
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.function.Consumer;
-import java.util.function.Function;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -502,15 +502,16 @@
* calling thread.
*
* @param textView TextView whose text is to be marked-up with links
- * @param options optional parameters to specify how to generate the links
+ * @param params optional parameters to specify how to generate the links
*
* @return a future that may be used to interrupt or query the background task
+ * @hide
*/
@UiThread
public static Future<Void> addLinksAsync(
@NonNull TextView textView,
- @Nullable TextLinks.Options options) {
- return addLinksAsync(textView, options, null /* executor */, null /* callback */);
+ @Nullable TextLinksParams params) {
+ return addLinksAsync(textView, params, null /* executor */, null /* callback */);
}
/**
@@ -525,16 +526,42 @@
* calling thread.
*
* @param textView TextView whose text is to be marked-up with links
- * @param options optional parameters to specify how to generate the links
- * @param executor Executor that runs the background task
- * @param callback Callback that receives the final status of the background task execution
+ * @param mask mask to define which kinds of links will be generated
*
* @return a future that may be used to interrupt or query the background task
+ * @hide
*/
@UiThread
public static Future<Void> addLinksAsync(
@NonNull TextView textView,
- @Nullable TextLinks.Options options,
+ @LinkifyMask int mask) {
+ return addLinksAsync(textView, TextLinksParams.fromLinkMask(mask),
+ null /* executor */, null /* callback */);
+ }
+
+ /**
+ * Scans the text of the provided TextView and turns all occurrences of the entity types
+ * specified by {@code options} into clickable links. If links are found, this method
+ * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
+ * problems if you call it repeatedly on the same text) and sets the movement method for the
+ * TextView to LinkMovementMethod.
+ *
+ * <p><strong>Note:</strong> This method returns immediately but generates the links with
+ * the specified classifier on a background thread. The generated links are applied on the
+ * calling thread.
+ *
+ * @param textView TextView whose text is to be marked-up with links
+ * @param params optional parameters to specify how to generate the links
+ * @param executor Executor that runs the background task
+ * @param callback Callback that receives the final status of the background task execution
+ *
+ * @return a future that may be used to interrupt or query the background task
+ * @hide
+ */
+ @UiThread
+ public static Future<Void> addLinksAsync(
+ @NonNull TextView textView,
+ @Nullable TextLinksParams params,
@Nullable Executor executor,
@Nullable Consumer<Integer> callback) {
Preconditions.checkNotNull(textView);
@@ -548,7 +575,7 @@
}
};
return addLinksAsync(spannable, textView.getTextClassifier(),
- options, executor, callback, modifyTextView);
+ params, executor, callback, modifyTextView);
}
/**
@@ -566,15 +593,16 @@
*
* @param text Spannable whose text is to be marked-up with links
* @param classifier the TextClassifier to use to generate the links
- * @param options optional parameters to specify how to generate the links
+ * @param params optional parameters to specify how to generate the links
*
* @return a future that may be used to interrupt or query the background task
+ * @hide
*/
public static Future<Void> addLinksAsync(
@NonNull Spannable text,
@NonNull TextClassifier classifier,
- @Nullable TextLinks.Options options) {
- return addLinksAsync(text, classifier, options, null /* executor */, null /* callback */);
+ @Nullable TextLinksParams params) {
+ return addLinksAsync(text, classifier, params, null /* executor */, null /* callback */);
}
/**
@@ -595,12 +623,13 @@
* @param mask mask to define which kinds of links will be generated
*
* @return a future that may be used to interrupt or query the background task
+ * @hide
*/
public static Future<Void> addLinksAsync(
@NonNull Spannable text,
@NonNull TextClassifier classifier,
@LinkifyMask int mask) {
- return addLinksAsync(text, classifier, TextLinks.Options.fromLinkMask(mask),
+ return addLinksAsync(text, classifier, TextLinksParams.fromLinkMask(mask),
null /* executor */, null /* callback */);
}
@@ -619,39 +648,46 @@
*
* @param text Spannable whose text is to be marked-up with links
* @param classifier the TextClassifier to use to generate the links
- * @param options optional parameters to specify how to generate the links
+ * @param params optional parameters to specify how to generate the links
* @param executor Executor that runs the background task
* @param callback Callback that receives the final status of the background task execution
*
* @return a future that may be used to interrupt or query the background task
+ * @hide
*/
public static Future<Void> addLinksAsync(
@NonNull Spannable text,
@NonNull TextClassifier classifier,
- @Nullable TextLinks.Options options,
+ @Nullable TextLinksParams params,
@Nullable Executor executor,
@Nullable Consumer<Integer> callback) {
- return addLinksAsync(text, classifier, options, executor, callback,
+ return addLinksAsync(text, classifier, params, executor, callback,
null /* modifyTextView */);
}
private static Future<Void> addLinksAsync(
@NonNull Spannable text,
@NonNull TextClassifier classifier,
- @Nullable TextLinks.Options options,
+ @Nullable TextLinksParams params,
@Nullable Executor executor,
@Nullable Consumer<Integer> callback,
@Nullable Runnable modifyTextView) {
Preconditions.checkNotNull(text);
Preconditions.checkNotNull(classifier);
+ // TODO: This is a bug. We shouldnot call getMaxGenerateLinksTextLength() on the UI thread.
// The input text may exceed the maximum length the text classifier can handle. In such
// cases, we process the text up to the maximum length.
final CharSequence truncatedText = text.subSequence(
0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
- final Supplier<TextLinks> supplier = () ->
- classifier.generateLinks(truncatedText, options.setLegacyFallback(true));
+ final TextClassifier.EntityConfig entityConfig = (params == null)
+ ? null : params.getEntityConfig();
+ final TextLinks.Request request = new TextLinks.Request.Builder(truncatedText)
+ .setLegacyFallback(true)
+ .setEntityConfig(entityConfig)
+ .build();
+ final Supplier<TextLinks> supplier = () -> classifier.generateLinks(request);
final Consumer<TextLinks> consumer = links -> {
if (links.getLinks().isEmpty()) {
if (callback != null) {
@@ -661,17 +697,13 @@
}
// Remove spans only for the part of the text we generated links for.
- final TextLinkSpan[] old = text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
+ final TextLinkSpan[] old =
+ text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
for (int i = old.length - 1; i >= 0; i--) {
text.removeSpan(old[i]);
}
- final Function<TextLinks.TextLink, TextLinkSpan> spanFactory = (options == null)
- ? null : options.getSpanFactory();
- final @TextLinks.ApplyStrategy int applyStrategy = (options == null)
- ? TextLinks.APPLY_STRATEGY_IGNORE : options.getApplyStrategy();
- final @TextLinks.Status int result = links.apply(text, applyStrategy, spanFactory,
- true /*allowPrefix*/);
+ final @TextLinks.Status int result = params.apply(text, links);
if (result == TextLinks.STATUS_LINKS_APPLIED) {
if (modifyTextView != null) {
modifyTextView.run();
diff --git a/core/java/android/util/DataUnit.java b/core/java/android/util/DataUnit.java
index ea4266e..cf045b8 100644
--- a/core/java/android/util/DataUnit.java
+++ b/core/java/android/util/DataUnit.java
@@ -29,6 +29,8 @@
* "kibibyte" as an IEC unit of 1024 bytes.
* <p>
* This design is mirrored after {@link TimeUnit} and {@link ChronoUnit}.
+ *
+ * @hide
*/
public enum DataUnit {
KILOBYTES { @Override public long toBytes(long v) { return v * 1_000; } },
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 9687009..eecdb74 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -37,7 +37,6 @@
private static final Map<String, String> DEFAULT_FLAGS;
static {
DEFAULT_FLAGS = new HashMap<>();
- DEFAULT_FLAGS.put("settings_battery_v2", "true");
DEFAULT_FLAGS.put("settings_battery_display_app_list", "false");
DEFAULT_FLAGS.put("settings_zone_picker_v2", "true");
DEFAULT_FLAGS.put("settings_about_phone_v2", "true");
diff --git a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
index 4431bcef1..758cd2b 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
@@ -62,6 +62,7 @@
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -457,6 +458,7 @@
// get the version code, but don't do anything with it: creator knew about all our flags
porBuf.getInt();
+ HashSet<X509Certificate> certHistorySet = new HashSet<>();
while (porBuf.hasRemaining()) {
levelCount++;
ByteBuffer level = getLengthPrefixedSlice(porBuf);
@@ -495,6 +497,12 @@
lastCert = new VerbatimX509Certificate(lastCert, encodedCert);
lastSigAlgorithm = sigAlgorithm;
+ if (certHistorySet.contains(lastCert)) {
+ throw new SecurityException("Encountered duplicate entries in "
+ + "Proof-of-rotation record at certificate #" + levelCount + ". All "
+ + "signing certificates should be unique");
+ }
+ certHistorySet.add(lastCert);
certs.add(lastCert);
flagsList.add(flags);
}
diff --git a/core/java/android/util/apk/ApkVerityBuilder.java b/core/java/android/util/apk/ApkVerityBuilder.java
index 3b8fc5c..f15e1a1 100644
--- a/core/java/android/util/apk/ApkVerityBuilder.java
+++ b/core/java/android/util/apk/ApkVerityBuilder.java
@@ -72,22 +72,31 @@
signatureInfo.centralDirOffset - signatureInfo.apkSigningBlockOffset;
long dataSize = apk.length() - signingBlockSize;
int[] levelOffset = calculateVerityLevelOffset(dataSize);
+ int merkleTreeSize = levelOffset[levelOffset.length - 1];
ByteBuffer output = bufferFactory.create(
- CHUNK_SIZE_BYTES + // fsverity header + extensions + padding
- levelOffset[levelOffset.length - 1]); // Merkle tree size
+ merkleTreeSize
+ + CHUNK_SIZE_BYTES); // maximum size of fsverity metadata
output.order(ByteOrder.LITTLE_ENDIAN);
- ByteBuffer header = slice(output, 0, FSVERITY_HEADER_SIZE_BYTES);
- ByteBuffer extensions = slice(output, FSVERITY_HEADER_SIZE_BYTES, CHUNK_SIZE_BYTES);
- ByteBuffer tree = slice(output, CHUNK_SIZE_BYTES, output.limit());
+ ByteBuffer tree = slice(output, 0, merkleTreeSize);
+ ByteBuffer header = slice(output, merkleTreeSize,
+ merkleTreeSize + FSVERITY_HEADER_SIZE_BYTES);
+ ByteBuffer extensions = slice(output, merkleTreeSize + FSVERITY_HEADER_SIZE_BYTES,
+ merkleTreeSize + CHUNK_SIZE_BYTES);
byte[] apkDigestBytes = new byte[DIGEST_SIZE_BYTES];
ByteBuffer apkDigest = ByteBuffer.wrap(apkDigestBytes);
apkDigest.order(ByteOrder.LITTLE_ENDIAN);
+ // NB: Buffer limit is set inside once finished.
calculateFsveritySignatureInternal(apk, signatureInfo, tree, apkDigest, header, extensions);
- output.rewind();
+ // Put the reverse offset to fs-verity header at the end.
+ output.position(merkleTreeSize + FSVERITY_HEADER_SIZE_BYTES + extensions.limit());
+ output.putInt(FSVERITY_HEADER_SIZE_BYTES + extensions.limit()
+ + 4); // size of this integer right before EOF
+ output.flip();
+
return new ApkVerityResult(output, apkDigestBytes);
}
@@ -101,7 +110,8 @@
ByteBuffer verityBlock = ByteBuffer.allocate(CHUNK_SIZE_BYTES)
.order(ByteOrder.LITTLE_ENDIAN);
ByteBuffer header = slice(verityBlock, 0, FSVERITY_HEADER_SIZE_BYTES);
- ByteBuffer extensions = slice(verityBlock, FSVERITY_HEADER_SIZE_BYTES, CHUNK_SIZE_BYTES);
+ ByteBuffer extensions = slice(verityBlock, FSVERITY_HEADER_SIZE_BYTES,
+ CHUNK_SIZE_BYTES - FSVERITY_HEADER_SIZE_BYTES);
calculateFsveritySignatureInternal(apk, signatureInfo, null, null, header, extensions);
@@ -328,10 +338,10 @@
buffer.put((byte) 12); // log2(block-size): log2(4096)
buffer.put((byte) 7); // log2(leaves-per-node): log2(4096 / 32)
- buffer.putShort((short) 1); // meta algorithm, SHA256_MODE == 1
- buffer.putShort((short) 1); // data algorithm, SHA256_MODE == 1
+ buffer.putShort((short) 1); // meta algorithm, SHA256 == 1
+ buffer.putShort((short) 1); // data algorithm, SHA256 == 1
- buffer.putInt(0x0); // flags
+ buffer.putInt(0); // flags
buffer.putInt(0); // reserved
buffer.putLong(fileSize); // original file size
@@ -362,12 +372,11 @@
//
// struct fsverity_extension_patch {
// __le64 offset;
- // u8 length;
- // u8 reserved[7];
// u8 databytes[];
// };
final int kSizeOfFsverityExtensionHeader = 8;
+ final int kExtensionSizeAlignment = 8;
{
// struct fsverity_extension #1
@@ -385,24 +394,25 @@
{
// struct fsverity_extension #2
- final int kSizeOfFsverityPatchExtension =
- 8 + // offset size
- 1 + // size of length from offset (up to 255)
- 7 + // reserved
- ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE;
- final int kPadding = (int) divideRoundup(kSizeOfFsverityPatchExtension % 8, 8);
+ final int kTotalSize = kSizeOfFsverityExtensionHeader
+ + 8 // offset size
+ + ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE;
- buffer.putShort((short) // total size of extension, padded to 64-bit alignment
- (kSizeOfFsverityExtensionHeader + kSizeOfFsverityPatchExtension + kPadding));
+ buffer.putShort((short) kTotalSize);
buffer.put((byte) 1); // ID of patch extension
skip(buffer, 5); // reserved
// struct fsverity_extension_patch
- buffer.putLong(eocdOffset); // offset
- buffer.put((byte) ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE); // length
- skip(buffer, 7); // reserved
- buffer.putInt(Math.toIntExact(signingBlockOffset)); // databytes
- skip(buffer, kPadding); // padding
+ buffer.putLong(eocdOffset + ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_OFFSET); // offset
+ buffer.putInt(Math.toIntExact(signingBlockOffset)); // databytes
+
+ // The extension needs to be 0-padded at the end, since the length may not be multiple
+ // of 8.
+ int kPadding = kExtensionSizeAlignment - kTotalSize % kExtensionSizeAlignment;
+ if (kPadding == kExtensionSizeAlignment) {
+ kPadding = 0;
+ }
+ skip(buffer, kPadding); // padding
}
buffer.flip();
diff --git a/core/java/android/util/apk/VerbatimX509Certificate.java b/core/java/android/util/apk/VerbatimX509Certificate.java
index 9984c6d..391c5fc 100644
--- a/core/java/android/util/apk/VerbatimX509Certificate.java
+++ b/core/java/android/util/apk/VerbatimX509Certificate.java
@@ -18,6 +18,7 @@
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
+import java.util.Arrays;
/**
* For legacy reasons we need to return exactly the original encoded certificate bytes, instead
@@ -25,6 +26,7 @@
*/
class VerbatimX509Certificate extends WrappedX509Certificate {
private final byte[] mEncodedVerbatim;
+ private int mHash = -1;
VerbatimX509Certificate(X509Certificate wrapped, byte[] encodedVerbatim) {
super(wrapped);
@@ -35,4 +37,30 @@
public byte[] getEncoded() throws CertificateEncodingException {
return mEncodedVerbatim;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof VerbatimX509Certificate)) return false;
+
+ try {
+ byte[] a = this.getEncoded();
+ byte[] b = ((VerbatimX509Certificate) o).getEncoded();
+ return Arrays.equals(a, b);
+ } catch (CertificateEncodingException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ if (mHash == -1) {
+ try {
+ mHash = Arrays.hashCode(this.getEncoded());
+ } catch (CertificateEncodingException e) {
+ mHash = 0;
+ }
+ }
+ return mHash;
+ }
}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index d3b1e5c..df81a31 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -250,6 +250,18 @@
}
/**
+ * Destroys the HwuiContext without completely
+ * releasing the Surface.
+ * @hide
+ */
+ public void hwuiDestroy() {
+ if (mHwuiContext != null) {
+ mHwuiContext.destroy();
+ mHwuiContext = null;
+ }
+ }
+
+ /**
* Returns true if this object holds a valid surface.
*
* @return True if it holds a physical surface, so lockCanvas() will succeed.
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 6393127..97e11b1 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -4320,7 +4320,7 @@
OnCapturedPointerListener mOnCapturedPointerListener;
- private ArrayList<OnKeyFallbackListener> mKeyFallbackListeners;
+ private ArrayList<OnUnhandledKeyEventListener> mUnhandledKeyListeners;
}
ListenerInfo mListenerInfo;
@@ -13917,11 +13917,15 @@
mAttachInfo.mUnbufferedDispatchRequested = true;
}
+ private boolean hasSize() {
+ return (mBottom > mTop) && (mRight > mLeft);
+ }
+
private boolean canTakeFocus() {
return ((mViewFlags & VISIBILITY_MASK) == VISIBLE)
&& ((mViewFlags & FOCUSABLE) == FOCUSABLE)
&& ((mViewFlags & ENABLED_MASK) == ENABLED)
- && (sCanFocusZeroSized || !isLayoutValid() || (mBottom > mTop) && (mRight > mLeft));
+ && (sCanFocusZeroSized || !isLayoutValid() || hasSize());
}
/**
@@ -13982,7 +13986,7 @@
|| focusableChangedByAuto == 0
|| viewRootImpl == null
|| viewRootImpl.mThread == Thread.currentThread()) {
- shouldNotifyFocusableAvailable = true;
+ shouldNotifyFocusableAvailable = canTakeFocus();
}
}
}
@@ -14001,11 +14005,10 @@
needGlobalAttributesUpdate(true);
- // a view becoming visible is worth notifying the parent
- // about in case nothing has focus. even if this specific view
- // isn't focusable, it may contain something that is, so let
- // the root view try to give this focus if nothing else does.
- shouldNotifyFocusableAvailable = true;
+ // a view becoming visible is worth notifying the parent about in case nothing has
+ // focus. Even if this specific view isn't focusable, it may contain something that
+ // is, so let the root view try to give this focus if nothing else does.
+ shouldNotifyFocusableAvailable = hasSize();
}
}
@@ -14014,16 +14017,14 @@
// a view becoming enabled should notify the parent as long as the view is also
// visible and the parent wasn't already notified by becoming visible during this
// setFlags invocation.
- shouldNotifyFocusableAvailable = true;
+ shouldNotifyFocusableAvailable = canTakeFocus();
} else {
if (isFocused()) clearFocus();
}
}
- if (shouldNotifyFocusableAvailable) {
- if (mParent != null && canTakeFocus()) {
- mParent.focusableViewAvailable(this);
- }
+ if (shouldNotifyFocusableAvailable && mParent != null) {
+ mParent.focusableViewAvailable(this);
}
/* Check if the GONE bit has changed */
@@ -14927,10 +14928,6 @@
* ImageView with only the foreground image. The default implementation returns true; subclasses
* should override if they have cases which can be optimized.</p>
*
- * <p>The current implementation of the saveLayer and saveLayerAlpha methods in {@link Canvas}
- * necessitates that a View return true if it uses the methods internally without passing the
- * {@link Canvas#CLIP_TO_LAYER_SAVE_FLAG}.</p>
- *
* <p><strong>Note:</strong> The return value of this method is ignored if {@link
* #forceHasOverlappingRendering(boolean)} has been called on this view.</p>
*
@@ -20227,22 +20224,20 @@
int solidColor = getSolidColor();
if (solidColor == 0) {
- final int flags = Canvas.HAS_ALPHA_LAYER_SAVE_FLAG;
-
if (drawTop) {
- canvas.saveLayer(left, top, right, top + length, null, flags);
+ canvas.saveUnclippedLayer(left, top, right, top + length);
}
if (drawBottom) {
- canvas.saveLayer(left, bottom - length, right, bottom, null, flags);
+ canvas.saveUnclippedLayer(left, bottom - length, right, bottom);
}
if (drawLeft) {
- canvas.saveLayer(left, top, left + length, bottom, null, flags);
+ canvas.saveUnclippedLayer(left, top, left + length, bottom);
}
if (drawRight) {
- canvas.saveLayer(right - length, top, right, bottom, null, flags);
+ canvas.saveUnclippedLayer(right - length, top, right, bottom);
}
} else {
scrollabilityCache.setFadeColor(solidColor);
@@ -25885,26 +25880,19 @@
}
/**
- * Interface definition for a callback to be invoked when a hardware key event is
- * dispatched to this view during the fallback phase. This means no view in the hierarchy
- * has handled this event.
+ * Interface definition for a callback to be invoked when a hardware key event hasn't
+ * been handled by the view hierarchy.
*/
- public interface OnKeyFallbackListener {
+ public interface OnUnhandledKeyEventListener {
/**
- * Called when a hardware key is dispatched to a view in the fallback phase. This allows
- * listeners to respond to events after the view hierarchy has had a chance to respond.
- * <p>Key presses in software keyboards will generally NOT trigger this method,
- * although some may elect to do so in some situations. Do not assume a
- * software input method has to be key-based; even if it is, it may use key presses
- * in a different way than you expect, so there is no way to reliably catch soft
- * input key presses.
+ * Called when a hardware key is dispatched to a view after being unhandled during normal
+ * {@link KeyEvent} dispatch.
*
* @param v The view the key has been dispatched to.
- * @param event The KeyEvent object containing full information about
- * the event.
- * @return True if the listener has consumed the event, false otherwise.
+ * @param event The KeyEvent object containing information about the event.
+ * @return {@code true} if the listener has consumed the event, {@code false} otherwise.
*/
- boolean onKeyFallback(View v, KeyEvent event);
+ boolean onUnhandledKeyEvent(View v, KeyEvent event);
}
/**
@@ -27603,21 +27591,36 @@
return sUseDefaultFocusHighlight;
}
- /**
+ /**
+ * Dispatch a previously unhandled {@link KeyEvent} to this view. Unlike normal key dispatch,
+ * this dispatches to ALL child views until it is consumed. The dispatch order is z-order
+ * (visually on-top views first).
+ *
+ * @param evt the previously unhandled {@link KeyEvent}.
+ * @return the {@link View} which consumed the event or {@code null} if not consumed.
+ */
+ View dispatchUnhandledKeyEvent(KeyEvent evt) {
+ if (onUnhandledKeyEvent(evt)) {
+ return this;
+ }
+ return null;
+ }
+
+ /**
* Allows this view to handle {@link KeyEvent}s which weren't handled by normal dispatch. This
* occurs after the normal view hierarchy dispatch, but before the window callback. By default,
* this will dispatch into all the listeners registered via
- * {@link #addKeyFallbackListener(OnKeyFallbackListener)} in last-in-first-out order (most
- * recently added will receive events first).
+ * {@link #addOnUnhandledKeyEventListener(OnUnhandledKeyEventListener)} in last-in-first-out
+ * order (most recently added will receive events first).
*
- * @param event A not-previously-handled event.
+ * @param event An unhandled event.
* @return {@code true} if the event was handled, {@code false} otherwise.
- * @see #addKeyFallbackListener
+ * @see #addOnUnhandledKeyEventListener
*/
- public boolean onKeyFallback(@NonNull KeyEvent event) {
- if (mListenerInfo != null && mListenerInfo.mKeyFallbackListeners != null) {
- for (int i = mListenerInfo.mKeyFallbackListeners.size() - 1; i >= 0; --i) {
- if (mListenerInfo.mKeyFallbackListeners.get(i).onKeyFallback(this, event)) {
+ boolean onUnhandledKeyEvent(@NonNull KeyEvent event) {
+ if (mListenerInfo != null && mListenerInfo.mUnhandledKeyListeners != null) {
+ for (int i = mListenerInfo.mUnhandledKeyListeners.size() - 1; i >= 0; --i) {
+ if (mListenerInfo.mUnhandledKeyListeners.get(i).onUnhandledKeyEvent(this, event)) {
return true;
}
}
@@ -27625,31 +27628,47 @@
return false;
}
- /**
- * Adds a listener which will receive unhandled {@link KeyEvent}s.
- * @param listener the receiver of fallback {@link KeyEvent}s.
- * @see #onKeyFallback(KeyEvent)
- */
- public void addKeyFallbackListener(OnKeyFallbackListener listener) {
- ArrayList<OnKeyFallbackListener> fallbacks = getListenerInfo().mKeyFallbackListeners;
- if (fallbacks == null) {
- fallbacks = new ArrayList<>();
- getListenerInfo().mKeyFallbackListeners = fallbacks;
- }
- fallbacks.add(listener);
+ boolean hasUnhandledKeyListener() {
+ return (mListenerInfo != null && mListenerInfo.mUnhandledKeyListeners != null
+ && !mListenerInfo.mUnhandledKeyListeners.isEmpty());
}
/**
- * Removes a listener which will receive unhandled {@link KeyEvent}s.
- * @param listener the receiver of fallback {@link KeyEvent}s.
- * @see #onKeyFallback(KeyEvent)
+ * Adds a listener which will receive unhandled {@link KeyEvent}s. This must be called on the
+ * UI thread.
+ *
+ * @param listener a receiver of unhandled {@link KeyEvent}s.
+ * @see #removeOnUnhandledKeyEventListener
*/
- public void removeKeyFallbackListener(OnKeyFallbackListener listener) {
+ public void addOnUnhandledKeyEventListener(OnUnhandledKeyEventListener listener) {
+ ArrayList<OnUnhandledKeyEventListener> listeners = getListenerInfo().mUnhandledKeyListeners;
+ if (listeners == null) {
+ listeners = new ArrayList<>();
+ getListenerInfo().mUnhandledKeyListeners = listeners;
+ }
+ listeners.add(listener);
+ if (listeners.size() == 1 && mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).incrementChildUnhandledKeyListeners();
+ }
+ }
+
+ /**
+ * Removes a listener which will receive unhandled {@link KeyEvent}s. This must be called on the
+ * UI thread.
+ *
+ * @param listener a receiver of unhandled {@link KeyEvent}s.
+ * @see #addOnUnhandledKeyEventListener
+ */
+ public void removeOnUnhandledKeyEventListener(OnUnhandledKeyEventListener listener) {
if (mListenerInfo != null) {
- if (mListenerInfo.mKeyFallbackListeners != null) {
- mListenerInfo.mKeyFallbackListeners.remove(listener);
- if (mListenerInfo.mKeyFallbackListeners.isEmpty()) {
- mListenerInfo.mKeyFallbackListeners = null;
+ if (mListenerInfo.mUnhandledKeyListeners != null
+ && !mListenerInfo.mUnhandledKeyListeners.isEmpty()) {
+ mListenerInfo.mUnhandledKeyListeners.remove(listener);
+ if (mListenerInfo.mUnhandledKeyListeners.isEmpty()) {
+ mListenerInfo.mUnhandledKeyListeners = null;
+ if (mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).decrementChildUnhandledKeyListeners();
+ }
}
}
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 33fcf6a..6002fe5 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -583,6 +583,11 @@
private List<Integer> mTransientIndices = null;
private List<View> mTransientViews = null;
+ /**
+ * Keeps track of how many child views have UnhandledKeyEventListeners. This should only be
+ * updated on the UI thread so shouldn't require explicit synchronization.
+ */
+ int mChildUnhandledKeyListeners = 0;
/**
* Empty ActionMode used as a sentinel in recursive entries to startActionModeForChild.
@@ -5055,6 +5060,9 @@
child.assignParent(this);
} else {
child.mParent = this;
+ if (child.hasUnhandledKeyListener()) {
+ incrementChildUnhandledKeyListeners();
+ }
}
final boolean childHasFocus = child.hasFocus();
@@ -5359,6 +5367,10 @@
removeFromArray(index);
+ if (view.hasUnhandledKeyListener()) {
+ decrementChildUnhandledKeyListeners();
+ }
+
if (view == mDefaultFocus) {
clearDefaultFocus(view);
}
@@ -7537,6 +7549,62 @@
}
}
+ @Override
+ boolean hasUnhandledKeyListener() {
+ return (mChildUnhandledKeyListeners > 0) || super.hasUnhandledKeyListener();
+ }
+
+ void incrementChildUnhandledKeyListeners() {
+ mChildUnhandledKeyListeners += 1;
+ if (mChildUnhandledKeyListeners == 1) {
+ if (mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).incrementChildUnhandledKeyListeners();
+ }
+ }
+ }
+
+ void decrementChildUnhandledKeyListeners() {
+ mChildUnhandledKeyListeners -= 1;
+ if (mChildUnhandledKeyListeners == 0) {
+ if (mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).decrementChildUnhandledKeyListeners();
+ }
+ }
+ }
+
+ @Override
+ View dispatchUnhandledKeyEvent(KeyEvent evt) {
+ if (!hasUnhandledKeyListener()) {
+ return null;
+ }
+ ArrayList<View> orderedViews = buildOrderedChildList();
+ if (orderedViews != null) {
+ try {
+ for (int i = orderedViews.size() - 1; i >= 0; --i) {
+ View v = orderedViews.get(i);
+ View consumer = v.dispatchUnhandledKeyEvent(evt);
+ if (consumer != null) {
+ return consumer;
+ }
+ }
+ } finally {
+ orderedViews.clear();
+ }
+ } else {
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ View v = getChildAt(i);
+ View consumer = v.dispatchUnhandledKeyEvent(evt);
+ if (consumer != null) {
+ return consumer;
+ }
+ }
+ }
+ if (onUnhandledKeyEvent(evt)) {
+ return this;
+ }
+ return null;
+ }
+
/**
* LayoutParams are used by views to tell their parents how they want to be
* laid out. See
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index d521684..433c90b 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -380,7 +380,7 @@
InputStage mFirstPostImeInputStage;
InputStage mSyntheticInputStage;
- private final KeyFallbackManager mKeyFallbackManager = new KeyFallbackManager();
+ private final UnhandledKeyManager mUnhandledKeyManager = new UnhandledKeyManager();
boolean mWindowAttributesChanged = false;
int mWindowAttributesChangesFlag = 0;
@@ -4975,10 +4975,10 @@
private int processKeyEvent(QueuedInputEvent q) {
final KeyEvent event = (KeyEvent)q.mEvent;
- mKeyFallbackManager.mDispatched = false;
+ mUnhandledKeyManager.mDispatched = false;
- if (mKeyFallbackManager.hasFocus()
- && mKeyFallbackManager.dispatchUnique(mView, event)) {
+ if (mUnhandledKeyManager.hasFocus()
+ && mUnhandledKeyManager.dispatchUnique(mView, event)) {
return FINISH_HANDLED;
}
@@ -4991,7 +4991,7 @@
return FINISH_NOT_HANDLED;
}
- if (mKeyFallbackManager.dispatchUnique(mView, event)) {
+ if (mUnhandledKeyManager.dispatchUnique(mView, event)) {
return FINISH_HANDLED;
}
@@ -7798,7 +7798,7 @@
* @return {@code true} if the event was handled, {@code false} otherwise.
*/
public boolean dispatchKeyFallbackEvent(KeyEvent event) {
- return mKeyFallbackManager.dispatch(mView, event);
+ return mUnhandledKeyManager.dispatch(mView, event);
}
class TakenSurfaceHolder extends BaseSurfaceHolder {
@@ -8374,18 +8374,17 @@
}
}
- private static class KeyFallbackManager {
+ private static class UnhandledKeyManager {
- // This is used to ensure that key-fallback events are only dispatched once. We attempt
+ // This is used to ensure that unhandled events are only dispatched once. We attempt
// to dispatch more than once in order to achieve a certain order. Specifically, if we
- // are in an Activity or Dialog (and have a Window.Callback), the keyfallback events should
+ // are in an Activity or Dialog (and have a Window.Callback), the unhandled events should
// be dispatched after the view hierarchy, but before the Activity. However, if we aren't
- // in an activity, we still want key fallbacks to be dispatched.
+ // in an activity, we still want unhandled keys to be dispatched.
boolean mDispatched = false;
SparseBooleanArray mCapturedKeys = new SparseBooleanArray();
- WeakReference<View> mFallbackReceiver = null;
- int mVisitCount = 0;
+ WeakReference<View> mCurrentReceiver = null;
private void updateCaptureState(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
@@ -8402,56 +8401,28 @@
updateCaptureState(event);
- if (mFallbackReceiver != null) {
- View target = mFallbackReceiver.get();
+ if (mCurrentReceiver != null) {
+ View target = mCurrentReceiver.get();
if (mCapturedKeys.size() == 0) {
- mFallbackReceiver = null;
+ mCurrentReceiver = null;
}
if (target != null && target.isAttachedToWindow()) {
- return target.onKeyFallback(event);
+ target.onUnhandledKeyEvent(event);
}
// consume anyways so that we don't feed uncaptured key events to other views
return true;
}
- boolean result = dispatchInZOrder(root, event);
+ View consumer = root.dispatchUnhandledKeyEvent(event);
+ if (consumer != null) {
+ mCurrentReceiver = new WeakReference<>(consumer);
+ }
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- return result;
- }
-
- private boolean dispatchInZOrder(View view, KeyEvent evt) {
- if (view instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) view;
- ArrayList<View> orderedViews = vg.buildOrderedChildList();
- if (orderedViews != null) {
- try {
- for (int i = orderedViews.size() - 1; i >= 0; --i) {
- View v = orderedViews.get(i);
- if (dispatchInZOrder(v, evt)) {
- return true;
- }
- }
- } finally {
- orderedViews.clear();
- }
- } else {
- for (int i = vg.getChildCount() - 1; i >= 0; --i) {
- View v = vg.getChildAt(i);
- if (dispatchInZOrder(v, evt)) {
- return true;
- }
- }
- }
- }
- if (view.onKeyFallback(evt)) {
- mFallbackReceiver = new WeakReference<>(view);
- return true;
- }
- return false;
+ return consumer != null;
}
boolean hasFocus() {
- return mFallbackReceiver != null;
+ return mCurrentReceiver != null;
}
boolean dispatchUnique(View root, KeyEvent event) {
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index abc19d0..f6181d7 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -236,6 +236,18 @@
int TRANSIT_KEYGUARD_UNOCCLUDE = 23;
/**
+ * A translucent activity is being opened.
+ * @hide
+ */
+ int TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
+
+ /**
+ * A translucent activity is being closed.
+ * @hide
+ */
+ int TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
+
+ /**
* @hide
*/
@IntDef(prefix = { "TRANSIT_" }, value = {
@@ -258,7 +270,9 @@
TRANSIT_KEYGUARD_GOING_AWAY,
TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
TRANSIT_KEYGUARD_OCCLUDE,
- TRANSIT_KEYGUARD_UNOCCLUDE
+ TRANSIT_KEYGUARD_UNOCCLUDE,
+ TRANSIT_TRANSLUCENT_ACTIVITY_OPEN,
+ TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE
})
@Retention(RetentionPolicy.SOURCE)
@interface TransitionType {}
@@ -1833,7 +1847,9 @@
public static final int SOFT_INPUT_MASK_STATE = 0x0f;
/**
- * Visibility state for {@link #softInputMode}: no state has been specified.
+ * Visibility state for {@link #softInputMode}: no state has been specified. The system may
+ * show or hide the software keyboard for better user experience when the window gains
+ * focus.
*/
public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;
@@ -2220,7 +2236,7 @@
@IntDef(
flag = true,
value = {LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,
+ LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER})
@interface LayoutInDisplayCutoutMode {}
@@ -2231,10 +2247,11 @@
* Defaults to {@link #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT}.
*
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+ * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
* @see DisplayCutout
- * @see android.R.attr#layoutInDisplayCutoutMode
+ * @see android.R.attr#windowLayoutInDisplayCutoutMode
+ * android:windowLayoutInDisplayCutoutMode
*/
@LayoutInDisplayCutoutMode
public int layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
@@ -2245,10 +2262,10 @@
* laid out such that it does not overlap with the {@link DisplayCutout} area.
*
* <p>
- * In practice, this means that if the window did not set FLAG_FULLSCREEN or
- * SYSTEM_UI_FLAG_FULLSCREEN, it can extend into the cutout area in portrait if the cutout
- * is at the top edge. Similarly for SYSTEM_UI_FLAG_HIDE_NAVIGATION and a cutout at the
- * bottom of the screen.
+ * In practice, this means that if the window did not set {@link #FLAG_FULLSCREEN} or
+ * {@link View#SYSTEM_UI_FLAG_FULLSCREEN}, it can extend into the cutout area in portrait
+ * if the cutout is at the top edge. Similarly for
+ * {@link View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} and a cutout at the bottom of the screen.
* Otherwise (i.e. fullscreen or landscape) it is laid out such that it does not overlap the
* cutout area.
*
@@ -2258,6 +2275,9 @@
*
* @see DisplayCutout
* @see WindowInsets
+ * @see #layoutInDisplayCutoutMode
+ * @see android.R.attr#windowLayoutInDisplayCutoutMode
+ * android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
@@ -2279,8 +2299,40 @@
* The window must make sure that no important content overlaps with the
* {@link DisplayCutout}.
*
+ * <p>
+ * In this mode, the window extends under cutouts on the short edge of the display in both
+ * portrait and landscape, regardless of whether the window is hiding the system bars:<br/>
+ * <img src="{@docRoot}reference/android/images/display_cutout/short_edge/fullscreen_top_no_letterbox.png"
+ * height="720"
+ * alt="Screenshot of a fullscreen activity on a display with a cutout at the top edge in
+ * portrait, no letterbox is applied."/>
+ *
+ * <img src="{@docRoot}reference/android/images/display_cutout/short_edge/landscape_top_no_letterbox.png"
+ * width="720"
+ * alt="Screenshot of an activity on a display with a cutout at the top edge in landscape,
+ * no letterbox is applied."/>
+ *
+ * <p>
+ * A cutout in the corner is considered to be on the short edge: <br/>
+ * <img src="{@docRoot}reference/android/images/display_cutout/short_edge/fullscreen_corner_no_letterbox.png"
+ * height="720"
+ * alt="Screenshot of a fullscreen activity on a display with a cutout in the corner in
+ * portrait, no letterbox is applied."/>
+ *
+ * <p>
+ * On the other hand, should the cutout be on the long edge of the display, a letterbox will
+ * be applied such that the window does not extend into the cutout on either long edge:
+ * <br/>
+ * <img src="{@docRoot}reference/android/images/display_cutout/short_edge/portrait_side_letterbox.png"
+ * height="720"
+ * alt="Screenshot of an activity on a display with a cutout on the long edge in portrait,
+ * letterbox is applied."/>
+ *
* @see DisplayCutout
* @see WindowInsets#getDisplayCutout()
+ * @see #layoutInDisplayCutoutMode
+ * @see android.R.attr#windowLayoutInDisplayCutoutMode
+ * android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;
@@ -2288,12 +2340,14 @@
* The window is never allowed to overlap with the DisplayCutout area.
*
* <p>
- * This should be used with windows that transiently set SYSTEM_UI_FLAG_FULLSCREEN to
- * avoid a relayout of the window when the flag is set or cleared.
+ * This should be used with windows that transiently set
+ * {@link View#SYSTEM_UI_FLAG_FULLSCREEN} or {@link View#SYSTEM_UI_FLAG_HIDE_NAVIGATION}
+ * to avoid a relayout of the window when the respective flag is set or cleared.
*
* @see DisplayCutout
- * @see View#SYSTEM_UI_FLAG_FULLSCREEN SYSTEM_UI_FLAG_FULLSCREEN
- * @see View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ * @see #layoutInDisplayCutoutMode
+ * @see android.R.attr#windowLayoutInDisplayCutoutMode
+ * android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 5bee87c..88300db 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -274,6 +274,16 @@
public static final int STATE_DISABLED_BY_SERVICE = 4;
/**
+ * Same as {@link #STATE_UNKNOWN}, but used on
+ * {@link AutofillManagerClient#setSessionFinished(int)} when the session was finished because
+ * the URL bar changed on client mode
+ *
+ * @hide
+ */
+ public static final int STATE_UNKNOWN_COMPAT_MODE = 5;
+
+
+ /**
* Timeout in ms for calls to the field classification service.
* @hide
*/
@@ -1809,13 +1819,22 @@
final View[] views = client.autofillClientFindViewsByAutofillIdTraversal(
Helper.toArray(ids));
+ ArrayList<AutofillId> failedIds = null;
+
for (int i = 0; i < itemCount; i++) {
final AutofillId id = ids.get(i);
final AutofillValue value = values.get(i);
final int viewId = id.getViewId();
final View view = views[i];
if (view == null) {
- Log.w(TAG, "autofill(): no View with id " + viewId);
+ // Most likely view has been removed after the initial request was sent to the
+ // the service; this is fine, but we need to update the view status in the
+ // server side so it can be triggered again.
+ Log.d(TAG, "autofill(): no View with id " + id);
+ if (failedIds == null) {
+ failedIds = new ArrayList<>();
+ }
+ failedIds.add(id);
continue;
}
if (id.isVirtual()) {
@@ -1849,12 +1868,28 @@
}
}
+ if (failedIds != null) {
+ if (sVerbose) {
+ Log.v(TAG, "autofill(): total failed views: " + failedIds);
+ }
+ try {
+ mService.setAutofillFailure(mSessionId, failedIds, mContext.getUserId());
+ } catch (RemoteException e) {
+ // In theory, we could ignore this error since it's not a big deal, but
+ // in reality, we rather crash the app anyways, as the failure could be
+ // a consequence of something going wrong on the server side...
+ e.rethrowFromSystemServer();
+ }
+ }
+
if (virtualValues != null) {
for (int i = 0; i < virtualValues.size(); i++) {
final View parent = virtualValues.keyAt(i);
final SparseArray<AutofillValue> childrenValues = virtualValues.valueAt(i);
parent.autofill(childrenValues);
numApplied += childrenValues.size();
+ // TODO: we should provide a callback so the parent can call failures; something
+ // like notifyAutofillFailed(View view, int[] childrenIds);
}
}
@@ -1947,15 +1982,24 @@
* Marks the state of the session as finished.
*
* @param newState {@link #STATE_FINISHED} (because the autofill service returned a {@code null}
- * FillResponse), {@link #STATE_UNKNOWN} (because the session was removed), or
- * {@link #STATE_DISABLED_BY_SERVICE} (because the autofill service disabled further autofill
- * requests for the activity).
+ * FillResponse), {@link #STATE_UNKNOWN} (because the session was removed),
+ * {@link #STATE_UNKNOWN_COMPAT_MODE} (beucase the session was finished when the URL bar
+ * changed on compat mode), or {@link #STATE_DISABLED_BY_SERVICE} (because the autofill service
+ * disabled further autofill requests for the activity).
*/
private void setSessionFinished(int newState) {
synchronized (mLock) {
- if (sVerbose) Log.v(TAG, "setSessionFinished(): from " + mState + " to " + newState);
- resetSessionLocked(/* resetEnteredIds= */ false);
- mState = newState;
+ if (sVerbose) {
+ Log.v(TAG, "setSessionFinished(): from " + getStateAsStringLocked() + " to "
+ + getStateAsString(newState));
+ }
+ if (newState == STATE_UNKNOWN_COMPAT_MODE) {
+ resetSessionLocked(/* resetEnteredIds= */ true);
+ mState = STATE_UNKNOWN;
+ } else {
+ resetSessionLocked(/* resetEnteredIds= */ false);
+ mState = newState;
+ }
}
}
@@ -2107,19 +2151,26 @@
@GuardedBy("mLock")
private String getStateAsStringLocked() {
- switch (mState) {
+ return getStateAsString(mState);
+ }
+
+ @NonNull
+ private static String getStateAsString(int state) {
+ switch (state) {
case STATE_UNKNOWN:
- return "STATE_UNKNOWN";
+ return "UNKNOWN";
case STATE_ACTIVE:
- return "STATE_ACTIVE";
+ return "ACTIVE";
case STATE_FINISHED:
- return "STATE_FINISHED";
+ return "FINISHED";
case STATE_SHOWING_SAVE_UI:
- return "STATE_SHOWING_SAVE_UI";
+ return "SHOWING_SAVE_UI";
case STATE_DISABLED_BY_SERVICE:
- return "STATE_DISABLED_BY_SERVICE";
+ return "DISABLED_BY_SERVICE";
+ case STATE_UNKNOWN_COMPAT_MODE:
+ return "UNKNOWN_COMPAT_MODE";
default:
- return "INVALID:" + mState;
+ return "INVALID:" + state;
}
}
diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl
index 56f79ab..176df73 100644
--- a/core/java/android/view/autofill/IAutoFillManager.aidl
+++ b/core/java/android/view/autofill/IAutoFillManager.aidl
@@ -16,6 +16,8 @@
package android.view.autofill;
+import java.util.List;
+
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
@@ -47,6 +49,7 @@
in AutofillId autoFillId, in Rect bounds, in AutofillValue value, int userId,
boolean hasCallback, int flags, in ComponentName componentName, int sessionId,
int action, boolean compatMode);
+ void setAutofillFailure(int sessionId, in List<AutofillId> ids, int userId);
void finishSession(int sessionId, int userId);
void cancelSession(int sessionId, int userId);
void setAuthenticationResult(in Bundle data, int sessionId, int authenticationId, int userId);
diff --git a/core/java/android/view/textclassifier/DefaultLogger.java b/core/java/android/view/textclassifier/DefaultLogger.java
index b2f4e39..203ca56 100644
--- a/core/java/android/view/textclassifier/DefaultLogger.java
+++ b/core/java/android/view/textclassifier/DefaultLogger.java
@@ -39,7 +39,7 @@
public final class DefaultLogger extends Logger {
private static final String LOG_TAG = "DefaultLogger";
- private static final String CLASSIFIER_ID = "androidtc";
+ static final String CLASSIFIER_ID = "androidtc";
private static final int START_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_START;
private static final int PREV_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_PREVIOUS;
@@ -87,7 +87,7 @@
.addTaggedData(INDEX, event.getEventIndex())
.addTaggedData(WIDGET_TYPE, event.getWidgetType())
.addTaggedData(WIDGET_VERSION, event.getWidgetVersion())
- .addTaggedData(MODEL_NAME, SignatureParser.getModelName(event.getSignature()))
+ .addTaggedData(MODEL_NAME, SignatureParser.getModelName(event.getResultId()))
.addTaggedData(ENTITY_TYPE, event.getEntityType())
.addTaggedData(SMART_START, event.getSmartStart())
.addTaggedData(SMART_END, event.getSmartEnd())
@@ -231,9 +231,9 @@
}
/**
- * Creates a signature string that may be used to tag TextClassifier results.
+ * Creates a string id that may be used to identify a TextClassifier result.
*/
- public static String createSignature(
+ public static String createId(
String text, int start, int end, Context context, int modelVersion,
List<Locale> locales) {
Preconditions.checkNotNull(text);
@@ -250,7 +250,7 @@
}
/**
- * Helper for creating and parsing signature strings for
+ * Helper for creating and parsing string ids for
* {@link android.view.textclassifier.TextClassifierImpl}.
*/
@VisibleForTesting
diff --git a/core/java/android/view/textclassifier/LinksInfo.java b/core/java/android/view/textclassifier/LinksInfo.java
deleted file mode 100644
index 754c9e9..0000000
--- a/core/java/android/view/textclassifier/LinksInfo.java
+++ /dev/null
@@ -1,42 +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.
- */
-
-package android.view.textclassifier;
-
-import android.annotation.NonNull;
-
-/**
- * Link information that can be applied to text. See: {@link #apply(CharSequence)}.
- * Typical implementations of this interface will annotate spannable text with e.g
- * {@link android.text.style.ClickableSpan}s or other annotations.
- * @hide
- */
-public interface LinksInfo {
-
- /**
- * @hide
- */
- LinksInfo NO_OP = text -> false;
-
- /**
- * Applies link annotations to the specified text.
- * These annotations are not guaranteed to be applied. For example, the annotations may not be
- * applied if the text has changed from what it was when the link spec was generated for it.
- *
- * @return Whether or not the link annotations were successfully applied.
- */
- boolean apply(@NonNull CharSequence text);
-}
diff --git a/core/java/android/view/textclassifier/Log.java b/core/java/android/view/textclassifier/Log.java
index 83ca15d..ef19ee5 100644
--- a/core/java/android/view/textclassifier/Log.java
+++ b/core/java/android/view/textclassifier/Log.java
@@ -35,6 +35,10 @@
Slog.d(tag, msg);
}
+ public static void w(String tag, String msg) {
+ Slog.w(tag, msg);
+ }
+
public static void e(String tag, String msg, Throwable tr) {
if (ENABLE_FULL_LOGGING) {
Slog.e(tag, msg, tr);
diff --git a/core/java/android/view/textclassifier/Logger.java b/core/java/android/view/textclassifier/Logger.java
index 9c92fd4..f03906a 100644
--- a/core/java/android/view/textclassifier/Logger.java
+++ b/core/java/android/view/textclassifier/Logger.java
@@ -18,56 +18,23 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.StringDef;
import android.content.Context;
-import android.util.Log;
import com.android.internal.util.Preconditions;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.text.BreakIterator;
import java.util.Locale;
import java.util.Objects;
-import java.util.UUID;
/**
* A helper for logging TextClassifier related events.
+ * @hide
*/
public abstract class Logger {
- /**
- * Use this to specify an indeterminate positive index.
- */
- public static final int OUT_OF_BOUNDS = Integer.MAX_VALUE;
-
- /**
- * Use this to specify an indeterminate negative index.
- */
- public static final int OUT_OF_BOUNDS_NEGATIVE = Integer.MIN_VALUE;
-
private static final String LOG_TAG = "Logger";
/* package */ static final boolean DEBUG_LOG_ENABLED = true;
- private static final String NO_SIGNATURE = "";
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @StringDef({WIDGET_TEXTVIEW, WIDGET_WEBVIEW, WIDGET_EDITTEXT,
- WIDGET_EDIT_WEBVIEW, WIDGET_CUSTOM_TEXTVIEW, WIDGET_CUSTOM_EDITTEXT,
- WIDGET_CUSTOM_UNSELECTABLE_TEXTVIEW, WIDGET_UNKNOWN})
- public @interface WidgetType {}
-
- public static final String WIDGET_TEXTVIEW = "textview";
- public static final String WIDGET_EDITTEXT = "edittext";
- public static final String WIDGET_UNSELECTABLE_TEXTVIEW = "nosel-textview";
- public static final String WIDGET_WEBVIEW = "webview";
- public static final String WIDGET_EDIT_WEBVIEW = "edit-webview";
- public static final String WIDGET_CUSTOM_TEXTVIEW = "customview";
- public static final String WIDGET_CUSTOM_EDITTEXT = "customedit";
- public static final String WIDGET_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
- public static final String WIDGET_UNKNOWN = "unknown";
-
private @SelectionEvent.InvocationMethod int mInvocationMethod;
private SelectionEvent mPrevEvent;
private SelectionEvent mSmartEvent;
@@ -99,16 +66,15 @@
public abstract void writeEvent(@NonNull SelectionEvent event);
/**
- * Returns true if the signature matches that of a smart selection event (i.e.
+ * Returns true if the resultId matches that of a smart selection event (i.e.
* {@link SelectionEvent#EVENT_SMART_SELECTION_SINGLE} or
* {@link SelectionEvent#EVENT_SMART_SELECTION_MULTI}).
* Returns false otherwise.
*/
- public boolean isSmartSelection(@NonNull String signature) {
+ public boolean isSmartSelection(@NonNull String resultId) {
return false;
}
-
/**
* Returns a token iterator for tokenizing text for logging purposes.
*/
@@ -131,7 +97,7 @@
mInvocationMethod = invocationMethod;
logEvent(new SelectionEvent(
start, start + 1, SelectionEvent.EVENT_SELECTION_STARTED,
- TextClassifier.TYPE_UNKNOWN, mInvocationMethod, NO_SIGNATURE, mConfig));
+ TextClassifier.TYPE_UNKNOWN, mInvocationMethod, null, mConfig));
}
/**
@@ -150,7 +116,7 @@
logEvent(new SelectionEvent(
start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
- TextClassifier.TYPE_UNKNOWN, mInvocationMethod, NO_SIGNATURE, mConfig));
+ TextClassifier.TYPE_UNKNOWN, mInvocationMethod, null, mConfig));
}
/**
@@ -174,10 +140,9 @@
final String entityType = classification.getEntityCount() > 0
? classification.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String signature = classification.getSignature();
logEvent(new SelectionEvent(
start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
- entityType, mInvocationMethod, signature, mConfig));
+ entityType, mInvocationMethod, classification.getId(), mConfig));
}
/**
@@ -199,7 +164,7 @@
}
final int eventType;
- if (isSmartSelection(selection.getSignature())) {
+ if (isSmartSelection(selection.getId())) {
eventType = end - start > 1
? SelectionEvent.EVENT_SMART_SELECTION_MULTI
: SelectionEvent.EVENT_SMART_SELECTION_SINGLE;
@@ -210,9 +175,8 @@
final String entityType = selection.getEntityCount() > 0
? selection.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String signature = selection.getSignature();
- logEvent(new SelectionEvent(start, end, eventType, entityType, mInvocationMethod, signature,
- mConfig));
+ logEvent(new SelectionEvent(start, end, eventType, entityType, mInvocationMethod,
+ selection.getId(), mConfig));
}
/**
@@ -234,7 +198,7 @@
logEvent(new SelectionEvent(
start, end, actionType, TextClassifier.TYPE_UNKNOWN, mInvocationMethod,
- NO_SIGNATURE, mConfig));
+ null, mConfig));
}
/**
@@ -264,9 +228,8 @@
final String entityType = classification.getEntityCount() > 0
? classification.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String signature = classification.getSignature();
logEvent(new SelectionEvent(start, end, actionType, entityType, mInvocationMethod,
- signature, mConfig));
+ classification.getId(), mConfig));
}
private void logEvent(@NonNull SelectionEvent event) {
@@ -299,6 +262,9 @@
// Selection did not change. Ignore event.
return;
}
+ break;
+ default:
+ // do nothing.
}
event.setEventTime(now);
@@ -309,7 +275,7 @@
.setEnd(event.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
}
if (mSmartEvent != null) {
- event.setSignature(mSmartEvent.getSignature())
+ event.setResultId(mSmartEvent.getResultId())
.setSmartStart(mSmartEvent.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
.setSmartEnd(mSmartEvent.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
}
@@ -325,9 +291,9 @@
}
}
- private String startNewSession() {
+ private TextClassificationSessionId startNewSession() {
endSession();
- return UUID.randomUUID().toString();
+ return new TextClassificationSessionId();
}
private void endSession() {
@@ -372,12 +338,12 @@
/**
* @param context Context of the widget the logger logs for
* @param widgetType a name for the widget being logged for. e.g.
- * {@link #WIDGET_TEXTVIEW}
+ * {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}
* @param widgetVersion a string version info for the widget the logger logs for
*/
public Config(
@NonNull Context context,
- @WidgetType String widgetType,
+ @TextClassifier.WidgetType String widgetType,
@Nullable String widgetVersion) {
mPackageName = Preconditions.checkNotNull(context).getPackageName();
mWidgetType = widgetType;
@@ -392,7 +358,8 @@
}
/**
- * Returns the name for the widget being logged for. e.g. {@link #WIDGET_TEXTVIEW}.
+ * Returns the name for the widget being logged for. e.g.
+ * {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}.
*/
public String getWidgetType() {
return mWidgetType;
diff --git a/core/java/android/view/textclassifier/SelectionEvent.java b/core/java/android/view/textclassifier/SelectionEvent.java
index 7ac094e..1e978cc 100644
--- a/core/java/android/view/textclassifier/SelectionEvent.java
+++ b/core/java/android/view/textclassifier/SelectionEvent.java
@@ -17,10 +17,12 @@
package android.view.textclassifier;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.textclassifier.TextClassifier.EntityType;
+import android.view.textclassifier.TextClassifier.WidgetType;
import com.android.internal.util.Preconditions;
@@ -103,30 +105,33 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({INVOCATION_MANUAL, INVOCATION_LINK})
+ @IntDef({INVOCATION_MANUAL, INVOCATION_LINK, INVOCATION_UNKNOWN})
public @interface InvocationMethod {}
/** Selection was invoked by the user long pressing, double tapping, or dragging to select. */
public static final int INVOCATION_MANUAL = 1;
/** Selection was invoked by the user tapping on a link. */
public static final int INVOCATION_LINK = 2;
+ /** Unknown invocation method */
+ public static final int INVOCATION_UNKNOWN = 0;
+
+ private static final String NO_SIGNATURE = "";
private final int mAbsoluteStart;
private final int mAbsoluteEnd;
- private final @EventType int mEventType;
private final @EntityType String mEntityType;
- @Nullable private final String mWidgetVersion;
- private final String mPackageName;
- private final String mWidgetType;
- private final @InvocationMethod int mInvocationMethod;
- // These fields should only be set by creator of a SelectionEvent.
- private String mSignature;
+ private @EventType int mEventType;
+ private String mPackageName = "";
+ private String mWidgetType = TextClassifier.WIDGET_TYPE_UNKNOWN;
+ private @InvocationMethod int mInvocationMethod;
+ @Nullable private String mWidgetVersion;
+ @Nullable private String mResultId;
private long mEventTime;
private long mDurationSinceSessionStart;
private long mDurationSincePreviousEvent;
private int mEventIndex;
- @Nullable private String mSessionId;
+ @Nullable private TextClassificationSessionId mSessionId;
private int mStart;
private int mEnd;
private int mSmartStart;
@@ -135,20 +140,30 @@
SelectionEvent(
int start, int end,
@EventType int eventType, @EntityType String entityType,
- @InvocationMethod int invocationMethod, String signature, Logger.Config config) {
+ @InvocationMethod int invocationMethod, @Nullable String resultId) {
Preconditions.checkArgument(end >= start, "end cannot be less than start");
mAbsoluteStart = start;
mAbsoluteEnd = end;
mEventType = eventType;
mEntityType = Preconditions.checkNotNull(entityType);
- mSignature = Preconditions.checkNotNull(signature);
- Preconditions.checkNotNull(config);
- mWidgetVersion = config.getWidgetVersion();
- mPackageName = Preconditions.checkNotNull(config.getPackageName());
- mWidgetType = Preconditions.checkNotNull(config.getWidgetType());
+ mResultId = resultId;
mInvocationMethod = invocationMethod;
}
+ SelectionEvent(
+ int start, int end,
+ @EventType int eventType, @EntityType String entityType,
+ @InvocationMethod int invocationMethod, @Nullable String resultId,
+ Logger.Config config) {
+ this(start, end, eventType, entityType, invocationMethod, resultId);
+ Preconditions.checkNotNull(config);
+ setTextClassificationSessionContext(
+ new TextClassificationContext.Builder(
+ config.getPackageName(), config.getWidgetType())
+ .setWidgetVersion(config.getWidgetVersion())
+ .build());
+ }
+
private SelectionEvent(Parcel in) {
mAbsoluteStart = in.readInt();
mAbsoluteEnd = in.readInt();
@@ -158,12 +173,13 @@
mPackageName = in.readString();
mWidgetType = in.readString();
mInvocationMethod = in.readInt();
- mSignature = in.readString();
+ mResultId = in.readString();
mEventTime = in.readLong();
mDurationSinceSessionStart = in.readLong();
mDurationSincePreviousEvent = in.readLong();
mEventIndex = in.readInt();
- mSessionId = in.readInt() > 0 ? in.readString() : null;
+ mSessionId = in.readInt() > 0
+ ? TextClassificationSessionId.CREATOR.createFromParcel(in) : null;
mStart = in.readInt();
mEnd = in.readInt();
mSmartStart = in.readInt();
@@ -183,14 +199,14 @@
dest.writeString(mPackageName);
dest.writeString(mWidgetType);
dest.writeInt(mInvocationMethod);
- dest.writeString(mSignature);
+ dest.writeString(mResultId);
dest.writeLong(mEventTime);
dest.writeLong(mDurationSinceSessionStart);
dest.writeLong(mDurationSincePreviousEvent);
dest.writeInt(mEventIndex);
dest.writeInt(mSessionId != null ? 1 : 0);
if (mSessionId != null) {
- dest.writeString(mSessionId);
+ mSessionId.writeToParcel(dest, flags);
}
dest.writeInt(mStart);
dest.writeInt(mEnd);
@@ -203,6 +219,156 @@
return 0;
}
+ /**
+ * Creates a "selection started" event.
+ *
+ * @param invocationMethod the way the selection was triggered
+ * @param start the index of the selected text
+ */
+ @NonNull
+ public static SelectionEvent createSelectionStartedEvent(
+ @SelectionEvent.InvocationMethod int invocationMethod, int start) {
+ return new SelectionEvent(
+ start, start + 1, SelectionEvent.EVENT_SELECTION_STARTED,
+ TextClassifier.TYPE_UNKNOWN, invocationMethod, NO_SIGNATURE);
+ }
+
+ /**
+ * Creates a "selection modified" event.
+ * Use when the user modifies the selection.
+ *
+ * @param start the start (inclusive) index of the selection
+ * @param end the end (exclusive) index of the selection
+ *
+ * @throws IllegalArgumentException if end is less than start
+ */
+ @NonNull
+ public static SelectionEvent createSelectionModifiedEvent(int start, int end) {
+ Preconditions.checkArgument(end >= start, "end cannot be less than start");
+ return new SelectionEvent(
+ start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
+ TextClassifier.TYPE_UNKNOWN, INVOCATION_UNKNOWN, NO_SIGNATURE);
+ }
+
+ /**
+ * Creates a "selection modified" event.
+ * Use when the user modifies the selection and the selection's entity type is known.
+ *
+ * @param start the start (inclusive) index of the selection
+ * @param end the end (exclusive) index of the selection
+ * @param classification the TextClassification object returned by the TextClassifier that
+ * classified the selected text
+ *
+ * @throws IllegalArgumentException if end is less than start
+ */
+ @NonNull
+ public static SelectionEvent createSelectionModifiedEvent(
+ int start, int end, @NonNull TextClassification classification) {
+ Preconditions.checkArgument(end >= start, "end cannot be less than start");
+ Preconditions.checkNotNull(classification);
+ final String entityType = classification.getEntityCount() > 0
+ ? classification.getEntity(0)
+ : TextClassifier.TYPE_UNKNOWN;
+ return new SelectionEvent(
+ start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
+ entityType, INVOCATION_UNKNOWN, classification.getId());
+ }
+
+ /**
+ * Creates a "selection modified" event.
+ * Use when a TextClassifier modifies the selection.
+ *
+ * @param start the start (inclusive) index of the selection
+ * @param end the end (exclusive) index of the selection
+ * @param selection the TextSelection object returned by the TextClassifier for the
+ * specified selection
+ *
+ * @throws IllegalArgumentException if end is less than start
+ */
+ @NonNull
+ public static SelectionEvent createSelectionModifiedEvent(
+ int start, int end, @NonNull TextSelection selection) {
+ Preconditions.checkArgument(end >= start, "end cannot be less than start");
+ Preconditions.checkNotNull(selection);
+ final String entityType = selection.getEntityCount() > 0
+ ? selection.getEntity(0)
+ : TextClassifier.TYPE_UNKNOWN;
+ return new SelectionEvent(
+ start, end, SelectionEvent.EVENT_AUTO_SELECTION,
+ entityType, INVOCATION_UNKNOWN, selection.getId());
+ }
+
+ /**
+ * Creates an event specifying an action taken on a selection.
+ * Use when the user clicks on an action to act on the selected text.
+ *
+ * @param start the start (inclusive) index of the selection
+ * @param end the end (exclusive) index of the selection
+ * @param actionType the action that was performed on the selection
+ *
+ * @throws IllegalArgumentException if end is less than start
+ */
+ @NonNull
+ public static SelectionEvent createSelectionActionEvent(
+ int start, int end, @SelectionEvent.ActionType int actionType) {
+ Preconditions.checkArgument(end >= start, "end cannot be less than start");
+ checkActionType(actionType);
+ return new SelectionEvent(
+ start, end, actionType, TextClassifier.TYPE_UNKNOWN, INVOCATION_UNKNOWN,
+ NO_SIGNATURE);
+ }
+
+ /**
+ * Creates an event specifying an action taken on a selection.
+ * Use when the user clicks on an action to act on the selected text and the selection's
+ * entity type is known.
+ *
+ * @param start the start (inclusive) index of the selection
+ * @param end the end (exclusive) index of the selection
+ * @param actionType the action that was performed on the selection
+ * @param classification the TextClassification object returned by the TextClassifier that
+ * classified the selected text
+ *
+ * @throws IllegalArgumentException if end is less than start
+ * @throws IllegalArgumentException If actionType is not a valid SelectionEvent actionType
+ */
+ @NonNull
+ public static SelectionEvent createSelectionActionEvent(
+ int start, int end, @SelectionEvent.ActionType int actionType,
+ @NonNull TextClassification classification) {
+ Preconditions.checkArgument(end >= start, "end cannot be less than start");
+ Preconditions.checkNotNull(classification);
+ checkActionType(actionType);
+ final String entityType = classification.getEntityCount() > 0
+ ? classification.getEntity(0)
+ : TextClassifier.TYPE_UNKNOWN;
+ return new SelectionEvent(start, end, actionType, entityType, INVOCATION_UNKNOWN,
+ classification.getId());
+ }
+
+ /**
+ * @throws IllegalArgumentException If eventType is not an {@link SelectionEvent.ActionType}
+ */
+ private static void checkActionType(@SelectionEvent.EventType int eventType)
+ throws IllegalArgumentException {
+ switch (eventType) {
+ case SelectionEvent.ACTION_OVERTYPE: // fall through
+ case SelectionEvent.ACTION_COPY: // fall through
+ case SelectionEvent.ACTION_PASTE: // fall through
+ case SelectionEvent.ACTION_CUT: // fall through
+ case SelectionEvent.ACTION_SHARE: // fall through
+ case SelectionEvent.ACTION_SMART_SHARE: // fall through
+ case SelectionEvent.ACTION_DRAG: // fall through
+ case SelectionEvent.ACTION_ABANDON: // fall through
+ case SelectionEvent.ACTION_SELECT_ALL: // fall through
+ case SelectionEvent.ACTION_RESET: // fall through
+ return;
+ default:
+ throw new IllegalArgumentException(
+ String.format(Locale.US, "%d is not an eventType", eventType));
+ }
+ }
+
int getAbsoluteStart() {
return mAbsoluteStart;
}
@@ -214,15 +380,24 @@
/**
* Returns the type of event that was triggered. e.g. {@link #ACTION_COPY}.
*/
+ @EventType
public int getEventType() {
return mEventType;
}
/**
+ * Sets the event type.
+ */
+ void setEventType(@EventType int eventType) {
+ mEventType = eventType;
+ }
+
+ /**
* Returns the type of entity that is associated with this event. e.g.
* {@link android.view.textclassifier.TextClassifier#TYPE_EMAIL}.
*/
@EntityType
+ @NonNull
public String getEntityType() {
return mEntityType;
}
@@ -230,6 +405,7 @@
/**
* Returns the package name of the app that this event originated in.
*/
+ @NonNull
public String getPackageName() {
return mPackageName;
}
@@ -237,6 +413,8 @@
/**
* Returns the type of widget that was involved in triggering this event.
*/
+ @WidgetType
+ @NonNull
public String getWidgetType() {
return mWidgetType;
}
@@ -244,11 +422,21 @@
/**
* Returns a string version info for the widget this event was triggered in.
*/
+ @Nullable
public String getWidgetVersion() {
return mWidgetVersion;
}
/**
+ * Sets the {@link TextClassificationContext} for this event.
+ */
+ void setTextClassificationSessionContext(TextClassificationContext context) {
+ mPackageName = context.getPackageName();
+ mWidgetType = context.getWidgetType();
+ mWidgetVersion = context.getWidgetVersion();
+ }
+
+ /**
* Returns the way the selection mode was invoked.
*/
public @InvocationMethod int getInvocationMethod() {
@@ -256,14 +444,22 @@
}
/**
- * Returns the signature of the text classifier result associated with this event.
+ * Sets the invocationMethod for this event.
*/
- public String getSignature() {
- return mSignature;
+ void setInvocationMethod(@InvocationMethod int invocationMethod) {
+ mInvocationMethod = invocationMethod;
}
- SelectionEvent setSignature(String signature) {
- mSignature = Preconditions.checkNotNull(signature);
+ /**
+ * Returns the id of the text classifier result associated with this event.
+ */
+ @Nullable
+ public String getResultId() {
+ return mResultId;
+ }
+
+ SelectionEvent setResultId(@Nullable String resultId) {
+ mResultId = resultId;
return this;
}
@@ -320,17 +516,18 @@
/**
* Returns the selection session id.
*/
- public String getSessionId() {
+ @Nullable
+ public TextClassificationSessionId getSessionId() {
return mSessionId;
}
- SelectionEvent setSessionId(String id) {
+ SelectionEvent setSessionId(TextClassificationSessionId id) {
mSessionId = id;
return this;
}
/**
- * Returns the start index of this events token relative to the index of the start selection
+ * Returns the start index of this events relative to the index of the start selection
* event in the selection session.
*/
public int getStart() {
@@ -343,7 +540,7 @@
}
/**
- * Returns the end index of this events token relative to the index of the start selection
+ * Returns the end index of this events relative to the index of the start selection
* event in the selection session.
*/
public int getEnd() {
@@ -356,7 +553,7 @@
}
/**
- * Returns the start index of this events token relative to the index of the smart selection
+ * Returns the start index of this events relative to the index of the smart selection
* event in the selection session.
*/
public int getSmartStart() {
@@ -369,7 +566,7 @@
}
/**
- * Returns the end index of this events token relative to the index of the smart selection
+ * Returns the end index of this events relative to the index of the smart selection
* event in the selection session.
*/
public int getSmartEnd() {
@@ -382,7 +579,15 @@
}
boolean isTerminal() {
- switch (mEventType) {
+ return isTerminal(mEventType);
+ }
+
+ /**
+ * Returns true if the eventType is a terminal event type. Otherwise returns false.
+ * A terminal event is an event that ends a selection interaction.
+ */
+ public static boolean isTerminal(@EventType int eventType) {
+ switch (eventType) {
case ACTION_OVERTYPE: // fall through
case ACTION_COPY: // fall through
case ACTION_PASTE: // fall through
@@ -401,7 +606,7 @@
@Override
public int hashCode() {
return Objects.hash(mAbsoluteStart, mAbsoluteEnd, mEventType, mEntityType,
- mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mSignature,
+ mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mResultId,
mEventTime, mDurationSinceSessionStart, mDurationSincePreviousEvent,
mEventIndex, mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
}
@@ -424,7 +629,7 @@
&& Objects.equals(mPackageName, other.mPackageName)
&& Objects.equals(mWidgetType, other.mWidgetType)
&& mInvocationMethod == other.mInvocationMethod
- && Objects.equals(mSignature, other.mSignature)
+ && Objects.equals(mResultId, other.mResultId)
&& mEventTime == other.mEventTime
&& mDurationSinceSessionStart == other.mDurationSinceSessionStart
&& mDurationSincePreviousEvent == other.mDurationSincePreviousEvent
@@ -439,15 +644,16 @@
@Override
public String toString() {
return String.format(Locale.US,
- "SelectionEvent {absoluteStart=%d, absoluteEnd=%d, eventType=%d, entityType=%s, "
- + "widgetVersion=%s, packageName=%s, widgetType=%s, invocationMethod=%s, "
- + "signature=%s, eventTime=%d, durationSinceSessionStart=%d, "
- + "durationSincePreviousEvent=%d, eventIndex=%d, sessionId=%s, start=%d, end=%d, "
- + "smartStart=%d, smartEnd=%d}",
+ "SelectionEvent {absoluteStart=%d, absoluteEnd=%d, eventType=%d, entityType=%s, "
+ + "widgetVersion=%s, packageName=%s, widgetType=%s, invocationMethod=%s, "
+ + "resultId=%s, eventTime=%d, durationSinceSessionStart=%d, "
+ + "durationSincePreviousEvent=%d, eventIndex=%d,"
+ + "sessionId=%s, start=%d, end=%d, smartStart=%d, smartEnd=%d}",
mAbsoluteStart, mAbsoluteEnd, mEventType, mEntityType,
- mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mSignature,
- mEventTime, mDurationSinceSessionStart, mDurationSincePreviousEvent,
- mEventIndex, mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
+ mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod,
+ mResultId, mEventTime, mDurationSinceSessionStart,
+ mDurationSincePreviousEvent, mEventIndex,
+ mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
}
public static final Creator<SelectionEvent> CREATOR = new Creator<SelectionEvent>() {
@@ -461,4 +667,4 @@
return new SelectionEvent[size];
}
};
-}
+}
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index 2a24dd7..45fd6bf 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -16,7 +16,6 @@
package android.view.textclassifier;
-import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
@@ -56,6 +55,8 @@
private Logger.Config mLoggerConfig;
@GuardedBy("mLoggerLock")
private Logger mLogger;
+ @GuardedBy("mLoggerLock")
+ private TextClassificationSessionId mSessionId;
public SystemTextClassifier(Context context, TextClassificationConstants settings)
throws ServiceManager.ServiceNotFoundException {
@@ -71,26 +72,20 @@
*/
@Override
@WorkerThread
- public TextSelection suggestSelection(
- @NonNull CharSequence text,
- @IntRange(from = 0) int selectionStartIndex,
- @IntRange(from = 0) int selectionEndIndex,
- @Nullable TextSelection.Options options) {
- Utils.validate(text, selectionStartIndex, selectionEndIndex, false /* allowInMainThread */);
+ public TextSelection suggestSelection(TextSelection.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
try {
final TextSelectionCallback callback = new TextSelectionCallback();
- mManagerService.onSuggestSelection(
- text, selectionStartIndex, selectionEndIndex, options, callback);
+ mManagerService.onSuggestSelection(mSessionId, request, callback);
final TextSelection selection = callback.mReceiver.get();
if (selection != null) {
return selection;
}
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- } catch (InterruptedException e) {
- Log.d(LOG_TAG, e.getMessage());
+ } catch (RemoteException | InterruptedException e) {
+ Log.e(LOG_TAG, "Error suggesting selection for text. Using fallback.", e);
}
- return mFallback.suggestSelection(text, selectionStartIndex, selectionEndIndex, options);
+ return mFallback.suggestSelection(request);
}
/**
@@ -98,25 +93,20 @@
*/
@Override
@WorkerThread
- public TextClassification classifyText(
- @NonNull CharSequence text,
- @IntRange(from = 0) int startIndex,
- @IntRange(from = 0) int endIndex,
- @Nullable TextClassification.Options options) {
- Utils.validate(text, startIndex, endIndex, false /* allowInMainThread */);
+ public TextClassification classifyText(TextClassification.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
try {
final TextClassificationCallback callback = new TextClassificationCallback();
- mManagerService.onClassifyText(text, startIndex, endIndex, options, callback);
+ mManagerService.onClassifyText(mSessionId, request, callback);
final TextClassification classification = callback.mReceiver.get();
if (classification != null) {
return classification;
}
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- } catch (InterruptedException e) {
- Log.d(LOG_TAG, e.getMessage());
+ } catch (RemoteException | InterruptedException e) {
+ Log.e(LOG_TAG, "Error classifying text. Using fallback.", e);
}
- return mFallback.classifyText(text, startIndex, endIndex, options);
+ return mFallback.classifyText(request);
}
/**
@@ -124,33 +114,26 @@
*/
@Override
@WorkerThread
- public TextLinks generateLinks(
- @NonNull CharSequence text, @Nullable TextLinks.Options options) {
- Utils.validate(text, false /* allowInMainThread */);
+ public TextLinks generateLinks(@NonNull TextLinks.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
- final boolean legacyFallback = options != null && options.isLegacyFallback();
- if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
- return Utils.generateLegacyLinks(text, options);
+ if (!mSettings.isSmartLinkifyEnabled() && request.isLegacyFallback()) {
+ return Utils.generateLegacyLinks(request);
}
try {
- if (options == null) {
- options = new TextLinks.Options().setCallingPackageName(mPackageName);
- } else if (!mPackageName.equals(options.getCallingPackageName())) {
- options.setCallingPackageName(mPackageName);
- }
+ request.setCallingPackageName(mPackageName);
final TextLinksCallback callback = new TextLinksCallback();
- mManagerService.onGenerateLinks(text, options, callback);
+ mManagerService.onGenerateLinks(mSessionId, request, callback);
final TextLinks links = callback.mReceiver.get();
if (links != null) {
return links;
}
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- } catch (InterruptedException e) {
- Log.d(LOG_TAG, e.getMessage());
+ } catch (RemoteException | InterruptedException e) {
+ Log.e(LOG_TAG, "Error generating links. Using fallback.", e);
}
- return mFallback.generateLinks(text, options);
+ return mFallback.generateLinks(request);
}
/**
@@ -173,9 +156,9 @@
@Override
public void writeEvent(SelectionEvent event) {
try {
- mManagerService.onSelectionEvent(event);
+ mManagerService.onSelectionEvent(mSessionId, event);
} catch (RemoteException e) {
- e.rethrowAsRuntimeException();
+ Log.e(LOG_TAG, "Error reporting selection event.", e);
}
}
};
@@ -184,6 +167,34 @@
return mLogger;
}
+ @Override
+ public void destroy() {
+ try {
+ if (mSessionId != null) {
+ mManagerService.onDestroyTextClassificationSession(mSessionId);
+ }
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Error destroying classification session.", e);
+ }
+ }
+
+ /**
+ * Attempts to initialize a new classification session.
+ *
+ * @param classificationContext the classification context
+ * @param sessionId the session's id
+ */
+ void initializeRemoteSession(
+ @NonNull TextClassificationContext classificationContext,
+ @NonNull TextClassificationSessionId sessionId) {
+ mSessionId = Preconditions.checkNotNull(sessionId);
+ try {
+ mManagerService.onCreateTextClassificationSession(classificationContext, mSessionId);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Error starting a new classification session.", e);
+ }
+ }
+
private static final class TextSelectionCallback extends ITextSelectionCallback.Stub {
final ResponseReceiver<TextSelection> mReceiver = new ResponseReceiver<>();
diff --git a/core/java/android/view/textclassifier/TextClassification.aidl b/core/java/android/view/textclassifier/TextClassification.aidl
index 9fefe5d..bfb143c 100644
--- a/core/java/android/view/textclassifier/TextClassification.aidl
+++ b/core/java/android/view/textclassifier/TextClassification.aidl
@@ -17,4 +17,4 @@
package android.view.textclassifier;
parcelable TextClassification;
-parcelable TextClassification.Options;
\ No newline at end of file
+parcelable TextClassification.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index b5c9de9..37a5d9a 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -21,6 +21,8 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.PendingIntent;
+import android.app.RemoteAction;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -36,13 +38,15 @@
import android.util.ArrayMap;
import android.view.View.OnClickListener;
import android.view.textclassifier.TextClassifier.EntityType;
+import android.view.textclassifier.TextClassifier.Utils;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
-import java.util.Calendar;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -77,25 +81,16 @@
* view.startActionMode(new ActionMode.Callback() {
*
* public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- * // Add the "primary" action.
- * if (thisAppHasPermissionToInvokeIntent(classification.getIntent())) {
- * menu.add(Menu.NONE, 0, 20, classification.getLabel())
- * .setIcon(classification.getIcon())
- * .setIntent(classification.getIntent());
- * }
- * // Add the "secondary" actions.
- * for (int i = 0; i < classification.getSecondaryActionsCount(); i++) {
- * if (thisAppHasPermissionToInvokeIntent(classification.getSecondaryIntent(i))) {
- * menu.add(Menu.NONE, i + 1, 20, classification.getSecondaryLabel(i))
- * .setIcon(classification.getSecondaryIcon(i))
- * .setIntent(classification.getSecondaryIntent(i));
- * }
+ * for (int i = 0; i < classification.getActions().size(); ++i) {
+ * RemoteAction action = classification.getActions().get(i);
+ * menu.add(Menu.NONE, i, 20, action.getTitle())
+ * .setIcon(action.getIcon());
* }
* return true;
* }
*
* public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- * context.startActivity(item.getIntent());
+ * classification.getActions().get(item.getItemId()).getActionIntent().send();
* return true;
* }
*
@@ -110,9 +105,9 @@
*/
static final TextClassification EMPTY = new TextClassification.Builder().build();
+ private static final String LOG_TAG = "TextClassification";
// TODO(toki): investigate a way to derive this based on device properties.
- private static final int MAX_PRIMARY_ICON_SIZE = 192;
- private static final int MAX_SECONDARY_ICON_SIZE = 144;
+ private static final int MAX_LEGACY_ICON_SIZE = 192;
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {IntentType.UNSUPPORTED, IntentType.ACTIVITY, IntentType.SERVICE})
@@ -123,39 +118,31 @@
}
@NonNull private final String mText;
- @Nullable private final Drawable mPrimaryIcon;
- @Nullable private final String mPrimaryLabel;
- @Nullable private final Intent mPrimaryIntent;
- @Nullable private final OnClickListener mPrimaryOnClickListener;
- @NonNull private final List<Drawable> mSecondaryIcons;
- @NonNull private final List<String> mSecondaryLabels;
- @NonNull private final List<Intent> mSecondaryIntents;
+ @Nullable private final Drawable mLegacyIcon;
+ @Nullable private final String mLegacyLabel;
+ @Nullable private final Intent mLegacyIntent;
+ @Nullable private final OnClickListener mLegacyOnClickListener;
+ @NonNull private final List<RemoteAction> mActions;
@NonNull private final EntityConfidence mEntityConfidence;
- @NonNull private final String mSignature;
+ @Nullable private final String mId;
private TextClassification(
@Nullable String text,
- @Nullable Drawable primaryIcon,
- @Nullable String primaryLabel,
- @Nullable Intent primaryIntent,
- @Nullable OnClickListener primaryOnClickListener,
- @NonNull List<Drawable> secondaryIcons,
- @NonNull List<String> secondaryLabels,
- @NonNull List<Intent> secondaryIntents,
+ @Nullable Drawable legacyIcon,
+ @Nullable String legacyLabel,
+ @Nullable Intent legacyIntent,
+ @Nullable OnClickListener legacyOnClickListener,
+ @NonNull List<RemoteAction> actions,
@NonNull Map<String, Float> entityConfidence,
- @NonNull String signature) {
- Preconditions.checkArgument(secondaryLabels.size() == secondaryIntents.size());
- Preconditions.checkArgument(secondaryIcons.size() == secondaryIntents.size());
+ @Nullable String id) {
mText = text;
- mPrimaryIcon = primaryIcon;
- mPrimaryLabel = primaryLabel;
- mPrimaryIntent = primaryIntent;
- mPrimaryOnClickListener = primaryOnClickListener;
- mSecondaryIcons = secondaryIcons;
- mSecondaryLabels = secondaryLabels;
- mSecondaryIntents = secondaryIntents;
+ mLegacyIcon = legacyIcon;
+ mLegacyLabel = legacyLabel;
+ mLegacyIntent = legacyIntent;
+ mLegacyOnClickListener = legacyOnClickListener;
+ mActions = Collections.unmodifiableList(actions);
mEntityConfidence = new EntityConfidence(entityConfidence);
- mSignature = signature;
+ mId = id;
}
/**
@@ -197,172 +184,110 @@
}
/**
- * Returns the number of <i>secondary</i> actions that are available to act on the classified
- * text.
- *
- * <p><strong>Note: </strong> that there may or may not be a <i>primary</i> action.
- *
- * @see #getSecondaryIntent(int)
- * @see #getSecondaryLabel(int)
- * @see #getSecondaryIcon(int)
+ * Returns a list of actions that may be performed on the text. The list is ordered based on
+ * the likelihood that a user will use the action, with the most likely action appearing first.
*/
- @IntRange(from = 0)
- public int getSecondaryActionsCount() {
- return mSecondaryIntents.size();
+ public List<RemoteAction> getActions() {
+ return mActions;
}
/**
- * Returns one of the <i>secondary</i> icons that maybe rendered on a widget used to act on the
- * classified text.
+ * Returns an icon that may be rendered on a widget used to act on the classified text.
*
- * @param index Index of the action to get the icon for.
- * @throws IndexOutOfBoundsException if the specified index is out of range.
- * @see #getSecondaryActionsCount() for the number of actions available.
- * @see #getSecondaryIntent(int)
- * @see #getSecondaryLabel(int)
- * @see #getIcon()
+ * @deprecated Use {@link #getActions()} instead.
*/
- @Nullable
- public Drawable getSecondaryIcon(int index) {
- return mSecondaryIcons.get(index);
- }
-
- /**
- * Returns an icon for the <i>primary</i> intent that may be rendered on a widget used to act
- * on the classified text.
- *
- * @see #getSecondaryIcon(int)
- */
+ @Deprecated
@Nullable
public Drawable getIcon() {
- return mPrimaryIcon;
+ return mLegacyIcon;
}
/**
- * Returns one of the <i>secondary</i> labels that may be rendered on a widget used to act on
- * the classified text.
+ * Returns a label that may be rendered on a widget used to act on the classified text.
*
- * @param index Index of the action to get the label for.
- * @throws IndexOutOfBoundsException if the specified index is out of range.
- * @see #getSecondaryActionsCount()
- * @see #getSecondaryIntent(int)
- * @see #getSecondaryIcon(int)
- * @see #getLabel()
+ * @deprecated Use {@link #getActions()} instead.
*/
- @Nullable
- public CharSequence getSecondaryLabel(int index) {
- return mSecondaryLabels.get(index);
- }
-
- /**
- * Returns a label for the <i>primary</i> intent that may be rendered on a widget used to act
- * on the classified text.
- *
- * @see #getSecondaryLabel(int)
- */
+ @Deprecated
@Nullable
public CharSequence getLabel() {
- return mPrimaryLabel;
+ return mLegacyLabel;
}
/**
- * Returns one of the <i>secondary</i> intents that may be fired to act on the classified text.
+ * Returns an intent that may be fired to act on the classified text.
*
- * @param index Index of the action to get the intent for.
- * @throws IndexOutOfBoundsException if the specified index is out of range.
- * @see #getSecondaryActionsCount()
- * @see #getSecondaryLabel(int)
- * @see #getSecondaryIcon(int)
- * @see #getIntent()
+ * @deprecated Use {@link #getActions()} instead.
*/
- @Nullable
- public Intent getSecondaryIntent(int index) {
- return mSecondaryIntents.get(index);
- }
-
- /**
- * Returns the <i>primary</i> intent that may be fired to act on the classified text.
- *
- * @see #getSecondaryIntent(int)
- */
+ @Deprecated
@Nullable
public Intent getIntent() {
- return mPrimaryIntent;
+ return mLegacyIntent;
}
/**
- * Returns the <i>primary</i> OnClickListener that may be triggered to act on the classified
- * text. This field is not parcelable and will be null for all objects read from a parcel.
- * Instead, call Context#startActivity(Intent) with the result of #getSecondaryIntent(int).
- * Note that this may fail if the activity doesn't have permission to send the intent.
+ * Returns the OnClickListener that may be triggered to act on the classified text. This field
+ * is not parcelable and will be null for all objects read from a parcel. Instead, call
+ * Context#startActivity(Intent) with the result of #getSecondaryIntent(int). Note that this may
+ * fail if the activity doesn't have permission to send the intent.
+ *
+ * @deprecated Use {@link #getActions()} instead.
*/
@Nullable
public OnClickListener getOnClickListener() {
- return mPrimaryOnClickListener;
+ return mLegacyOnClickListener;
}
/**
- * Returns the signature for this object.
- * The TextClassifier that generates this object may use it as a way to internally identify
- * this object.
+ * Returns the id, if one exists, for this object.
*/
- @NonNull
- public String getSignature() {
- return mSignature;
+ @Nullable
+ public String getId() {
+ return mId;
}
@Override
public String toString() {
- return String.format(Locale.US, "TextClassification {"
- + "text=%s, entities=%s, "
- + "primaryLabel=%s, secondaryLabels=%s, "
- + "primaryIntent=%s, secondaryIntents=%s, "
- + "signature=%s}",
- mText, mEntityConfidence,
- mPrimaryLabel, mSecondaryLabels,
- mPrimaryIntent, mSecondaryIntents,
- mSignature);
+ return String.format(Locale.US,
+ "TextClassification {text=%s, entities=%s, actions=%s, id=%s}",
+ mText, mEntityConfidence, mActions, mId);
}
/**
- * Creates an OnClickListener that triggers the specified intent.
+ * Creates an OnClickListener that triggers the specified PendingIntent.
+ *
+ * @hide
+ */
+ public static OnClickListener createIntentOnClickListener(@NonNull final PendingIntent intent) {
+ Preconditions.checkNotNull(intent);
+ return v -> {
+ try {
+ intent.send();
+ } catch (PendingIntent.CanceledException e) {
+ Log.e(LOG_TAG, "Error sending PendingIntent", e);
+ }
+ };
+ }
+
+ /**
+ * Creates a PendingIntent for the specified intent.
* Returns null if the intent is not supported for the specified context.
*
* @throws IllegalArgumentException if context or intent is null
* @hide
*/
@Nullable
- public static OnClickListener createIntentOnClickListener(
+ public static PendingIntent createPendingIntent(
@NonNull final Context context, @NonNull final Intent intent) {
switch (getIntentType(intent, context)) {
case IntentType.ACTIVITY:
- return v -> context.startActivity(intent);
+ return PendingIntent.getActivity(context, 0, intent, 0);
case IntentType.SERVICE:
- return v -> context.startService(intent);
+ return PendingIntent.getService(context, 0, intent, 0);
default:
return null;
}
}
- /**
- * Triggers the specified intent.
- *
- * @throws IllegalArgumentException if context or intent is null
- * @hide
- */
- public static void fireIntent(@NonNull final Context context, @NonNull final Intent intent) {
- switch (getIntentType(intent, context)) {
- case IntentType.ACTIVITY:
- context.startActivity(intent);
- return;
- case IntentType.SERVICE:
- context.startService(intent);
- return;
- default:
- return;
- }
- }
-
@IntentType
private static int getIntentType(@NonNull Intent intent, @NonNull Context context) {
Preconditions.checkArgument(context != null);
@@ -434,33 +359,6 @@
}
/**
- * Returns a list of drawables converted to Bitmaps
- *
- * @param drawables The drawables to convert.
- * @param maxDims The maximum edge length of the resulting bitmaps (in pixels).
- */
- private static List<Bitmap> drawablesToBitmaps(List<Drawable> drawables, int maxDims) {
- final List<Bitmap> bitmaps = new ArrayList<>(drawables.size());
- for (Drawable drawable : drawables) {
- bitmaps.add(drawableToBitmap(drawable, maxDims));
- }
- return bitmaps;
- }
-
- /** Returns a list of drawable wrappers for a list of bitmaps. */
- private static List<Drawable> bitmapsToDrawables(List<Bitmap> bitmaps) {
- final List<Drawable> drawables = new ArrayList<>(bitmaps.size());
- for (Bitmap bitmap : bitmaps) {
- if (bitmap != null) {
- drawables.add(new BitmapDrawable(Resources.getSystem(), bitmap));
- } else {
- drawables.add(null);
- }
- }
- return drawables;
- }
-
- /**
* Builder for building {@link TextClassification} objects.
*
* <p>e.g.
@@ -470,28 +368,26 @@
* .setText(classifiedText)
* .setEntityType(TextClassifier.TYPE_EMAIL, 0.9)
* .setEntityType(TextClassifier.TYPE_OTHER, 0.1)
- * .setPrimaryAction(intent, label, icon)
- * .addSecondaryAction(intent1, label1, icon1)
- * .addSecondaryAction(intent2, label2, icon2)
+ * .addAction(remoteAction1)
+ * .addAction(remoteAction2)
* .build();
* }</pre>
*/
public static final class Builder {
@NonNull private String mText;
- @NonNull private final List<Drawable> mSecondaryIcons = new ArrayList<>();
- @NonNull private final List<String> mSecondaryLabels = new ArrayList<>();
- @NonNull private final List<Intent> mSecondaryIntents = new ArrayList<>();
+ @NonNull private List<RemoteAction> mActions = new ArrayList<>();
@NonNull private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
- @Nullable Drawable mPrimaryIcon;
- @Nullable String mPrimaryLabel;
- @Nullable Intent mPrimaryIntent;
- @Nullable OnClickListener mPrimaryOnClickListener;
- @NonNull private String mSignature = "";
+ @Nullable Drawable mLegacyIcon;
+ @Nullable String mLegacyLabel;
+ @Nullable Intent mLegacyIntent;
+ @Nullable OnClickListener mLegacyOnClickListener;
+ @Nullable private String mId;
/**
* Sets the classified text.
*/
+ @NonNull
public Builder setText(@Nullable String text) {
mText = text;
return this;
@@ -506,6 +402,7 @@
* 0 implies the entity does not exist for the classified text.
* Values greater than 1 are clamped to 1.
*/
+ @NonNull
public Builder setEntityType(
@NonNull @EntityType String type,
@FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
@@ -514,60 +411,27 @@
}
/**
- * Adds an <i>secondary</i> action that may be performed on the classified text.
- * Secondary actions are in addition to the <i>primary</i> action which may or may not
- * exist.
- *
- * <p>The label and icon are used for rendering of widgets that offer the intent.
- * Actions should be added in order of priority.
- *
- * <p><stong>Note: </stong> If all input parameters are set to null, this method will be a
- * no-op.
- *
- * @see #setPrimaryAction(Intent, String, Drawable)
+ * Adds an action that may be performed on the classified text. Actions should be added in
+ * order of likelihood that the user will use them, with the most likely action being added
+ * first.
*/
- public Builder addSecondaryAction(
- @Nullable Intent intent, @Nullable String label, @Nullable Drawable icon) {
- if (intent != null || label != null || icon != null) {
- mSecondaryIntents.add(intent);
- mSecondaryLabels.add(label);
- mSecondaryIcons.add(icon);
- }
+ @NonNull
+ public Builder addAction(@NonNull RemoteAction action) {
+ Preconditions.checkArgument(action != null);
+ mActions.add(action);
return this;
}
/**
- * Removes all the <i>secondary</i> actions.
- */
- public Builder clearSecondaryActions() {
- mSecondaryIntents.clear();
- mSecondaryLabels.clear();
- mSecondaryIcons.clear();
- return this;
- }
-
- /**
- * Sets the <i>primary</i> action that may be performed on the classified text. This is
- * equivalent to calling {@code setIntent(intent).setLabel(label).setIcon(icon)}.
- *
- * <p><strong>Note: </strong>If all input parameters are null, there will be no
- * <i>primary</i> action but there may still be <i>secondary</i> actions.
- *
- * @see #addSecondaryAction(Intent, String, Drawable)
- */
- public Builder setPrimaryAction(
- @Nullable Intent intent, @Nullable String label, @Nullable Drawable icon) {
- return setIntent(intent).setLabel(label).setIcon(icon);
- }
-
- /**
* Sets the icon for the <i>primary</i> action that may be rendered on a widget used to act
* on the classified text.
*
- * @see #setPrimaryAction(Intent, String, Drawable)
+ * @deprecated Use {@link #addAction(RemoteAction)} instead.
*/
+ @Deprecated
+ @NonNull
public Builder setIcon(@Nullable Drawable icon) {
- mPrimaryIcon = icon;
+ mLegacyIcon = icon;
return this;
}
@@ -575,10 +439,12 @@
* Sets the label for the <i>primary</i> action that may be rendered on a widget used to
* act on the classified text.
*
- * @see #setPrimaryAction(Intent, String, Drawable)
+ * @deprecated Use {@link #addAction(RemoteAction)} instead.
*/
+ @Deprecated
+ @NonNull
public Builder setLabel(@Nullable String label) {
- mPrimaryLabel = label;
+ mLegacyLabel = label;
return this;
}
@@ -586,10 +452,12 @@
* Sets the intent for the <i>primary</i> action that may be fired to act on the classified
* text.
*
- * @see #setPrimaryAction(Intent, String, Drawable)
+ * @deprecated Use {@link #addAction(RemoteAction)} instead.
*/
+ @Deprecated
+ @NonNull
public Builder setIntent(@Nullable Intent intent) {
- mPrimaryIntent = intent;
+ mLegacyIntent = intent;
return this;
}
@@ -597,62 +465,82 @@
* Sets the OnClickListener for the <i>primary</i> action that may be triggered to act on
* the classified text. This field is not parcelable and will always be null when the
* object is read from a parcel.
+ *
+ * @deprecated Use {@link #addAction(RemoteAction)} instead.
*/
+ @Deprecated
+ @NonNull
public Builder setOnClickListener(@Nullable OnClickListener onClickListener) {
- mPrimaryOnClickListener = onClickListener;
+ mLegacyOnClickListener = onClickListener;
return this;
}
/**
- * Sets a signature for the TextClassification object.
- * The TextClassifier that generates the TextClassification object may use it as a way to
- * internally identify the TextClassification object.
+ * Sets an id for the TextClassification object.
*/
- public Builder setSignature(@NonNull String signature) {
- mSignature = Preconditions.checkNotNull(signature);
+ @NonNull
+ public Builder setId(@Nullable String id) {
+ mId = id;
return this;
}
/**
* Builds and returns a {@link TextClassification} object.
*/
+ @NonNull
public TextClassification build() {
- return new TextClassification(
- mText,
- mPrimaryIcon, mPrimaryLabel, mPrimaryIntent, mPrimaryOnClickListener,
- mSecondaryIcons, mSecondaryLabels, mSecondaryIntents,
- mEntityConfidence, mSignature);
+ return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent,
+ mLegacyOnClickListener, mActions, mEntityConfidence, mId);
}
}
/**
- * Optional input parameters for generating TextClassification.
+ * A request object for generating TextClassification.
*/
- public static final class Options implements Parcelable {
+ public static final class Request implements Parcelable {
- private @Nullable LocaleList mDefaultLocales;
- private @Nullable Calendar mReferenceTime;
+ private final CharSequence mText;
+ private final int mStartIndex;
+ private final int mEndIndex;
+ @Nullable private final LocaleList mDefaultLocales;
+ @Nullable private final ZonedDateTime mReferenceTime;
- public Options() {}
-
- /**
- * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
- * the provided text. If no locale preferences exist, set this to null or an empty
- * locale list.
- */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ private Request(
+ CharSequence text,
+ int startIndex,
+ int endIndex,
+ LocaleList defaultLocales,
+ ZonedDateTime referenceTime) {
+ mText = text;
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
mDefaultLocales = defaultLocales;
- return this;
+ mReferenceTime = referenceTime;
}
/**
- * @param referenceTime reference time based on which relative dates (e.g. "tomorrow" should
- * be interpreted. This should usually be the time when the text was originally
- * composed. If no reference time is set, now is used.
+ * Returns the text providing context for the text to classify (which is specified
+ * by the sub sequence starting at startIndex and ending at endIndex)
*/
- public Options setReferenceTime(Calendar referenceTime) {
- mReferenceTime = referenceTime;
- return this;
+ @NonNull
+ public CharSequence getText() {
+ return mText;
+ }
+
+ /**
+ * Returns start index of the text to classify.
+ */
+ @IntRange(from = 0)
+ public int getStartIndex() {
+ return mStartIndex;
+ }
+
+ /**
+ * Returns end index of the text to classify.
+ */
+ @IntRange(from = 0)
+ public int getEndIndex() {
+ return mEndIndex;
}
/**
@@ -669,10 +557,73 @@
* interpreted.
*/
@Nullable
- public Calendar getReferenceTime() {
+ public ZonedDateTime getReferenceTime() {
return mReferenceTime;
}
+ /**
+ * A builder for building TextClassification requests.
+ */
+ public static final class Builder {
+
+ private final CharSequence mText;
+ private final int mStartIndex;
+ private final int mEndIndex;
+
+ @Nullable private LocaleList mDefaultLocales;
+ @Nullable private ZonedDateTime mReferenceTime;
+
+ /**
+ * @param text text providing context for the text to classify (which is specified
+ * by the sub sequence starting at startIndex and ending at endIndex)
+ * @param startIndex start index of the text to classify
+ * @param endIndex end index of the text to classify
+ */
+ public Builder(
+ @NonNull CharSequence text,
+ @IntRange(from = 0) int startIndex,
+ @IntRange(from = 0) int endIndex) {
+ Utils.checkArgument(text, startIndex, endIndex);
+ mText = text;
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
+ }
+
+ /**
+ * @param defaultLocales ordered list of locale preferences that may be used to
+ * disambiguate the provided text. If no locale preferences exist, set this to null
+ * or an empty locale list.
+ *
+ * @return this builder
+ */
+ @NonNull
+ public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ mDefaultLocales = defaultLocales;
+ return this;
+ }
+
+ /**
+ * @param referenceTime reference time based on which relative dates (e.g. "tomorrow"
+ * should be interpreted. This should usually be the time when the text was
+ * originally composed. If no reference time is set, now is used.
+ *
+ * @return this builder
+ */
+ @NonNull
+ public Builder setReferenceTime(@Nullable ZonedDateTime referenceTime) {
+ mReferenceTime = referenceTime;
+ return this;
+ }
+
+ /**
+ * Builds and returns the request object.
+ */
+ @NonNull
+ public Request build() {
+ return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime);
+ }
+ }
+
@Override
public int describeContents() {
return 0;
@@ -680,36 +631,38 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mText.toString());
+ dest.writeInt(mStartIndex);
+ dest.writeInt(mEndIndex);
dest.writeInt(mDefaultLocales != null ? 1 : 0);
if (mDefaultLocales != null) {
mDefaultLocales.writeToParcel(dest, flags);
}
dest.writeInt(mReferenceTime != null ? 1 : 0);
if (mReferenceTime != null) {
- dest.writeSerializable(mReferenceTime);
+ dest.writeString(mReferenceTime.toString());
}
}
- public static final Parcelable.Creator<Options> CREATOR =
- new Parcelable.Creator<Options>() {
+ public static final Parcelable.Creator<Request> CREATOR =
+ new Parcelable.Creator<Request>() {
@Override
- public Options createFromParcel(Parcel in) {
- return new Options(in);
+ public Request createFromParcel(Parcel in) {
+ return new Request(in);
}
@Override
- public Options[] newArray(int size) {
- return new Options[size];
+ public Request[] newArray(int size) {
+ return new Request[size];
}
};
- private Options(Parcel in) {
- if (in.readInt() > 0) {
- mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
- }
- if (in.readInt() > 0) {
- mReferenceTime = (Calendar) in.readSerializable();
- }
+ private Request(Parcel in) {
+ mText = in.readString();
+ mStartIndex = in.readInt();
+ mEndIndex = in.readInt();
+ mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+ mReferenceTime = in.readInt() == 0 ? null : ZonedDateTime.parse(in.readString());
}
}
@@ -721,22 +674,20 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mText);
- final Bitmap primaryIconBitmap = drawableToBitmap(mPrimaryIcon, MAX_PRIMARY_ICON_SIZE);
- dest.writeInt(primaryIconBitmap != null ? 1 : 0);
- if (primaryIconBitmap != null) {
- primaryIconBitmap.writeToParcel(dest, flags);
+ final Bitmap legacyIconBitmap = drawableToBitmap(mLegacyIcon, MAX_LEGACY_ICON_SIZE);
+ dest.writeInt(legacyIconBitmap != null ? 1 : 0);
+ if (legacyIconBitmap != null) {
+ legacyIconBitmap.writeToParcel(dest, flags);
}
- dest.writeString(mPrimaryLabel);
- dest.writeInt(mPrimaryIntent != null ? 1 : 0);
- if (mPrimaryIntent != null) {
- mPrimaryIntent.writeToParcel(dest, flags);
+ dest.writeString(mLegacyLabel);
+ dest.writeInt(mLegacyIntent != null ? 1 : 0);
+ if (mLegacyIntent != null) {
+ mLegacyIntent.writeToParcel(dest, flags);
}
- // mPrimaryOnClickListener is not parcelable.
- dest.writeTypedList(drawablesToBitmaps(mSecondaryIcons, MAX_SECONDARY_ICON_SIZE));
- dest.writeStringList(mSecondaryLabels);
- dest.writeTypedList(mSecondaryIntents);
+ // mOnClickListener is not parcelable.
+ dest.writeTypedList(mActions);
mEntityConfidence.writeToParcel(dest, flags);
- dest.writeString(mSignature);
+ dest.writeString(mId);
}
public static final Parcelable.Creator<TextClassification> CREATOR =
@@ -754,16 +705,20 @@
private TextClassification(Parcel in) {
mText = in.readString();
- mPrimaryIcon = in.readInt() == 0
+ mLegacyIcon = in.readInt() == 0
? null
: new BitmapDrawable(Resources.getSystem(), Bitmap.CREATOR.createFromParcel(in));
- mPrimaryLabel = in.readString();
- mPrimaryIntent = in.readInt() == 0 ? null : Intent.CREATOR.createFromParcel(in);
- mPrimaryOnClickListener = null; // not parcelable
- mSecondaryIcons = bitmapsToDrawables(in.createTypedArrayList(Bitmap.CREATOR));
- mSecondaryLabels = in.createStringArrayList();
- mSecondaryIntents = in.createTypedArrayList(Intent.CREATOR);
+ mLegacyLabel = in.readString();
+ if (in.readInt() == 0) {
+ mLegacyIntent = null;
+ } else {
+ mLegacyIntent = Intent.CREATOR.createFromParcel(in);
+ mLegacyIntent.removeFlags(
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ }
+ mLegacyOnClickListener = null; // not parcelable
+ mActions = in.createTypedArrayList(RemoteAction.CREATOR);
mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
- mSignature = in.readString();
+ mId = in.readString();
}
}
diff --git a/core/java/android/view/textclassifier/TextClassificationContext.aidl b/core/java/android/view/textclassifier/TextClassificationContext.aidl
new file mode 100644
index 0000000..0d6b033
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationContext.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+parcelable TextClassificationContext;
diff --git a/core/java/android/view/textclassifier/TextClassificationContext.java b/core/java/android/view/textclassifier/TextClassificationContext.java
new file mode 100644
index 0000000..a15411f
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationContext.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.textclassifier.TextClassifier.WidgetType;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.Locale;
+
+/**
+ * A representation of the context in which text classification would be performed.
+ * @see TextClassificationManager#createTextClassificationSession(TextClassificationContext)
+ */
+public final class TextClassificationContext implements Parcelable {
+
+ private final String mPackageName;
+ private final String mWidgetType;
+ @Nullable private final String mWidgetVersion;
+
+ private TextClassificationContext(
+ String packageName,
+ String widgetType,
+ String widgetVersion) {
+ mPackageName = Preconditions.checkNotNull(packageName);
+ mWidgetType = Preconditions.checkNotNull(widgetType);
+ mWidgetVersion = widgetVersion;
+ }
+
+ /**
+ * Returns the package name for the calling package.
+ */
+ @NonNull
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Returns the widget type for this classification context.
+ */
+ @NonNull
+ @WidgetType
+ public String getWidgetType() {
+ return mWidgetType;
+ }
+
+ /**
+ * Returns a custom version string for the widget type.
+ *
+ * @see #getWidgetType()
+ */
+ @Nullable
+ public String getWidgetVersion() {
+ return mWidgetVersion;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "TextClassificationContext{"
+ + "packageName=%s, widgetType=%s, widgetVersion=%s}",
+ mPackageName, mWidgetType, mWidgetVersion);
+ }
+
+ /**
+ * A builder for building a TextClassification context.
+ */
+ public static final class Builder {
+
+ private final String mPackageName;
+ private final String mWidgetType;
+
+ @Nullable private String mWidgetVersion;
+
+ /**
+ * Initializes a new builder for text classification context objects.
+ *
+ * @param packageName the name of the calling package
+ * @param widgetType the type of widget e.g. {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}
+ *
+ * @return this builder
+ */
+ public Builder(@NonNull String packageName, @NonNull @WidgetType String widgetType) {
+ mPackageName = Preconditions.checkNotNull(packageName);
+ mWidgetType = Preconditions.checkNotNull(widgetType);
+ }
+
+ /**
+ * Sets an optional custom version string for the widget type.
+ *
+ * @return this builder
+ */
+ public Builder setWidgetVersion(@Nullable String widgetVersion) {
+ mWidgetVersion = widgetVersion;
+ return this;
+ }
+
+ /**
+ * Builds the text classification context object.
+ *
+ * @return the built TextClassificationContext object
+ */
+ @NonNull
+ public TextClassificationContext build() {
+ return new TextClassificationContext(mPackageName, mWidgetType, mWidgetVersion);
+ }
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mPackageName);
+ parcel.writeString(mWidgetType);
+ parcel.writeString(mWidgetVersion);
+ }
+
+ private TextClassificationContext(Parcel in) {
+ mPackageName = in.readString();
+ mWidgetType = in.readString();
+ mWidgetVersion = in.readString();
+ }
+
+ public static final Parcelable.Creator<TextClassificationContext> CREATOR =
+ new Parcelable.Creator<TextClassificationContext>() {
+ @Override
+ public TextClassificationContext createFromParcel(Parcel parcel) {
+ return new TextClassificationContext(parcel);
+ }
+
+ @Override
+ public TextClassificationContext[] newArray(int size) {
+ return new TextClassificationContext[size];
+ }
+ };
+}
diff --git a/core/java/android/view/textclassifier/TextClassificationManager.java b/core/java/android/view/textclassifier/TextClassificationManager.java
index a7f1ca1..262d9b8 100644
--- a/core/java/android/view/textclassifier/TextClassificationManager.java
+++ b/core/java/android/view/textclassifier/TextClassificationManager.java
@@ -16,6 +16,7 @@
package android.view.textclassifier;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemService;
import android.content.Context;
@@ -36,6 +37,9 @@
private static final String LOG_TAG = "TextClassificationManager";
private final Object mLock = new Object();
+ private final TextClassificationSessionFactory mDefaultSessionFactory =
+ classificationContext -> new TextClassificationSession(
+ classificationContext, getTextClassifier());
private final Context mContext;
private final TextClassificationConstants mSettings;
@@ -46,12 +50,15 @@
private TextClassifier mLocalTextClassifier;
@GuardedBy("mLock")
private TextClassifier mSystemTextClassifier;
+ @GuardedBy("mLock")
+ private TextClassificationSessionFactory mSessionFactory;
/** @hide */
public TextClassificationManager(Context context) {
mContext = Preconditions.checkNotNull(context);
mSettings = TextClassificationConstants.loadFromString(Settings.Global.getString(
context.getContentResolver(), Settings.Global.TEXT_CLASSIFIER_CONSTANTS));
+ mSessionFactory = mDefaultSessionFactory;
}
/**
@@ -61,6 +68,7 @@
*
* @see #setTextClassifier(TextClassifier)
*/
+ @NonNull
public TextClassifier getTextClassifier() {
synchronized (mLock) {
if (mTextClassifier == null) {
@@ -93,7 +101,6 @@
* @see TextClassifier#SYSTEM
* @hide
*/
- // TODO: Expose as system API.
public TextClassifier getTextClassifier(@TextClassifierType int type) {
switch (type) {
case TextClassifier.LOCAL:
@@ -108,6 +115,61 @@
return mSettings;
}
+ /**
+ * Call this method to start a text classification session with the given context.
+ * A session is created with a context helping the classifier better understand
+ * what the user needs and consists of queries and feedback events. The queries
+ * are directly related to providing useful functionality to the user and the events
+ * are a feedback loop back to the classifier helping it learn and better serve
+ * future queries.
+ *
+ * <p> All interactions with the returned classifier are considered part of a single
+ * session and are logically grouped. For example, when a text widget is focused
+ * all user interactions around text editing (selection, editing, etc) can be
+ * grouped together to allow the classifier get better.
+ *
+ * @param classificationContext The context in which classification would occur
+ *
+ * @return An instance to perform classification in the given context
+ */
+ @NonNull
+ public TextClassifier createTextClassificationSession(
+ @NonNull TextClassificationContext classificationContext) {
+ Preconditions.checkNotNull(classificationContext);
+ final TextClassifier textClassifier =
+ mSessionFactory.createTextClassificationSession(classificationContext);
+ Preconditions.checkNotNull(textClassifier, "Session Factory should never return null");
+ return textClassifier;
+ }
+
+ /**
+ * @see #createTextClassificationSession(TextClassificationContext, TextClassifier)
+ * @hide
+ */
+ public TextClassifier createTextClassificationSession(
+ TextClassificationContext classificationContext, TextClassifier textClassifier) {
+ Preconditions.checkNotNull(classificationContext);
+ Preconditions.checkNotNull(textClassifier);
+ return new TextClassificationSession(classificationContext, textClassifier);
+ }
+
+ /**
+ * Sets a TextClassificationSessionFactory to be used to create session-aware TextClassifiers.
+ *
+ * @param factory the textClassification session factory. If this is null, the default factory
+ * will be used.
+ */
+ public void setTextClassificationSessionFactory(
+ @Nullable TextClassificationSessionFactory factory) {
+ synchronized (mLock) {
+ if (factory != null) {
+ mSessionFactory = factory;
+ } else {
+ mSessionFactory = mDefaultSessionFactory;
+ }
+ }
+ }
+
private TextClassifier getSystemTextClassifier() {
synchronized (mLock) {
if (mSystemTextClassifier == null && isSystemTextClassifierEnabled()) {
diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java
new file mode 100644
index 0000000..e8e300a
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationSession.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.WorkerThread;
+import android.view.textclassifier.DefaultLogger.SignatureParser;
+import android.view.textclassifier.SelectionEvent.InvocationMethod;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Session-aware TextClassifier.
+ */
+@WorkerThread
+final class TextClassificationSession implements TextClassifier {
+
+ /* package */ static final boolean DEBUG_LOG_ENABLED = true;
+ private static final String LOG_TAG = "TextClassificationSession";
+
+ private final TextClassifier mDelegate;
+ private final SelectionEventHelper mEventHelper;
+ private final TextClassificationSessionId mSessionId;
+ private final TextClassificationContext mClassificationContext;
+
+ private boolean mDestroyed;
+
+ TextClassificationSession(TextClassificationContext context, TextClassifier delegate) {
+ mClassificationContext = Preconditions.checkNotNull(context);
+ mDelegate = Preconditions.checkNotNull(delegate);
+ mSessionId = new TextClassificationSessionId();
+ mEventHelper = new SelectionEventHelper(mSessionId, mClassificationContext);
+ initializeRemoteSession();
+ }
+
+ @Override
+ public TextSelection suggestSelection(TextSelection.Request request) {
+ checkDestroyed();
+ return mDelegate.suggestSelection(request);
+ }
+
+ private void initializeRemoteSession() {
+ if (mDelegate instanceof SystemTextClassifier) {
+ ((SystemTextClassifier) mDelegate).initializeRemoteSession(
+ mClassificationContext, mSessionId);
+ }
+ }
+
+ @Override
+ public TextClassification classifyText(TextClassification.Request request) {
+ checkDestroyed();
+ return mDelegate.classifyText(request);
+ }
+
+ @Override
+ public TextLinks generateLinks(TextLinks.Request request) {
+ checkDestroyed();
+ return mDelegate.generateLinks(request);
+ }
+
+ @Override
+ public void onSelectionEvent(SelectionEvent event) {
+ checkDestroyed();
+ Preconditions.checkNotNull(event);
+ if (mEventHelper.sanitizeEvent(event)) {
+ mDelegate.onSelectionEvent(event);
+ }
+ }
+
+ @Override
+ public void destroy() {
+ mEventHelper.endSession();
+ mDelegate.destroy();
+ mDestroyed = true;
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return mDestroyed;
+ }
+
+ /**
+ * @throws IllegalStateException if this TextClassification session has been destroyed.
+ * @see #isDestroyed()
+ * @see #destroy()
+ */
+ private void checkDestroyed() {
+ if (mDestroyed) {
+ throw new IllegalStateException("This TextClassification session has been destroyed");
+ }
+ }
+
+ /**
+ * Helper class for updating SelectionEvent fields.
+ */
+ private static final class SelectionEventHelper {
+
+ private final TextClassificationSessionId mSessionId;
+ private final TextClassificationContext mContext;
+
+ @InvocationMethod
+ private int mInvocationMethod = SelectionEvent.INVOCATION_UNKNOWN;
+ private SelectionEvent mPrevEvent;
+ private SelectionEvent mSmartEvent;
+ private SelectionEvent mStartEvent;
+
+ SelectionEventHelper(
+ TextClassificationSessionId sessionId, TextClassificationContext context) {
+ mSessionId = Preconditions.checkNotNull(sessionId);
+ mContext = Preconditions.checkNotNull(context);
+ }
+
+ /**
+ * Updates the necessary fields in the event for the current session.
+ *
+ * @return true if the event should be reported. false if the event should be ignored
+ */
+ boolean sanitizeEvent(SelectionEvent event) {
+ updateInvocationMethod(event);
+ modifyAutoSelectionEventType(event);
+
+ if (event.getEventType() != SelectionEvent.EVENT_SELECTION_STARTED
+ && mStartEvent == null) {
+ if (DEBUG_LOG_ENABLED) {
+ Log.d(LOG_TAG, "Selection session not yet started. Ignoring event");
+ }
+ return false;
+ }
+
+ final long now = System.currentTimeMillis();
+ switch (event.getEventType()) {
+ case SelectionEvent.EVENT_SELECTION_STARTED:
+ Preconditions.checkArgument(
+ event.getAbsoluteEnd() == event.getAbsoluteStart() + 1);
+ event.setSessionId(mSessionId);
+ mStartEvent = event;
+ break;
+ case SelectionEvent.EVENT_SMART_SELECTION_SINGLE: // fall through
+ case SelectionEvent.EVENT_SMART_SELECTION_MULTI:
+ mSmartEvent = event;
+ break;
+ case SelectionEvent.EVENT_SELECTION_MODIFIED: // fall through
+ case SelectionEvent.EVENT_AUTO_SELECTION:
+ if (mPrevEvent != null
+ && mPrevEvent.getAbsoluteStart() == event.getAbsoluteStart()
+ && mPrevEvent.getAbsoluteEnd() == event.getAbsoluteEnd()) {
+ // Selection did not change. Ignore event.
+ return false;
+ }
+ break;
+ default:
+ // do nothing.
+ }
+
+ event.setEventTime(now);
+ if (mStartEvent != null) {
+ event.setSessionId(mStartEvent.getSessionId())
+ .setDurationSinceSessionStart(now - mStartEvent.getEventTime())
+ .setStart(event.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
+ .setEnd(event.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
+ }
+ if (mSmartEvent != null) {
+ event.setResultId(mSmartEvent.getResultId())
+ .setSmartStart(
+ mSmartEvent.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
+ .setSmartEnd(mSmartEvent.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
+ }
+ if (mPrevEvent != null) {
+ event.setDurationSincePreviousEvent(now - mPrevEvent.getEventTime())
+ .setEventIndex(mPrevEvent.getEventIndex() + 1);
+ }
+ mPrevEvent = event;
+ return true;
+ }
+
+ void endSession() {
+ mPrevEvent = null;
+ mSmartEvent = null;
+ mStartEvent = null;
+ }
+
+ private void updateInvocationMethod(SelectionEvent event) {
+ event.setTextClassificationSessionContext(mContext);
+ if (event.getInvocationMethod() == SelectionEvent.INVOCATION_UNKNOWN) {
+ event.setInvocationMethod(mInvocationMethod);
+ } else {
+ mInvocationMethod = event.getInvocationMethod();
+ }
+ }
+
+ private void modifyAutoSelectionEventType(SelectionEvent event) {
+ switch (event.getEventType()) {
+ case SelectionEvent.EVENT_SMART_SELECTION_SINGLE: // fall through
+ case SelectionEvent.EVENT_SMART_SELECTION_MULTI: // fall through
+ case SelectionEvent.EVENT_AUTO_SELECTION:
+ if (isPlatformLocalTextClassifierSmartSelection(event.getResultId())) {
+ if (event.getAbsoluteEnd() - event.getAbsoluteStart() > 1) {
+ event.setEventType(SelectionEvent.EVENT_SMART_SELECTION_MULTI);
+ } else {
+ event.setEventType(SelectionEvent.EVENT_SMART_SELECTION_SINGLE);
+ }
+ } else {
+ event.setEventType(SelectionEvent.EVENT_AUTO_SELECTION);
+ }
+ return;
+ default:
+ return;
+ }
+ }
+
+ private static boolean isPlatformLocalTextClassifierSmartSelection(String signature) {
+ return DefaultLogger.CLASSIFIER_ID.equals(SignatureParser.getClassifierId(signature));
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/TextClassificationSessionFactory.java b/core/java/android/view/textclassifier/TextClassificationSessionFactory.java
new file mode 100644
index 0000000..c0914b6
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationSessionFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.NonNull;
+
+/**
+ * An interface for creating a session-aware TextClassifier.
+ *
+ * @see TextClassificationManager#createTextClassificationSession(TextClassificationContext)
+ */
+public interface TextClassificationSessionFactory {
+
+ /**
+ * Creates and returns a session-aware TextClassifier.
+ *
+ * @param classificationContext the classification context
+ */
+ @NonNull
+ TextClassifier createTextClassificationSession(
+ @NonNull TextClassificationContext classificationContext);
+}
diff --git a/core/java/android/view/textclassifier/TextClassificationSessionId.aidl b/core/java/android/view/textclassifier/TextClassificationSessionId.aidl
new file mode 100644
index 0000000..1bbf2da
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationSessionId.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+parcelable TextClassificationSessionId;
diff --git a/core/java/android/view/textclassifier/TextClassificationSessionId.java b/core/java/android/view/textclassifier/TextClassificationSessionId.java
new file mode 100644
index 0000000..1378bd9
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassificationSessionId.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.Locale;
+import java.util.UUID;
+
+/**
+ * This class represents the id of a text classification session.
+ */
+public final class TextClassificationSessionId implements Parcelable {
+ private final @NonNull String mValue;
+
+ /**
+ * Creates a new instance.
+ *
+ * @hide
+ */
+ public TextClassificationSessionId() {
+ this(UUID.randomUUID().toString());
+ }
+
+ /**
+ * Creates a new instance.
+ *
+ * @param value The internal value.
+ *
+ * @hide
+ */
+ public TextClassificationSessionId(@NonNull String value) {
+ mValue = value;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + mValue.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TextClassificationSessionId other = (TextClassificationSessionId) obj;
+ if (!mValue.equals(other.mValue)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "TextClassificationSessionId {%s}", mValue);
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mValue);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Flattens this id to a string.
+ *
+ * @return The flattened id.
+ *
+ * @hide
+ */
+ public @NonNull String flattenToString() {
+ return mValue;
+ }
+
+ /**
+ * Unflattens a print job id from a string.
+ *
+ * @param string The string.
+ * @return The unflattened id, or null if the string is malformed.
+ *
+ * @hide
+ */
+ public static @NonNull TextClassificationSessionId unflattenFromString(@NonNull String string) {
+ return new TextClassificationSessionId(string);
+ }
+
+ public static final Parcelable.Creator<TextClassificationSessionId> CREATOR =
+ new Parcelable.Creator<TextClassificationSessionId>() {
+ @Override
+ public TextClassificationSessionId createFromParcel(Parcel parcel) {
+ return new TextClassificationSessionId(
+ Preconditions.checkNotNull(parcel.readString()));
+ }
+
+ @Override
+ public TextClassificationSessionId[] newArray(int size) {
+ return new TextClassificationSessionId[size];
+ }
+ };
+}
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 98fa574..54261be 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -33,7 +33,6 @@
import android.text.util.Linkify.LinkifyMask;
import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.Slog;
import com.android.internal.util.Preconditions;
@@ -112,6 +111,38 @@
@StringDef(prefix = { "HINT_" }, value = {HINT_TEXT_IS_EDITABLE, HINT_TEXT_IS_NOT_EDITABLE})
@interface Hints {}
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @StringDef({WIDGET_TYPE_TEXTVIEW, WIDGET_TYPE_WEBVIEW, WIDGET_TYPE_EDITTEXT,
+ WIDGET_TYPE_EDIT_WEBVIEW, WIDGET_TYPE_CUSTOM_TEXTVIEW, WIDGET_TYPE_CUSTOM_EDITTEXT,
+ WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW, WIDGET_TYPE_UNKNOWN})
+ @interface WidgetType {}
+
+ /** The widget involved in the text classification session is a standard
+ * {@link android.widget.TextView}. */
+ String WIDGET_TYPE_TEXTVIEW = "textview";
+ /** The widget involved in the text classification session is a standard
+ * {@link android.widget.EditText}. */
+ String WIDGET_TYPE_EDITTEXT = "edittext";
+ /** The widget involved in the text classification session is a standard non-selectable
+ * {@link android.widget.TextView}. */
+ String WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = "nosel-textview";
+ /** The widget involved in the text classification session is a standard
+ * {@link android.webkit.WebView}. */
+ String WIDGET_TYPE_WEBVIEW = "webview";
+ /** The widget involved in the text classification session is a standard editable
+ * {@link android.webkit.WebView}. */
+ String WIDGET_TYPE_EDIT_WEBVIEW = "edit-webview";
+ /** The widget involved in the text classification session is a custom text widget. */
+ String WIDGET_TYPE_CUSTOM_TEXTVIEW = "customview";
+ /** The widget involved in the text classification session is a custom editable text widget. */
+ String WIDGET_TYPE_CUSTOM_EDITTEXT = "customedit";
+ /** The widget involved in the text classification session is a custom non-selectable text
+ * widget. */
+ String WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
+ /** The widget involved in the text classification session is of an unknown/unspecified type. */
+ String WIDGET_TYPE_UNKNOWN = "unknown";
+
/**
* No-op TextClassifier.
* This may be used to turn off TextClassifier features.
@@ -124,67 +155,44 @@
*
* <p><strong>NOTE: </strong>Call on a worker thread.
*
- * @param text text providing context for the selected text (which is specified
- * by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
- * @param selectionStartIndex start index of the selected part of text
- * @param selectionEndIndex end index of the selected part of text
- * @param options optional input parameters
+ * <p><strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
*
- * @throws IllegalArgumentException if text is null; selectionStartIndex is negative;
- * selectionEndIndex is greater than text.length() or not greater than selectionStartIndex
- *
- * @see #suggestSelection(CharSequence, int, int)
+ * @param request the text selection request
*/
@WorkerThread
@NonNull
- default TextSelection suggestSelection(
- @NonNull CharSequence text,
- @IntRange(from = 0) int selectionStartIndex,
- @IntRange(from = 0) int selectionEndIndex,
- @Nullable TextSelection.Options options) {
- Utils.validate(text, selectionStartIndex, selectionEndIndex, false);
- return new TextSelection.Builder(selectionStartIndex, selectionEndIndex).build();
+ default TextSelection suggestSelection(@NonNull TextSelection.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
+ return new TextSelection.Builder(request.getStartIndex(), request.getEndIndex()).build();
}
/**
* Returns suggested text selection start and end indices, recognized entity types, and their
* associated confidence scores. The entity types are ordered from highest to lowest scoring.
*
- * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
- * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}. If that method
- * calls this method, a stack overflow error will happen.
- *
* <p><strong>NOTE: </strong>Call on a worker thread.
*
+ * <p><strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+ *
+ * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
+ * {@link #suggestSelection(TextSelection.Request)}. If that method calls this method,
+ * a stack overflow error will happen.
+ *
* @param text text providing context for the selected text (which is specified
* by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
* @param selectionStartIndex start index of the selected part of text
* @param selectionEndIndex end index of the selected part of text
+ * @param defaultLocales ordered list of locale preferences that may be used to
+ * disambiguate the provided text. If no locale preferences exist, set this to null
+ * or an empty locale list.
*
* @throws IllegalArgumentException if text is null; selectionStartIndex is negative;
* selectionEndIndex is greater than text.length() or not greater than selectionStartIndex
*
- * @see #suggestSelection(CharSequence, int, int, TextSelection.Options)
- */
- @WorkerThread
- @NonNull
- default TextSelection suggestSelection(
- @NonNull CharSequence text,
- @IntRange(from = 0) int selectionStartIndex,
- @IntRange(from = 0) int selectionEndIndex) {
- return suggestSelection(text, selectionStartIndex, selectionEndIndex,
- (TextSelection.Options) null);
- }
-
- /**
- * See {@link #suggestSelection(CharSequence, int, int)} or
- * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}.
- *
- * <p><strong>NOTE: </strong>Call on a worker thread.
- *
- * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
- * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}. If that method
- * calls this method, a stack overflow error will happen.
+ * @see #suggestSelection(TextSelection.Request)
*/
@WorkerThread
@NonNull
@@ -193,10 +201,11 @@
@IntRange(from = 0) int selectionStartIndex,
@IntRange(from = 0) int selectionEndIndex,
@Nullable LocaleList defaultLocales) {
- final TextSelection.Options options = (defaultLocales != null)
- ? new TextSelection.Options().setDefaultLocales(defaultLocales)
- : null;
- return suggestSelection(text, selectionStartIndex, selectionEndIndex, options);
+ final TextSelection.Request request = new TextSelection.Request.Builder(
+ text, selectionStartIndex, selectionEndIndex)
+ .setDefaultLocales(defaultLocales)
+ .build();
+ return suggestSelection(request);
}
/**
@@ -205,25 +214,16 @@
*
* <p><strong>NOTE: </strong>Call on a worker thread.
*
- * @param text text providing context for the text to classify (which is specified
- * by the sub sequence starting at startIndex and ending at endIndex)
- * @param startIndex start index of the text to classify
- * @param endIndex end index of the text to classify
- * @param options optional input parameters
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
*
- * @throws IllegalArgumentException if text is null; startIndex is negative;
- * endIndex is greater than text.length() or not greater than startIndex
- *
- * @see #classifyText(CharSequence, int, int)
+ * @param request the text classification request
*/
@WorkerThread
@NonNull
- default TextClassification classifyText(
- @NonNull CharSequence text,
- @IntRange(from = 0) int startIndex,
- @IntRange(from = 0) int endIndex,
- @Nullable TextClassification.Options options) {
- Utils.validate(text, startIndex, endIndex, false);
+ default TextClassification classifyText(@NonNull TextClassification.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
return TextClassification.EMPTY;
}
@@ -234,37 +234,24 @@
* <p><strong>NOTE: </strong>Call on a worker thread.
*
* <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
- * {@link #classifyText(CharSequence, int, int, TextClassification.Options)}. If that method
- * calls this method, a stack overflow error will happen.
+ * {@link #classifyText(TextClassification.Request)}. If that method calls this method,
+ * a stack overflow error will happen.
+ *
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
*
* @param text text providing context for the text to classify (which is specified
* by the sub sequence starting at startIndex and ending at endIndex)
* @param startIndex start index of the text to classify
* @param endIndex end index of the text to classify
+ * @param defaultLocales ordered list of locale preferences that may be used to
+ * disambiguate the provided text. If no locale preferences exist, set this to null
+ * or an empty locale list.
*
* @throws IllegalArgumentException if text is null; startIndex is negative;
* endIndex is greater than text.length() or not greater than startIndex
*
- * @see #classifyText(CharSequence, int, int, TextClassification.Options)
- */
- @WorkerThread
- @NonNull
- default TextClassification classifyText(
- @NonNull CharSequence text,
- @IntRange(from = 0) int startIndex,
- @IntRange(from = 0) int endIndex) {
- return classifyText(text, startIndex, endIndex, (TextClassification.Options) null);
- }
-
- /**
- * See {@link #classifyText(CharSequence, int, int, TextClassification.Options)} or
- * {@link #classifyText(CharSequence, int, int)}.
- *
- * <p><strong>NOTE: </strong>Call on a worker thread.
- *
- * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
- * {@link #classifyText(CharSequence, int, int, TextClassification.Options)}. If that method
- * calls this method, a stack overflow error will happen.
+ * @see #classifyText(TextClassification.Request)
*/
@WorkerThread
@NonNull
@@ -273,10 +260,11 @@
@IntRange(from = 0) int startIndex,
@IntRange(from = 0) int endIndex,
@Nullable LocaleList defaultLocales) {
- final TextClassification.Options options = (defaultLocales != null)
- ? new TextClassification.Options().setDefaultLocales(defaultLocales)
- : null;
- return classifyText(text, startIndex, endIndex, options);
+ final TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(defaultLocales)
+ .build();
+ return classifyText(request);
}
/**
@@ -285,50 +273,28 @@
*
* <p><strong>NOTE: </strong>Call on a worker thread.
*
- * @param text the text to generate annotations for
- * @param options configuration for link generation
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
*
- * @throws IllegalArgumentException if text is null or the text is too long for the
- * TextClassifier implementation.
+ * @param request the text links request
*
- * @see #generateLinks(CharSequence)
* @see #getMaxGenerateLinksTextLength()
*/
@WorkerThread
- default TextLinks generateLinks(
- @NonNull CharSequence text, @Nullable TextLinks.Options options) {
- Utils.validate(text, false);
- return new TextLinks.Builder(text.toString()).build();
- }
-
- /**
- * Generates and returns a {@link TextLinks} that may be applied to the text to annotate it with
- * links information.
- *
- * <p><strong>NOTE: </strong>Call on a worker thread.
- *
- * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
- * {@link #generateLinks(CharSequence, TextLinks.Options)}. If that method calls this method,
- * a stack overflow error will happen.
- *
- * @param text the text to generate annotations for
- *
- * @throws IllegalArgumentException if text is null or the text is too long for the
- * TextClassifier implementation.
- *
- * @see #generateLinks(CharSequence, TextLinks.Options)
- * @see #getMaxGenerateLinksTextLength()
- */
- @WorkerThread
- default TextLinks generateLinks(@NonNull CharSequence text) {
- return generateLinks(text, null);
+ @NonNull
+ default TextLinks generateLinks(@NonNull TextLinks.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
+ return new TextLinks.Builder(request.getText().toString()).build();
}
/**
* Returns the maximal length of text that can be processed by generateLinks.
*
- * @see #generateLinks(CharSequence)
- * @see #generateLinks(CharSequence, TextLinks.Options)
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+ *
+ * @see #generateLinks(TextLinks.Request)
*/
@WorkerThread
default int getMaxGenerateLinksTextLength() {
@@ -339,6 +305,7 @@
* Returns a helper for logging TextClassifier related events.
*
* @param config logger configuration
+ * @hide
*/
@WorkerThread
default Logger getLogger(@NonNull Logger.Config config) {
@@ -347,6 +314,37 @@
}
/**
+ * Reports a selection event.
+ *
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+ */
+ default void onSelectionEvent(@NonNull SelectionEvent event) {}
+
+ /**
+ * Destroys this TextClassifier.
+ *
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to its methods should
+ * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+ *
+ * <p>Subsequent calls to this method are no-ops.
+ */
+ default void destroy() {}
+
+ /**
+ * Returns whether or not this TextClassifier has been destroyed.
+ *
+ * <strong>NOTE: </strong>If a TextClassifier has been destroyed, caller should not interact
+ * with the classifier and an attempt to do so would throw an {@link IllegalStateException}.
+ * However, this method should never throw an {@link IllegalStateException}.
+ *
+ * @see #destroy()
+ */
+ default boolean isDestroyed() {
+ return false;
+ }
+
+ /**
* Configuration object for specifying what entities to identify.
*
* Configs are initially based on a predefined preset, and can be modified from there.
@@ -374,7 +372,7 @@
*
* @param hints Hints for the TextClassifier to determine what types of entities to find.
*/
- public static EntityConfig create(@Nullable Collection<String> hints) {
+ public static EntityConfig createWithHints(@Nullable Collection<String> hints) {
return new EntityConfig(/* useHints */ true, hints,
/* includedEntityTypes */null, /* excludedEntityTypes */ null);
}
@@ -402,7 +400,8 @@
* @param entityTypes Complete set of entities, e.g. {@link #TYPE_URL} to find.
*
*/
- public static EntityConfig createWithEntityList(@Nullable Collection<String> entityTypes) {
+ public static EntityConfig createWithExplicitEntityList(
+ @Nullable Collection<String> entityTypes) {
return new EntityConfig(/* useHints */ false, /* hints */ null,
/* includedEntityTypes */ entityTypes, /* excludedEntityTypes */ null);
}
@@ -491,42 +490,25 @@
* endIndex is greater than text.length() or is not greater than startIndex;
* options is null
*/
- public static void validate(
- @NonNull CharSequence text, int startIndex, int endIndex,
- boolean allowInMainThread) {
+ static void checkArgument(@NonNull CharSequence text, int startIndex, int endIndex) {
Preconditions.checkArgument(text != null);
Preconditions.checkArgument(startIndex >= 0);
Preconditions.checkArgument(endIndex <= text.length());
Preconditions.checkArgument(endIndex > startIndex);
- checkMainThread(allowInMainThread);
}
- /**
- * @throws IllegalArgumentException if text is null or options is null
- */
- public static void validate(@NonNull CharSequence text, boolean allowInMainThread) {
- Preconditions.checkArgument(text != null);
- checkMainThread(allowInMainThread);
- }
-
- /**
- * @throws IllegalArgumentException if text is null; the text is too long or options is null
- */
- public static void validate(@NonNull CharSequence text, int maxLength,
- boolean allowInMainThread) {
- validate(text, allowInMainThread);
+ static void checkTextLength(CharSequence text, int maxLength) {
Preconditions.checkArgumentInRange(text.length(), 0, maxLength, "text.length()");
}
/**
* Generates links using legacy {@link Linkify}.
*/
- public static TextLinks generateLegacyLinks(
- @NonNull CharSequence text, @NonNull TextLinks.Options options) {
- final String string = Preconditions.checkNotNull(text).toString();
+ public static TextLinks generateLegacyLinks(@NonNull TextLinks.Request request) {
+ final String string = request.getText().toString();
final TextLinks.Builder links = new TextLinks.Builder(string);
- final List<String> entities = Preconditions.checkNotNull(options).getEntityConfig()
+ final List<String> entities = request.getEntityConfig()
.resolveEntityListModifications(Collections.emptyList());
if (entities.contains(TextClassifier.TYPE_URL)) {
addLinks(links, string, TextClassifier.TYPE_URL);
@@ -577,9 +559,9 @@
return scores;
}
- private static void checkMainThread(boolean allowInMainThread) {
- if (!allowInMainThread && Looper.myLooper() == Looper.getMainLooper()) {
- Slog.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
+ static void checkMainThread() {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ Log.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
}
}
}
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index c2fb032..7e3748a 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -16,9 +16,12 @@
package android.view.textclassifier;
+import static java.time.temporal.ChronoUnit.MILLIS;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
+import android.app.RemoteAction;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.ContentUris;
@@ -26,7 +29,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Bundle;
import android.os.LocaleList;
@@ -44,9 +47,10 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.time.Instant;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -93,6 +97,8 @@
private Logger.Config mLoggerConfig;
@GuardedBy("mLoggerLock") // Do not access outside this lock.
private Logger mLogger;
+ @GuardedBy("mLoggerLock") // Do not access outside this lock.
+ private Logger mLogger2; // This is the new logger. Will replace mLogger.
private final TextClassificationConstants mSettings;
@@ -106,50 +112,46 @@
/** @inheritDoc */
@Override
@WorkerThread
- public TextSelection suggestSelection(
- @NonNull CharSequence text, int selectionStartIndex, int selectionEndIndex,
- @Nullable TextSelection.Options options) {
- Utils.validate(text, selectionStartIndex, selectionEndIndex, false /* allowInMainThread */);
+ public TextSelection suggestSelection(TextSelection.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
try {
- final int rangeLength = selectionEndIndex - selectionStartIndex;
- if (text.length() > 0
+ final int rangeLength = request.getEndIndex() - request.getStartIndex();
+ final String string = request.getText().toString();
+ if (string.length() > 0
&& rangeLength <= mSettings.getSuggestSelectionMaxRangeLength()) {
- final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
- final String localesString = concatenateLocales(locales);
- final Calendar refTime = Calendar.getInstance();
- final boolean darkLaunchAllowed = options != null && options.isDarkLaunchAllowed();
- final TextClassifierImplNative nativeImpl = getNative(locales);
- final String string = text.toString();
+ final String localesString = concatenateLocales(request.getDefaultLocales());
+ final ZonedDateTime refTime = ZonedDateTime.now();
+ final TextClassifierImplNative nativeImpl = getNative(request.getDefaultLocales());
final int start;
final int end;
- if (mSettings.isModelDarkLaunchEnabled() && !darkLaunchAllowed) {
- start = selectionStartIndex;
- end = selectionEndIndex;
+ if (mSettings.isModelDarkLaunchEnabled() && !request.isDarkLaunchAllowed()) {
+ start = request.getStartIndex();
+ end = request.getEndIndex();
} else {
final int[] startEnd = nativeImpl.suggestSelection(
- string, selectionStartIndex, selectionEndIndex,
+ string, request.getStartIndex(), request.getEndIndex(),
new TextClassifierImplNative.SelectionOptions(localesString));
start = startEnd[0];
end = startEnd[1];
}
if (start < end
&& start >= 0 && end <= string.length()
- && start <= selectionStartIndex && end >= selectionEndIndex) {
+ && start <= request.getStartIndex() && end >= request.getEndIndex()) {
final TextSelection.Builder tsBuilder = new TextSelection.Builder(start, end);
final TextClassifierImplNative.ClassificationResult[] results =
nativeImpl.classifyText(
string, start, end,
new TextClassifierImplNative.ClassificationOptions(
- refTime.getTimeInMillis(),
- refTime.getTimeZone().getID(),
+ refTime.toInstant().toEpochMilli(),
+ refTime.getZone().getId(),
localesString));
final int size = results.length;
for (int i = 0; i < size; i++) {
tsBuilder.setEntityType(results[i].getCollection(), results[i].getScore());
}
- return tsBuilder
- .setSignature(
- getSignature(string, selectionStartIndex, selectionEndIndex))
+ return tsBuilder.setId(createId(
+ string, request.getStartIndex(), request.getEndIndex()))
.build();
} else {
// We can not trust the result. Log the issue and ignore the result.
@@ -163,36 +165,34 @@
t);
}
// Getting here means something went wrong, return a NO_OP result.
- return mFallback.suggestSelection(
- text, selectionStartIndex, selectionEndIndex, options);
+ return mFallback.suggestSelection(request);
}
/** @inheritDoc */
@Override
@WorkerThread
- public TextClassification classifyText(
- @NonNull CharSequence text, int startIndex, int endIndex,
- @Nullable TextClassification.Options options) {
- Utils.validate(text, startIndex, endIndex, false /* allowInMainThread */);
+ public TextClassification classifyText(TextClassification.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
try {
- final int rangeLength = endIndex - startIndex;
- if (text.length() > 0 && rangeLength <= mSettings.getClassifyTextMaxRangeLength()) {
- final String string = text.toString();
- final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
- final String localesString = concatenateLocales(locales);
- final Calendar refTime = (options != null && options.getReferenceTime() != null)
- ? options.getReferenceTime() : Calendar.getInstance();
-
+ final int rangeLength = request.getEndIndex() - request.getStartIndex();
+ final String string = request.getText().toString();
+ if (string.length() > 0 && rangeLength <= mSettings.getClassifyTextMaxRangeLength()) {
+ final String localesString = concatenateLocales(request.getDefaultLocales());
+ final ZonedDateTime refTime = request.getReferenceTime() != null
+ ? request.getReferenceTime() : ZonedDateTime.now();
final TextClassifierImplNative.ClassificationResult[] results =
- getNative(locales)
- .classifyText(string, startIndex, endIndex,
+ getNative(request.getDefaultLocales())
+ .classifyText(
+ string, request.getStartIndex(), request.getEndIndex(),
new TextClassifierImplNative.ClassificationOptions(
- refTime.getTimeInMillis(),
- refTime.getTimeZone().getID(),
+ refTime.toInstant().toEpochMilli(),
+ refTime.getZone().getId(),
localesString));
if (results.length > 0) {
return createClassificationResult(
- results, string, startIndex, endIndex, refTime);
+ results, string,
+ request.getStartIndex(), request.getEndIndex(), refTime.toInstant());
}
}
} catch (Throwable t) {
@@ -200,42 +200,40 @@
Log.e(LOG_TAG, "Error getting text classification info.", t);
}
// Getting here means something went wrong, return a NO_OP result.
- return mFallback.classifyText(text, startIndex, endIndex, options);
+ return mFallback.classifyText(request);
}
/** @inheritDoc */
@Override
@WorkerThread
- public TextLinks generateLinks(
- @NonNull CharSequence text, @Nullable TextLinks.Options options) {
- Utils.validate(text, getMaxGenerateLinksTextLength(), false /* allowInMainThread */);
+ public TextLinks generateLinks(@NonNull TextLinks.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkTextLength(request.getText(), getMaxGenerateLinksTextLength());
+ Utils.checkMainThread();
- final boolean legacyFallback = options != null && options.isLegacyFallback();
- if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
- return Utils.generateLegacyLinks(text, options);
+ if (!mSettings.isSmartLinkifyEnabled() && request.isLegacyFallback()) {
+ return Utils.generateLegacyLinks(request);
}
- final String textString = text.toString();
+ final String textString = request.getText().toString();
final TextLinks.Builder builder = new TextLinks.Builder(textString);
try {
final long startTimeMs = System.currentTimeMillis();
- final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null;
- final Calendar refTime = Calendar.getInstance();
- final Collection<String> entitiesToIdentify =
- options != null && options.getEntityConfig() != null
- ? options.getEntityConfig().resolveEntityListModifications(
- getEntitiesForHints(options.getEntityConfig().getHints()))
- : mSettings.getEntityListDefault();
+ final ZonedDateTime refTime = ZonedDateTime.now();
+ final Collection<String> entitiesToIdentify = request.getEntityConfig() != null
+ ? request.getEntityConfig().resolveEntityListModifications(
+ getEntitiesForHints(request.getEntityConfig().getHints()))
+ : mSettings.getEntityListDefault();
final TextClassifierImplNative nativeImpl =
- getNative(defaultLocales);
+ getNative(request.getDefaultLocales());
final TextClassifierImplNative.AnnotatedSpan[] annotations =
nativeImpl.annotate(
textString,
new TextClassifierImplNative.AnnotationOptions(
- refTime.getTimeInMillis(),
- refTime.getTimeZone().getID(),
- concatenateLocales(defaultLocales)));
+ refTime.toInstant().toEpochMilli(),
+ refTime.getZone().getId(),
+ concatenateLocales(request.getDefaultLocales())));
for (TextClassifierImplNative.AnnotatedSpan span : annotations) {
final TextClassifierImplNative.ClassificationResult[] results =
span.getClassification();
@@ -251,18 +249,17 @@
}
final TextLinks links = builder.build();
final long endTimeMs = System.currentTimeMillis();
- final String callingPackageName =
- options == null || options.getCallingPackageName() == null
- ? mContext.getPackageName() // local (in process) TC.
- : options.getCallingPackageName();
+ final String callingPackageName = request.getCallingPackageName() == null
+ ? mContext.getPackageName() // local (in process) TC.
+ : request.getCallingPackageName();
mGenerateLinksLogger.logGenerateLinks(
- text, links, callingPackageName, endTimeMs - startTimeMs);
+ request.getText(), links, callingPackageName, endTimeMs - startTimeMs);
return links;
} catch (Throwable t) {
// Avoid throwing from this method. Log the error.
Log.e(LOG_TAG, "Error getting links info.", t);
}
- return mFallback.generateLinks(text, options);
+ return mFallback.generateLinks(request);
}
/** @inheritDoc */
@@ -299,6 +296,18 @@
return mLogger;
}
+ @Override
+ public void onSelectionEvent(SelectionEvent event) {
+ Preconditions.checkNotNull(event);
+ synchronized (mLoggerLock) {
+ if (mLogger2 == null) {
+ mLogger2 = new DefaultLogger(
+ new Logger.Config(mContext, WIDGET_TYPE_UNKNOWN, null));
+ }
+ mLogger2.writeEvent(event);
+ }
+ }
+
private TextClassifierImplNative getNative(LocaleList localeList)
throws FileNotFoundException {
synchronized (mLock) {
@@ -320,9 +329,9 @@
}
}
- private String getSignature(String text, int start, int end) {
+ private String createId(String text, int start, int end) {
synchronized (mLock) {
- return DefaultLogger.createSignature(text, start, end, mContext, mModel.getVersion(),
+ return DefaultLogger.createId(text, start, end, mContext, mModel.getVersion(),
mModel.getSupportedLocales());
}
}
@@ -401,7 +410,7 @@
private TextClassification createClassificationResult(
TextClassifierImplNative.ClassificationResult[] classifications,
- String text, int start, int end, @Nullable Calendar referenceTime) {
+ String text, int start, int end, @Nullable Instant referenceTime) {
final String classifiedText = text.substring(start, end);
final TextClassification.Builder builder = new TextClassification.Builder()
.setText(classifiedText);
@@ -418,48 +427,25 @@
}
}
- addActions(builder, IntentFactory.create(
- mContext, referenceTime, highestScoringResult, classifiedText));
-
- return builder.setSignature(getSignature(text, start, end)).build();
- }
-
- /** Extends the classification with the intents that can be resolved. */
- private void addActions(
- TextClassification.Builder builder, List<Intent> intents) {
- final PackageManager pm = mContext.getPackageManager();
- final int size = intents.size();
- for (int i = 0; i < size; i++) {
- final Intent intent = intents.get(i);
- final ResolveInfo resolveInfo;
- if (intent != null) {
- resolveInfo = pm.resolveActivity(intent, 0);
- } else {
- resolveInfo = null;
+ boolean isPrimaryAction = true;
+ for (LabeledIntent labeledIntent : IntentFactory.create(
+ mContext, referenceTime, highestScoringResult, classifiedText)) {
+ RemoteAction action = labeledIntent.asRemoteAction(mContext);
+ if (isPrimaryAction) {
+ // For O backwards compatibility, the first RemoteAction is also written to the
+ // legacy API fields.
+ builder.setIcon(action.getIcon().loadDrawable(mContext));
+ builder.setLabel(action.getTitle().toString());
+ builder.setIntent(labeledIntent.getIntent());
+ builder.setOnClickListener(TextClassification.createIntentOnClickListener(
+ TextClassification.createPendingIntent(mContext,
+ labeledIntent.getIntent())));
+ isPrimaryAction = false;
}
- if (resolveInfo != null && resolveInfo.activityInfo != null) {
- final String packageName = resolveInfo.activityInfo.packageName;
- final String label = IntentFactory.getLabel(mContext, intent);
- Drawable icon;
- if ("android".equals(packageName)) {
- // Requires the chooser to find an activity to handle the intent.
- icon = null;
- } else {
- // A default activity will handle the intent.
- intent.setComponent(
- new ComponentName(packageName, resolveInfo.activityInfo.name));
- icon = resolveInfo.activityInfo.loadIcon(pm);
- if (icon == null) {
- icon = resolveInfo.loadIcon(pm);
- }
- }
- if (i == 0) {
- builder.setPrimaryAction(intent, label, icon);
- } else {
- builder.addSecondaryAction(intent, label, icon);
- }
- }
+ builder.addAction(action);
}
+
+ return builder.setId(createId(text, start, end)).build();
}
/**
@@ -516,7 +502,7 @@
return mPath;
}
- /** A name to use for signature generation. Effectively the name of the model file. */
+ /** A name to use for id generation. Effectively the name of the model file. */
String getName() {
return mName;
}
@@ -588,6 +574,60 @@
}
/**
+ * Helper class to store the information from which RemoteActions are built.
+ */
+ private static final class LabeledIntent {
+ private String mTitle;
+ private String mDescription;
+ private Intent mIntent;
+
+ LabeledIntent(String title, String description, Intent intent) {
+ mTitle = title;
+ mDescription = description;
+ mIntent = intent;
+ }
+
+ String getTitle() {
+ return mTitle;
+ }
+
+ String getDescription() {
+ return mDescription;
+ }
+
+ Intent getIntent() {
+ return mIntent;
+ }
+
+ RemoteAction asRemoteAction(Context context) {
+ final PackageManager pm = context.getPackageManager();
+ final ResolveInfo resolveInfo = pm.resolveActivity(mIntent, 0);
+ final String packageName = resolveInfo != null && resolveInfo.activityInfo != null
+ ? resolveInfo.activityInfo.packageName : null;
+ Icon icon = null;
+ boolean shouldShowIcon = false;
+ if (packageName != null && !"android".equals(packageName)) {
+ // There is a default activity handling the intent.
+ mIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
+ if (resolveInfo.activityInfo.getIconResource() != 0) {
+ icon = Icon.createWithResource(
+ packageName, resolveInfo.activityInfo.getIconResource());
+ shouldShowIcon = true;
+ }
+ }
+ if (icon == null) {
+ // RemoteAction requires that there be an icon.
+ icon = Icon.createWithResource("android",
+ com.android.internal.R.drawable.ic_more_items);
+ }
+ RemoteAction action = new RemoteAction(icon, mTitle, mDescription,
+ TextClassification.createPendingIntent(context, mIntent));
+ action.setShouldShowIcon(shouldShowIcon);
+ return action;
+ }
+ }
+
+ /**
* Creates intents based on the classification type.
*/
static final class IntentFactory {
@@ -598,84 +638,101 @@
private IntentFactory() {}
@NonNull
- public static List<Intent> create(
+ public static List<LabeledIntent> create(
Context context,
- @Nullable Calendar referenceTime,
+ @Nullable Instant referenceTime,
TextClassifierImplNative.ClassificationResult classification,
String text) {
final String type = classification.getCollection().trim().toLowerCase(Locale.ENGLISH);
text = text.trim();
switch (type) {
case TextClassifier.TYPE_EMAIL:
- return createForEmail(text);
+ return createForEmail(context, text);
case TextClassifier.TYPE_PHONE:
return createForPhone(context, text);
case TextClassifier.TYPE_ADDRESS:
- return createForAddress(text);
+ return createForAddress(context, text);
case TextClassifier.TYPE_URL:
return createForUrl(context, text);
case TextClassifier.TYPE_DATE:
case TextClassifier.TYPE_DATE_TIME:
if (classification.getDatetimeResult() != null) {
- Calendar eventTime = Calendar.getInstance();
- eventTime.setTimeInMillis(
+ final Instant parsedTime = Instant.ofEpochMilli(
classification.getDatetimeResult().getTimeMsUtc());
- return createForDatetime(type, referenceTime, eventTime);
+ return createForDatetime(context, type, referenceTime, parsedTime);
} else {
return new ArrayList<>();
}
case TextClassifier.TYPE_FLIGHT_NUMBER:
- return createForFlight(text);
+ return createForFlight(context, text);
default:
return new ArrayList<>();
}
}
@NonNull
- private static List<Intent> createForEmail(String text) {
+ private static List<LabeledIntent> createForEmail(Context context, String text) {
return Arrays.asList(
- new Intent(Intent.ACTION_SENDTO)
- .setData(Uri.parse(String.format("mailto:%s", text))),
- new Intent(Intent.ACTION_INSERT_OR_EDIT)
- .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
- .putExtra(ContactsContract.Intents.Insert.EMAIL, text));
+ new LabeledIntent(
+ context.getString(com.android.internal.R.string.email),
+ context.getString(com.android.internal.R.string.email_desc),
+ new Intent(Intent.ACTION_SENDTO)
+ .setData(Uri.parse(String.format("mailto:%s", text)))),
+ new LabeledIntent(
+ context.getString(com.android.internal.R.string.add_contact),
+ context.getString(com.android.internal.R.string.add_contact_desc),
+ new Intent(Intent.ACTION_INSERT_OR_EDIT)
+ .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
+ .putExtra(ContactsContract.Intents.Insert.EMAIL, text)));
}
@NonNull
- private static List<Intent> createForPhone(Context context, String text) {
- final List<Intent> intents = new ArrayList<>();
+ private static List<LabeledIntent> createForPhone(Context context, String text) {
+ final List<LabeledIntent> actions = new ArrayList<>();
final UserManager userManager = context.getSystemService(UserManager.class);
final Bundle userRestrictions = userManager != null
? userManager.getUserRestrictions() : new Bundle();
if (!userRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS, false)) {
- intents.add(new Intent(Intent.ACTION_DIAL)
- .setData(Uri.parse(String.format("tel:%s", text))));
+ actions.add(new LabeledIntent(
+ context.getString(com.android.internal.R.string.dial),
+ context.getString(com.android.internal.R.string.dial_desc),
+ new Intent(Intent.ACTION_DIAL).setData(
+ Uri.parse(String.format("tel:%s", text)))));
}
- intents.add(new Intent(Intent.ACTION_INSERT_OR_EDIT)
- .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
- .putExtra(ContactsContract.Intents.Insert.PHONE, text));
+ actions.add(new LabeledIntent(
+ context.getString(com.android.internal.R.string.add_contact),
+ context.getString(com.android.internal.R.string.add_contact_desc),
+ new Intent(Intent.ACTION_INSERT_OR_EDIT)
+ .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
+ .putExtra(ContactsContract.Intents.Insert.PHONE, text)));
if (!userRestrictions.getBoolean(UserManager.DISALLOW_SMS, false)) {
- intents.add(new Intent(Intent.ACTION_SENDTO)
- .setData(Uri.parse(String.format("smsto:%s", text))));
+ actions.add(new LabeledIntent(
+ context.getString(com.android.internal.R.string.sms),
+ context.getString(com.android.internal.R.string.sms_desc),
+ new Intent(Intent.ACTION_SENDTO)
+ .setData(Uri.parse(String.format("smsto:%s", text)))));
}
- return intents;
+ return actions;
}
@NonNull
- private static List<Intent> createForAddress(String text) {
- final List<Intent> intents = new ArrayList<>();
+ private static List<LabeledIntent> createForAddress(Context context, String text) {
+ final List<LabeledIntent> actions = new ArrayList<>();
try {
final String encText = URLEncoder.encode(text, "UTF-8");
- intents.add(new Intent(Intent.ACTION_VIEW)
- .setData(Uri.parse(String.format("geo:0,0?q=%s", encText))));
+ actions.add(new LabeledIntent(
+ context.getString(com.android.internal.R.string.map),
+ context.getString(com.android.internal.R.string.map_desc),
+ new Intent(Intent.ACTION_VIEW)
+ .setData(Uri.parse(String.format("geo:0,0?q=%s", encText)))));
} catch (UnsupportedEncodingException e) {
Log.e(LOG_TAG, "Could not encode address", e);
}
- return intents;
+ return actions;
}
@NonNull
- private static List<Intent> createForUrl(Context context, String text) {
+ private static List<LabeledIntent> createForUrl(Context context, String text) {
final String httpPrefix = "http://";
final String httpsPrefix = "https://";
if (text.toLowerCase().startsWith(httpPrefix)) {
@@ -685,99 +742,64 @@
} else {
text = httpPrefix + text;
}
- return Arrays.asList(new Intent(Intent.ACTION_VIEW, Uri.parse(text))
- .putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()));
+ return Arrays.asList(new LabeledIntent(
+ context.getString(com.android.internal.R.string.browse),
+ context.getString(com.android.internal.R.string.browse_desc),
+ new Intent(Intent.ACTION_VIEW, Uri.parse(text))
+ .putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName())));
}
@NonNull
- private static List<Intent> createForDatetime(
- String type, @Nullable Calendar referenceTime, Calendar eventTime) {
+ private static List<LabeledIntent> createForDatetime(
+ Context context, String type, @Nullable Instant referenceTime,
+ Instant parsedTime) {
if (referenceTime == null) {
// If no reference time was given, use now.
- referenceTime = Calendar.getInstance();
+ referenceTime = Instant.now();
}
- List<Intent> intents = new ArrayList<>();
- intents.add(createCalendarViewIntent(eventTime));
- final long millisSinceReference =
- eventTime.getTimeInMillis() - referenceTime.getTimeInMillis();
- if (millisSinceReference > MIN_EVENT_FUTURE_MILLIS) {
- intents.add(createCalendarCreateEventIntent(eventTime, type));
+ List<LabeledIntent> actions = new ArrayList<>();
+ actions.add(createCalendarViewIntent(context, parsedTime));
+ final long millisUntilEvent = referenceTime.until(parsedTime, MILLIS);
+ if (millisUntilEvent > MIN_EVENT_FUTURE_MILLIS) {
+ actions.add(createCalendarCreateEventIntent(context, parsedTime, type));
}
- return intents;
+ return actions;
}
@NonNull
- private static List<Intent> createForFlight(String text) {
- return Arrays.asList(new Intent(Intent.ACTION_WEB_SEARCH)
- .putExtra(SearchManager.QUERY, text));
+ private static List<LabeledIntent> createForFlight(Context context, String text) {
+ return Arrays.asList(new LabeledIntent(
+ context.getString(com.android.internal.R.string.view_flight),
+ context.getString(com.android.internal.R.string.view_flight_desc),
+ new Intent(Intent.ACTION_WEB_SEARCH)
+ .putExtra(SearchManager.QUERY, text)));
}
@NonNull
- private static Intent createCalendarViewIntent(Calendar eventTime) {
+ private static LabeledIntent createCalendarViewIntent(Context context, Instant parsedTime) {
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
- ContentUris.appendId(builder, eventTime.getTimeInMillis());
- return new Intent(Intent.ACTION_VIEW).setData(builder.build());
+ ContentUris.appendId(builder, parsedTime.toEpochMilli());
+ return new LabeledIntent(
+ context.getString(com.android.internal.R.string.view_calendar),
+ context.getString(com.android.internal.R.string.view_calendar_desc),
+ new Intent(Intent.ACTION_VIEW).setData(builder.build()));
}
@NonNull
- private static Intent createCalendarCreateEventIntent(
- Calendar eventTime, @EntityType String type) {
+ private static LabeledIntent createCalendarCreateEventIntent(
+ Context context, Instant parsedTime, @EntityType String type) {
final boolean isAllDay = TextClassifier.TYPE_DATE.equals(type);
- return new Intent(Intent.ACTION_INSERT)
- .setData(CalendarContract.Events.CONTENT_URI)
- .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, isAllDay)
- .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, eventTime.getTimeInMillis())
- .putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
- eventTime.getTimeInMillis() + DEFAULT_EVENT_DURATION);
- }
-
- @Nullable
- public static String getLabel(Context context, @Nullable Intent intent) {
- if (intent == null || intent.getAction() == null) {
- return null;
- }
- final String authority =
- intent.getData() == null ? null : intent.getData().getAuthority();
- switch (intent.getAction()) {
- case Intent.ACTION_DIAL:
- return context.getString(com.android.internal.R.string.dial);
- case Intent.ACTION_SENDTO:
- if ("mailto".equals(intent.getScheme())) {
- return context.getString(com.android.internal.R.string.email);
- } else if ("smsto".equals(intent.getScheme())) {
- return context.getString(com.android.internal.R.string.sms);
- } else {
- return null;
- }
- case Intent.ACTION_INSERT:
- if (CalendarContract.AUTHORITY.equals(authority)) {
- return context.getString(com.android.internal.R.string.add_calendar_event);
- }
- return null;
- case Intent.ACTION_INSERT_OR_EDIT:
- if (ContactsContract.Contacts.CONTENT_ITEM_TYPE.equals(
- intent.getType())) {
- return context.getString(com.android.internal.R.string.add_contact);
- } else {
- return null;
- }
- case Intent.ACTION_VIEW:
- if (CalendarContract.AUTHORITY.equals(authority)) {
- return context.getString(com.android.internal.R.string.view_calendar);
- } else if ("geo".equals(intent.getScheme())) {
- return context.getString(com.android.internal.R.string.map);
- } else if ("http".equals(intent.getScheme())
- || "https".equals(intent.getScheme())) {
- return context.getString(com.android.internal.R.string.browse);
- } else {
- return null;
- }
- case Intent.ACTION_WEB_SEARCH:
- return context.getString(com.android.internal.R.string.view_flight);
- default:
- return null;
- }
+ return new LabeledIntent(
+ context.getString(com.android.internal.R.string.add_calendar_event),
+ context.getString(com.android.internal.R.string.add_calendar_event_desc),
+ new Intent(Intent.ACTION_INSERT)
+ .setData(CalendarContract.Events.CONTENT_URI)
+ .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, isAllDay)
+ .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,
+ parsedTime.toEpochMilli())
+ .putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
+ parsedTime.toEpochMilli() + DEFAULT_EVENT_DURATION));
}
}
}
diff --git a/core/java/android/view/textclassifier/TextLinks.aidl b/core/java/android/view/textclassifier/TextLinks.aidl
index 1bbb798..5de2c77 100644
--- a/core/java/android/view/textclassifier/TextLinks.aidl
+++ b/core/java/android/view/textclassifier/TextLinks.aidl
@@ -17,4 +17,4 @@
package android.view.textclassifier;
parcelable TextLinks;
-parcelable TextLinks.Options;
\ No newline at end of file
+parcelable TextLinks.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index 38a7d9a..17c7b13 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -25,10 +25,9 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Spannable;
+import android.text.method.MovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
-import android.text.util.Linkify;
-import android.text.util.Linkify.LinkifyMask;
import android.view.View;
import android.view.textclassifier.TextClassifier.EntityType;
import android.widget.TextView;
@@ -43,6 +42,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.function.Function;
@@ -79,15 +79,15 @@
public @interface ApplyStrategy {}
/**
- * Do not replace {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to
- * be applied to. Do not apply the TextLinkSpan.
- */
+ * Do not replace {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to
+ * be applied to. Do not apply the TextLinkSpan.
+ */
public static final int APPLY_STRATEGY_IGNORE = 0;
/**
- * Replace any {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to be
- * applied to.
- */
+ * Replace any {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to be
+ * applied to.
+ */
public static final int APPLY_STRATEGY_REPLACE = 1;
private final String mFullText;
@@ -99,70 +99,54 @@
}
/**
+ * Returns the text that was used to generate these links.
+ * @hide
+ */
+ @NonNull
+ public String getText() {
+ return mFullText;
+ }
+
+ /**
* Returns an unmodifiable Collection of the links.
*/
+ @NonNull
public Collection<TextLink> getLinks() {
return mLinks;
}
/**
* Annotates the given text with the generated links. It will fail if the provided text doesn't
- * match the original text used to crete the TextLinks.
+ * match the original text used to create the TextLinks.
+ *
+ * <p><strong>NOTE: </strong>It may be necessary to set a LinkMovementMethod on the TextView
+ * widget to properly handle links. See {@link TextView#setMovementMethod(MovementMethod)}
*
* @param text the text to apply the links to. Must match the original text
- * @param applyStrategy strategy for resolving link conflicts
- * @param spanFactory a factory to generate spans from TextLinks. Will use a default if null
- * @param allowPrefix whether to allow applying links only to a prefix of the text.
+ * @param applyStrategy the apply strategy used to determine how to apply links to text.
+ * e.g {@link TextLinks#APPLY_STRATEGY_IGNORE}
+ * @param spanFactory a custom span factory for converting TextLinks to TextLinkSpans.
+ * Set to {@code null} to use the default span factory.
*
* @return a status code indicating whether or not the links were successfully applied
- *
- * @hide
+ * e.g. {@link #STATUS_LINKS_APPLIED}
*/
@Status
public int apply(
@NonNull Spannable text,
@ApplyStrategy int applyStrategy,
- @Nullable Function<TextLink, TextLinkSpan> spanFactory,
- boolean allowPrefix) {
+ @Nullable Function<TextLink, TextLinkSpan> spanFactory) {
Preconditions.checkNotNull(text);
- checkValidApplyStrategy(applyStrategy);
- final String textString = text.toString();
- if (!mFullText.equals(textString) && !(allowPrefix && textString.startsWith(mFullText))) {
- return STATUS_DIFFERENT_TEXT;
- }
- if (mLinks.isEmpty()) {
- return STATUS_NO_LINKS_FOUND;
- }
+ return new TextLinksParams.Builder()
+ .setApplyStrategy(applyStrategy)
+ .setSpanFactory(spanFactory)
+ .build()
+ .apply(text, this);
+ }
- if (spanFactory == null) {
- spanFactory = DEFAULT_SPAN_FACTORY;
- }
- int applyCount = 0;
- for (TextLink link : mLinks) {
- final TextLinkSpan span = spanFactory.apply(link);
- if (span != null) {
- final ClickableSpan[] existingSpans = text.getSpans(
- link.getStart(), link.getEnd(), ClickableSpan.class);
- if (existingSpans.length > 0) {
- if (applyStrategy == APPLY_STRATEGY_REPLACE) {
- for (ClickableSpan existingSpan : existingSpans) {
- text.removeSpan(existingSpan);
- }
- text.setSpan(span, link.getStart(), link.getEnd(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- applyCount++;
- }
- } else {
- text.setSpan(span, link.getStart(), link.getEnd(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- applyCount++;
- }
- }
- }
- if (applyCount == 0) {
- return STATUS_NO_LINKS_APPLIED;
- }
- return STATUS_LINKS_APPLIED;
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "TextLinks{fullText=%s, links=%s}", mFullText, mLinks);
}
@Override
@@ -271,6 +255,13 @@
}
@Override
+ public String toString() {
+ return String.format(Locale.US,
+ "TextLink{start=%s, end=%s, entityScores=%s, urlSpan=%s}",
+ mStart, mEnd, mEntityScores, mUrlSpan);
+ }
+
+ @Override
public int describeContents() {
return 0;
}
@@ -304,108 +295,35 @@
}
/**
- * Optional input parameters for generating TextLinks.
+ * A request object for generating TextLinks.
*/
- public static final class Options implements Parcelable {
+ public static final class Request implements Parcelable {
- private LocaleList mDefaultLocales;
- private TextClassifier.EntityConfig mEntityConfig;
- private boolean mLegacyFallback;
-
- private @ApplyStrategy int mApplyStrategy;
- private Function<TextLink, TextLinkSpan> mSpanFactory;
-
+ private final CharSequence mText;
+ @Nullable private final LocaleList mDefaultLocales;
+ @Nullable private final TextClassifier.EntityConfig mEntityConfig;
+ private final boolean mLegacyFallback;
private String mCallingPackageName;
- /**
- * Returns a new options object based on the specified link mask.
- */
- public static Options fromLinkMask(@LinkifyMask int mask) {
- final List<String> entitiesToFind = new ArrayList<>();
-
- if ((mask & Linkify.WEB_URLS) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_URL);
- }
- if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_EMAIL);
- }
- if ((mask & Linkify.PHONE_NUMBERS) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_PHONE);
- }
- if ((mask & Linkify.MAP_ADDRESSES) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
- }
-
- return new Options().setEntityConfig(
- TextClassifier.EntityConfig.createWithEntityList(entitiesToFind));
- }
-
- public Options() {}
-
- /**
- * @param defaultLocales ordered list of locale preferences that may be used to
- * disambiguate the provided text. If no locale preferences exist,
- * set this to null or an empty locale list.
- */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ private Request(
+ CharSequence text,
+ LocaleList defaultLocales,
+ TextClassifier.EntityConfig entityConfig,
+ boolean legacyFallback,
+ String callingPackageName) {
+ mText = text;
mDefaultLocales = defaultLocales;
- return this;
- }
-
- /**
- * Sets the entity configuration to use. This determines what types of entities the
- * TextClassifier will look for.
- *
- * @param entityConfig EntityConfig to use
- */
- public Options setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
mEntityConfig = entityConfig;
- return this;
- }
-
- /**
- * Sets whether the TextClassifier can fallback to legacy links if smart linkify is
- * disabled.
- * <strong>Note: </strong>This is not parcelled.
- * @hide
- */
- public Options setLegacyFallback(boolean legacyFallback) {
mLegacyFallback = legacyFallback;
- return this;
- }
-
- /**
- * Sets a strategy for resolving conflicts when applying generated links to text that
- * already have links.
- *
- * @throws IllegalArgumentException if applyStrategy is not valid
- *
- * @see #APPLY_STRATEGY_IGNORE
- * @see #APPLY_STRATEGY_REPLACE
- */
- public Options setApplyStrategy(@ApplyStrategy int applyStrategy) {
- checkValidApplyStrategy(applyStrategy);
- mApplyStrategy = applyStrategy;
- return this;
- }
-
- /**
- * Sets a factory for converting a TextLink to a TextLinkSpan.
- *
- * <p><strong>Note: </strong>This is not parceled over IPC.
- */
- public Options setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
- mSpanFactory = spanFactory;
- return this;
- }
-
- /**
- * Sets the name of the package that requested the links to get generated.
- * @hide
- */
- public Options setCallingPackageName(@Nullable String callingPackageName) {
mCallingPackageName = callingPackageName;
- return this;
+ }
+
+ /**
+ * Returns the text to generate links for.
+ */
+ @NonNull
+ public CharSequence getText() {
+ return mText;
}
/**
@@ -437,26 +355,91 @@
}
/**
- * @return the strategy for resolving conflictswhen applying generated links to text that
- * already have links
- *
- * @see #APPLY_STRATEGY_IGNORE
- * @see #APPLY_STRATEGY_REPLACE
+ * Sets the name of the package that requested the links to get generated.
*/
- @ApplyStrategy
- public int getApplyStrategy() {
- return mApplyStrategy;
+ void setCallingPackageName(@Nullable String callingPackageName) {
+ mCallingPackageName = callingPackageName;
}
/**
- * Returns a factory for converting a TextLink to a TextLinkSpan.
- *
- * <p><strong>Note: </strong>This is not parcelable and will always return null if read
- * from a parcel
+ * A builder for building TextLinks requests.
*/
- @Nullable
- public Function<TextLink, TextLinkSpan> getSpanFactory() {
- return mSpanFactory;
+ public static final class Builder {
+
+ private final CharSequence mText;
+
+ @Nullable private LocaleList mDefaultLocales;
+ @Nullable private TextClassifier.EntityConfig mEntityConfig;
+ private boolean mLegacyFallback = true; // Use legacy fall back by default.
+ private String mCallingPackageName;
+
+ public Builder(@NonNull CharSequence text) {
+ mText = Preconditions.checkNotNull(text);
+ }
+
+ /**
+ * @param defaultLocales ordered list of locale preferences that may be used to
+ * disambiguate the provided text. If no locale preferences exist,
+ * set this to null or an empty locale list.
+ * @return this builder
+ */
+ @NonNull
+ public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ mDefaultLocales = defaultLocales;
+ return this;
+ }
+
+ /**
+ * Sets the entity configuration to use. This determines what types of entities the
+ * TextClassifier will look for.
+ * Set to {@code null} for the default entity config and teh TextClassifier will
+ * automatically determine what links to generate.
+ *
+ * @return this builder
+ */
+ @NonNull
+ public Builder setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+ mEntityConfig = entityConfig;
+ return this;
+ }
+
+ /**
+ * Sets whether the TextClassifier can fallback to legacy links if smart linkify is
+ * disabled.
+ *
+ * <p><strong>Note: </strong>This is not parcelled.
+ *
+ * @return this builder
+ * @hide
+ */
+ @NonNull
+ public Builder setLegacyFallback(boolean legacyFallback) {
+ mLegacyFallback = legacyFallback;
+ return this;
+ }
+
+ /**
+ * Sets the name of the package that requested the links to get generated.
+ *
+ * @return this builder
+ * @hide
+ */
+ @NonNull
+ public Builder setCallingPackageName(@Nullable String callingPackageName) {
+ mCallingPackageName = callingPackageName;
+ return this;
+ }
+
+ /**
+ * Builds and returns the request object.
+ */
+ @NonNull
+ public Request build() {
+ return new Request(
+ mText, mDefaultLocales, mEntityConfig,
+ mLegacyFallback, mCallingPackageName);
+ }
+
}
/**
@@ -476,6 +459,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mText.toString());
dest.writeInt(mDefaultLocales != null ? 1 : 0);
if (mDefaultLocales != null) {
mDefaultLocales.writeToParcel(dest, flags);
@@ -484,42 +468,33 @@
if (mEntityConfig != null) {
mEntityConfig.writeToParcel(dest, flags);
}
- dest.writeInt(mApplyStrategy);
dest.writeString(mCallingPackageName);
}
- public static final Parcelable.Creator<Options> CREATOR =
- new Parcelable.Creator<Options>() {
+ public static final Parcelable.Creator<Request> CREATOR =
+ new Parcelable.Creator<Request>() {
@Override
- public Options createFromParcel(Parcel in) {
- return new Options(in);
+ public Request createFromParcel(Parcel in) {
+ return new Request(in);
}
@Override
- public Options[] newArray(int size) {
- return new Options[size];
+ public Request[] newArray(int size) {
+ return new Request[size];
}
};
- private Options(Parcel in) {
- if (in.readInt() > 0) {
- mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
- }
- if (in.readInt() > 0) {
- mEntityConfig = TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
- }
- mApplyStrategy = in.readInt();
+ private Request(Parcel in) {
+ mText = in.readString();
+ mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+ mEntityConfig = in.readInt() == 0
+ ? null : TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
+ mLegacyFallback = true;
mCallingPackageName = in.readString();
}
}
/**
- * A function to create spans from TextLinks.
- */
- private static final Function<TextLink, TextLinkSpan> DEFAULT_SPAN_FACTORY =
- textLink -> new TextLinkSpan(textLink);
-
- /**
* A ClickableSpan for a TextLink.
*
* <p>Applies only to TextViews.
@@ -596,6 +571,7 @@
*
* @throws IllegalArgumentException if entityScores is null or empty.
*/
+ @NonNull
public Builder addLink(int start, int end, Map<String, Float> entityScores) {
mLinks.add(new TextLink(start, end, entityScores, null));
return this;
@@ -605,6 +581,7 @@
* @see #addLink(int, int, Map)
* @param urlSpan An optional URLSpan to delegate to. NOTE: Not parcelled.
*/
+ @NonNull
Builder addLink(int start, int end, Map<String, Float> entityScores,
@Nullable URLSpan urlSpan) {
mLinks.add(new TextLink(start, end, entityScores, urlSpan));
@@ -614,6 +591,7 @@
/**
* Removes all {@link TextLink}s.
*/
+ @NonNull
public Builder clearTextLinks() {
mLinks.clear();
return this;
@@ -624,18 +602,9 @@
*
* @return the constructed TextLinks
*/
+ @NonNull
public TextLinks build() {
return new TextLinks(mFullText, mLinks);
}
}
-
- /**
- * @throws IllegalArgumentException if the value is invalid
- */
- private static void checkValidApplyStrategy(int applyStrategy) {
- if (applyStrategy != APPLY_STRATEGY_IGNORE && applyStrategy != APPLY_STRATEGY_REPLACE) {
- throw new IllegalArgumentException(
- "Invalid apply strategy. See TextLinks.ApplyStrategy for options.");
- }
- }
}
diff --git a/core/java/android/view/textclassifier/TextLinksParams.java b/core/java/android/view/textclassifier/TextLinksParams.java
new file mode 100644
index 0000000..be4c3bc
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextLinksParams.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.text.Spannable;
+import android.text.style.ClickableSpan;
+import android.text.util.Linkify;
+import android.text.util.Linkify.LinkifyMask;
+import android.view.textclassifier.TextLinks.TextLink;
+import android.view.textclassifier.TextLinks.TextLinkSpan;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * Parameters for generating and applying links.
+ * @hide
+ */
+public final class TextLinksParams {
+
+ /**
+ * A function to create spans from TextLinks.
+ */
+ private static final Function<TextLink, TextLinkSpan> DEFAULT_SPAN_FACTORY =
+ textLink -> new TextLinkSpan(textLink);
+
+ @TextLinks.ApplyStrategy
+ private final int mApplyStrategy;
+ private final Function<TextLink, TextLinkSpan> mSpanFactory;
+ private final TextClassifier.EntityConfig mEntityConfig;
+
+ private TextLinksParams(
+ @TextLinks.ApplyStrategy int applyStrategy,
+ Function<TextLink, TextLinkSpan> spanFactory) {
+ mApplyStrategy = applyStrategy;
+ mSpanFactory = spanFactory;
+ mEntityConfig = TextClassifier.EntityConfig.createWithHints(null);
+ }
+
+ /**
+ * Returns a new TextLinksParams object based on the specified link mask.
+ *
+ * @param mask the link mask
+ * e.g. {@link LinkifyMask#PHONE_NUMBERS} | {@link LinkifyMask#EMAIL_ADDRESSES}
+ * @hide
+ */
+ @NonNull
+ public static TextLinksParams fromLinkMask(@LinkifyMask int mask) {
+ final List<String> entitiesToFind = new ArrayList<>();
+ if ((mask & Linkify.WEB_URLS) != 0) {
+ entitiesToFind.add(TextClassifier.TYPE_URL);
+ }
+ if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
+ entitiesToFind.add(TextClassifier.TYPE_EMAIL);
+ }
+ if ((mask & Linkify.PHONE_NUMBERS) != 0) {
+ entitiesToFind.add(TextClassifier.TYPE_PHONE);
+ }
+ if ((mask & Linkify.MAP_ADDRESSES) != 0) {
+ entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
+ }
+ return new TextLinksParams.Builder().setEntityConfig(
+ TextClassifier.EntityConfig.createWithExplicitEntityList(entitiesToFind))
+ .build();
+ }
+
+ /**
+ * Returns the entity config used to determine what entity types to generate.
+ */
+ @NonNull
+ public TextClassifier.EntityConfig getEntityConfig() {
+ return mEntityConfig;
+ }
+
+ /**
+ * Annotates the given text with the generated links. It will fail if the provided text doesn't
+ * match the original text used to crete the TextLinks.
+ *
+ * @param text the text to apply the links to. Must match the original text
+ * @param textLinks the links to apply to the text
+ *
+ * @return a status code indicating whether or not the links were successfully applied
+ * @hide
+ */
+ @TextLinks.Status
+ public int apply(@NonNull Spannable text, @NonNull TextLinks textLinks) {
+ Preconditions.checkNotNull(text);
+ Preconditions.checkNotNull(textLinks);
+
+ final String textString = text.toString();
+ if (!textString.startsWith(textLinks.getText())) {
+ return TextLinks.STATUS_DIFFERENT_TEXT;
+ }
+ if (textLinks.getLinks().isEmpty()) {
+ return TextLinks.STATUS_NO_LINKS_FOUND;
+ }
+
+ int applyCount = 0;
+ for (TextLink link : textLinks.getLinks()) {
+ final TextLinkSpan span = mSpanFactory.apply(link);
+ if (span != null) {
+ final ClickableSpan[] existingSpans = text.getSpans(
+ link.getStart(), link.getEnd(), ClickableSpan.class);
+ if (existingSpans.length > 0) {
+ if (mApplyStrategy == TextLinks.APPLY_STRATEGY_REPLACE) {
+ for (ClickableSpan existingSpan : existingSpans) {
+ text.removeSpan(existingSpan);
+ }
+ text.setSpan(span, link.getStart(), link.getEnd(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ applyCount++;
+ }
+ } else {
+ text.setSpan(span, link.getStart(), link.getEnd(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ applyCount++;
+ }
+ }
+ }
+ if (applyCount == 0) {
+ return TextLinks.STATUS_NO_LINKS_APPLIED;
+ }
+ return TextLinks.STATUS_LINKS_APPLIED;
+ }
+
+ /**
+ * A builder for building TextLinksParams.
+ */
+ public static final class Builder {
+
+ @TextLinks.ApplyStrategy
+ private int mApplyStrategy = TextLinks.APPLY_STRATEGY_IGNORE;
+ private Function<TextLink, TextLinkSpan> mSpanFactory = DEFAULT_SPAN_FACTORY;
+
+ /**
+ * Sets the apply strategy used to determine how to apply links to text.
+ * e.g {@link TextLinks#APPLY_STRATEGY_IGNORE}
+ *
+ * @return this builder
+ */
+ public Builder setApplyStrategy(@TextLinks.ApplyStrategy int applyStrategy) {
+ mApplyStrategy = checkApplyStrategy(applyStrategy);
+ return this;
+ }
+
+ /**
+ * Sets a custom span factory for converting TextLinks to TextLinkSpans.
+ * Set to {@code null} to use the default span factory.
+ *
+ * @return this builder
+ */
+ public Builder setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
+ mSpanFactory = spanFactory == null ? DEFAULT_SPAN_FACTORY : spanFactory;
+ return this;
+ }
+
+ /**
+ * Sets the entity configuration used to determine what entity types to generate.
+ * Set to {@code null} for the default entity config which will automatically determine
+ * what links to generate.
+ *
+ * @return this builder
+ */
+ public Builder setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+ return this;
+ }
+
+ /**
+ * Builds and returns a TextLinksParams object.
+ */
+ public TextLinksParams build() {
+ return new TextLinksParams(mApplyStrategy, mSpanFactory);
+ }
+ }
+
+ /** @throws IllegalArgumentException if the value is invalid */
+ @TextLinks.ApplyStrategy
+ private static int checkApplyStrategy(int applyStrategy) {
+ if (applyStrategy != TextLinks.APPLY_STRATEGY_IGNORE
+ && applyStrategy != TextLinks.APPLY_STRATEGY_REPLACE) {
+ throw new IllegalArgumentException(
+ "Invalid apply strategy. See TextLinksParams.ApplyStrategy for options.");
+ }
+ return applyStrategy;
+ }
+}
+
diff --git a/core/java/android/view/textclassifier/TextSelection.aidl b/core/java/android/view/textclassifier/TextSelection.aidl
index dab1aef..b2fd9be 100644
--- a/core/java/android/view/textclassifier/TextSelection.aidl
+++ b/core/java/android/view/textclassifier/TextSelection.aidl
@@ -17,4 +17,4 @@
package android.view.textclassifier;
parcelable TextSelection;
-parcelable TextSelection.Options;
\ No newline at end of file
+parcelable TextSelection.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextSelection.java b/core/java/android/view/textclassifier/TextSelection.java
index 1c93be7..939e717 100644
--- a/core/java/android/view/textclassifier/TextSelection.java
+++ b/core/java/android/view/textclassifier/TextSelection.java
@@ -25,6 +25,7 @@
import android.os.Parcelable;
import android.util.ArrayMap;
import android.view.textclassifier.TextClassifier.EntityType;
+import android.view.textclassifier.TextClassifier.Utils;
import com.android.internal.util.Preconditions;
@@ -38,16 +39,15 @@
private final int mStartIndex;
private final int mEndIndex;
- @NonNull private final EntityConfidence mEntityConfidence;
- @NonNull private final String mSignature;
+ private final EntityConfidence mEntityConfidence;
+ @Nullable private final String mId;
private TextSelection(
- int startIndex, int endIndex, @NonNull Map<String, Float> entityConfidence,
- @NonNull String signature) {
+ int startIndex, int endIndex, Map<String, Float> entityConfidence, String id) {
mStartIndex = startIndex;
mEndIndex = endIndex;
mEntityConfidence = new EntityConfidence(entityConfidence);
- mSignature = signature;
+ mId = id;
}
/**
@@ -80,7 +80,8 @@
* @see #getEntityCount() for the number of entities available.
*/
@NonNull
- public @EntityType String getEntity(int index) {
+ @EntityType
+ public String getEntity(int index) {
return mEntityConfidence.getEntities().get(index);
}
@@ -95,21 +96,19 @@
}
/**
- * Returns the signature for this object.
- * The TextClassifier that generates this object may use it as a way to internally identify
- * this object.
+ * Returns the id, if one exists, for this object.
*/
- @NonNull
- public String getSignature() {
- return mSignature;
+ @Nullable
+ public String getId() {
+ return mId;
}
@Override
public String toString() {
return String.format(
Locale.US,
- "TextSelection {startIndex=%d, endIndex=%d, entities=%s, signature=%s}",
- mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+ "TextSelection {id=%s, startIndex=%d, endIndex=%d, entities=%s}",
+ mId, mStartIndex, mEndIndex, mEntityConfidence);
}
/**
@@ -119,8 +118,8 @@
private final int mStartIndex;
private final int mEndIndex;
- @NonNull private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
- @NonNull private String mSignature = "";
+ private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
+ @Nullable private String mId;
/**
* Creates a builder used to build {@link TextSelection} objects.
@@ -142,56 +141,96 @@
* 0 implies the entity does not exist for the classified text.
* Values greater than 1 are clamped to 1.
*/
+ @NonNull
public Builder setEntityType(
@NonNull @EntityType String type,
@FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
+ Preconditions.checkNotNull(type);
mEntityConfidence.put(type, confidenceScore);
return this;
}
/**
- * Sets a signature for the TextSelection object.
- *
- * The TextClassifier that generates the TextSelection object may use it as a way to
- * internally identify the TextSelection object.
+ * Sets an id for the TextSelection object.
*/
- public Builder setSignature(@NonNull String signature) {
- mSignature = Preconditions.checkNotNull(signature);
+ @NonNull
+ public Builder setId(@NonNull String id) {
+ mId = Preconditions.checkNotNull(id);
return this;
}
/**
* Builds and returns {@link TextSelection} object.
*/
+ @NonNull
public TextSelection build() {
return new TextSelection(
- mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+ mStartIndex, mEndIndex, mEntityConfidence, mId);
}
}
/**
- * Optional input parameters for generating TextSelection.
+ * A request object for generating TextSelection.
*/
- public static final class Options implements Parcelable {
+ public static final class Request implements Parcelable {
- private @Nullable LocaleList mDefaultLocales;
- private boolean mDarkLaunchAllowed;
+ private final CharSequence mText;
+ private final int mStartIndex;
+ private final int mEndIndex;
+ @Nullable private final LocaleList mDefaultLocales;
+ private final boolean mDarkLaunchAllowed;
- public Options() {}
-
- /**
- * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
- * the provided text. If no locale preferences exist, set this to null or an empty
- * locale list.
- */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ private Request(
+ CharSequence text,
+ int startIndex,
+ int endIndex,
+ LocaleList defaultLocales,
+ boolean darkLaunchAllowed) {
+ mText = text;
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
mDefaultLocales = defaultLocales;
- return this;
+ mDarkLaunchAllowed = darkLaunchAllowed;
}
/**
- * @return ordered list of locale preferences that can be used to disambiguate
- * the provided text.
+ * Returns the text providing context for the selected text (which is specified by the
+ * sub sequence starting at startIndex and ending at endIndex).
+ */
+ @NonNull
+ public CharSequence getText() {
+ return mText;
+ }
+
+ /**
+ * Returns start index of the selected part of text.
+ */
+ @IntRange(from = 0)
+ public int getStartIndex() {
+ return mStartIndex;
+ }
+
+ /**
+ * Returns end index of the selected part of text.
+ */
+ @IntRange(from = 0)
+ public int getEndIndex() {
+ return mEndIndex;
+ }
+
+ /**
+ * Returns true if the TextClassifier should return selection suggestions when "dark
+ * launched". Otherwise, returns false.
+ *
+ * @hide
+ */
+ public boolean isDarkLaunchAllowed() {
+ return mDarkLaunchAllowed;
+ }
+
+ /**
+ * @return ordered list of locale preferences that can be used to disambiguate the
+ * provided text.
*/
@Nullable
public LocaleList getDefaultLocales() {
@@ -199,26 +238,71 @@
}
/**
- * @param allowed whether or not the TextClassifier should return selection suggestions
- * when "dark launched". When a TextClassifier is dark launched, it can suggest
- * selection changes that should not be used to actually change the user's selection.
- * Instead, the suggested selection is logged, compared with the user's selection
- * interaction, and used to generate quality metrics for the TextClassifier.
- *
- * @hide
+ * A builder for building TextSelection requests.
*/
- public void setDarkLaunchAllowed(boolean allowed) {
- mDarkLaunchAllowed = allowed;
- }
+ public static final class Builder {
- /**
- * Returns true if the TextClassifier should return selection suggestions when
- * "dark launched". Otherwise, returns false.
- *
- * @hide
- */
- public boolean isDarkLaunchAllowed() {
- return mDarkLaunchAllowed;
+ private final CharSequence mText;
+ private final int mStartIndex;
+ private final int mEndIndex;
+
+ @Nullable private LocaleList mDefaultLocales;
+ private boolean mDarkLaunchAllowed;
+
+ /**
+ * @param text text providing context for the selected text (which is specified by the
+ * sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
+ * @param startIndex start index of the selected part of text
+ * @param endIndex end index of the selected part of text
+ */
+ public Builder(
+ @NonNull CharSequence text,
+ @IntRange(from = 0) int startIndex,
+ @IntRange(from = 0) int endIndex) {
+ Utils.checkArgument(text, startIndex, endIndex);
+ mText = text;
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
+ }
+
+ /**
+ * @param defaultLocales ordered list of locale preferences that may be used to
+ * disambiguate the provided text. If no locale preferences exist, set this to null
+ * or an empty locale list.
+ *
+ * @return this builder.
+ */
+ @NonNull
+ public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+ mDefaultLocales = defaultLocales;
+ return this;
+ }
+
+ /**
+ * @param allowed whether or not the TextClassifier should return selection suggestions
+ * when "dark launched". When a TextClassifier is dark launched, it can suggest
+ * selection changes that should not be used to actually change the user's
+ * selection. Instead, the suggested selection is logged, compared with the user's
+ * selection interaction, and used to generate quality metrics for the
+ * TextClassifier. Not parceled.
+ *
+ * @return this builder.
+ * @hide
+ */
+ @NonNull
+ public Builder setDarkLaunchAllowed(boolean allowed) {
+ mDarkLaunchAllowed = allowed;
+ return this;
+ }
+
+ /**
+ * Builds and returns the request object.
+ */
+ @NonNull
+ public Request build() {
+ return new Request(mText, mStartIndex, mEndIndex,
+ mDefaultLocales, mDarkLaunchAllowed);
+ }
}
@Override
@@ -228,31 +312,34 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mText.toString());
+ dest.writeInt(mStartIndex);
+ dest.writeInt(mEndIndex);
dest.writeInt(mDefaultLocales != null ? 1 : 0);
if (mDefaultLocales != null) {
mDefaultLocales.writeToParcel(dest, flags);
}
- dest.writeInt(mDarkLaunchAllowed ? 1 : 0);
}
- public static final Parcelable.Creator<Options> CREATOR =
- new Parcelable.Creator<Options>() {
+ public static final Parcelable.Creator<Request> CREATOR =
+ new Parcelable.Creator<Request>() {
@Override
- public Options createFromParcel(Parcel in) {
- return new Options(in);
+ public Request createFromParcel(Parcel in) {
+ return new Request(in);
}
@Override
- public Options[] newArray(int size) {
- return new Options[size];
+ public Request[] newArray(int size) {
+ return new Request[size];
}
};
- private Options(Parcel in) {
- if (in.readInt() > 0) {
- mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
- }
- mDarkLaunchAllowed = in.readInt() != 0;
+ private Request(Parcel in) {
+ mText = in.readString();
+ mStartIndex = in.readInt();
+ mEndIndex = in.readInt();
+ mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+ mDarkLaunchAllowed = false;
}
}
@@ -266,7 +353,7 @@
dest.writeInt(mStartIndex);
dest.writeInt(mEndIndex);
mEntityConfidence.writeToParcel(dest, flags);
- dest.writeString(mSignature);
+ dest.writeString(mId);
}
public static final Parcelable.Creator<TextSelection> CREATOR =
@@ -286,6 +373,6 @@
mStartIndex = in.readInt();
mEndIndex = in.readInt();
mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
- mSignature = in.readString();
+ mId = in.readString();
}
}
diff --git a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
index 157b3d8..f7d75cd 100644
--- a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
+++ b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
@@ -473,7 +473,7 @@
final String entityType = classification.getEntityCount() > 0
? classification.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String versionTag = getVersionInfo(classification.getSignature());
+ final String versionTag = getVersionInfo(classification.getId());
return new SelectionEvent(
start, end, EventType.SELECTION_MODIFIED, entityType, versionTag);
}
@@ -489,7 +489,7 @@
*/
public static SelectionEvent selectionModified(
int start, int end, @NonNull TextSelection selection) {
- final boolean smartSelection = getSourceClassifier(selection.getSignature())
+ final boolean smartSelection = getSourceClassifier(selection.getId())
.equals(TextClassifier.DEFAULT_LOG_TAG);
final int eventType;
if (smartSelection) {
@@ -503,7 +503,7 @@
final String entityType = selection.getEntityCount() > 0
? selection.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String versionTag = getVersionInfo(selection.getSignature());
+ final String versionTag = getVersionInfo(selection.getId());
return new SelectionEvent(start, end, eventType, entityType, versionTag);
}
@@ -538,7 +538,7 @@
final String entityType = classification.getEntityCount() > 0
? classification.getEntity(0)
: TextClassifier.TYPE_UNKNOWN;
- final String versionTag = getVersionInfo(classification.getSignature());
+ final String versionTag = getVersionInfo(classification.getId());
return new SelectionEvent(start, end, actionType, entityType, versionTag);
}
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index d0f9eee..6df1655 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -152,6 +152,14 @@
* will continue to load the resource as usual. Otherwise, the return
* response and data will be used.
*
+ * <p>This callback is invoked for a variety of URL schemes (e.g., {@code http(s):}, {@code
+ * data:}, {@code file:}, etc.), not only those schemes which send requests over the network.
+ * This is not called for {@code javascript:} URLs, {@code blob:} URLs, or for assets accessed
+ * via {@code file:///android_asset/} or {@code file:///android_res/} URLs.
+ *
+ * <p>In the case of redirects, this is only called for the initial resource URL, not any
+ * subsequent redirect URLs.
+ *
* <p class="note"><b>Note:</b> This method is called on a thread
* other than the UI thread so clients should exercise caution
* when accessing private data or the view system.
@@ -182,6 +190,14 @@
* will continue to load the resource as usual. Otherwise, the return
* response and data will be used.
*
+ * <p>This callback is invoked for a variety of URL schemes (e.g., {@code http(s):}, {@code
+ * data:}, {@code file:}, etc.), not only those schemes which send requests over the network.
+ * This is not called for {@code javascript:} URLs, {@code blob:} URLs, or for assets accessed
+ * via {@code file:///android_asset/} or {@code file:///android_res/} URLs.
+ *
+ * <p>In the case of redirects, this is only called for the initial resource URL, not any
+ * subsequent redirect URLs.
+ *
* <p class="note"><b>Note:</b> This method is called on a thread
* other than the UI thread so clients should exercise caution
* when accessing private data or the view system.
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 3775835..9946726 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -23,6 +23,7 @@
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
+import android.app.RemoteAction;
import android.content.ClipData;
import android.content.ClipData.Item;
import android.content.Context;
@@ -4045,43 +4046,46 @@
if (textClassification == null) {
return;
}
- final OnClickListener onClick = getSupportedOnClickListener(
- textClassification.getIcon(),
- textClassification.getLabel(),
- textClassification.getIntent());
- if (onClick != null) {
+ if (!textClassification.getActions().isEmpty()) {
+ // Primary assist action (Always shown).
+ final MenuItem item = addAssistMenuItem(menu,
+ textClassification.getActions().get(0), TextView.ID_ASSIST,
+ MENU_ITEM_ORDER_ASSIST, MenuItem.SHOW_AS_ACTION_ALWAYS);
+ item.setIntent(textClassification.getIntent());
+ } else if (hasLegacyAssistItem(textClassification)) {
+ // Legacy primary assist action (Always shown).
final MenuItem item = menu.add(
TextView.ID_ASSIST, TextView.ID_ASSIST, MENU_ITEM_ORDER_ASSIST,
textClassification.getLabel())
.setIcon(textClassification.getIcon())
.setIntent(textClassification.getIntent());
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
- mAssistClickHandlers.put(
- item, TextClassification.createIntentOnClickListener(
- mTextView.getContext(), textClassification.getIntent()));
+ mAssistClickHandlers.put(item, TextClassification.createIntentOnClickListener(
+ TextClassification.createPendingIntent(mTextView.getContext(),
+ textClassification.getIntent())));
}
- final int count = textClassification.getSecondaryActionsCount();
- for (int i = 0; i < count; i++) {
- final OnClickListener onClick1 = getSupportedOnClickListener(
- textClassification.getSecondaryIcon(i),
- textClassification.getSecondaryLabel(i),
- textClassification.getSecondaryIntent(i));
- if (onClick1 == null) {
- continue;
- }
- final int order = MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START + i;
- final MenuItem item = menu.add(
- TextView.ID_ASSIST, Menu.NONE, order,
- textClassification.getSecondaryLabel(i))
- .setIcon(textClassification.getSecondaryIcon(i))
- .setIntent(textClassification.getSecondaryIntent(i));
- item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
- mAssistClickHandlers.put(item,
- TextClassification.createIntentOnClickListener(
- mTextView.getContext(), textClassification.getSecondaryIntent(i)));
+ final int count = textClassification.getActions().size();
+ for (int i = 1; i < count; i++) {
+ // Secondary assist action (Never shown).
+ addAssistMenuItem(menu, textClassification.getActions().get(i), Menu.NONE,
+ MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START + i - 1,
+ MenuItem.SHOW_AS_ACTION_NEVER);
}
}
+ private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int intemId, int order,
+ int showAsAction) {
+ final MenuItem item = menu.add(TextView.ID_ASSIST, intemId, order, action.getTitle())
+ .setContentDescription(action.getContentDescription());
+ if (action.shouldShowIcon()) {
+ item.setIcon(action.getIcon().loadDrawable(mTextView.getContext()));
+ }
+ item.setShowAsAction(showAsAction);
+ mAssistClickHandlers.put(item,
+ TextClassification.createIntentOnClickListener(action.getActionIntent()));
+ return item;
+ }
+
private void clearAssistMenuItems(Menu menu) {
int i = 0;
while (i < menu.size()) {
@@ -4094,15 +4098,11 @@
}
}
- @Nullable
- private OnClickListener getSupportedOnClickListener(
- Drawable icon, CharSequence label, Intent intent) {
- final boolean hasUi = icon != null || !TextUtils.isEmpty(label);
- if (hasUi) {
- return TextClassification.createIntentOnClickListener(
- mTextView.getContext(), intent);
- }
- return null;
+ private boolean hasLegacyAssistItem(TextClassification classification) {
+ // Check whether we have the UI data and and action.
+ return (classification.getIcon() != null || !TextUtils.isEmpty(
+ classification.getLabel())) && (classification.getIntent() != null
+ || classification.getOnClickListener() != null);
}
private boolean onAssistMenuItemClicked(MenuItem assistMenuItem) {
@@ -4120,7 +4120,7 @@
final Intent intent = assistMenuItem.getIntent();
if (intent != null) {
onClickListener = TextClassification.createIntentOnClickListener(
- mTextView.getContext(), intent);
+ TextClassification.createPendingIntent(mTextView.getContext(), intent));
}
}
if (onClickListener != null) {
@@ -4585,8 +4585,8 @@
return mContainer.isShowing();
}
- private boolean isVisible() {
- // Always show a dragging handle.
+ private boolean shouldShow() {
+ // A dragging handle should always be shown.
if (mIsDragging) {
return true;
}
@@ -4599,6 +4599,10 @@
mPositionX + mHotspotX + getHorizontalOffset(), mPositionY);
}
+ private void setVisible(final boolean visible) {
+ mContainer.getContentView().setVisibility(visible ? VISIBLE : INVISIBLE);
+ }
+
public abstract int getCurrentCursorOffset();
protected abstract void updateSelection(int offset);
@@ -4692,7 +4696,7 @@
onHandleMoved();
}
- if (isVisible()) {
+ if (shouldShow()) {
// Transform to the window coordinates to follow the view tranformation.
final int[] pts = { mPositionX + mHotspotX + getHorizontalOffset(), mPositionY};
mTextView.transformFromViewToWindowSpace(pts);
@@ -4745,6 +4749,15 @@
return 0;
}
+ private boolean tooLargeTextForMagnifier() {
+ final float magnifierContentHeight = Math.round(
+ mMagnifierAnimator.mMagnifier.getHeight()
+ / mMagnifierAnimator.mMagnifier.getZoom());
+ final Paint.FontMetrics fontMetrics = mTextView.getPaint().getFontMetrics();
+ final float glyphHeight = fontMetrics.descent - fontMetrics.ascent;
+ return glyphHeight > magnifierContentHeight;
+ }
+
/**
* Computes the position where the magnifier should be shown, relative to
* {@code mTextView}, and writes them to {@code showPosInView}. Also decides
@@ -4824,18 +4837,34 @@
return true;
}
+ private boolean handleOverlapsMagnifier() {
+ final int handleY = mContainer.getDecorViewLayoutParams().y;
+ final int magnifierBottomWhenAtWindowTop =
+ mTextView.getRootWindowInsets().getSystemWindowInsetTop()
+ + mMagnifierAnimator.mMagnifier.getHeight();
+ return handleY <= magnifierBottomWhenAtWindowTop;
+ }
+
protected final void updateMagnifier(@NonNull final MotionEvent event) {
if (mMagnifierAnimator == null) {
return;
}
final PointF showPosInView = new PointF();
- final boolean shouldShow = obtainMagnifierShowCoordinates(event, showPosInView);
+ final boolean shouldShow = !tooLargeTextForMagnifier()
+ && obtainMagnifierShowCoordinates(event, showPosInView);
if (shouldShow) {
// Make the cursor visible and stop blinking.
mRenderCursorRegardlessTiming = true;
mTextView.invalidateCursorPath();
suspendBlink();
+ // Hide handle if it overlaps the magnifier.
+ if (handleOverlapsMagnifier()) {
+ setVisible(false);
+ } else {
+ setVisible(true);
+ }
+
mMagnifierAnimator.show(showPosInView.x, showPosInView.y);
} else {
dismissMagnifier();
@@ -4847,6 +4876,7 @@
mMagnifierAnimator.dismiss();
mRenderCursorRegardlessTiming = false;
resumeBlink();
+ setVisible(true);
}
}
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index df04beb..5eb6699 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -48,7 +48,6 @@
import android.view.SurfaceView;
import android.view.ThreadedRenderer;
import android.view.View;
-import android.view.ViewParent;
import android.view.ViewRootImpl;
import com.android.internal.R;
@@ -158,36 +157,13 @@
configureCoordinates(xPosInView, yPosInView);
- // Clamp the startX value to avoid magnifying content which does not belong to the magnified
- // view. This will not take into account overlapping views.
- // For this, we compute:
- // - zeroScrollXInSurface: this is the start x of mView, where this is not masked by a
- // potential scrolling container. For example, if mView is a
- // TextView contained in a HorizontalScrollView,
- // mViewCoordinatesInSurface will reflect the surface position of
- // the first text character, rather than the position of the first
- // visible one. Therefore, we need to add back the amount of
- // scrolling from the parent containers.
- // - actualWidth: similarly, the width of a View will be larger than its actually visible
- // width when it is contained in a scrolling container. We need to use
- // the minimum width of a scrolling container which contains this view.
- int zeroScrollXInSurface = mViewCoordinatesInSurface[0];
- int actualWidth = mView.getWidth();
- ViewParent viewParent = mView.getParent();
- while (viewParent instanceof View) {
- final View container = (View) viewParent;
- if (container.canScrollHorizontally(-1 /* left scroll */)
- || container.canScrollHorizontally(1 /* right scroll */)) {
- zeroScrollXInSurface += container.getScrollX();
- actualWidth = Math.min(actualWidth, container.getWidth()
- - container.getPaddingLeft() - container.getPaddingRight());
- }
- viewParent = viewParent.getParent();
- }
-
- final int startX = Math.max(zeroScrollXInSurface, Math.min(
+ // Clamp the startX location to avoid magnifying content which does not belong
+ // to the magnified view. This will not take into account overlapping views.
+ final Rect viewVisibleRegion = new Rect();
+ mView.getGlobalVisibleRect(viewVisibleRegion);
+ final int startX = Math.max(viewVisibleRegion.left, Math.min(
mCenterZoomCoords.x - mBitmapWidth / 2,
- zeroScrollXInSurface + actualWidth - mBitmapWidth));
+ viewVisibleRegion.right - mBitmapWidth));
final int startY = mCenterZoomCoords.y - mBitmapHeight / 2;
if (xPosInView != mPrevPosInView.x || yPosInView != mPrevPosInView.y) {
@@ -417,6 +393,12 @@
private int mWindowPositionY;
private boolean mPendingWindowPositionUpdate;
+ // The lock used to synchronize the UI and render threads when a #destroy
+ // is performed on the UI thread and a frame callback on the render thread.
+ // When both mLock and mDestroyLock need to be held at the same time,
+ // mDestroyLock should be acquired before mLock in order to avoid deadlocks.
+ private final Object mDestroyLock = new Object();
+
InternalPopupWindow(final Context context, final Display display,
final Surface parentSurface,
final int width, final int height, final float elevation, final float cornerRadius,
@@ -541,9 +523,11 @@
* Destroys this instance.
*/
public void destroy() {
+ synchronized (mDestroyLock) {
+ mSurface.destroy();
+ }
synchronized (mLock) {
mRenderer.destroy();
- mSurface.destroy();
mSurfaceControl.destroy();
mSurfaceSession.kill();
mBitmapRenderNode.destroy();
@@ -591,21 +575,23 @@
final int pendingY = mWindowPositionY;
callback = frame -> {
- synchronized (mLock) {
+ synchronized (mDestroyLock) {
if (!mSurface.isValid()) {
return;
}
- mRenderer.setLightCenter(mDisplay, pendingX, pendingY);
- // Show or move the window at the content draw frame.
- SurfaceControl.openTransaction();
- mSurfaceControl.deferTransactionUntil(mSurface, frame);
- if (updateWindowPosition) {
- mSurfaceControl.setPosition(pendingX, pendingY);
+ synchronized (mLock) {
+ mRenderer.setLightCenter(mDisplay, pendingX, pendingY);
+ // Show or move the window at the content draw frame.
+ SurfaceControl.openTransaction();
+ mSurfaceControl.deferTransactionUntil(mSurface, frame);
+ if (updateWindowPosition) {
+ mSurfaceControl.setPosition(pendingX, pendingY);
+ }
+ if (firstDraw) {
+ mSurfaceControl.show();
+ }
+ SurfaceControl.closeTransaction();
}
- if (firstDraw) {
- mSurfaceControl.show();
- }
- SurfaceControl.closeTransaction();
}
};
} else {
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 05204d0..b3327a7 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -35,6 +35,7 @@
import android.view.ActionMode;
import android.view.textclassifier.Logger;
import android.view.textclassifier.SelectionEvent;
+import android.view.textclassifier.SelectionEvent.InvocationMethod;
import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationConstants;
import android.view.textclassifier.TextClassificationManager;
@@ -86,7 +87,7 @@
mTextClassificationSettings = TextClassificationManager.getSettings(mTextView.getContext());
mTextClassificationHelper = new TextClassificationHelper(
mTextView.getContext(),
- mTextView.getTextClassifier(),
+ mTextView::getTextClassifier,
getText(mTextView),
0, 1, mTextView.getTextLocales());
mSelectionTracker = new SelectionTracker(mTextView);
@@ -221,7 +222,7 @@
private boolean skipTextClassification() {
// No need to make an async call for a no-op TextClassifier.
- final boolean noOpTextClassifier = mTextView.getTextClassifier() == TextClassifier.NO_OP;
+ final boolean noOpTextClassifier = mTextView.usesNoOpTextClassifier();
// Do not call the TextClassifier if there is no selection.
final boolean noSelection = mTextView.getSelectionEnd() == mTextView.getSelectionStart();
// Do not call the TextClassifier if this is a password field.
@@ -447,7 +448,7 @@
selectionEnd = mTextView.getSelectionEnd();
}
mTextClassificationHelper.init(
- mTextView.getTextClassifier(),
+ mTextView::getTextClassifier,
getText(mTextView),
selectionStart, selectionEnd,
mTextView.getTextLocales());
@@ -498,7 +499,8 @@
mOriginalEnd = mSelectionEnd = selectionEnd;
mAllowReset = false;
maybeInvalidateLogger();
- mLogger.logSelectionStarted(text, selectionStart,
+ mLogger.logSelectionStarted(mTextView.getTextClassificationSession(),
+ text, selectionStart,
isLink ? SelectionEvent.INVOCATION_LINK : SelectionEvent.INVOCATION_MANUAL);
}
@@ -632,6 +634,7 @@
mSelectionStart, mSelectionEnd,
SelectionEvent.ACTION_ABANDON, null /* classification */);
mSelectionStart = mSelectionEnd = -1;
+ mTextView.getTextClassificationSession().destroy();
mIsPending = false;
}
}
@@ -663,6 +666,8 @@
private final Logger mLogger;
private final boolean mEditTextLogger;
private final BreakIterator mTokenIterator;
+
+ @Nullable private TextClassifier mClassificationSession;
private int mStartIndex;
private String mText;
@@ -674,20 +679,21 @@
mTokenIterator = mLogger.getTokenIterator(textView.getTextLocale());
}
- @Logger.WidgetType
+ @TextClassifier.WidgetType
private static String getWidetType(TextView textView) {
if (textView.isTextEditable()) {
- return Logger.WIDGET_EDITTEXT;
+ return TextClassifier.WIDGET_TYPE_EDITTEXT;
}
if (textView.isTextSelectable()) {
- return Logger.WIDGET_TEXTVIEW;
+ return TextClassifier.WIDGET_TYPE_TEXTVIEW;
}
- return Logger.WIDGET_UNSELECTABLE_TEXTVIEW;
+ return TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW;
}
public void logSelectionStarted(
+ TextClassifier classificationSession,
CharSequence text, int index,
- @SelectionEvent.InvocationMethod int invocationMethod) {
+ @InvocationMethod int invocationMethod) {
try {
Preconditions.checkNotNull(text);
Preconditions.checkArgumentInRange(index, 0, text.length(), "index");
@@ -697,9 +703,13 @@
mTokenIterator.setText(mText);
mStartIndex = index;
mLogger.logSelectionStartedEvent(invocationMethod, 0);
+ // TODO: Remove the above legacy logging.
+ mClassificationSession = classificationSession;
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionStartedEvent(invocationMethod, 0));
} catch (Exception e) {
// Avoid crashes due to logging.
- Log.d(LOG_TAG, e.getMessage());
+ Log.e(LOG_TAG, "" + e.getMessage(), e);
}
}
@@ -712,16 +722,34 @@
if (selection != null) {
mLogger.logSelectionModifiedEvent(
wordIndices[0], wordIndices[1], selection);
+ // TODO: Remove the above legacy logging.
+ if (mClassificationSession != null) {
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionModifiedEvent(
+ wordIndices[0], wordIndices[1], selection));
+ }
} else if (classification != null) {
mLogger.logSelectionModifiedEvent(
wordIndices[0], wordIndices[1], classification);
+ // TODO: Remove the above legacy logging.
+ if (mClassificationSession != null) {
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionModifiedEvent(
+ wordIndices[0], wordIndices[1], classification));
+ }
} else {
mLogger.logSelectionModifiedEvent(
wordIndices[0], wordIndices[1]);
+ // TODO: Remove the above legacy logging.
+ if (mClassificationSession != null) {
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionModifiedEvent(
+ wordIndices[0], wordIndices[1]));
+ }
}
} catch (Exception e) {
// Avoid crashes due to logging.
- Log.d(LOG_TAG, e.getMessage());
+ Log.e(LOG_TAG, "" + e.getMessage(), e);
}
}
@@ -736,13 +764,25 @@
if (classification != null) {
mLogger.logSelectionActionEvent(
wordIndices[0], wordIndices[1], action, classification);
+ // TODO: Remove the above legacy logging.
+ if (mClassificationSession != null) {
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionActionEvent(
+ wordIndices[0], wordIndices[1], action, classification));
+ }
} else {
mLogger.logSelectionActionEvent(
wordIndices[0], wordIndices[1], action);
+ // TODO: Remove the above legacy logging.
+ if (mClassificationSession != null) {
+ mClassificationSession.onSelectionEvent(
+ SelectionEvent.createSelectionActionEvent(
+ wordIndices[0], wordIndices[1], action));
+ }
}
} catch (Exception e) {
// Avoid crashes due to logging.
- Log.d(LOG_TAG, e.getMessage());
+ Log.e(LOG_TAG, "" + e.getMessage(), e);
}
}
@@ -887,7 +927,7 @@
private final Context mContext;
private final boolean mDarkLaunchEnabled;
- private TextClassifier mTextClassifier;
+ private Supplier<TextClassifier> mTextClassifier;
/** The original TextView text. **/
private String mText;
@@ -896,9 +936,8 @@
/** End index relative to mText. */
private int mSelectionEnd;
- private final TextSelection.Options mSelectionOptions = new TextSelection.Options();
- private final TextClassification.Options mClassificationOptions =
- new TextClassification.Options();
+ @Nullable
+ private LocaleList mDefaultLocales;
/** Trimmed text starting from mTrimStart in mText. */
private CharSequence mTrimmedText;
@@ -919,7 +958,7 @@
/** Whether the TextClassifier has been initialized. */
private boolean mHot;
- TextClassificationHelper(Context context, TextClassifier textClassifier,
+ TextClassificationHelper(Context context, Supplier<TextClassifier> textClassifier,
CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
init(textClassifier, text, selectionStart, selectionEnd, locales);
mContext = Preconditions.checkNotNull(context);
@@ -928,7 +967,7 @@
}
@UiThread
- public void init(TextClassifier textClassifier, CharSequence text,
+ public void init(Supplier<TextClassifier> textClassifier, CharSequence text,
int selectionStart, int selectionEnd, LocaleList locales) {
mTextClassifier = Preconditions.checkNotNull(textClassifier);
mText = Preconditions.checkNotNull(text).toString();
@@ -936,9 +975,7 @@
Preconditions.checkArgument(selectionEnd > selectionStart);
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
- mClassificationOptions.setDefaultLocales(locales);
- mSelectionOptions.setDefaultLocales(locales)
- .setDarkLaunchAllowed(true);
+ mDefaultLocales = locales;
}
@WorkerThread
@@ -953,13 +990,16 @@
trimText();
final TextSelection selection;
if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
- selection = mTextClassifier.suggestSelection(
- mTrimmedText, mRelativeStart, mRelativeEnd, mSelectionOptions);
+ final TextSelection.Request request = new TextSelection.Request.Builder(
+ mTrimmedText, mRelativeStart, mRelativeEnd)
+ .setDefaultLocales(mDefaultLocales)
+ .setDarkLaunchAllowed(true)
+ .build();
+ selection = mTextClassifier.get().suggestSelection(request);
} else {
// Use old APIs.
- selection = mTextClassifier.suggestSelection(
- mTrimmedText, mRelativeStart, mRelativeEnd,
- mSelectionOptions.getDefaultLocales());
+ selection = mTextClassifier.get().suggestSelection(
+ mTrimmedText, mRelativeStart, mRelativeEnd, mDefaultLocales);
}
// Do not classify new selection boundaries if TextClassifier should be dark launched.
if (!mDarkLaunchEnabled) {
@@ -994,25 +1034,26 @@
if (!Objects.equals(mText, mLastClassificationText)
|| mSelectionStart != mLastClassificationSelectionStart
|| mSelectionEnd != mLastClassificationSelectionEnd
- || !Objects.equals(
- mClassificationOptions.getDefaultLocales(),
- mLastClassificationLocales)) {
+ || !Objects.equals(mDefaultLocales, mLastClassificationLocales)) {
mLastClassificationText = mText;
mLastClassificationSelectionStart = mSelectionStart;
mLastClassificationSelectionEnd = mSelectionEnd;
- mLastClassificationLocales = mClassificationOptions.getDefaultLocales();
+ mLastClassificationLocales = mDefaultLocales;
trimText();
final TextClassification classification;
if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
- classification = mTextClassifier.classifyText(
- mTrimmedText, mRelativeStart, mRelativeEnd, mClassificationOptions);
+ final TextClassification.Request request =
+ new TextClassification.Request.Builder(
+ mTrimmedText, mRelativeStart, mRelativeEnd)
+ .setDefaultLocales(mDefaultLocales)
+ .build();
+ classification = mTextClassifier.get().classifyText(request);
} else {
// Use old APIs.
- classification = mTextClassifier.classifyText(
- mTrimmedText, mRelativeStart, mRelativeEnd,
- mClassificationOptions.getDefaultLocales());
+ classification = mTextClassifier.get().classifyText(
+ mTrimmedText, mRelativeStart, mRelativeEnd, mDefaultLocales);
}
mLastClassificationResult = new SelectionResult(
mSelectionStart, mSelectionEnd, classification, selection);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 7cf3e10..11db6b6 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -36,6 +36,7 @@
import android.annotation.StyleRes;
import android.annotation.XmlRes;
import android.app.Activity;
+import android.app.PendingIntent;
import android.app.assist.AssistStructure;
import android.content.ClipData;
import android.content.ClipDescription;
@@ -163,6 +164,7 @@
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationContext;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
@@ -427,6 +429,7 @@
private boolean mPreDrawListenerDetached;
private TextClassifier mTextClassifier;
+ private TextClassifier mTextClassificationSession;
// A flag to prevent repeated movements from escaping the enclosing text view. The idea here is
// that if a user is holding down a movement key to traverse text, we shouldn't also traverse
@@ -644,8 +647,12 @@
*/
private Layout mSavedMarqueeModeLayout;
+ // Do not update following mText/mSpannable/mPrecomputed except for setTextInternal()
@ViewDebug.ExportedProperty(category = "text")
- private CharSequence mText;
+ private @Nullable CharSequence mText;
+ private @Nullable Spannable mSpannable;
+ private @Nullable PrecomputedText mPrecomputed;
+
private CharSequence mTransformed;
private BufferType mBufferType = BufferType.NORMAL;
@@ -874,7 +881,7 @@
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
}
- mText = "";
+ setTextInternal("");
final Resources res = getResources();
final CompatibilityInfo compat = res.getCompatibilityInfo();
@@ -1615,6 +1622,13 @@
}
}
+ // Update mText and mPrecomputed
+ private void setTextInternal(@Nullable CharSequence text) {
+ mText = text;
+ mSpannable = (text instanceof Spannable) ? (Spannable) text : null;
+ mPrecomputed = (text instanceof PrecomputedText) ? (PrecomputedText) text : null;
+ }
+
/**
* Specify whether this widget should automatically scale the text to try to perfectly fit
* within the layout bounds by using the default auto-size configuration.
@@ -1973,9 +1987,9 @@
}
}
}
- } else if (mText instanceof Spannable) {
+ } else if (mSpannable != null) {
// Reset the selection.
- Selection.setSelection((Spannable) mText, getSelectionEnd());
+ Selection.setSelection(mSpannable, getSelectionEnd());
}
}
}
@@ -2359,7 +2373,7 @@
if (mMovement != movement) {
mMovement = movement;
- if (movement != null && !(mText instanceof Spannable)) {
+ if (movement != null && mSpannable == null) {
setText(mText);
}
@@ -2409,8 +2423,8 @@
return;
}
if (mTransformation != null) {
- if (mText instanceof Spannable) {
- ((Spannable) mText).removeSpan(mTransformation);
+ if (mSpannable != null) {
+ mSpannable.removeSpan(mTransformation);
}
}
@@ -5254,7 +5268,7 @@
((Editable) mText).append(text, start, end);
if (mAutoLinkMask != 0) {
- boolean linksWereAdded = Linkify.addLinks((Spannable) mText, mAutoLinkMask);
+ boolean linksWereAdded = Linkify.addLinks(mSpannable, mAutoLinkMask);
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (linksWereAdded && mLinksClickable && !textCanBeSelected()) {
@@ -5413,7 +5427,7 @@
}
if (ss.selStart >= 0 && ss.selEnd >= 0) {
- if (mText instanceof Spannable) {
+ if (mSpannable != null) {
int len = mText.length();
if (ss.selStart > len || ss.selEnd > len) {
@@ -5426,7 +5440,7 @@
Log.e(LOG_TAG, "Saved cursor position " + ss.selStart + "/" + ss.selEnd
+ " out of range for " + restored + "text " + mText);
} else {
- Selection.setSelection((Spannable) mText, ss.selStart, ss.selEnd);
+ Selection.setSelection(mSpannable, ss.selStart, ss.selEnd);
if (ss.frozenWithFocus) {
createEditorIfNeeded();
@@ -5688,7 +5702,7 @@
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
- mText = text;
+ setTextInternal(text);
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
@@ -5699,7 +5713,7 @@
}
mBufferType = type;
- mText = text;
+ setTextInternal(text);
if (mTransformation == null) {
mTransformed = text;
@@ -5825,8 +5839,8 @@
setText(text, type);
if (start >= 0 || end >= 0) {
- if (mText instanceof Spannable) {
- Selection.setSelection((Spannable) mText,
+ if (mSpannable != null) {
+ Selection.setSelection(mSpannable,
Math.max(0, Math.min(start, len)),
Math.max(0, Math.min(end, len)));
}
@@ -6020,7 +6034,7 @@
}
if (!isSuggestionsEnabled()) {
- mText = removeSuggestionSpans(mText);
+ setTextInternal(removeSuggestionSpans(mText));
}
InputMethodManager imm = InputMethodManager.peekInstance();
@@ -6948,8 +6962,7 @@
public boolean hasOverlappingRendering() {
// horizontal fading edge causes SaveLayerAlpha, which doesn't support alpha modulation
return ((getBackground() != null && getBackground().getCurrent() != null)
- || mText instanceof Spannable || hasSelection()
- || isHorizontalFadingEdgeEnabled());
+ || mSpannable != null || hasSelection() || isHorizontalFadingEdgeEnabled());
}
/**
@@ -7399,11 +7412,11 @@
@Override
public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
- if (mText instanceof Spannable && mLinksClickable) {
+ if (mSpannable != null && mLinksClickable) {
final float x = event.getX(pointerIndex);
final float y = event.getY(pointerIndex);
final int offset = getOffsetForPosition(x, y);
- final ClickableSpan[] clickables = ((Spannable) mText).getSpans(offset, offset,
+ final ClickableSpan[] clickables = mSpannable.getSpans(offset, offset,
ClickableSpan.class);
if (clickables.length > 0) {
return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_HAND);
@@ -7496,10 +7509,10 @@
} else if (which == KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD) {
// mMovement is not null from doKeyDown
- mMovement.onKeyUp(this, (Spannable) mText, keyCode, up);
+ mMovement.onKeyUp(this, mSpannable, keyCode, up);
while (--repeatCount > 0) {
- mMovement.onKeyDown(this, (Spannable) mText, keyCode, down);
- mMovement.onKeyUp(this, (Spannable) mText, keyCode, up);
+ mMovement.onKeyDown(this, mSpannable, keyCode, down);
+ mMovement.onKeyUp(this, mSpannable, keyCode, up);
}
}
@@ -7694,8 +7707,7 @@
boolean doDown = true;
if (otherEvent != null) {
try {
- boolean handled = mMovement.onKeyOther(this, (Spannable) mText,
- otherEvent);
+ boolean handled = mMovement.onKeyOther(this, mSpannable, otherEvent);
doDown = false;
if (handled) {
return KEY_EVENT_HANDLED;
@@ -7706,7 +7718,7 @@
}
}
if (doDown) {
- if (mMovement.onKeyDown(this, (Spannable) mText, keyCode, event)) {
+ if (mMovement.onKeyDown(this, mSpannable, keyCode, event)) {
if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) {
mPreventDefaultMovement = true;
}
@@ -7848,7 +7860,7 @@
}
if (mMovement != null && mLayout != null) {
- if (mMovement.onKeyUp(this, (Spannable) mText, keyCode, event)) {
+ if (mMovement.onKeyUp(this, mSpannable, keyCode, event)) {
return true;
}
}
@@ -8314,13 +8326,23 @@
}
/**
+ * Returns true if DynamicLayout is required
+ *
+ * @hide
+ */
+ @VisibleForTesting
+ public boolean useDynamicLayout() {
+ return isTextSelectable() || (mSpannable != null && mPrecomputed == null);
+ }
+
+ /**
* @hide
*/
protected Layout makeSingleLayout(int wantWidth, BoringLayout.Metrics boring, int ellipsisWidth,
Layout.Alignment alignment, boolean shouldEllipsize, TruncateAt effectiveEllipsize,
boolean useSaved) {
Layout result = null;
- if (mText instanceof Spannable) {
+ if (useDynamicLayout()) {
final DynamicLayout.Builder builder = DynamicLayout.Builder.obtain(mText, mTextPaint,
wantWidth)
.setDisplayText(mTransformed)
@@ -9262,7 +9284,7 @@
}
if (newStart != start) {
- Selection.setSelection((Spannable) mText, newStart);
+ Selection.setSelection(mSpannable, newStart);
return true;
}
@@ -9999,9 +10021,8 @@
if (mEditor != null) mEditor.onFocusChanged(focused, direction);
if (focused) {
- if (mText instanceof Spannable) {
- Spannable sp = (Spannable) mText;
- MetaKeyKeyListener.resetMetaState(sp);
+ if (mSpannable != null) {
+ MetaKeyKeyListener.resetMetaState(mSpannable);
}
}
@@ -10039,7 +10060,7 @@
*/
public void clearComposingText() {
if (mText instanceof Spannable) {
- BaseInputConnection.removeComposingSpans((Spannable) mText);
+ BaseInputConnection.removeComposingSpans(mSpannable);
}
}
@@ -10095,7 +10116,7 @@
boolean handled = false;
if (mMovement != null) {
- handled |= mMovement.onTouchEvent(this, (Spannable) mText, event);
+ handled |= mMovement.onTouchEvent(this, mSpannable, event);
}
final boolean textIsSelectable = isTextSelectable();
@@ -10103,7 +10124,7 @@
// The LinkMovementMethod which should handle taps on links has not been installed
// on non editable text that support text selection.
// We reproduce its behavior here to open links for these.
- ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
+ ClickableSpan[] links = mSpannable.getSpans(getSelectionStart(),
getSelectionEnd(), ClickableSpan.class);
if (links.length > 0) {
@@ -10138,7 +10159,7 @@
public boolean onGenericMotionEvent(MotionEvent event) {
if (mMovement != null && mText instanceof Spannable && mLayout != null) {
try {
- if (mMovement.onGenericMotionEvent(this, (Spannable) mText, event)) {
+ if (mMovement.onGenericMotionEvent(this, mSpannable, event)) {
return true;
}
} catch (AbstractMethodError ex) {
@@ -10199,8 +10220,8 @@
@Override
public boolean onTrackballEvent(MotionEvent event) {
- if (mMovement != null && mText instanceof Spannable && mLayout != null) {
- if (mMovement.onTrackballEvent(this, (Spannable) mText, event)) {
+ if (mMovement != null && mSpannable != null && mLayout != null) {
+ if (mMovement.onTrackballEvent(this, mSpannable, event)) {
return true;
}
}
@@ -11121,7 +11142,7 @@
if (mText != null) {
int updatedTextLength = mText.length();
if (updatedTextLength > 0) {
- Selection.setSelection((Spannable) mText, updatedTextLength);
+ Selection.setSelection(mSpannable, updatedTextLength);
}
}
} return true;
@@ -11509,18 +11530,64 @@
@NonNull
public TextClassifier getTextClassifier() {
if (mTextClassifier == null) {
- TextClassificationManager tcm =
+ final TextClassificationManager tcm =
mContext.getSystemService(TextClassificationManager.class);
if (tcm != null) {
- mTextClassifier = tcm.getTextClassifier();
- } else {
- mTextClassifier = TextClassifier.NO_OP;
+ return tcm.getTextClassifier();
}
+ return TextClassifier.NO_OP;
}
return mTextClassifier;
}
/**
+ * Returns a session-aware text classifier.
+ * This method creates one if none already exists or the current one is destroyed.
+ */
+ @NonNull
+ TextClassifier getTextClassificationSession() {
+ if (mTextClassificationSession == null || mTextClassificationSession.isDestroyed()) {
+ final TextClassificationManager tcm =
+ mContext.getSystemService(TextClassificationManager.class);
+ if (tcm != null) {
+ final String widgetType;
+ if (isTextEditable()) {
+ widgetType = TextClassifier.WIDGET_TYPE_EDITTEXT;
+ } else if (isTextSelectable()) {
+ widgetType = TextClassifier.WIDGET_TYPE_TEXTVIEW;
+ } else {
+ widgetType = TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW;
+ }
+ // TODO: Tagged this widgetType with a * so it we can monitor if it reports
+ // SelectionEvents exactly as the older Logger does. Remove once investigations
+ // are complete.
+ final TextClassificationContext textClassificationContext =
+ new TextClassificationContext.Builder(
+ mContext.getPackageName(), "*" + widgetType)
+ .build();
+ if (mTextClassifier != null) {
+ mTextClassificationSession = tcm.createTextClassificationSession(
+ textClassificationContext, mTextClassifier);
+ } else {
+ mTextClassificationSession = tcm.createTextClassificationSession(
+ textClassificationContext);
+ }
+ } else {
+ mTextClassificationSession = TextClassifier.NO_OP;
+ }
+ }
+ return mTextClassificationSession;
+ }
+
+ /**
+ * Returns true if this TextView uses a no-op TextClassifier.
+ */
+ boolean usesNoOpTextClassifier() {
+ return getTextClassifier() == TextClassifier.NO_OP;
+ }
+
+
+ /**
* Starts an ActionMode for the specified TextLinkSpan.
*
* @return Whether or not we're attempting to start the action mode.
@@ -11558,15 +11625,20 @@
final int start = spanned.getSpanStart(clickedSpan);
final int end = spanned.getSpanEnd(clickedSpan);
if (start >= 0 && end <= mText.length() && start < end) {
- final TextClassification.Options options = new TextClassification.Options()
- .setDefaultLocales(getTextLocales());
+ final TextClassification.Request request = new TextClassification.Request.Builder(
+ mText, start, end)
+ .setDefaultLocales(getTextLocales())
+ .build();
final Supplier<TextClassification> supplier = () ->
- getTextClassifier().classifyText(mText, start, end, options);
+ getTextClassifier().classifyText(request);
final Consumer<TextClassification> consumer = classification -> {
if (classification != null) {
- final Intent intent = classification.getIntent();
- if (intent != null) {
- TextClassification.fireIntent(mContext, intent);
+ if (!classification.getActions().isEmpty()) {
+ try {
+ classification.getActions().get(0).getActionIntent().send();
+ } catch (PendingIntent.CanceledException e) {
+ Log.e(LOG_TAG, "Error sending PendingIntent", e);
+ }
} else {
Log.d(LOG_TAG, "No link action to perform");
}
@@ -11697,7 +11769,7 @@
hideFloatingToolbar(FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY);
}
final int length = mText.length();
- Selection.setSelection((Spannable) mText, 0, length);
+ Selection.setSelection(mSpannable, 0, length);
return length > 0;
}
@@ -11725,7 +11797,7 @@
}
if (paste != null) {
if (!didFirst) {
- Selection.setSelection((Spannable) mText, max);
+ Selection.setSelection(mSpannable, max);
((Editable) mText).replace(min, max, paste);
didFirst = true;
} else {
@@ -11747,7 +11819,7 @@
selectedText = TextUtils.trimToParcelableSize(selectedText);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, selectedText);
getContext().startActivity(Intent.createChooser(sharingIntent, null));
- Selection.setSelection((Spannable) mText, getSelectionEnd());
+ Selection.setSelection(mSpannable, getSelectionEnd());
}
}
@@ -11822,7 +11894,7 @@
case DragEvent.ACTION_DRAG_LOCATION:
if (mText instanceof Spannable) {
final int offset = getOffsetForPosition(event.getX(), event.getY());
- Selection.setSelection((Spannable) mText, offset);
+ Selection.setSelection(mSpannable, offset);
}
return true;
@@ -12456,9 +12528,8 @@
+ " before=" + before + " after=" + after + ": " + buffer);
}
- if (AccessibilityManager.getInstance(mContext).isEnabled()
- && !isPasswordInputType(getInputType()) && !hasPasswordTransformationMethod()) {
- mBeforeText = buffer.toString();
+ if (AccessibilityManager.getInstance(mContext).isEnabled() && (mTransformed != null)) {
+ mBeforeText = mTransformed.toString();
}
TextView.this.sendBeforeTextChanged(buffer, start, before, after);
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 6e0ba341..97043c7 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -389,6 +389,10 @@
@Override
public void showTargetDetails(ResolveInfo ri) {
+ if (ri == null) {
+ return;
+ }
+
ComponentName name = ri.activityInfo.getComponentName();
boolean pinned = mPinnedSharedPrefs.getBoolean(name.flattenToString(), false);
ResolverTargetActionsDialogFragment f =
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 514ff76..03dd77f 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -93,6 +93,7 @@
void noteVibratorOff(int uid);
void noteGpsChanged(in WorkSource oldSource, in WorkSource newSource);
void noteGpsSignalQuality(int signalLevel);
+ void noteUsbConnectionState(boolean connected);
void noteScreenState(int state);
void noteScreenBrightness(int brightness);
void noteUserActivity(int uid, int event);
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index b049db3..f4b7032 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -187,11 +187,27 @@
@Override
public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data) {
+ return performBackup(packageInfo, data, /*flags=*/ 0);
+ }
+
+ @Override
+ public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data, int flags) {
+ boolean isIncremental = (flags & FLAG_INCREMENTAL) != 0;
+ boolean isNonIncremental = (flags & FLAG_NON_INCREMENTAL) != 0;
+
+ if (isIncremental) {
+ Log.i(TAG, "Performing incremental backup for " + packageInfo.packageName);
+ } else if (isNonIncremental) {
+ Log.i(TAG, "Performing non-incremental backup for " + packageInfo.packageName);
+ } else {
+ Log.i(TAG, "Performing backup for " + packageInfo.packageName);
+ }
+
if (DEBUG) {
try {
- StructStat ss = Os.fstat(data.getFileDescriptor());
- Log.v(TAG, "performBackup() pkg=" + packageInfo.packageName
- + " size=" + ss.st_size);
+ StructStat ss = Os.fstat(data.getFileDescriptor());
+ Log.v(TAG, "performBackup() pkg=" + packageInfo.packageName
+ + " size=" + ss.st_size + " flags=" + flags);
} catch (ErrnoException e) {
Log.w(TAG, "Unable to stat input file in performBackup() on "
+ packageInfo.packageName);
@@ -199,7 +215,26 @@
}
File packageDir = new File(mCurrentSetIncrementalDir, packageInfo.packageName);
- packageDir.mkdirs();
+ boolean hasDataForPackage = !packageDir.mkdirs();
+
+ if (isIncremental) {
+ if (mParameters.isNonIncrementalOnly() || !hasDataForPackage) {
+ if (mParameters.isNonIncrementalOnly()) {
+ Log.w(TAG, "Transport is in non-incremental only mode.");
+
+ } else {
+ Log.w(TAG,
+ "Requested incremental, but transport currently stores no data for the "
+ + "package, requesting non-incremental retry.");
+ }
+ return TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED;
+ }
+ }
+ if (isNonIncremental && hasDataForPackage) {
+ Log.w(TAG, "Requested non-incremental, deleting existing data.");
+ clearBackupData(packageInfo);
+ packageDir.mkdirs();
+ }
// Each 'record' in the restore set is kept in its own file, named by
// the record key. Wind through the data file, extracting individual
diff --git a/core/java/com/android/internal/backup/LocalTransportParameters.java b/core/java/com/android/internal/backup/LocalTransportParameters.java
index 154e79d..2427d39 100644
--- a/core/java/com/android/internal/backup/LocalTransportParameters.java
+++ b/core/java/com/android/internal/backup/LocalTransportParameters.java
@@ -26,8 +26,10 @@
private static final String TAG = "LocalTransportParams";
private static final String SETTING = Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS;
private static final String KEY_FAKE_ENCRYPTION_FLAG = "fake_encryption_flag";
+ private static final String KEY_NON_INCREMENTAL_ONLY = "non_incremental_only";
private boolean mFakeEncryptionFlag;
+ private boolean mIsNonIncrementalOnly;
LocalTransportParameters(Handler handler, ContentResolver resolver) {
super(handler, resolver, Settings.Secure.getUriFor(SETTING));
@@ -37,11 +39,16 @@
return mFakeEncryptionFlag;
}
+ boolean isNonIncrementalOnly() {
+ return mIsNonIncrementalOnly;
+ }
+
public String getSettingValue(ContentResolver resolver) {
return Settings.Secure.getString(resolver, SETTING);
}
public void update(KeyValueListParser parser) {
mFakeEncryptionFlag = parser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, false);
+ mIsNonIncrementalOnly = parser.getBoolean(KEY_NON_INCREMENTAL_ONLY, false);
}
}
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index d2e9789..3f8fd9b 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -21,6 +21,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
@@ -196,6 +197,10 @@
public void onPackagesSuspended(String[] packages) {
}
+ public void onPackagesSuspended(String[] packages, Bundle launcherExtras) {
+ onPackagesSuspended(packages);
+ }
+
public void onPackagesUnsuspended(String[] packages) {
}
@@ -433,8 +438,9 @@
}
} else if (Intent.ACTION_PACKAGES_SUSPENDED.equals(action)) {
String[] pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ final Bundle launcherExtras = intent.getBundleExtra(Intent.EXTRA_LAUNCHER_EXTRAS);
mSomePackagesChanged = true;
- onPackagesSuspended(pkgList);
+ onPackagesSuspended(pkgList, launcherExtras);
} else if (Intent.ACTION_PACKAGES_UNSUSPENDED.equals(action)) {
String[] pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
mSomePackagesChanged = true;
diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java
index 43abade..98afebc 100644
--- a/core/java/com/android/internal/net/NetworkStatsFactory.java
+++ b/core/java/com/android/internal/net/NetworkStatsFactory.java
@@ -22,16 +22,14 @@
import static android.net.NetworkStats.UID_ALL;
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
+import android.annotation.Nullable;
import android.net.NetworkStats;
import android.os.StrictMode;
import android.os.SystemClock;
-import android.util.ArrayMap;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ProcFileReader;
-import com.google.android.collect.Lists;
import libcore.io.IoUtils;
@@ -41,8 +39,10 @@
import java.io.FileReader;
import java.io.IOException;
import java.net.ProtocolException;
-import java.util.ArrayList;
-import java.util.Objects;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Creates {@link NetworkStats} instances by parsing various {@code /proc/}
@@ -56,11 +56,6 @@
private static final boolean USE_NATIVE_PARSING = true;
private static final boolean SANITY_CHECK_NATIVE = false;
- private static final String CLATD_INTERFACE_PREFIX = "v4-";
- // Delta between IPv4 header (20b) and IPv6 header (40b).
- // Used for correct stats accounting on clatd interfaces.
- private static final int IPV4V6_HEADER_DELTA = 20;
-
/** Path to {@code /proc/net/dev}. */
private final File mStatsIfaceDev;
/** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */
@@ -72,18 +67,64 @@
private boolean mUseBpfStats;
- // TODO: to improve testability and avoid global state, do not use a static variable.
- @GuardedBy("sStackedIfaces")
- private static final ArrayMap<String, String> sStackedIfaces = new ArrayMap<>();
+ // TODO: only do adjustments in NetworkStatsService and remove this.
+ /**
+ * (Stacked interface) -> (base interface) association for all connected ifaces since boot.
+ *
+ * Because counters must never roll backwards, once a given interface is stacked on top of an
+ * underlying interface, the stacked interface can never be stacked on top of
+ * another interface. */
+ private static final ConcurrentHashMap<String, String> sStackedIfaces
+ = new ConcurrentHashMap<>();
public static void noteStackedIface(String stackedIface, String baseIface) {
- synchronized (sStackedIfaces) {
- if (baseIface != null) {
- sStackedIfaces.put(stackedIface, baseIface);
- } else {
- sStackedIfaces.remove(stackedIface);
+ if (stackedIface != null && baseIface != null) {
+ sStackedIfaces.put(stackedIface, baseIface);
+ }
+ }
+
+ /**
+ * Get a set of interfaces containing specified ifaces and stacked interfaces.
+ *
+ * <p>The added stacked interfaces are ifaces stacked on top of the specified ones, or ifaces
+ * on which the specified ones are stacked. Stacked interfaces are those noted with
+ * {@link #noteStackedIface(String, String)}, but only interfaces noted before this method
+ * is called are guaranteed to be included.
+ */
+ public static String[] augmentWithStackedInterfaces(@Nullable String[] requiredIfaces) {
+ if (requiredIfaces == NetworkStats.INTERFACES_ALL) {
+ return null;
+ }
+
+ HashSet<String> relatedIfaces = new HashSet<>(Arrays.asList(requiredIfaces));
+ // ConcurrentHashMap's EntrySet iterators are "guaranteed to traverse
+ // elements as they existed upon construction exactly once, and may
+ // (but are not guaranteed to) reflect any modifications subsequent to construction".
+ // This is enough here.
+ for (Map.Entry<String, String> entry : sStackedIfaces.entrySet()) {
+ if (relatedIfaces.contains(entry.getKey())) {
+ relatedIfaces.add(entry.getValue());
+ } else if (relatedIfaces.contains(entry.getValue())) {
+ relatedIfaces.add(entry.getKey());
}
}
+
+ String[] outArray = new String[relatedIfaces.size()];
+ return relatedIfaces.toArray(outArray);
+ }
+
+ /**
+ * Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}.
+ * @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map)
+ */
+ public static void apply464xlatAdjustments(NetworkStats baseTraffic,
+ NetworkStats stackedTraffic) {
+ NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces);
+ }
+
+ @VisibleForTesting
+ public static void clearStackedIfaces() {
+ sStackedIfaces.clear();
}
public NetworkStatsFactory() {
@@ -252,51 +293,10 @@
NetworkStats lastStats) throws IOException {
final NetworkStats stats =
readNetworkStatsDetailInternal(limitUid, limitIfaces, limitTag, lastStats);
- final ArrayMap<String, String> stackedIfaces;
- synchronized (sStackedIfaces) {
- stackedIfaces = new ArrayMap<>(sStackedIfaces);
- }
- // Total 464xlat traffic to subtract from uid 0 on all base interfaces.
- final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size());
- NetworkStats.Entry entry = null; // For recycling
-
- // For 464xlat traffic, xt_qtaguid sees every IPv4 packet twice, once as a native IPv4
- // packet on the stacked interface, and once as translated to an IPv6 packet on the
- // base interface. For correct stats accounting on the base interface, every 464xlat
- // packet needs to be subtracted from the root UID on the base interface both for tx
- // and rx traffic (http://b/12249687, http:/b/33681750).
- for (int i = 0; i < stats.size(); i++) {
- entry = stats.getValues(i, entry);
- if (entry.iface == null || !entry.iface.startsWith(CLATD_INTERFACE_PREFIX)) {
- continue;
- }
- final String baseIface = stackedIfaces.get(entry.iface);
- if (baseIface == null) {
- continue;
- }
-
- NetworkStats.Entry adjust =
- new NetworkStats.Entry(baseIface, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L, 0L);
- // Subtract any 464lat traffic seen for the root UID on the current base interface.
- adjust.rxBytes -= (entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
- adjust.txBytes -= (entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
- adjust.rxPackets -= entry.rxPackets;
- adjust.txPackets -= entry.txPackets;
- adjustments.combineValues(adjust);
-
- // For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent
- // on the stacked interface with prefix "v4-" and drops the IPv6 header size after
- // unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
- // difference for all packets (http://b/12249687, http:/b/33681750).
- entry.rxBytes = entry.rxPackets * IPV4V6_HEADER_DELTA;
- entry.txBytes = entry.txPackets * IPV4V6_HEADER_DELTA;
- entry.rxPackets = 0;
- entry.txPackets = 0;
- stats.combineValues(entry);
- }
-
- stats.combineAllValues(adjustments);
+ // No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap.
+ // TODO: remove this and only apply adjustments in NetworkStatsService.
+ stats.apply464xlatAdjustments(sStackedIfaces);
return stats;
}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 3c150c1..89f6156 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -19,7 +19,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.job.JobProtoEnums;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.content.ContentResolver;
@@ -767,6 +766,8 @@
int mCameraOnNesting;
StopwatchTimer mCameraOnTimer;
+ int mUsbDataState; // 0: unknown, 1: disconnected, 2: connected
+
int mGpsSignalQualityBin = -1;
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
protected final StopwatchTimer[] mGpsSignalQualityTimer =
@@ -5240,6 +5241,19 @@
}
}
+ public void noteUsbConnectionStateLocked(boolean connected) {
+ int newState = connected ? 2 : 1;
+ if (mUsbDataState != newState) {
+ mUsbDataState = newState;
+ if (connected) {
+ mHistoryCur.states2 |= HistoryItem.STATE2_USB_DATA_LINK_FLAG;
+ } else {
+ mHistoryCur.states2 &= ~HistoryItem.STATE2_USB_DATA_LINK_FLAG;
+ }
+ addHistoryRecordLocked(mClocks.elapsedRealtime(), mClocks.uptimeMillis());
+ }
+ }
+
void stopAllPhoneSignalStrengthTimersLocked(int except) {
final long elapsedRealtime = mClocks.elapsedRealtime();
for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
@@ -5652,29 +5666,7 @@
mBluetoothScanTimer.startRunningLocked(elapsedRealtime);
}
mBluetoothScanNesting++;
-
- if (workChain != null) {
- StatsLog.write(StatsLog.BLE_SCAN_STATE_CHANGED,
- workChain.getUids(), workChain.getTags(),
- StatsLog.BLE_SCAN_STATE_CHANGED__STATE__ON);
- if (isUnoptimized) {
- StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
- workChain.getUids(), workChain.getTags(),
- StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__ON);
- }
- } else {
- StatsLog.write_non_chained(StatsLog.BLE_SCAN_STATE_CHANGED, uid, null,
- StatsLog.BLE_SCAN_STATE_CHANGED__STATE__ON);
- if (isUnoptimized) {
- StatsLog.write_non_chained(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED, uid, null,
- StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__ON);
- }
- }
-
getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime, isUnoptimized);
- if (workChain != null) {
- getUidStatsLocked(uid).addBluetoothWorkChain(workChain, isUnoptimized);
- }
}
public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws, boolean isUnoptimized) {
@@ -5704,29 +5696,7 @@
addHistoryRecordLocked(elapsedRealtime, uptime);
mBluetoothScanTimer.stopRunningLocked(elapsedRealtime);
}
-
- if (workChain != null) {
- StatsLog.write(
- StatsLog.BLE_SCAN_STATE_CHANGED, workChain.getUids(), workChain.getTags(),
- StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
- if (isUnoptimized) {
- StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
- workChain.getUids(), workChain.getTags(),
- StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
- }
- } else {
- StatsLog.write_non_chained(StatsLog.BLE_SCAN_STATE_CHANGED, uid, null,
- StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
- if (isUnoptimized) {
- StatsLog.write_non_chained(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED, uid, null,
- StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
- }
- }
-
getUidStatsLocked(uid).noteBluetoothScanStoppedLocked(elapsedRealtime, isUnoptimized);
- if (workChain != null) {
- getUidStatsLocked(uid).removeBluetoothWorkChain(workChain, isUnoptimized);
- }
}
private int getAttributionUid(int uid, WorkChain workChain) {
@@ -5761,33 +5731,9 @@
+ Integer.toHexString(mHistoryCur.states2));
addHistoryRecordLocked(elapsedRealtime, uptime);
mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtime);
-
-
for (int i=0; i<mUidStats.size(); i++) {
BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
uid.noteResetBluetoothScanLocked(elapsedRealtime);
-
- List<WorkChain> allWorkChains = uid.getAllBluetoothWorkChains();
- if (allWorkChains != null) {
- for (int j = 0; j < allWorkChains.size(); ++j) {
- StatsLog.write(StatsLog.BLE_SCAN_STATE_CHANGED,
- allWorkChains.get(j).getUids(),
- allWorkChains.get(j).getTags(),
- StatsLog.BLE_SCAN_STATE_CHANGED__STATE__OFF);
- }
- allWorkChains.clear();
- }
-
- List<WorkChain> unoptimizedWorkChains = uid.getUnoptimizedBluetoothWorkChains();
- if (unoptimizedWorkChains != null) {
- for (int j = 0; j < unoptimizedWorkChains.size(); ++j) {
- StatsLog.write(StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED,
- unoptimizedWorkChains.get(j).getUids(),
- unoptimizedWorkChains.get(j).getTags(),
- StatsLog.BLE_UNOPTIMIZED_SCAN_STATE_CHANGED__STATE__OFF);
- }
- unoptimizedWorkChains.clear();
- }
}
}
}
@@ -5999,7 +5945,6 @@
if (strengthBin >= 0) {
if (!mWifiSignalStrengthsTimer[strengthBin].isRunningLocked()) {
mWifiSignalStrengthsTimer[strengthBin].startRunningLocked(elapsedRealtime);
- StatsLog.write(StatsLog.WIFI_SIGNAL_STRENGTH_CHANGED, strengthBin);
}
mHistoryCur.states2 =
(mHistoryCur.states2&~HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_MASK)
@@ -6010,6 +5955,7 @@
} else {
stopAllWifiSignalStrengthTimersLocked(-1);
}
+ StatsLog.write(StatsLog.WIFI_SIGNAL_STRENGTH_CHANGED, strengthBin);
mWifiSignalStrengthBin = strengthBin;
}
}
@@ -6859,15 +6805,6 @@
*/
final SparseArray<Pid> mPids = new SparseArray<>();
- /**
- * The list of WorkChains associated with active bluetooth scans.
- *
- * NOTE: This is a hack and it only needs to exist because there's a "reset" API that is
- * supposed to stop and log all WorkChains that were currently active.
- */
- ArrayList<WorkChain> mAllBluetoothChains = null;
- ArrayList<WorkChain> mUnoptimizedBluetoothChains = null;
-
public Uid(BatteryStatsImpl bsi, int uid) {
mBsi = bsi;
mUid = uid;
@@ -7250,25 +7187,17 @@
public void noteAudioTurnedOnLocked(long elapsedRealtimeMs) {
createAudioTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, getUid(), null,
- StatsLog.AUDIO_STATE_CHANGED__STATE__ON);
}
public void noteAudioTurnedOffLocked(long elapsedRealtimeMs) {
if (mAudioTurnedOnTimer != null) {
mAudioTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
- if (!mAudioTurnedOnTimer.isRunningLocked()) { // only tell statsd if truly stopped
- StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, getUid(), null,
- StatsLog.AUDIO_STATE_CHANGED__STATE__OFF);
- }
}
}
public void noteResetAudioLocked(long elapsedRealtimeMs) {
if (mAudioTurnedOnTimer != null) {
mAudioTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, getUid(), null,
- StatsLog.AUDIO_STATE_CHANGED__STATE__OFF);
}
}
@@ -7282,25 +7211,17 @@
public void noteVideoTurnedOnLocked(long elapsedRealtimeMs) {
createVideoTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED, getUid(), null,
- StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED__STATE__ON);
}
public void noteVideoTurnedOffLocked(long elapsedRealtimeMs) {
if (mVideoTurnedOnTimer != null) {
mVideoTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
- if (!mVideoTurnedOnTimer.isRunningLocked()) { // only tell statsd if truly stopped
- StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED, getUid(),
- null, StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED__STATE__OFF);
- }
}
}
public void noteResetVideoLocked(long elapsedRealtimeMs) {
if (mVideoTurnedOnTimer != null) {
mVideoTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED, getUid(), null,
- StatsLog.MEDIA_CODEC_ACTIVITY_CHANGED__STATE__OFF);
}
}
@@ -7314,25 +7235,17 @@
public void noteFlashlightTurnedOnLocked(long elapsedRealtimeMs) {
createFlashlightTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, getUid(), null,
- StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__ON);
}
public void noteFlashlightTurnedOffLocked(long elapsedRealtimeMs) {
if (mFlashlightTurnedOnTimer != null) {
mFlashlightTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
- if (!mFlashlightTurnedOnTimer.isRunningLocked()) {
- StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, getUid(), null,
- StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__OFF);
- }
}
}
public void noteResetFlashlightLocked(long elapsedRealtimeMs) {
if (mFlashlightTurnedOnTimer != null) {
mFlashlightTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, getUid(), null,
- StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__OFF);
}
}
@@ -7346,25 +7259,17 @@
public void noteCameraTurnedOnLocked(long elapsedRealtimeMs) {
createCameraTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, getUid(), null,
- StatsLog.CAMERA_STATE_CHANGED__STATE__ON);
}
public void noteCameraTurnedOffLocked(long elapsedRealtimeMs) {
if (mCameraTurnedOnTimer != null) {
mCameraTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
- if (!mCameraTurnedOnTimer.isRunningLocked()) { // only tell statsd if truly stopped
- StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, getUid(), null,
- StatsLog.CAMERA_STATE_CHANGED__STATE__OFF);
- }
}
}
public void noteResetCameraLocked(long elapsedRealtimeMs) {
if (mCameraTurnedOnTimer != null) {
mCameraTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, getUid(), null,
- StatsLog.CAMERA_STATE_CHANGED__STATE__OFF);
}
}
@@ -7428,40 +7333,6 @@
}
}
- public void addBluetoothWorkChain(WorkChain workChain, boolean isUnoptimized) {
- if (mAllBluetoothChains == null) {
- mAllBluetoothChains = new ArrayList<WorkChain>(4);
- }
-
- if (isUnoptimized && mUnoptimizedBluetoothChains == null) {
- mUnoptimizedBluetoothChains = new ArrayList<WorkChain>(4);
- }
-
- mAllBluetoothChains.add(workChain);
- if (isUnoptimized) {
- mUnoptimizedBluetoothChains.add(workChain);
- }
- }
-
- public void removeBluetoothWorkChain(WorkChain workChain, boolean isUnoptimized) {
- if (mAllBluetoothChains != null) {
- mAllBluetoothChains.remove(workChain);
- }
-
- if (isUnoptimized && mUnoptimizedBluetoothChains != null) {
- mUnoptimizedBluetoothChains.remove(workChain);
- }
- }
-
- public List<WorkChain> getAllBluetoothWorkChains() {
- return mAllBluetoothChains;
- }
-
- public List<WorkChain> getUnoptimizedBluetoothWorkChains() {
- return mUnoptimizedBluetoothChains;
- }
-
-
public void noteResetBluetoothScanLocked(long elapsedRealtimeMs) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
@@ -10040,8 +9911,6 @@
DualTimer t = mSyncStats.startObject(name);
if (t != null) {
t.startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, getUid(), null, name,
- StatsLog.SYNC_STATE_CHANGED__STATE__ON);
}
}
@@ -10049,10 +9918,6 @@
DualTimer t = mSyncStats.stopObject(name);
if (t != null) {
t.stopRunningLocked(elapsedRealtimeMs);
- if (!t.isRunningLocked()) { // only tell statsd if truly stopped
- StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, getUid(), null, name,
- StatsLog.SYNC_STATE_CHANGED__STATE__OFF);
- }
}
}
@@ -10060,9 +9925,6 @@
DualTimer t = mJobStats.startObject(name);
if (t != null) {
t.startRunningLocked(elapsedRealtimeMs);
- StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
- JobProtoEnums.STOP_REASON_CANCELLED);
}
}
@@ -10070,11 +9932,6 @@
DualTimer t = mJobStats.stopObject(name);
if (t != null) {
t.stopRunningLocked(elapsedRealtimeMs);
- if (!t.isRunningLocked()) { // only tell statsd if truly stopped
- StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
- stopReason);
- }
}
if (mBsi.mOnBatteryTimeBase.isRunning()) {
SparseIntArray types = mJobCompletions.get(name);
@@ -10182,10 +10039,6 @@
public void noteStartSensor(int sensor, long elapsedRealtimeMs) {
DualTimer t = getSensorTimerLocked(sensor, /* create= */ true);
t.startRunningLocked(elapsedRealtimeMs);
- if (sensor != Sensor.GPS) {
- StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, getUid(), null, sensor,
- StatsLog.SENSOR_STATE_CHANGED__STATE__ON);
- }
}
public void noteStopSensor(int sensor, long elapsedRealtimeMs) {
@@ -10193,10 +10046,6 @@
DualTimer t = getSensorTimerLocked(sensor, false);
if (t != null) {
t.stopRunningLocked(elapsedRealtimeMs);
- if (sensor != Sensor.GPS) {
- StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, getUid(), null,
- sensor, StatsLog.SENSOR_STATE_CHANGED__STATE__OFF);
- }
}
}
diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java
index 89a4e17..dc660a4 100644
--- a/core/java/com/android/internal/os/RoSystemProperties.java
+++ b/core/java/com/android/internal/os/RoSystemProperties.java
@@ -31,6 +31,8 @@
SystemProperties.get("ro.control_privapp_permissions");
// ------ ro.config.* -------- //
+ public static final boolean CONFIG_AVOID_GFX_ACCEL =
+ SystemProperties.getBoolean("ro.config.avoid_gfx_accel", false);
public static final boolean CONFIG_LOW_RAM =
SystemProperties.getBoolean("ro.config.low_ram", false);
public static final boolean CONFIG_SMALL_BATTERY =
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 28a7c12..cbd3ad5 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -53,10 +53,21 @@
public static final int DISABLE_VERIFIER = 1 << 9;
/** Only use oat files located in /system. Otherwise use dex/jar/apk . */
public static final int ONLY_USE_SYSTEM_OAT_FILES = 1 << 10;
- /** Do enfore hidden API access restrictions. */
- public static final int ENABLE_HIDDEN_API_CHECKS = 1 << 11;
/** Force generation of native debugging information for backtraces. */
- public static final int DEBUG_GENERATE_MINI_DEBUG_INFO = 1 << 12;
+ public static final int DEBUG_GENERATE_MINI_DEBUG_INFO = 1 << 11;
+ /**
+ * Hidden API access restrictions. This is a mask for bits representing the API enforcement
+ * policy, defined by {@code @ApplicationInfo.HiddenApiEnforcementPolicy}.
+ */
+ public static final int API_ENFORCEMENT_POLICY_MASK = (1 << 12) | (1 << 13);
+ /**
+ * Bit shift for use with {@link #API_ENFORCEMENT_POLICY_MASK}.
+ *
+ * (flags & API_ENFORCEMENT_POLICY_MASK) >> API_ENFORCEMENT_POLICY_SHIFT gives
+ * @ApplicationInfo.ApiEnforcementPolicy values.
+ */
+ public static final int API_ENFORCEMENT_POLICY_SHIFT =
+ Integer.numberOfTrailingZeros(API_ENFORCEMENT_POLICY_MASK);
/** No external storage should be mounted. */
public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE;
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index cd83c57..5d40a73 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -47,6 +47,8 @@
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
+
import libcore.io.IoUtils;
/**
@@ -159,6 +161,11 @@
return null;
}
+ if (parsedArgs.apiBlacklistExemptions != null) {
+ handleApiBlacklistExemptions(parsedArgs.apiBlacklistExemptions);
+ return null;
+ }
+
if (parsedArgs.permittedCapabilities != 0 || parsedArgs.effectiveCapabilities != 0) {
throw new ZygoteSecurityException("Client may not specify capabilities: " +
"permitted=0x" + Long.toHexString(parsedArgs.permittedCapabilities) +
@@ -278,6 +285,15 @@
}
}
+ private void handleApiBlacklistExemptions(String[] exemptions) {
+ try {
+ ZygoteInit.setApiBlacklistExemptions(exemptions);
+ mSocketOutStream.writeInt(0);
+ } catch (IOException ioe) {
+ throw new IllegalStateException("Error writing to command socket", ioe);
+ }
+ }
+
protected void preload() {
ZygoteInit.lazyPreload();
}
@@ -439,6 +455,12 @@
boolean startChildZygote;
/**
+ * Exemptions from API blacklisting. These are sent to the pre-forked zygote at boot time,
+ * or when they change, via --set-api-blacklist-exemptions.
+ */
+ String[] apiBlacklistExemptions;
+
+ /**
* Constructs instance and parses args
* @param args zygote command-line args
* @throws IllegalArgumentException
@@ -592,6 +614,11 @@
preloadDefault = true;
} else if (arg.equals("--start-child-zygote")) {
startChildZygote = true;
+ } else if (arg.equals("--set-api-blacklist-exemptions")) {
+ // consume all remaining args; this is a stand-alone command, never included
+ // with the regular fork command.
+ apiBlacklistExemptions = Arrays.copyOfRange(args, curArg + 1, args.length);
+ curArg = args.length;
} else {
break;
}
@@ -606,7 +633,7 @@
throw new IllegalArgumentException(
"Unexpected arguments after --preload-package.");
}
- } else if (!preloadDefault) {
+ } else if (!preloadDefault && apiBlacklistExemptions == null) {
if (!seenRuntimeArgs) {
throw new IllegalArgumentException("Unexpected argument : " + args[curArg]);
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 66035f4..c5d41db 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -514,6 +514,10 @@
/* should never reach here */
}
+ public static void setApiBlacklistExemptions(String[] exemptions) {
+ VMRuntime.getRuntime().setHiddenApiExemptions(exemptions);
+ }
+
/**
* Creates a PathClassLoader for the given class path that is associated with a shared
* namespace, i.e., this classloader can access platform-private native libraries. The
@@ -652,7 +656,7 @@
String args[] = {
"--setuid=1000",
"--setgid=1000",
- "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,1065,3001,3002,3003,3006,3007,3009,3010",
+ "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 221bf88..ad5743d 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -18,7 +18,7 @@
import android.content.ComponentName;
import android.graphics.Rect;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
@@ -141,7 +141,7 @@
void showShutdownUi(boolean isReboot, String reason);
// Used to show the dialog when FingerprintService starts authentication
- void showFingerprintDialog(in Bundle bundle, IFingerprintDialogReceiver receiver);
+ void showFingerprintDialog(in Bundle bundle, IBiometricDialogReceiver receiver);
// Used to hide the dialog when a finger is authenticated
void onFingerprintAuthenticated();
// Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index adf4287..0c5efe2 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -20,7 +20,7 @@
import android.graphics.Rect;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
@@ -88,7 +88,7 @@
void showPinningEscapeToast();
// Used to show the dialog when FingerprintService starts authentication
- void showFingerprintDialog(in Bundle bundle, IFingerprintDialogReceiver receiver);
+ void showFingerprintDialog(in Bundle bundle, IBiometricDialogReceiver receiver);
// Used to hide the dialog when a finger is authenticated
void onFingerprintAuthenticated();
// Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index 59b14f1..ae7ba19 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -61,7 +61,6 @@
void initRecoveryServiceWithSigFile(in String rootCertificateAlias,
in byte[] recoveryServiceCertFile, in byte[] recoveryServiceSigFile);
KeyChainSnapshot getKeyChainSnapshot();
- byte[] generateAndStoreKey(String alias);
String generateKey(String alias);
String importKey(String alias, in byte[] keyBytes);
String getKey(String alias);
diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java
index 51dd929..e8fc598 100644
--- a/core/java/com/android/internal/widget/LockPatternView.java
+++ b/core/java/com/android/internal/widget/LockPatternView.java
@@ -1000,6 +1000,11 @@
setPatternInProgress(false);
cancelLineAnimations();
notifyPatternDetected();
+ // Also clear pattern if fading is enabled
+ if (mFadePattern) {
+ clearPatternDrawLookup();
+ mPatternDisplayMode = DisplayMode.Correct;
+ }
invalidate();
}
if (PROFILE_DRAWING) {
diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/core/java/com/android/server/NetworkManagementSocketTagger.java
index 03f2bc1..2959667 100644
--- a/core/java/com/android/server/NetworkManagementSocketTagger.java
+++ b/core/java/com/android/server/NetworkManagementSocketTagger.java
@@ -67,6 +67,10 @@
return old;
}
+ public static int getThreadSocketStatsUid() {
+ return threadSocketTags.get().statsUid;
+ }
+
@Override
public void tag(FileDescriptor fd) throws SocketException {
final SocketTags options = threadSocketTags.get();
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index c71e505..c5be8e4 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -142,12 +142,24 @@
// Package names that are exempted from private API blacklisting
final ArraySet<String> mHiddenApiPackageWhitelist = new ArraySet<>();
+ // The list of carrier applications which should be disabled until used.
+ // This function suppresses update notifications for these pre-installed apps.
+ // In SubscriptionInfoUpdater, the listed applications are disabled until used when all of the
+ // following conditions are met.
+ // 1. Not currently carrier-privileged according to the inserted SIM
+ // 2. Pre-installed
+ // 3. In the default state (enabled but not explicitly)
+ // And SubscriptionInfoUpdater undoes this and marks the app enabled when a SIM is inserted
+ // that marks the app as carrier privileged. It also grants the app default permissions
+ // for Phone and Location. As such, apps MUST only ever be added to this list if they
+ // obtain user consent to access their location through other means.
+ final ArraySet<String> mDisabledUntilUsedPreinstalledCarrierApps = new ArraySet<>();
+
// These are the packages of carrier-associated apps which should be disabled until used until
// a SIM is inserted which grants carrier privileges to that carrier app.
final ArrayMap<String, List<String>> mDisabledUntilUsedPreinstalledCarrierAssociatedApps =
new ArrayMap<>();
-
final ArrayMap<String, ArraySet<String>> mPrivAppPermissions = new ArrayMap<>();
final ArrayMap<String, ArraySet<String>> mPrivAppDenyPermissions = new ArrayMap<>();
@@ -232,6 +244,10 @@
return mBackupTransportWhitelist;
}
+ public ArraySet<String> getDisabledUntilUsedPreinstalledCarrierApps() {
+ return mDisabledUntilUsedPreinstalledCarrierApps;
+ }
+
public ArrayMap<String, List<String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps() {
return mDisabledUntilUsedPreinstalledCarrierAssociatedApps;
}
@@ -630,6 +646,18 @@
associatedPkgs.add(pkgname);
}
XmlUtils.skipCurrentTag(parser);
+ } else if ("disabled-until-used-preinstalled-carrier-app".equals(name)
+ && allowAppConfigs) {
+ String pkgname = parser.getAttributeValue(null, "package");
+ if (pkgname == null) {
+ Slog.w(TAG,
+ "<disabled-until-used-preinstalled-carrier-app> without "
+ + "package in " + permFile + " at "
+ + parser.getPositionDescription());
+ } else {
+ mDisabledUntilUsedPreinstalledCarrierApps.add(pkgname);
+ }
+ XmlUtils.skipCurrentTag(parser);
} else if ("privapp-permissions".equals(name) && allowPrivappPermissions) {
// privapp permissions from system, vendor and product partitions are stored
// separately. This is to prevent xml files in the vendor partition from
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 1d22093..302189f 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -195,6 +195,7 @@
"android_content_res_ObbScanner.cpp",
"android_content_res_Configuration.cpp",
"android_animation_PropertyValuesHolder.cpp",
+ "android_security_Scrypt.cpp",
"com_android_internal_net_NetworkStatsFactory.cpp",
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
@@ -228,6 +229,7 @@
"libseccomp_policy",
"libselinux",
"libgrallocusage",
+ "libscrypt_static",
],
shared_libs: [
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5ae4a52..f8dd7ac 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -208,6 +208,7 @@
extern int register_android_content_res_ObbScanner(JNIEnv* env);
extern int register_android_content_res_Configuration(JNIEnv* env);
extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
+extern int register_android_security_Scrypt(JNIEnv *env);
extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env);
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
@@ -1492,6 +1493,7 @@
REG_JNI(register_android_content_res_Configuration),
REG_JNI(register_android_animation_PropertyValuesHolder),
+ REG_JNI(register_android_security_Scrypt),
REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
REG_JNI(register_com_android_internal_net_NetworkStatsFactory),
REG_JNI(register_com_android_internal_os_FuseAppLoop),
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index 726c450..825b7a0 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -210,7 +210,7 @@
jint desiredWidth, jint desiredHeight, jobject jsubset,
jboolean requireMutable, jint allocator,
jboolean requireUnpremul, jboolean preferRamOverQuality,
- jboolean asAlphaMask) {
+ jboolean asAlphaMask, jobject jcolorSpace) {
auto* decoder = reinterpret_cast<ImageDecoder*>(nativePtr);
SkAndroidCodec* codec = decoder->mCodec.get();
const SkISize desiredSize = SkISize::Make(desiredWidth, desiredHeight);
@@ -264,7 +264,8 @@
// This is currently the only way to know that we should decode to F16.
colorType = codec->computeOutputColorType(colorType);
}
- sk_sp<SkColorSpace> colorSpace = codec->computeOutputColorSpace(colorType);
+ sk_sp<SkColorSpace> colorSpace = GraphicsJNI::getNativeColorSpace(env, jcolorSpace);
+ colorSpace = codec->computeOutputColorSpace(colorType, colorSpace);
decodeInfo = decodeInfo.makeColorType(colorType).makeColorSpace(colorSpace);
SkBitmap bm;
@@ -507,18 +508,26 @@
return encodedFormatToString(env, decoder->mCodec->getEncodedFormat());
}
+static jobject ImageDecoder_nGetColorSpace(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
+ auto* codec = reinterpret_cast<ImageDecoder*>(nativePtr)->mCodec.get();
+ auto colorType = codec->computeOutputColorType(codec->getInfo().colorType());
+ sk_sp<SkColorSpace> colorSpace = codec->computeOutputColorSpace(colorType);
+ return GraphicsJNI::getColorSpace(env, colorSpace, colorType);
+}
+
static const JNINativeMethod gImageDecoderMethods[] = {
{ "nCreate", "(JLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset },
{ "nCreate", "(Ljava/nio/ByteBuffer;IILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
{ "nCreate", "([BIILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray },
{ "nCreate", "(Ljava/io/InputStream;[BLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream },
{ "nCreate", "(Ljava/io/FileDescriptor;Landroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd },
- { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZ)Landroid/graphics/Bitmap;",
+ { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;",
(void*) ImageDecoder_nDecodeBitmap },
{ "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize },
{ "nGetPadding", "(JLandroid/graphics/Rect;)V", (void*) ImageDecoder_nGetPadding },
{ "nClose", "(J)V", (void*) ImageDecoder_nClose},
{ "nGetMimeType", "(J)Ljava/lang/String;", (void*) ImageDecoder_nGetMimeType },
+ { "nGetColorSpace", "(J)Landroid/graphics/ColorSpace;", (void*) ImageDecoder_nGetColorSpace },
};
int register_android_graphics_ImageDecoder(JNIEnv* env) {
diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp
index d3d6882..97abd82 100644
--- a/core/jni/android/graphics/Path.cpp
+++ b/core/jni/android/graphics/Path.cpp
@@ -37,6 +37,14 @@
class SkPathGlue {
public:
+ static void finalizer(SkPath* obj) {
+ // Purge entries from the HWUI path cache if this path's data is unique
+ if (obj->unique() && android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().pathCache.removeDeferred(obj);
+ }
+ delete obj;
+ }
+
// ---------------- Regular JNI -----------------------------
static jlong init(JNIEnv* env, jclass clazz) {
@@ -48,13 +56,8 @@
return reinterpret_cast<jlong>(new SkPath(*val));
}
- static void finalize(JNIEnv* env, jclass clazz, jlong objHandle) {
- SkPath* obj = reinterpret_cast<SkPath*>(objHandle);
- // Purge entries from the HWUI path cache if this path's data is unique
- if (obj->unique() && android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().pathCache.removeDeferred(obj);
- }
- delete obj;
+ static jlong getFinalizer(JNIEnv* env, jclass clazz) {
+ return static_cast<jlong>(reinterpret_cast<uintptr_t>(&finalizer));
}
static void set(JNIEnv* env, jclass clazz, jlong dstHandle, jlong srcHandle) {
@@ -469,7 +472,9 @@
SkRect rect;
SkPath* obj = reinterpret_cast<SkPath*>(objHandle);
jboolean result = obj->isRect(&rect);
- GraphicsJNI::rect_to_jrectf(rect, env, jrect);
+ if (jrect) {
+ GraphicsJNI::rect_to_jrectf(rect, env, jrect);
+ }
return result;
}
@@ -510,7 +515,7 @@
static const JNINativeMethod methods[] = {
{"nInit","()J", (void*) SkPathGlue::init},
{"nInit","(J)J", (void*) SkPathGlue::init_Path},
- {"nFinalize", "(J)V", (void*) SkPathGlue::finalize},
+ {"nGetFinalizer", "()J", (void*) SkPathGlue::getFinalizer},
{"nSet","(JJ)V", (void*) SkPathGlue::set},
{"nComputeBounds","(JLandroid/graphics/RectF;)V", (void*) SkPathGlue::computeBounds},
{"nIncReserve","(JI)V", (void*) SkPathGlue::incReserve},
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index c9bfa13..7f90d8e 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -448,8 +448,9 @@
jboolean hasAlpha, jlong paintHandle) {
// Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will
// correct the alphaType to kOpaque_SkAlphaType.
- SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType,
- GraphicsJNI::defaultColorSpace());
+ SkImageInfo info = SkImageInfo::Make(width, height,
+ hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
+ kPremul_SkAlphaType);
SkBitmap bitmap;
bitmap.setInfo(info);
sk_sp<Bitmap> androidBitmap = Bitmap::allocateHeapBitmap(&bitmap);
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index b610b35..e02741f 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -49,6 +49,22 @@
#define ALIGN(x, mask) ( ((x) + (mask) - 1) & ~((mask) - 1) )
+// Use BAD_VALUE for surface abandoned error
+#define OVERRIDE_SURFACE_ERROR(err) \
+do { \
+ if (err == -ENODEV) { \
+ err = BAD_VALUE; \
+ } \
+} while (0)
+
+#define UPDATE(md, tag, data, size) \
+do { \
+ if ((md).update((tag), (data), (size))) { \
+ ALOGE("Update " #tag " failed!"); \
+ return BAD_VALUE; \
+ } \
+} while (0)
+
/**
* Convert from RGB 888 to Y'CbCr using the conversion specified in JFIF v1.02
*/
@@ -108,6 +124,7 @@
if (err != NO_ERROR) {
ALOGE("%s: Failed to set native window usage flag, error %s (%d).", __FUNCTION__,
strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
@@ -117,6 +134,7 @@
if (err != NO_ERROR) {
ALOGE("%s: Failed to get native window min undequeued buffers, error %s (%d).",
__FUNCTION__, strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
@@ -126,6 +144,7 @@
if (err != NO_ERROR) {
ALOGE("%s: Failed to set native window buffer count, error %s (%d).", __FUNCTION__,
strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
@@ -180,7 +199,12 @@
// TODO: Switch to using Surface::lock and Surface::unlockAndPost
err = native_window_dequeue_buffer_and_wait(anw.get(), &anb);
- if (err != NO_ERROR) return err;
+ if (err != NO_ERROR) {
+ ALOGE("%s: Failed to dequeue buffer, error %s (%d).", __FUNCTION__,
+ strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
+ return err;
+ }
sp<GraphicBuffer> buf(GraphicBuffer::from(anb));
uint32_t grallocBufWidth = buf->getWidth();
@@ -198,6 +222,7 @@
if (err != NO_ERROR) {
ALOGE("%s: Error while querying surface pixel format %s (%d).", __FUNCTION__,
strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
@@ -345,6 +370,7 @@
err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), /*fenceFd*/-1);
if (err != NO_ERROR) {
ALOGE("%s: Failed to queue buffer, error %s (%d).", __FUNCTION__, strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
@@ -420,6 +446,7 @@
if(err != NO_ERROR) {
ALOGE("%s: Error while querying surface pixel format %s (%d).", __FUNCTION__, strerror(-err),
err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return fmt;
@@ -437,6 +464,7 @@
if(err != NO_ERROR) {
ALOGE("%s: Error while querying surface dataspace %s (%d).", __FUNCTION__, strerror(-err),
err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return fmt;
@@ -466,12 +494,14 @@
if(err != NO_ERROR) {
ALOGE("%s: Error while querying surface width %s (%d).", __FUNCTION__, strerror(-err),
err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
err = anw->query(anw.get(), NATIVE_WINDOW_HEIGHT, dimenBuf + 1);
if(err != NO_ERROR) {
ALOGE("%s: Error while querying surface height %s (%d).", __FUNCTION__, strerror(-err),
err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
env->SetIntArrayRegion(dimens, /*start*/0, /*length*/ARRAY_SIZE(dimenBuf), dimenBuf);
@@ -493,6 +523,7 @@
if(err != NO_ERROR) {
jniThrowException(env, "java/lang/UnsupportedOperationException;",
"Error while querying surface usage bits");
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return usage;
@@ -513,6 +544,7 @@
if(err != NO_ERROR) {
jniThrowException(env, "java/lang/UnsupportedOperationException;",
"Error while disconnecting surface");
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
@@ -532,6 +564,7 @@
if(err != NO_ERROR) {
ALOGE("%s: Error while querying SurfaceTexture width %s (%d)", __FUNCTION__,
strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
@@ -539,6 +572,7 @@
if(err != NO_ERROR) {
ALOGE("%s: Error while querying SurfaceTexture height %s (%d)", __FUNCTION__,
strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
@@ -559,6 +593,7 @@
status_t err = connectSurface(s, CAMERA_DEVICE_BUFFER_SLACK);
if (err != NO_ERROR) {
ALOGE("%s: Error while configuring surface %s (%d).", __FUNCTION__, strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
@@ -609,6 +644,7 @@
status_t err = native_window_set_buffers_format(anw.get(), pixelFormat);
if (err != NO_ERROR) {
ALOGE("%s: Error while setting surface format %s (%d).", __FUNCTION__, strerror(-err), err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
@@ -629,6 +665,7 @@
if (err != NO_ERROR) {
ALOGE("%s: Error while setting surface user dimens %s (%d).", __FUNCTION__, strerror(-err),
err);
+ OVERRIDE_SURFACE_ERROR(err);
return err;
}
return NO_ERROR;
diff --git a/core/jni/android_security_Scrypt.cpp b/core/jni/android_security_Scrypt.cpp
new file mode 100644
index 0000000..3350804
--- /dev/null
+++ b/core/jni/android_security_Scrypt.cpp
@@ -0,0 +1,72 @@
+/*
+ * 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 "Scrypt"
+
+#include <nativehelper/JNIHelp.h>
+#include "jni.h"
+
+#include <android_runtime/Log.h>
+#include <utils/Timers.h>
+#include <utils/misc.h>
+#include <utils/String8.h>
+#include <utils/Log.h>
+
+extern "C" {
+#include "crypto_scrypt.h"
+}
+
+namespace android {
+
+static jbyteArray android_security_Scrypt_nativeScrypt(JNIEnv* env, jobject, jbyteArray password, jbyteArray salt, jint N, jint r, jint p, jint outLen) {
+ if (!password || !salt) {
+ return NULL;
+ }
+
+ int passwordLen = env->GetArrayLength(password);
+ int saltLen = env->GetArrayLength(salt);
+ jbyteArray ret = env->NewByteArray(outLen);
+
+ jbyte* passwordPtr = (jbyte*)env->GetByteArrayElements(password, NULL);
+ jbyte* saltPtr = (jbyte*)env->GetByteArrayElements(salt, NULL);
+ jbyte* retPtr = (jbyte*)env->GetByteArrayElements(ret, NULL);
+
+ int rc = crypto_scrypt((const uint8_t *)passwordPtr, passwordLen,
+ (const uint8_t *)saltPtr, saltLen, N, r, p, (uint8_t *)retPtr,
+ outLen);
+ env->ReleaseByteArrayElements(password, passwordPtr, JNI_ABORT);
+ env->ReleaseByteArrayElements(salt, saltPtr, JNI_ABORT);
+ env->ReleaseByteArrayElements(ret, retPtr, 0);
+
+ if (!rc) {
+ return ret;
+ } else {
+ SLOGE("scrypt failed");
+ return NULL;
+ }
+}
+
+static const JNINativeMethod sMethods[] = {
+ /* name, signature, funcPtr */
+ {"nativeScrypt", "([B[BIIII)[B", (void*)android_security_Scrypt_nativeScrypt},
+};
+
+int register_android_security_Scrypt(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "android/security/Scrypt",
+ sMethods, NELEM(sMethods));
+}
+
+} /* namespace android */
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 04cb08f..b0f68cd 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -37,7 +37,7 @@
#include <system/graphics.h>
#include <ui/DisplayInfo.h>
#include <ui/FrameStats.h>
-#include <ui/GraphicsTypes.h>
+#include <ui/GraphicTypes.h>
#include <ui/HdrCapabilities.h>
#include <ui/Rect.h>
#include <ui/Region.h>
@@ -598,7 +598,7 @@
static jintArray nativeGetDisplayColorModes(JNIEnv* env, jclass, jobject tokenObj) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return NULL;
- Vector<ColorMode> colorModes;
+ Vector<ui::ColorMode> colorModes;
if (SurfaceComposerClient::getDisplayColorModes(token, &colorModes) != NO_ERROR ||
colorModes.isEmpty()) {
return NULL;
@@ -628,7 +628,7 @@
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return JNI_FALSE;
status_t err = SurfaceComposerClient::setActiveColorMode(token,
- static_cast<ColorMode>(colorMode));
+ static_cast<ui::ColorMode>(colorMode));
return err == NO_ERROR ? JNI_TRUE : JNI_FALSE;
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index b5fd792..b2853c9 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -260,7 +260,7 @@
}
// Apply system or app filter based on uid.
- if (getuid() >= AID_APP_START) {
+ if (uid >= AID_APP_START) {
set_app_seccomp_filter();
} else {
set_system_seccomp_filter();
@@ -619,11 +619,6 @@
fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)));
}
- // Must be called when the new process still has CAP_SYS_ADMIN. The other alternative is to
- // call prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that breaks SELinux domain transition (see
- // b/71859146).
- SetUpSeccompFilter(uid);
-
// Keep capabilities across UID change, unless we're staying root.
if (uid != 0) {
if (!EnableKeepCapabilities(&error_msg)) {
@@ -699,6 +694,13 @@
fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno)));
}
+ // Must be called when the new process still has CAP_SYS_ADMIN, in this case, before changing
+ // uid from 0, which clears capabilities. The other alternative is to call
+ // prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that breaks SELinux domain transition (see
+ // b/71859146). As the result, privileged syscalls used below still need to be accessible in
+ // app process.
+ SetUpSeccompFilter(uid);
+
rc = setresuid(uid, uid, uid);
if (rc == -1) {
fail_fn(CREATE_ERROR("setresuid(%d) failed: %s", uid, strerror(errno)));
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
new file mode 100644
index 0000000..ed42e2e
--- /dev/null
+++ b/core/proto/OWNERS
@@ -0,0 +1,13 @@
+# Be sure you are familiar with proto when you modify this directory.
+
+# Metrics
+bookatz@google.com
+cjyu@google.com
+jinyithu@google.com
+joeo@google.com
+kwekua@google.com
+singhtejinder@google.com
+
+# Frameworks
+ogunwale@google.com
+jjaggi@google.com
diff --git a/core/proto/android/app/job/enums.proto b/core/proto/android/app/job/enums.proto
index 0f14f20..17bf4fb 100644
--- a/core/proto/android/app/job/enums.proto
+++ b/core/proto/android/app/job/enums.proto
@@ -24,6 +24,7 @@
// Reasons a job is stopped.
// Primarily used in android.app.job.JobParameters.java.
enum StopReasonEnum {
+ STOP_REASON_UNKNOWN = -1;
STOP_REASON_CANCELLED = 0;
STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
STOP_REASON_PREEMPT = 2;
diff --git a/core/proto/android/content/clipdata.proto b/core/proto/android/content/clipdata.proto
index aeeef97..cbc00a7 100644
--- a/core/proto/android/content/clipdata.proto
+++ b/core/proto/android/content/clipdata.proto
@@ -25,7 +25,7 @@
// An android.content.ClipData object.
message ClipDataProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_LOCAL;
optional android.content.ClipDescriptionProto description = 1;
@@ -40,7 +40,7 @@
// An android.content.ClipData.Item object.
message Item {
- option (.android.msg_privacy).dest = DEST_EXPLICIT;
+ option (.android.msg_privacy).dest = DEST_LOCAL;
oneof data {
string html_text = 1;
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 476d5fe..6467976 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -134,8 +134,14 @@
// Linux services
optional ProcrankProto procrank = 2000 [
- (section).type = SECTION_NONE, // disable procrank until figure out permission
- (section).args = "/system/xbin/procrank"
+ // Disable procrank for reasons below:
+ // 1. incidentd can't execute `procrank` because it don't have DAC perms
+ // since it is running as its own uid, no root access.
+ // 2. the same information is able to be accessed by meminfo dumpsys.
+ // 3. leave this one here to show case of how to disable a section
+ // (no removal allowed if you are familiar with PROTOBUF).
+ (section).type = SECTION_NONE,
+ (section).args = "procrank"
];
optional PageTypeInfoProto page_type_info = 2001 [
@@ -169,9 +175,9 @@
];
optional GZippedFileProto last_kmsg = 2007 [
- (section).type = SECTION_NONE, // disable until selinux permission is gained
+ (section).type = SECTION_GZIP,
(section).args = "/sys/fs/pstore/console-ramoops /sys/fs/pstore/console-ramoops-0 /proc/last_kmsg",
- (privacy).dest = DEST_AUTOMATIC
+ (privacy).dest = DEST_EXPLICIT
];
// System Services
@@ -222,7 +228,7 @@
];
optional android.service.print.PrintServiceDumpProto print = 3010 [
- (section).type = SECTION_DUMPSYS,
+ (section).type = SECTION_NONE, // Turn off until we get approval for it.
(section).args = "print --proto"
];
diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto
index 694b94b..8bf3772 100644
--- a/core/proto/android/os/system_properties.proto
+++ b/core/proto/android/os/system_properties.proto
@@ -192,6 +192,8 @@
optional string libc_debug_malloc_program = 15;
message Log {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
optional string tag_WifiHAL = 1;
optional string tag_stats_log = 2;
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 7f8bed5..76a3b5d 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -20,8 +20,9 @@
option java_multiple_files = true;
option java_outer_classname = "SettingsServiceProto";
-import "frameworks/base/core/proto/android/providers/settings/common.proto";
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";
message SettingsServiceDumpProto {
@@ -47,351 +48,6 @@
optional SystemSettingsProto system_settings = 3;
}
-// Note: it's a conscious decision to add each setting as a separate field. This
-// allows annotating each setting with its own privacy tag.
-message SecureSettingsProto {
- option (android.msg_privacy).dest = DEST_EXPLICIT;
-
- repeated SettingsOperationProto historical_operations = 1;
-
- optional SettingProto android_id = 2;
- optional SettingProto default_input_method = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto selected_input_method_subtype = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto input_methods_subtype_history = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto input_method_selector_visibility = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The currently selected voice interaction service flattened ComponentName.
- optional SettingProto voice_interaction_service = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The currently selected autofill service flattened ComponentName.
- optional SettingProto autofill_service = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Boolean indicating if Autofill supports field classification.
- optional SettingProto autofill_feature_field_classification = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_user_data_max_user_data_size = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_user_data_max_field_classification_ids_size = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_user_data_max_category_count = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_user_data_max_value_length = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_user_data_min_value_length = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto user_setup_complete = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Whether the current user has been set up via setup wizard (0 = false,
- // 1 = true). This value differs from USER_SETUP_COMPLETE in that it can be
- // reset back to 0 in case SetupWizard has been re-enabled on TV devices.
- optional SettingProto tv_user_setup_complete = 16 [ (android.privacy).dest = DEST_AUTOMATIC ];
- repeated SettingProto completed_categories = 17;
- optional SettingProto enabled_input_methods = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto disabled_system_input_methods = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_ime_with_hard_keyboard = 20 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto always_on_vpn_app = 21;
- optional SettingProto always_on_vpn_lockdown = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto install_non_market_apps = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto unknown_sources_default_reversed = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The degree of location access enabled by the user.
- optional SettingProto location_mode = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The App or module that changes the location mode.
- optional SettingProto location_changer = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Whether lock-to-app will lock the keyguard when exiting.
- optional SettingProto lock_to_app_exit_locked = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lock_screen_lock_after_timeout = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lock_screen_allow_private_notifications = 29 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lock_screen_allow_remote_input = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_note_about_notification_hiding = 31 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto trust_agents_initialized = 32 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto parental_control_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto parental_control_last_update = 34 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto parental_control_redirect_url = 35 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto settings_classname = 36 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_enabled = 37 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_shortcut_enabled = 38 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_shortcut_on_lock_screen = 39 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_shortcut_dialog_shown = 40 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_shortcut_target_service = 41 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Setting specifying the accessibility service or feature to be toggled via
- // the accessibility button in the navigation bar. This is either a
- // flattened ComponentName or the class name of a system class implementing
- // a supported accessibility feature.
- optional SettingProto accessibility_button_target_component = 42 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto touch_exploration_enabled = 43 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // List of the enabled accessibility providers.
- optional SettingProto enabled_accessibility_services = 44;
- // List of the accessibility services to which the user has granted
- // permission to put the device into touch exploration mode.
- optional SettingProto touch_exploration_granted_accessibility_services = 45;
- // Uri of the slice that's presented on the keyguard. Defaults to a slice
- // with the date and next alarm.
- optional SettingProto keyguard_slice_uri = 46;
- // Whether to speak passwords while in accessibility mode.
- optional SettingProto accessibility_speak_password = 47 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_high_text_contrast_enabled = 48 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_display_magnification_enabled = 49 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_display_magnification_navbar_enabled = 50 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_display_magnification_scale = 51 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_soft_keyboard_mode = 52 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_enabled = 53 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_locale = 54 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_preset = 55 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_background_color = 56 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_foreground_color = 57 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_edge_type = 58 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_edge_color = 59 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_window_color = 60 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_typeface = 61 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_captioning_font_scale = 62 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_display_inversion_enabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_display_daltonizer_enabled = 64 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Integer property that specifies the type of color space adjustment to perform.
- optional SettingProto accessibility_display_daltonizer = 65 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_autoclick_enabled = 66 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_autoclick_delay = 67 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accessibility_large_pointer_icon = 68 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto long_press_timeout = 69 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto multi_press_timeout = 70 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto enabled_print_services = 71;
- optional SettingProto disabled_print_services = 72;
- optional SettingProto display_density_forced = 73 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tts_default_rate = 74 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tts_default_pitch = 75 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tts_default_synth = 76 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tts_default_locale = 77 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tts_enabled_plugins = 78;
- optional SettingProto connectivity_release_pending_intent_delay_ms = 79 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto allowed_geolocation_origins = 80;
- optional SettingProto preferred_tty_mode = 81 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto enhanced_voice_privacy_enabled = 82 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tty_mode_enabled = 83 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto backup_enabled = 84 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto backup_auto_restore = 85 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto backup_provisioned = 86 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto backup_transport = 87 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto last_setup_shown = 88 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_global_search_activity = 89 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_num_promoted_sources = 90 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_max_results_to_display = 91 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_max_results_per_source = 92 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_web_results_override_limit = 93 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_promoted_source_deadline_millis = 94 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_source_timeout_millis = 95 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_prefill_millis = 96 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_max_stat_age_millis = 97 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_max_source_event_age_millis = 98 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_min_impressions_for_source_ranking = 99 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_min_clicks_for_source_ranking = 100 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_max_shortcuts_returned = 101 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_query_thread_core_pool_size = 102 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_query_thread_max_pool_size = 103 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_shortcut_refresh_core_pool_size = 104 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_shortcut_refresh_max_pool_size = 105 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_thread_keepalive_seconds = 106 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto search_per_source_concurrent_query_limit = 107 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Whether or not alert sounds are played on StorageManagerService events.
- optional SettingProto mount_play_notification_snd = 108 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto mount_ums_autostart = 109 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto mount_ums_prompt = 110 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto mount_ums_notify_enabled = 111 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto anr_show_background = 112 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_first_crash_dialog_dev_option = 113 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The ComponentName string of the service to be used as the voice
- // recognition service.
- optional SettingProto voice_recognition_service = 114 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto package_verifier_user_consent = 115 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto selected_spell_checker = 116 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto selected_spell_checker_subtype = 117 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto spell_checker_enabled = 118 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto incall_power_button_behavior = 119 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto incall_back_button_behavior = 120 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto wake_gesture_enabled = 121 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto doze_enabled = 122 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto doze_always_on = 123 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto doze_pulse_on_pick_up = 124 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto doze_pulse_on_long_press = 125 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto doze_pulse_on_double_tap = 126 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto ui_night_mode = 127 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screensaver_enabled = 128 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screensaver_components = 129 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screensaver_activate_on_dock = 130 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screensaver_activate_on_sleep = 131 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screensaver_default_component = 132 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto nfc_payment_default_component = 133 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto nfc_payment_foreground = 134 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sms_default_application = 135 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto dialer_default_application = 136 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto emergency_assistance_application = 137 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_structure_enabled = 138 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_screenshot_enabled = 139 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_disclosure_enabled = 140 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_rotation_suggestions = 141 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto num_rotation_suggestions_accepted = 142 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Read only list of the service components that the current user has
- // explicitly allowed to see and assist with all of the user's
- // notifications.
- optional SettingProto enabled_notification_assistant = 143 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto enabled_notification_listeners = 144 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto enabled_notification_policy_access_packages = 145 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Defines whether managed profile ringtones should be synced from its
- // parent profile.
- optional SettingProto sync_parent_sounds = 146 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto immersive_mode_confirmations = 147 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The query URI to find a print service to install.
- optional SettingProto print_service_search_uri = 148 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The query URI to find an NFC service to install.
- optional SettingProto payment_service_search_uri = 149 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The query URI to find an auto fill service to install.
- optional SettingProto autofill_service_search_uri = 150 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto skip_first_use_hints = 151 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto unsafe_volume_music_active_ms = 152 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lock_screen_show_notifications = 153 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tv_input_hidden_inputs = 154;
- optional SettingProto tv_input_custom_labels = 155;
- optional SettingProto usb_audio_automatic_routing_disabled = 156 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sleep_timeout = 157 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto double_tap_to_wake = 158 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The current assistant component. It could be a voice interaction service,
- // or an activity that handles ACTION_ASSIST, or empty, which means using
- // the default handling.
- optional SettingProto assistant = 159 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto camera_gesture_disabled = 160 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto camera_double_tap_power_gesture_disabled = 161 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto camera_double_twist_to_flip_enabled = 162 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto camera_lift_trigger_enabled = 163 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_gesture_enabled = 164 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_gesture_sensitivity = 165 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_gesture_silence_alerts_enabled = 166 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_gesture_wake_enabled = 167 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto assist_gesture_setup_complete = 168 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_activated = 169 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_auto_mode = 170 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_color_temperature = 171 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_custom_start_time = 172 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_custom_end_time = 173 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto night_display_last_activated_time = 174 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto enabled_vr_listeners = 175 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto vr_display_mode = 176 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto carrier_apps_handled = 177 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto managed_profile_contact_remote_search = 178 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto automatic_storage_manager_enabled = 179 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto automatic_storage_manager_days_to_retain = 180 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto automatic_storage_manager_bytes_cleared = 181 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto automatic_storage_manager_last_run = 182 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto automatic_storage_manager_turned_off_by_policy = 183 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto system_navigation_keys_enabled = 184 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Holds comma-separated list of ordering of QuickSettings tiles.
- optional SettingProto qs_tiles = 185 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto instant_apps_enabled = 186 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto device_paired = 187 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto package_verifier_state = 188 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto cmas_additional_broadcast_pkg = 189 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto notification_badging = 190 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto qs_auto_added_tiles = 191 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lockdown_in_power_menu = 192 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto backup_manager_constants = 193;
- optional SettingProto backup_local_transport_parameters = 194;
- optional SettingProto bluetooth_on_while_driving = 195 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingsProto volume_hush_gesture = 196 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Please insert fields in the same order as in
- // frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 197
-}
-
-message SystemSettingsProto {
- option (android.msg_privacy).dest = DEST_EXPLICIT;
-
- repeated SettingsOperationProto historical_operations = 1;
-
- optional SettingProto end_button_behavior = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto advanced_settings = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto bluetooth_discoverability = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto bluetooth_discoverability_timeout = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto font_scale = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto system_locales = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto display_color_mode = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screen_off_timeout = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screen_brightness = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screen_brightness_for_vr = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screen_brightness_mode = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto screen_auto_brightness_adj = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Determines which streams are affected by ringer mode changes. The stream
- // type's bit will be set to 1 if it should be muted when going into an
- // inaudible ringer mode.
- optional SettingProto mode_ringer_streams_affected = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto mute_streams_affected = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto vibrate_on = 16 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto vibrate_input_devices = 17 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto notification_vibration_intensity = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto haptic_feedback_intensity = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_ring = 20 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_system = 21 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_voice = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_music = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_alarm = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_notification = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_bluetooth_sco = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_accessibility = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto volume_master = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto master_mono = 29 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Whether silent mode should allow vibration feedback. This is used
- // internally in AudioService and the Sound settings activity to coordinate
- // decoupling of vibrate and silent modes. This setting will likely be
- // removed in a future release with support for audio/vibe feedback
- // profiles.
- // Not used anymore. On devices with vibrator, the user explicitly selects
- // silent or vibrate mode. Kept for use by legacy database upgrade code in
- // DatabaseHelper.
- optional SettingProto vibrate_in_silent = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Appended to various volume related settings to record the previous values
- // before the settings were affected by a silent/vibrate ringer mode change.
- optional SettingProto append_for_last_audible = 31 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto ringtone = 32;
- optional SettingProto ringtone_cache = 33;
- optional SettingProto notification_sound = 34;
- optional SettingProto notification_sound_cache = 35;
- optional SettingProto alarm_alert = 36;
- optional SettingProto alarm_alert_cache = 37;
- optional SettingProto media_button_receiver = 38;
- optional SettingProto text_auto_replace = 39 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto text_auto_caps = 40 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto text_auto_punctuate = 41 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto text_show_password = 42 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_gtalk_service_status = 43 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto time_12_24 = 44 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto date_format = 45 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto setup_wizard_has_run = 46 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto accelerometer_rotation = 47 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto user_rotation = 48 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto hide_rotation_lock_toggle_for_accessibility = 49 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto vibrate_when_ringing = 50 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto dtmf_tone_when_dialing = 51 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto dtmf_tone_type_when_dialing = 52 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto hearing_aid = 53 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto tty_mode = 54 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // User-selected RTT mode. When on, outgoing and incoming calls will be
- // answered as RTT calls when supported by the device and carrier. Boolean
- // value.
- optional SettingProto rtt_calling_mode = 55 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sound_effects_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto haptic_feedback_enabled = 57 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto notification_light_pulse = 58 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Show pointer location on screen? 0 = no, 1 = yes.
- optional SettingProto pointer_location = 59 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_touches = 60 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // Log raw orientation data from {@link
- // com.android.server.policy.WindowOrientationListener} for use with the
- // orientationplot.py tool.
- // 0 = no, 1 = yes
- optional SettingProto window_orientation_listener_log = 61 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lockscreen_sounds_enabled = 62 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lockscreen_disabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sip_receive_calls = 64 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sip_call_options = 65 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sip_always = 66 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto sip_address_only = 67 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto pointer_speed = 68 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto lock_to_app_enabled = 69 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto egg_mode = 70 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto show_battery_percent = 71 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto when_to_make_wifi_calls = 72 [ (android.privacy).dest = DEST_AUTOMATIC ];
-
- // Please insert fields in the same order as in
- // frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 73;
-}
-
message SettingsProto {
// Enum values gotten from Settings.java
enum ScreenBrightnessMode {
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index c7de947..b5303c8 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -672,8 +672,10 @@
option (android.msg_privacy).dest = DEST_LOCAL;
// The requested Private DNS mode and an accompanying specifier.
- optional SettingProto dns_mode = 1;
- optional SettingProto dns_specifier = 2;
+ // msg_privacy settings don't apply to sub messages, only to primitive
+ // fields, so these must also be explicitly set to LOCAL.
+ optional SettingProto dns_mode = 1 [ (android.privacy).dest = DEST_LOCAL ];
+ optional SettingProto dns_specifier = 2 [ (android.privacy).dest = DEST_LOCAL ];
}
optional Private private = 96;
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
new file mode 100644
index 0000000..593747d
--- /dev/null
+++ b/core/proto/android/providers/settings/secure.proto
@@ -0,0 +1,478 @@
+/*
+ * 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.providers.settings;
+
+option java_multiple_files = true;
+
+import "frameworks/base/core/proto/android/providers/settings/common.proto";
+import "frameworks/base/libs/incident/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.
+message SecureSettingsProto {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ repeated SettingsOperationProto historical_operations = 1;
+
+ message Accessibility {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // List of the enabled accessibility providers.
+ optional SettingProto enabled_accessibility_services = 2;
+ optional SettingProto autoclick_enabled = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto autoclick_delay = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Setting specifying the accessibility service or feature to be toggled via
+ // the accessibility button in the navigation bar. This is either a
+ // flattened ComponentName or the class name of a system class implementing
+ // a supported accessibility feature.
+ optional SettingProto button_target_component = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_enabled = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_locale = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_preset = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_background_color = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_foreground_color = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_edge_type = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_edge_color = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_window_color = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_typeface = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto captioning_font_scale = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_daltonizer_enabled = 16 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Integer property that specifies the type of color space adjustment to perform.
+ optional SettingProto display_daltonizer = 17 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_inversion_enabled = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_magnification_enabled = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_magnification_navbar_enabled = 20 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_magnification_scale = 21 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto high_text_contrast_enabled = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto large_pointer_icon = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_enabled = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_on_lock_screen = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_dialog_shown = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_target_service = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto soft_keyboard_mode = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Whether to speak passwords while in accessibility mode.
+ optional SettingProto speak_password = 29 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto touch_exploration_enabled = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // List of the accessibility services to which the user has granted
+ // permission to put the device into touch exploration mode.
+ optional SettingProto touch_exploration_granted_accessibility_services = 31;
+ }
+ optional Accessibility accessibility = 2;
+
+ // Origins for which browsers should allow geolocation by default.
+ // The value is a space-separated list of origins.
+ optional SettingProto allowed_geolocation_origins = 3;
+
+ message AlwaysOnVpn {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto app = 1;
+ optional SettingProto lockdown = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional AlwaysOnVpn always_on_vpn = 4;
+
+ optional SettingProto android_id = 5;
+ optional SettingProto anr_show_background = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Assist {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // The current assistant component. It could be a voice interaction service,
+ // or an activity that handles ACTION_ASSIST, or empty, which means using
+ // the default handling.
+ optional SettingProto assistant = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto structure_enabled = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto screenshot_enabled = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto disclosure_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto gesture_enabled = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto gesture_sensitivity = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto gesture_silence_alerts_enabled = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto gesture_wake_enabled = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto gesture_setup_complete = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Assist assist = 7;
+
+ message Autofill {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // The currently selected autofill service flattened ComponentName.
+ optional SettingProto service = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Boolean indicating if Autofill supports field classification.
+ optional SettingProto feature_field_classification = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto user_data_max_user_data_size = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto user_data_max_field_classification_ids_size = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto user_data_max_category_count = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto user_data_max_value_length = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto user_data_min_value_length = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // The query URI to find an auto fill service to install.
+ optional SettingProto service_search_uri = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Autofill autofill = 8;
+
+ message AutomaticStorageManager {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto days_to_retain = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto bytes_cleared = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto last_run = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto turned_off_by_policy = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional AutomaticStorageManager automatic_storage_manager = 9;
+
+ message Backup {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_restore = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto provisioned = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto transport = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto manager_constants = 5;
+ optional SettingProto local_transport_parameters = 6;
+ optional SettingProto packages_to_clear_data_before_full_restore = 7;
+ }
+ optional Backup backup = 10;
+
+ optional SettingProto bluetooth_on_while_driving = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Camera {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto gesture_disabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto double_tap_power_gesture_disabled = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto double_twist_to_flip_enabled = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto lift_trigger_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Camera camera = 12;
+
+ optional SettingProto carrier_apps_handled = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto cmas_additional_broadcast_pkg = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ repeated SettingProto completed_categories = 15;
+ optional SettingProto connectivity_release_pending_intent_delay_ms = 16 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto device_paired = 17 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto dialer_default_application = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_density_forced = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto double_tap_to_wake = 20 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Doze {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto always_on = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto pulse_on_pick_up = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto pulse_on_long_press = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto pulse_on_double_tap = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Doze doze = 21;
+
+ optional SettingProto emergency_assistance_application = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enhanced_voice_privacy_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto immersive_mode_confirmations = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Incall {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto power_button_behavior = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto back_button_behavior = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Incall incall = 25;
+
+ message InputMethods {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto default_input_method = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto disabled_system_input_methods = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enabled_input_methods = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto method_selector_visibility = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto subtype_history = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto selected_input_method_subtype = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_ime_with_hard_keyboard = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional InputMethods input_methods = 26;
+
+ optional SettingProto install_non_market_apps = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto instant_apps_enabled = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Uri of the slice that's presented on the keyguard. Defaults to a slice
+ // with the date and next alarm.
+ optional SettingProto keyguard_slice_uri = 29;
+ optional SettingProto last_setup_shown = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Location {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // The degree of location access enabled by the user.
+ optional SettingProto mode = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // The App or module that changes the location mode.
+ optional SettingProto changer = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Location location = 31;
+
+ message LockScreen {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto lock_after_timeout = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto allow_private_notifications = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto allow_remote_input = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_notifications = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional LockScreen lock_screen = 32;
+
+ // Whether lock-to-app will lock the keyguard when exiting.
+ optional SettingProto lock_to_app_exit_locked = 33 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto lockdown_in_power_menu = 34 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto long_press_timeout = 35 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message ManagedProfile {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto contact_remote_search = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional ManagedProfile managed_profile = 36;
+
+ message Mount {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Whether or not alert sounds are played on StorageManagerService events.
+ optional SettingProto play_notification_snd = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ums_autostart = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ums_prompt = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ums_notify_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Mount mount = 37;
+
+ optional SettingProto multi_press_timeout = 38 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message NfcPayment {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto default_component = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Whether NFC payment is handled by the foreground application or a default.
+ optional SettingProto foreground = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // The query URI to find an NFC service to install.
+ optional SettingProto payment_service_search_uri = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional NfcPayment nfc_payment = 39;
+
+ message NightDisplay {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto activated = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_mode = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto color_temperature = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto custom_start_time = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto custom_end_time = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto last_activated_time = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional NightDisplay night_display = 40;
+
+ message Notification {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Read only list of the service components that the current user has
+ // explicitly allowed to see and assist with all of the user's
+ // notifications.
+ // "enabled_notification_assistant" in code.
+ optional SettingProto enabled_assistant = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enabled_listeners = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enabled_policy_access_packages = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto badging = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_note_about_notification_hiding = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Notification notification = 41;
+
+ message PackageVerifier {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto user_consent = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto state = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional PackageVerifier package_verifier = 42;
+
+ message ParentalControl {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto last_update = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto redirect_url = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional ParentalControl parental_control = 43;
+
+ message PrintService {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // The query URI to find a print service to install.
+ optional SettingProto search_uri = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto disabled_print_services = 2;
+ optional SettingProto enabled_print_services = 3;
+ }
+ optional PrintService print_service = 44;
+
+ message QuickSettings {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Holds comma-separated list of ordering of QuickSettings tiles.
+ optional SettingProto tiles = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_added_tiles = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional QuickSettings qs = 45;
+
+ message Rotation {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto show_rotation_suggestions = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto num_rotation_suggestions_accepted = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Rotation rotation = 46;
+
+ message Screensaver {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto components = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto activate_on_dock = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto activate_on_sleep = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto default_component = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Screensaver screensaver = 47;
+
+ message Search {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto global_search_activity = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto num_promoted_sources = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_results_to_display = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_results_per_source = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto web_results_override_limit = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto promoted_source_deadline_millis = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto source_timeout_millis = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto prefill_millis = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_stat_age_millis = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_source_event_age_millis = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto min_impressions_for_source_ranking = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto min_clicks_for_source_ranking = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_shortcuts_returned = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto query_thread_core_pool_size = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto query_thread_max_pool_size = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_refresh_core_pool_size = 16 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto shortcut_refresh_max_pool_size = 17 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto thread_keepalive_seconds = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto per_source_concurrent_query_limit = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Search search = 48;
+
+ message SpellChecker {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // "selected_spell_checker" in code.
+ optional SettingProto selected = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // "selected_spell_checker_subtype" in code.
+ optional SettingProto selected_subtype = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional SpellChecker spell_checker = 49;
+
+ optional SettingProto settings_classname = 50 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_first_crash_dialog_dev_option = 51 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto skip_first_use_hints = 52 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto sleep_timeout = 53 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto sms_default_application = 54 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Defines whether managed profile ringtones should be synced from its
+ // parent profile.
+ optional SettingProto sync_parent_sounds = 55 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto system_navigation_keys_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto trust_agents_initialized = 57 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Tts {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto default_rate = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto default_pitch = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto default_synth = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto default_locale = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enabled_plugins = 5;
+ }
+ optional Tts tts = 58;
+
+ message Tty {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto tty_mode_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // The preferred TTY mode:
+ // 0 = TTy Off, CDMA default
+ // 1 = TTY Full
+ // 2 = TTY HCO
+ // 3 = TTY VCO
+ optional SettingProto preferred_tty_mode = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Tty tty = 59;
+
+ message Tv {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Whether the current user has been set up via setup wizard (0 = false,
+ // 1 = true). This value differs from USER_SETUP_COMPLETE in that it can be
+ // reset back to 0 in case SetupWizard has been re-enabled on TV devices.
+ optional SettingProto user_setup_complete = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto input_hidden_inputs = 2;
+ optional SettingProto input_custom_labels = 3;
+ }
+ optional Tv tv = 60;
+
+ optional SettingProto ui_night_mode = 61 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto unknown_sources_default_reversed = 62 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto usb_audio_automatic_routing_disabled = 63 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Whether the current user has been set up via setup wizard (0 = false, 1 = true)
+ optional SettingProto user_setup_complete = 64 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Voice {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // The currently selected voice interaction service flattened ComponentName.
+ optional SettingProto interaction_service = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // The ComponentName string of the service to be used as the voice
+ // recognition service.
+ optional SettingProto recognition_service = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Voice voice = 65;
+
+ message Volume {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // What behavior should be invoked when the volume hush gesture is triggered
+ // One of VOLUME_HUSH_OFF, VOLUME_HUSH_VIBRATE, VOLUME_HUSH_MUTE.
+ optional SettingProto hush_gesture = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Persisted playback time after a user confirmation of an unsafe volume level.
+ optional SettingProto unsafe_volume_music_active_ms = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Volume volume = 66;
+
+ message Vr {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto display_mode = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto enabled_listeners = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Vr vr = 67;
+
+ optional SettingProto wake_gesture_enabled = 68 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ // Please insert fields in alphabetical order and group them into messages
+ // if possible (to avoid reaching the method limit).
+ // Next tag = 69;
+}
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
new file mode 100644
index 0000000..6b6edd2
--- /dev/null
+++ b/core/proto/android/providers/settings/system.proto
@@ -0,0 +1,246 @@
+/*
+ * 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.providers.settings;
+
+option java_multiple_files = true;
+
+import "frameworks/base/core/proto/android/providers/settings/common.proto";
+import "frameworks/base/libs/incident/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.
+message SystemSettingsProto {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ repeated SettingsOperationProto historical_operations = 1;
+
+ optional SettingProto advanced_settings = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Alarm {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // "alarm_alert" in code.
+ optional SettingProto default_uri = 1;
+ optional SettingProto alert_cache = 2;
+ }
+ optional Alarm alarm = 3;
+
+ message Bluetooth {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Whether remote devices may discover and/or connect to this device:
+ // 2 -- discoverable and connectable
+ // 1 -- connectable but not discoverable
+ // 0 -- neither connectable nor discoverable
+ optional SettingProto discoverability = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto discoverability_timeout_secs = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Bluetooth bluetooth = 4;
+
+ optional SettingProto date_format = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto display_color_mode = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message DevOptions {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Show pointer location on screen? 0 = no, 1 = yes. "pointer_location
+ // in code.
+ optional SettingProto pointer_location = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_touches = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Log raw orientation data from {@link
+ // com.android.server.policy.WindowOrientationListener} for use with the
+ // orientationplot.py tool.
+ // 0 = no, 1 = yes
+ optional SettingProto window_orientation_listener_log = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional DevOptions developer_options = 7;
+
+ message DtmfTone {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // "dtmf_tone_when_dialing" in code.
+ optional SettingProto play_when_dialing = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // "dtmf_tone_type_when_dialing" in code.
+ optional SettingProto type_played_when_dialing = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional DtmfTone dtmf_tone = 8;
+
+ optional SettingProto egg_mode = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto end_button_behavior = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto font_scale = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message HapticFeedback {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto intensity = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional HapticFeedback haptic_feedback = 12;
+
+ // Whether the hearing aid is enabled. The value is boolean (1 or 0).
+ optional SettingProto hearing_aid = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto lock_to_app_enabled = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Lockscreen {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto sounds_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto disabled = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Lockscreen lockscreen = 15;
+
+ // The system default media button event receiver.
+ optional SettingProto media_button_receiver = 16;
+
+ message Notification {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto sound = 1;
+ optional SettingProto sound_cache = 2;
+ optional SettingProto light_pulse = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto vibration_intensity = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Notification notification = 17;
+
+ optional SettingProto pointer_speed = 18 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Ringtone {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // "ringtone" in code. The system-wide default ringtone URI.
+ optional SettingProto default_uri = 1;
+ optional SettingProto cache = 2;
+ }
+ optional Ringtone ringtone = 19;
+
+ message Rotation {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ // Control whether the accelerometer will be used to change screen
+ // orientation. If 0, it will not be used unless explicitly requested
+ // by the application; if 1, it will be used by default unless
+ // explicitly disabled by the application.
+ optional SettingProto accelerometer_rotation = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Default screen rotation when no other policy applies.
+ // When accelerometer_rotation is zero and no on-screen Activity expresses a
+ // preference, this rotation value will be used. Must be one of the
+ // {@link android.view.Surface#ROTATION_0 Surface rotation constants}.
+ optional SettingProto user_rotation = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Control whether the rotation lock toggle in the System UI should be hidden.
+ // Typically this is done for accessibility purposes to make it harder for
+ // the user to accidentally toggle the rotation lock while the display rotation
+ // has been locked for accessibility.
+ // If 0, then rotation lock toggle is not hidden for accessibility (although it may be
+ // unavailable for other reasons). If 1, then the rotation lock toggle is hidden.
+ optional SettingProto hide_rotation_lock_toggle_for_accessibility = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Rotation rotation = 20;
+
+ // User-selected RTT mode. When on, outgoing and incoming calls will be
+ // answered as RTT calls when supported by the device and carrier. Boolean
+ // value.
+ optional SettingProto rtt_calling_mode = 21 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Screen {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto off_timeout = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto brightness = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto brightness_for_vr = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto brightness_mode = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_brightness_adj = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Screen screen = 22;
+
+ optional SettingProto setup_wizard_has_run = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_battery_percent = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_gtalk_service_status = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Sip {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto receive_calls = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto call_options = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto always = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto address_only = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Sip sip = 26;
+
+ optional SettingProto sound_effects_enabled = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto system_locales = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Text {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto auto_replace = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_caps = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto auto_punctuate = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto show_password = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Text text = 29;
+
+ optional SettingProto time_12_24 = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto tty_mode = 31 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ message Vibrate {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto on = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto input_devices = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Whether silent mode should allow vibration feedback. This is used
+ // internally in AudioService and the Sound settings activity to coordinate
+ // decoupling of vibrate and silent modes. This setting will likely be
+ // removed in a future release with support for audio/vibe feedback
+ // profiles.
+ // Not used anymore. On devices with vibrator, the user explicitly selects
+ // silent or vibrate mode. Kept for use by legacy database upgrade code in
+ // DatabaseHelper.
+ optional SettingProto in_silent = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto when_ringing = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Vibrate vibrate = 32;
+
+ message Volume {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ optional SettingProto ring = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto system = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto voice = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto music = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto alarm = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto notification = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto bluetooth_sco = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto accessibility = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto master = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto master_mono = 10 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Determines which streams are affected by ringer mode changes. The stream
+ // type's bit will be set to 1 if it should be muted when going into an
+ // inaudible ringer mode.
+ optional SettingProto mode_ringer_streams_affected = 11 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Which streams are affected by mute. The stream type's bit should be set
+ // to 1 if it should be muted when a mute request is received.
+ optional SettingProto mute_streams_affected = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+ optional Volume volume = 33;
+
+ optional SettingProto when_to_make_wifi_calls = 34 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ // Please insert fields in alphabetical order and group them into messages
+ // if possible (to avoid reaching the method limit).
+ // Next tag = 35;
+}
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 122e5c4..4df3b63 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -514,7 +514,7 @@
optional int32 uid = 3;
// Job IDs can technically be negative.
optional int32 job_id = 4;
- optional string tag = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string tag = 5;
// Only valid for STOP_JOB or STOP_PERIODIC_JOB Events.
optional .android.app.job.StopReasonEnum stop_reason = 6;
}
@@ -527,9 +527,7 @@
optional int32 calling_uid = 1;
// Job IDs can technically be negative.
optional int32 job_id = 2;
- optional string battery_name = 3 [
- (.android.privacy).dest = DEST_EXPLICIT
- ];
+ optional string battery_name = 3;
}
// Dump from a com.android.server.job.controllers.JobStatus object.
@@ -538,7 +536,7 @@
// The UID that scheduled the job.
optional int32 calling_uid = 1;
- optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string tag = 2;
// The UID for which the job is being run.
optional int32 source_uid = 3;
@@ -578,6 +576,12 @@
optional .android.os.PersistableBundleProto extras = 14;
optional .android.os.BundleProto transient_extras = 15;
+ // ClipData of information that is returned to the application at
+ // execution time, but not persisted by the system. This is provided by
+ // the app and the main purpose of providing a ClipData is to allow
+ // granting of URI permissions for data associated with the clip. The
+ // exact kind of permission grant to perform is specified in the flags
+ // field.
optional .android.content.ClipDataProto clip_data = 16;
optional GrantedUriPermissionsDumpProto granted_uri_permissions = 17;
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 063135d..a8d0825 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -156,6 +156,8 @@
TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
TRANSIT_KEYGUARD_OCCLUDE = 22;
TRANSIT_KEYGUARD_UNOCCLUDE = 23;
+ TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
+ TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
}
optional TransitionType last_used_app_transition = 2;
}
diff --git a/core/proto/android/service/print.proto b/core/proto/android/service/print.proto
index f783b86..994814b 100644
--- a/core/proto/android/service/print.proto
+++ b/core/proto/android/service/print.proto
@@ -75,7 +75,7 @@
repeated PrintJobInfoProto print_jobs = 1;
// Files used by these print jobs
- repeated string print_job_files = 2;
+ repeated string print_job_files = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
// Approved print services
repeated android.content.ComponentNameProto approved_services = 3;
@@ -101,7 +101,7 @@
}
message PrinterInfoProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
// The id of the printer
optional PrinterIdProto id = 1;
@@ -123,7 +123,7 @@
STATUS_UNAVAILABLE = 3;
}
// The status of the printer
- optional Status status = 3;
+ optional Status status = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
// The description of the printer
optional string description = 4;
@@ -171,13 +171,13 @@
}
message PrinterIdProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
// Component name of the service that reported the printer
- optional android.content.ComponentNameProto service_name = 1;
+ optional android.content.ComponentNameProto service_name = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
// Local id of the printer
- optional string local_id = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ optional string local_id = 2;
}
message ActivePrintServiceProto {
@@ -331,7 +331,7 @@
optional string label = 1 [ (android.privacy).dest = DEST_EXPLICIT ];
// Id of the job
- optional string print_job_id = 2;
+ optional string print_job_id = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
enum State {
// Unknown state
@@ -366,7 +366,7 @@
optional PrinterIdProto printer = 4;
// Tag assigned to the job
- optional string tag = 5;
+ optional string tag = 5 [ (android.privacy).dest = DEST_EXPLICIT ];
// Time the job was created
optional int64 creation_time = 6;
@@ -401,4 +401,4 @@
// The print job
optional PrintJobInfoProto print_job = 2;
-}
\ No newline at end of file
+}
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index b60c569..8240d8a 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -80,7 +80,7 @@
optional string model = 2;
optional string description = 3;
optional string version = 4;
- optional string uri = 5;
+ optional string uri = 5 [ (android.privacy).dest = DEST_EXPLICIT ];
optional string serial = 6 [ (android.privacy).dest = DEST_EXPLICIT ];
}
@@ -155,6 +155,7 @@
message UsbConnectionRecordProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // usb device's address, e.g. 001/002, nothing about the phone
optional string device_address = 1;
optional android.service.UsbConnectionRecordMode mode = 2;
optional int64 timestamp = 3;
@@ -251,6 +252,7 @@
optional string name = 3;
optional bool has_playback = 4;
optional bool has_capture = 5;
+ // usb device's address, e.g. 001/002, nothing about the phone
optional string address = 6;
}
@@ -259,6 +261,7 @@
optional int32 card = 1;
optional int32 device = 2;
+ // usb device's address, e.g. 001/002, nothing about the phone
optional string device_address = 3;
}
diff --git a/core/proto/android/view/displayinfo.proto b/core/proto/android/view/displayinfo.proto
index cbd06fd..2a03050 100644
--- a/core/proto/android/view/displayinfo.proto
+++ b/core/proto/android/view/displayinfo.proto
@@ -29,5 +29,5 @@
optional int32 logical_height = 2;
optional int32 app_width = 3;
optional int32 app_height = 4;
- optional string name = 5;
+ optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c4d3667..04c4130 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -89,6 +89,8 @@
<protected-broadcast android:name="android.intent.action.OVERLAY_REMOVED" />
<protected-broadcast android:name="android.intent.action.OVERLAY_PRIORITY_CHANGED" />
<protected-broadcast android:name="android.intent.action.USER_ACTIVITY_NOTIFICATION" />
+ <protected-broadcast android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.MY_PACKAGE_UNSUSPENDED" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGING" />
@@ -1102,6 +1104,8 @@
<!-- Allows an app to use fingerprint hardware.
<p>Protection level: normal
+ @deprecated Applications should request {@link
+ android.Manifest.permission#USE_BIOMETRIC} instead
-->
<permission android:name="android.permission.USE_FINGERPRINT"
android:permissionGroup="android.permission-group.SENSORS"
@@ -1109,6 +1113,15 @@
android:description="@string/permdesc_useFingerprint"
android:protectionLevel="normal" />
+ <!-- Allows an app to use device supported biometric modalities.
+ <p>Protection level: normal
+ -->
+ <permission android:name="android.permission.USE_BIOMETRIC"
+ android:permissionGroup="android.permission-group.SENSORS"
+ android:label="@string/permlab_useBiometric"
+ android:description="@string/permdesc_useBiometric"
+ android:protectionLevel="normal" />
+
<!-- ====================================================================== -->
<!-- REMOVED PERMISSIONS -->
<!-- ====================================================================== -->
@@ -2003,11 +2016,11 @@
<permission android:name="android.permission.REMOVE_TASKS"
android:protectionLevel="signature" />
- <!-- @SystemApi @hide Allows an application to create/manage/remove stacks -->
+ <!-- @SystemApi @TestApi @hide Allows an application to create/manage/remove stacks -->
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
android:protectionLevel="signature|privileged|development" />
- <!-- @SystemApi @hide Allows an application to embed other activities -->
+ <!-- @SystemApi @TestApi @hide Allows an application to embed other activities -->
<permission android:name="android.permission.ACTIVITY_EMBEDDING"
android:protectionLevel="signature|privileged|development" />
@@ -3108,6 +3121,12 @@
<permission android:name="android.permission.CONFIGURE_DISPLAY_COLOR_MODE"
android:protectionLevel="signature" />
+ <!-- Allows an application to control the color saturation of the display.
+ @hide
+ @SystemApi -->
+ <permission android:name="android.permission.CONTROL_DISPLAY_SATURATION"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an application to collect usage infomation about brightness slider changes.
<p>Not for use by third-party applications.</p>
@hide
@@ -4224,11 +4243,26 @@
android:exported="false">
</receiver>
- <receiver android:name="com.android.server.stats.StatsCompanionService$PollingAlarmReceiver"
+ <receiver android:name="com.android.server.stats.StatsCompanionService$PullingAlarmReceiver"
android:permission="android.permission.STATSCOMPANION"
android:exported="false">
</receiver>
+ <receiver android:name="com.android.server.stats.StatsCompanionService$PeriodicAlarmReceiver"
+ android:permission="android.permission.STATSCOMPANION"
+ android:exported="false">
+ </receiver>
+
+ <receiver android:name="com.android.server.am.BatteryStatsService$UsbConnectionReceiver"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.hardware.usb.action.USB_STATE" />
+ </intent-filter>
+ </receiver>
+
<service android:name="android.hardware.location.GeofenceHardwareService"
android:permission="android.permission.LOCATION_HARDWARE"
android:exported="false" />
diff --git a/core/res/res/anim/activity_translucent_close_exit.xml b/core/res/res/anim/activity_translucent_close_exit.xml
new file mode 100644
index 0000000..04c5dea
--- /dev/null
+++ b/core/res/res/anim/activity_translucent_close_exit.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shareInterpolator="false"
+ android:zAdjustment="top">
+ <translate
+ android:fromYDelta="0%"
+ android:toYDelta="100%"
+ android:interpolator="@interpolator/fast_out_linear_in"
+ android:duration="300"/>
+</set>
diff --git a/core/res/res/anim/activity_translucent_open_enter.xml b/core/res/res/anim/activity_translucent_open_enter.xml
new file mode 100644
index 0000000..da3dded
--- /dev/null
+++ b/core/res/res/anim/activity_translucent_open_enter.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shareInterpolator="false">
+ <translate
+ android:fromYDelta="100%"
+ android:toYDelta="0"
+ android:interpolator="@interpolator/linear_out_slow_in"
+ android:duration="300"/>
+</set>
diff --git a/core/res/res/drawable/ic_account_circle.xml b/core/res/res/drawable/ic_account_circle.xml
index a8c5b8c..f7317db 100644
--- a/core/res/res/drawable/ic_account_circle.xml
+++ b/core/res/res/drawable/ic_account_circle.xml
@@ -16,9 +16,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48.0dp"
android:height="48.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:pathData="M24,0C10.8,0 0,10.8 0,24s10.8,24 24,24s24,-10.8 24,-24S37.200001,0 24,0zM24,7.2c3.96,0 7.2,3.24 7.2,7.2s-3.24,7.2 -7.2,7.2s-7.2,-3.24 -7.2,-7.2S20.040001,7.2 24,7.2zM24,41.279999c-6,0 -11.28,-3.12 -14.4,-7.68c0.12,-4.8 9.6,-7.44 14.4,-7.44s14.28,2.64 14.4,7.44C35.279999,38.16 30,41.279999 24,41.279999z"
- android:fillColor="#FFFFFFFF"/>
+ android:viewportWidth="20.0"
+ android:viewportHeight="20.0">
+ <group
+ android:translateX="-2"
+ android:translateY="-2" >
+ <path
+ android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33C4.62,15.49 4,13.82 4,12c0,-4.41 3.59,-8 8,-8c4.41,0 8,3.59 8,8C20,13.82 19.38,15.49 18.36,16.83z"
+ android:fillColor="#FFFFFFFF" />
+ <path
+ android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13c1.94,0 3.5,-1.56 3.5,-3.5S13.94,6 12,6z"
+ android:fillColor="#FFFFFFFF" />
+ </group>
</vector>
diff --git a/core/res/res/drawable/ic_lock_bugreport.xml b/core/res/res/drawable/ic_lock_bugreport.xml
index 5501254..ebeb532 100644
--- a/core/res/res/drawable/ic_lock_bugreport.xml
+++ b/core/res/res/drawable/ic_lock_bugreport.xml
@@ -21,5 +21,11 @@
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FF000000"
- android:pathData="M20.0,8.0l-2.81,0.0a5.985,5.985 0.0,0.0 0.0,-1.82 -1.96l0.93,-0.93a0.99,0.996 0.0,1.0 0.0,-1.41 -1.41l-1.47,1.47C12.96,5.06 12.49,5.0 12.0,5.0s-0.9,0.06 -1.4,0.17L9.12,3.7a0.99,0.996 0.0,1.0 0.0,-1.41 1.41l0.9,0.92C7.88,6.55 7.26,7.22 6.81,8.0L4.0,8.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.09,0.0c0.0,0.33 0.0,0.66 -0.09,1.0l0.0,1.0L4.0,12.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.0,0.0l0.0,1.0c0.0,0.3 0.0,0.6 0.09,1.0L4.0,16.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.81,0.0c1.04,1.79 2.97,3.0 5.19,3.0s4.15,-1.21 5.19,-3.0L20.0,18.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0l-2.09,0.0c0.05,-0.3 0.09,-0.6 0.09,-1.0l0.0,-1.0l2.0,0.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0l-2.0,0.0l0.0,-1.0c0.0,-0.34 -0.04,-0.67 -0.09,-1.0L20.0,10.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0zm-6.0,8.0l-4.0,0.0l0.0,-2.0l4.0,0.0l0.0,2.0zm0.0,-4.0l-4.0,0.0l0.0,-2.0l4.0,0.0l0.0,2.0z"/>
+ android:pathData="M20,10V8h-2.81c-0.45,-0.78 -1.07,-1.46 -1.82,-1.96L17,4.41L15.59,3l-2.17,2.17c-0.03,-0.01 -0.05,-0.01 -0.08,-0.01c-0.16,-0.04 -0.32,-0.06 -0.49,-0.09c-0.06,-0.01 -0.11,-0.02 -0.17,-0.03C12.46,5.02 12.23,5 12,5h0c-0.49,0 -0.97,0.07 -1.42,0.18l0.02,-0.01L8.41,3L7,4.41l1.62,1.63l0.01,0C7.88,6.54 7.26,7.22 6.81,8H4v2h2.09C6.03,10.33 6,10.66 6,11v1H4v2h2v1c0,0.34 0.04,0.67 0.09,1H4v2h2.81c1.04,1.79 2.97,3 5.19,3h0c2.22,0 4.15,-1.21 5.19,-3H20v-2h-2.09l0,0c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1l0,0H20zM16,15c0,2.21 -1.79,4 -4,4c-2.21,0 -4,-1.79 -4,-4v-4c0,-2.21 1.79,-4 4,-4h0c2.21,0 4,1.79 4,4V15z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M10,14h4v2h-4z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M10,10h4v2h-4z"/>
</vector>
diff --git a/core/res/res/layout/autofill_dataset_picker_header_footer.xml b/core/res/res/layout/autofill_dataset_picker_header_footer.xml
new file mode 100644
index 0000000..048494a
--- /dev/null
+++ b/core/res/res/layout/autofill_dataset_picker_header_footer.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<view xmlns:android="http://schemas.android.com/apk/res/android"
+ class="com.android.server.autofill.ui.FillUi$AutofillFrameLayout"
+ android:id="@+id/autofill_dataset_picker"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ style="@style/AutofillDatasetPicker">
+
+ <LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/autofill_dataset_header"
+ android:visibility="gone"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
+
+ <ListView
+ android:id="@+id/autofill_dataset_list"
+ android:layout_weight="1"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:drawSelectorOnTop="true"
+ android:clickable="true"
+ android:divider="@null"
+ android:visibility="gone">
+ </ListView>
+
+ <LinearLayout
+ android:id="@+id/autofill_dataset_footer"
+ android:visibility="gone"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
+
+ </LinearLayout>
+
+</view>
diff --git a/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml b/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml
new file mode 100644
index 0000000..24b14a0
--- /dev/null
+++ b/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/autofill_dataset_picker"
+ style="@style/AutofillDatasetPicker"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/autofill_window_title"
+ android:layout_above="@+id/autofill_dataset_container"
+ android:layout_alignStart="@+id/autofill_dataset_container"
+ android:textSize="16sp"/>
+
+ <!-- autofill_container is the common parent for inserting authentication item or
+ autofill_dataset_list-->
+ <FrameLayout
+ android:id="@+id/autofill_dataset_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true">
+
+ <LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/autofill_dataset_header"
+ android:visibility="gone"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
+
+ <ListView
+ android:id="@+id/autofill_dataset_list"
+ android:layout_weight="1"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:clickable="true"
+ android:divider="@null"
+ android:drawSelectorOnTop="true"
+ android:visibility="gone"/>
+
+ <LinearLayout
+ android:id="@+id/autofill_dataset_footer"
+ android:visibility="gone"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
+
+ </LinearLayout>
+
+ </FrameLayout>
+
+</RelativeLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index faecfb7..1040f3b9 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen stemdiens nie"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen stemdiens of noodoproepe nie"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Tydelik deur jou diensverskaffer afgeskakel"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tydelik deur jou diensverskaffer afgeskakel vir SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Kan nie selnetwerk bereik nie"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probeer die voorkeurnetwerk verander. Tik om te verander."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Noodoproepe is onbeskikbaar"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Swerfbanier aan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Swerfbanier af"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Soek vir diens"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Kon nie Wi-Fi-oproepe opstel nie"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra eers jou diensverskaffer om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan. (Foutkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Probleem om Wi-Fi-oproepe by jou diensverskaffer te registreer: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-oproep"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Laat die program toe om metodes te benut om vingerafdruksjablone vir gebruik by te voeg en uit te vee."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"gebruik vingerafdrukhardeware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie herken nie"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk is gestaaf"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Vingerafdrukhardeware is nie beskikbaar nie."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan nie gestoor word nie. Verwyder asseblief \'n bestaande vingerafdruk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Invoermetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksaksies"</string>
<string name="email" msgid="4560673117055050403">"E-pos"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Stuur e-pos aan gekose adres"</string>
<string name="dial" msgid="1253998302767701559">"Bel"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Bel gekose foonnommer"</string>
<string name="map" msgid="6521159124535543457">"Spoor op"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Kry gekose adres"</string>
<string name="browse" msgid="1245903488306147205">"Maak oop"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Maak gekose URL oop"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Stuur SMS aan gekose foonnommer"</string>
<string name="add_contact" msgid="7867066569670597203">"Voeg by"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Voeg by kontakte"</string>
<string name="view_calendar" msgid="979609872939597838">"Bekyk"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Bekyk gekose tyd in kalender"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Skeduleer"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Skeduleer geleentheid vir gekose tyd"</string>
<string name="view_flight" msgid="7691640491425680214">"Spoor na"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Spoor gekose vlug na"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Bergingspasie word min"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Sommige stelselfunksies werk moontlik nie"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nie genoeg berging vir die stelsel nie. Maak seker jy het 250 MB spasie beskikbaar en herbegin."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Koppel aan oop Wi-Fi-netwerk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koppel aan diensverskaffer se Wi‑Fi-netwerk"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Koppel tans aan Wi-Fi-netwerk"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Aan Wi-Fi-netwerk gekoppel"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kon nie aan Wi-Fi-netwerk koppel nie"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wys bo-oor ander programme"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Skakel af"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Berei tans <xliff:g id="NAME">%s</xliff:g> voor"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kyk tans vir foute"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuwe <xliff:g id="NAME">%s</xliff:g> bespeur"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Gaan tans <xliff:g id="NAME">%s</xliff:g> na …"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Gaan tans huidige inhoud na"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nuwe <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tik om op te stel"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Om foto\'s en media oor te dra"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Gekorrupteerde <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is korrup. Tik om reg te maak."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Kwessie met <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tik om reg te stel"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is korrup. Kies om reg te stel."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Niegesteunde <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Hierdie toestel steun nie hierdie <xliff:g id="NAME">%s</xliff:g> nie. Tik om in \'n gesteunde formaat op te stel."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Hierdie toestel steun nie hierdie <xliff:g id="NAME">%s</xliff:g> nie. Kies om in \'n gesteunde formaat op te stel."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwags verwyder"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demonteer <xliff:g id="NAME">%s</xliff:g> voordat dit verwyder word om dataverlies te voorkom"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Het <xliff:g id="NAME">%s</xliff:g> verwyder"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> is verwyder; sit \'n nuwe een in"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Demonteer <xliff:g id="NAME">%s</xliff:g> tans nog …"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Moenie verwyder nie"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Maak media los voordat jy dit verwyder om te keer dat jy inhoud verloor"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> is verwyder"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Sommige funksies sal dalk nie behoorlik werk nie. Sit nuwe bergingmedia in."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Maak tans <xliff:g id="NAME">%s</xliff:g> los"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Moenie verwyder nie"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Stel op"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Haal uit"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Verken"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ontbreek"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sit hierdie toestel weer in"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Sit toestel weer in"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Skuif tans <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Skuif tans data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Skuif voltooi"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data na <xliff:g id="NAME">%s</xliff:g> geskuif"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Kon nie data skuif nie"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data oor op oorspronklike ligging"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Inhoudoordrag is klaar"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Inhoud is geskuif na <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kon nie inhoud skuif nie"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Probeer inhoud weer skuif"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Verwyderd"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Uitgegooi"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontroleer tans …"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleer deur jou administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opgedateer deur jou administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Uitgevee deur jou administrateur"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Batterybespaarder verlaag jou toestel se werkverrigting en beperk of skakel vibrasie, liggingdienste en agtergronddata af om sodoende jou batterylewe te verleng. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer nie tensy jy hulle oopmaak.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel laai."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Skakel Databespaarder aan?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Skakel aan"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Gedemp deur <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Daar is \'n interne probleem met jou toestel en dit sal dalk onstabiel wees totdat jy \'n fabriekterugstelling doen."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Daar is \'n interne probleem met jou toestel. Kontak jou vervaardiger vir besonderhede."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-versoek is na gewone oproep toe verander"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-versoek is na SS-versoek toe verander"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Na nuwe USSD-versoek toe verander"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-versoek is na video-oproep toe verander"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-versoek is na gewone oproep toe verander"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-versoek is na video-oproep toe verander"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-versoek is na USSD-versoek toe verander"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Na nuwe SS-versoek toe verander"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vou uit"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Vou in"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM nie opgestel vir stem nie"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM nie toegelaat vir stem nie"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Foon nie toegelaat vir stem nie"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> word nie toegelaat nie"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> is nie opgestel nie"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> word nie toegelaat nie"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> word nie toegelaat nie"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Opspringvenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Programweergawe is afgegradeer, of is nie met hierdie kortpad versoenbaar nie"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 58772d1..2b3c3be 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"የደዋይ ID ነባሪዎች ወደአልተከለከለም። ቀጥሎ ጥሪ፡አልተከለከለም"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"አገልግሎት አልቀረበም።"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"የደዋይ መታወቂያ ቅንብሮች መለወጥ አትችልም፡፡"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ምንም የውሂብ አገልግሎት የለም"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ምንም የአስቸኳይ አደጋ ጥሪ የለም"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ምንም የተንቀሳቃሽ ስልክ ውሂብ አገልግሎት የለም"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"የድንገተኛ አደጋ ጥሪ አይገኝም"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ምንም የድምፅ ጥሪ አገልግሎት የለም"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ምንም የድምፅ እና የድንገተኛ አደጋ ጥሪ አገልግሎት የለም"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"ለጊዜው በአካባቢዎ ባለው የተንቀሳቃሽ ስልክ አውታረ መረብ አይቀርብም"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"አውታረ መረብ ላይ መድረስ አይቻልም"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በቅንብሮች > አውታረ መረብ እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"የWi‑Fi ጥሪ ገቢር ነው"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"የአደጋ ጥሪዎች የተንቀሳቃሽ ስልክ አውታረ መረብ ያስፈልጋቸዋል።"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ምንም የድምፅ አገልግሎት ወይም የድንገተኛ አደጋ ጥሪ የለም"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ለጊዜው በአገልግሎት አቅራቢዎ ጠፍቷል"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ለሲም <xliff:g id="SIMNUMBER">%d</xliff:g> ለጊዜው በእርስዎ አገልግሎት አቅራቢ ጠፍቷል"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"የሞባይል አውታረ መረብን መድረስ አልተቻለም"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ተመራጭ አውታረ መረብን ለመለወጥ ይሞክሩ። ለመለወጥ መታ ያድርጉ።"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"የአደጋ ጊዜ ጥሪ አይገኝም"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"በWi‑Fi በኩል የአደጋ ጊዜ ጥሪዎችን ማድረግ አይችልም"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ማንቂያዎች"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ጥሪ ማስተላለፍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"የዝውውር ሰንደቅ በርቷል"</string>
<string name="roamingText12" msgid="1189071119992726320">"የዝውውር ሰንደቅ ጠፍቷል"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"አገልግሎት ፍለጋ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"የWi-Fi ጥሪ ማድረጊያ"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"የWi‑Fi ጥሪን ማቀናበር አልተቻለም"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ መጠየቅ አለብዎት። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ። (የስህተት ኮድ፦ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ከእርስዎ አገልግሎት አቅራቢ ጋር ይመዝገቡ (ስህተት ኮድ፦ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"ከእርስዎ አገልግሎት አቅራቢ ጋር የWi‑Fi ጥሪን በማስመዝገብ ላይ ችግር፦ <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"እጅግ ብዙ ጥየቃዎች ተካሂደዋል። ትንሽ ቆይተው እንደገና ይሞክሩ።"</string>
<string name="notification_title" msgid="8967710025036163822">"ለ <xliff:g id="ACCOUNT">%1$s</xliff:g> በመለያ መግባት ስህተት"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ሥምሪያ"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ሥምሪያ"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"በጣም ብዙ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ስርዞች።"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ማሳመር አልተቻለም"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"በጣም ብዙ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ለመሰረዝ ተሞክሯል።"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"የጡባዊ ተኮ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"የእጅ ሰዓት ማከማቻ ሙሉ ነው። ቦታ ለማስለቀቅ አንዳንድ ፋይሎችን ይሰርዙ።"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"የቴሌቪዥን ማከማቻ ሙሉ ነው። ቦታ ለማስለቀቅ አንዳንድ ፋይሎችን ይሰርዙ።"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"በእርስዎ የሥራ መገለጫ አስተዳዳሪ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"በ<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"የስራ መገለጫ ተሰርዟል"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"በጎደለ የአስተዳዳሪ መተግበሪያ ምክንያት የሥራ መገለጫ ተሰርዟል።"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"የሥራ መገለጫ አስተዳዳሪ መተግበሪያው ወይም ይጎድላል ወይም ተበላሽቷል። በዚህ ምክንያት የሥራ መገለጫዎ እና ተዛማጅ ውሂብ ተሰርዘዋል። እርዳታን ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"የሥራ መገለጫዎ ከዚህ በኋላ በዚህ መሣሪያ ላይ አይገኝም"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"በጣም ብዙ የይለፍ ቃል ሙከራዎች"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"መሣሪያው የሚተዳደር ነው"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"የእርስዎ ድርጅት ይህን መሣሪያ ያስተዳድራል፣ እና የአውታረ መረብ ትራፊክን ሊከታተል ይችላል። ዝርዝሮችን ለማግኘት መታ ያድርጉ።"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"የእርስዎ መሣሪያ ይደመሰሳል"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"የአስተዳዳሪ መተግበሪያ ጥቅም ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካልዎት የእርስዎን ድርጅት አስተዳዳሪ ያነጋግሩ።"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"የአስተዳዳሪ መተግበሪያ ስራ ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካለዎት የድርጅትዎን አስተዳዳሪ ያነጋግሩ።"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ማተም በ<xliff:g id="OWNER_APP">%s</xliff:g> ተሰናክሏል።"</string>
<string name="me" msgid="6545696007631404292">"እኔ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"የጡባዊ አማራጮች"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"የአውሮፕላን ሁነታ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"የአውሮፕላንሁነታ በርቷል"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"የአውሮፕላንሁነታ ጠፍቷል"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"የባትሪ ኃይል ቆጣቢ"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"የባትሪ ኃይል ቆጣቢ ጠፍቷል"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"የባትሪ ኃይል ቆጣቢ በርቷል"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ደግፍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ወደ የስራ መገለጫ ቀይር"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ዕውቂያዎች"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"የእርስዎ እውቂያዎች ላይ ይድረሱባቸው"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> እውቂያዎችዎን እንዲደርስ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> እውቂያዎችዎን እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"መገኛ አካባቢ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"የዚህን መሣሪያ አካባቢ ይድረሱበት"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የዚህ መሣሪያ አካባቢን እንዲደርስ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የዚህ መሣሪያ አካባቢን እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ቀን መቁጠሪያ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ቀን መቁጠሪያዎን እንዲደርስ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ቀን መቁጠሪያዎን እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"ኤስኤምኤስ"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"የኤስኤምኤስ መልዕክቶችን ይላኩና ይመልከቱ"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የኤስኤምኤስ መልዕክቶችን እንዲልክ እና እንዲመለከት ይፍቀዱለት"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የኤስኤምኤስ መልዕክቶችን እንዲልክ እና እንዲመለከት ይፈቀድለት?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ማከማቻ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"በመሳሪያዎ ላይ ያሉ ፎቶዎችን፣ ማህደረመረጃን እና ፋይሎችን ይድረሱ"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> በመሣሪያዎ ላይ ያሉ ፎቶዎችን፣ ማህደረ መረጃን እና ፋይሎችን እንዲደርስ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> በመሣሪያዎ ላይ ያሉ ፎቶዎችን፣ ማህደረ መረጃን እና ፋይሎችን እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ማይክሮፎን"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ኦዲዮ ይቅዱ"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ኦዲዮን እንዲቀዳ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ኦዲዮን እንዲቀዳ ይፈቀድለት?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ካሜራ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ስዕሎች ያንሱ እና ቪዲዮ ይቅረጹ"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ስዕሎችን እንዲያነሳ እና ቪዲዮን እንዲቀርጽ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ስዕሎችን እንዲያነሳ እና ቪዲዮን እንዲቀርጽ ይፈቀድለት?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ስልክ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"የስልክ ጥሪዎች ያድርጉ እና ያስተዳድሩ"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የስልክ ጥሪዎችን እንዲያደርግ እና እንዲያቀናብር ይፍቀዱለት"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የስልክ ጥሪዎችን እንዲያደርግ እና እንዲያቀናብር ይፈቀድለት?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"የሰውነት ዳሳሾች"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ስለአስፈላጊ ምልክቶችዎ ያሉ የዳሳሽ ውሂብ ይድረሱ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የሰውነትዎ መሠረታዊ ምልክቶች የዳሳሽ ውሂብ እንዲደርስ ይፍቀዱለት"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የሰውነትዎ መሠረታዊ ምልክቶች የዳሳሽ ውሂብ እንዲደርስ ይፈቀድለት?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"የጣት ምልክቶችን ያከናውኑ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"መታ ማድረግ፣ ማንሸራተት፣ መቆንጠጥ እና ሌሎች የጣት ምልክቶችን ማከናወን ይችላል።"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"የጣት አሻራ ምልክቶች"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"በመሣሪያዎቹ የጣት አሻራ ዳሳሽ ላይ የተከናወኑ የጣት ምልክቶችን መያዝ ይችላል።"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"በመሣሪያው የጣት አሻራ ዳሳሽ ላይ የተከናወኑ የጣት ምልክቶችን መያዝ ይችላል።"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"የሁኔቴ አሞሌ አቦዝን ወይም ቀይር"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"የስርዓት አዶዎችን ወደ ሁኔታ አሞሌ ላለማስቻል ወይም ለማከል እና ለማስወገድ ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"የሁኔታ አሞሌ መሆን"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"መተግበሪያው የራሱን ክፍሎች በማህደረ ትውስታ ውስጥ በቋሚነት የሚቀጥሉ እንዲያደርግ ይፈቅድለታል። ይህ ለሌላ መተግበሪያዎች ያለውን ማህደረ ትውስታ በመገደብ ጡባዊ ተኮውን ሊያንቀራፍፈው ይችላል።"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"መተግበሪያው የእራሱ ክፍሎች በማህደረትውስታ ውስጥ ዘላቂ እንዲያደርግ ያስችለዋል። ይሄ ሌሎች መተግበሪያዎች የሚገኘውን ማህደረትውስታ በመገደብ ቴሌቪዥኑን ሊያንቀራፍፈው ይችላል።"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"መተግበሪያው የራሱን ክፍሎች በማህደረ ትውስታ ውስጥ በቋሚነት የሚቀጥሉ እንዲያደርግ ይፈቅድለታል። ይህ ለሌላ መተግበሪያዎች ያለውን ማህደረ ትውስታ በመገደብ ስልኩን ያንቀራፍፈዋል።"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"የፊት አገልግሎትን ማሄድ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"መተግበሪያው ፊት ላይ ያሉ አገልግሎቶችን እንዲጠቀም ያስችለዋል።"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"የመተግበሪያ ማከማቻ ቦታ ለካ"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"የራሱን ኮድ ፣ውሂብ እና መሸጎጫ መጠኖች ሰርስሮ ለማውጣት ለመተግበሪያው ይፈቅዳሉ።"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"የስርዓት ቅንብሮችን አስተካክል"</string>
@@ -478,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"ባዮሜትራዊ ሃርድዌርን መጠቀም"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ስራ እንዲጠቀም ያስችለዋል"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"የጣት አሻራ ሃርድዌርን አስተዳድር"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"መተግበሪያው ጥቅም ላይ እንዲውሉ የጣት አሻራ ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"የጣት አሻራ ሃርድዌርን ተጠቀም"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"አልታወቀም"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"የጣት አሻራ ትክክለኛነት ተረጋግጧል"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"የጣት አሻራ ሃርድዌር አይገኝም።"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"የጣት አሻራ ሊከማች አይችልም። እባክዎ አሁን ያለውን የጣት አሻራ ያስወግዱ።"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"በስርዓተ-ጥለት መክፈት።"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"በፊት መክፈት።"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"የሲም ፒን ክፈት።"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"የሲም ፒዩኬ ክፈት።"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"በይለፍ ቃል መክፈት።"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"የስርዓተ-ጥለት አካባቢ።"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"የማንሸራተቻ አካባቢ።"</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"ፅሁፍ ወደ ቅንጥብ ሰሌዳ ተገልብጧል።"</string>
<string name="more_item_label" msgid="4650918923083320495">"ተጨማሪ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ምናሌ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ቦታ"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"አሰገባ"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ሰርዝ"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"ግቤት ስልት"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"የፅሁፍ እርምጃዎች"</string>
<string name="email" msgid="4560673117055050403">"ኢሜይል"</string>
+ <string name="email_desc" msgid="3638665569546416795">"ለተመረጡ አድራሻዎች ኢሜይል ላክ"</string>
<string name="dial" msgid="1253998302767701559">"ጥሪ"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"ወደተመረጠውን ስልክ ቁጥር ደውል"</string>
<string name="map" msgid="6521159124535543457">"ቦታውን አግኝ"</string>
+ <string name="map_desc" msgid="9036645769910215302">"የተመረጡ አድራሻዎችን በካርታዎች ላይ ያግኙ"</string>
<string name="browse" msgid="1245903488306147205">"ክፈት"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"የተመረጠውን ዩአርኤል ክፈት"</string>
<string name="sms" msgid="4560537514610063430">"መልዕክት"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"ለተመረጠው ስልክ ቁጥር መልዕክት ላክ"</string>
<string name="add_contact" msgid="7867066569670597203">"አክል"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"ወደ እውቂያዎች ያክሉ"</string>
<string name="view_calendar" msgid="979609872939597838">"ይመልከቱ"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"የተመረጠውን ሰዓት በቀን መቁጠሪያ ውስጥ ይመልከቱ"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"መርሐግብር"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"ለተመረጠው ጊዜ የክስተት መርሐግብር ያስይዙ"</string>
<string name="view_flight" msgid="7691640491425680214">"ተከታተል"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"የተመረጠውን በረራ ይከታተሉ"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"የማከማቻ ቦታ እያለቀ ነው"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"አንዳንድ የስርዓት ተግባራት ላይሰሩ ይችላሉ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ለስርዓቱ የሚሆን በቂ ቦታ የለም። 250 ሜባ ነጻ ቦታ እንዳለዎት ያረጋግጡና ዳግም ያስጀምሩ።"</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"ዝማኔ ካለ አረጋግጥ"</string>
<string name="smv_application" msgid="3307209192155442829">"መተግበሪያው <xliff:g id="APPLICATION">%1$s</xliff:g>( ሂደት<xliff:g id="PROCESS">%2$s</xliff:g>) በራስ ተነሳሺ StrictMode ደንብን ይተላለፋል።"</string>
<string name="smv_process" msgid="5120397012047462446">"ሂደቱ <xliff:g id="PROCESS">%1$s</xliff:g> በራስ ተነሳሺ StrictMode ፖሊሲን ይተላለፋል።"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android እያሻሻለ ነው..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android በመጀመር ላይ ነው…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ስልክ በመዘመን ላይ ነው…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ጡባዊ በመዘመን ላይ ነው…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"መሣሪያ በመዘመን ላይ ነው…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ስልክ በመጀመር ላይ ነው…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ጡባዊ በመጀመር ላይ ነው…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"መሣሪያ በመጀመር ላይ ነው…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ማከማቻን በማመቻቸት ላይ።"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"የAndroid ዝማኔን በመጨረስ ላይ…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"አንዳንድ መተግበሪያዎች ማላቁ እስኪጠናቀቅ ድረስ በአግባቡ ላይሰሩ ይችላሉ"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"የስርዓት ዝማኔን በመጨረስ ላይ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> በማላቅ ላይ…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"መተግበሪያዎች በአግባቡ በመጠቀም ላይ <xliff:g id="NUMBER_0">%1$d</xliff:g> ከ <xliff:g id="NUMBER_1">%2$d</xliff:g> ፡፡"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>ን ማዘጋጀት።"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"መተግበሪያዎችን በማስጀመር ላይ፡፡"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"አጨራረስ ማስነሻ፡፡"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> አሂድ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ወደ ጨዋታ ለመመለስ መታ ያድርጉ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ጨዋታ ይምረጡ"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ለተሻለ አፈጻጸም ከእነዚህ መካከል አንዱ ብቻ ነው የሚከፈተው።"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"ወደ <xliff:g id="OLD_APP">%1$s</xliff:g> ተመለስ"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"የቆሻሻ ቁልል ተሰብስቧል፤ ለማጋራት መታ ያድርጉ"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"ለፅሁፍ ድርጊት ምረጥ"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ከክፍት የWi‑Fi አውታረ መረብ ጋር ያገናኙ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ከአገልግሎት አቅራቢ Wi-Fi አውታረ መረብ ጋር ይገናኙ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ከክፍት የWi‑Fi አውታረ መረብ ጋር በመገናኘት ላይ"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ከWi‑Fi አውታረ መረብ ጋር በመገናኘት ላይ"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ከWi‑Fi አውታረ መረብ ጋር ተገናኝቷል"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ከWi‑Fi አውታረ መረብ ጋር መገናኘት አልተቻለም"</string>
<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="1100098935861622985">"ሁሉም አውታረ መረቦች"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ሁሉም አውታረ መረቦች"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi በራስ-ሰር ይበራል"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ከፍተኛ ጥራት ያለው የተቀመጠ አውታረ መረብ አቅራቢያ ሲሆኑ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"መልሰህ አታብራ"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"ዳግም ጀምር"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"የሞባይል አገልግሎትን አግብር"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"የእርስዎን አዲስ ሲም ለማግበር የአገልግሎት አቅራቢውን መተግበሪያ ያውርዱ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"የእርስዎን አዲስ ሲም ለማግበር የ<xliff:g id="APP_NAME">%1$s</xliff:g>ን መተግበሪያ ያውርዱ"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"መተግበሪያን አውርድ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"አዲስ ሲም ገብቷል"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ለማዋቀር መታ ያድርጉ"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP በዩኤስቢ በኩል በርቷል"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"ዩኤስቢን እንደ ሞደም መሰካት በርቷል"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI በዩኤስቢ በኩል በርቷል"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"የዩኤስቢ ተቀጥላ መሣሪያ ሁነታ በርቷል"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"የዩኤስቢ ተቀጥላ ተገናኝቷል"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ለተጨማሪ አማራጮች መታ ያድርጉ።"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"የተገናኘ መሣሪያን ኃይል በመሙላት ላይ። ለተጨማሪ አማራጮች መታ ያድርጉ።"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"የአናሎግ ኦዲዮ ረዳት እንዳለ ተደርሶበታል"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ዓባሪ የተያያዘው መሣሪያ ከዚህ ስልክ ጋር ተኳዃኝ አይደለም። የበለጠ ለመረዳት መታ ያድርጉ።"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"የዩኤስቢ ማረሚያን ለማሰናከል መታ ያድርጉ።"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"የዩኤስቢ ማረሚያን ለማጥፋት መታ ያድርጉ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ማረሚያ ላለማንቃት ምረጥ።"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"የሳንካ ሪፖርትን በመውሰድ ላይ…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"የሳንካ ሪፖርት ይጋራ?"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"አጥፋ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ን በማዘጋጀት ላይ"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ስህተቶች ካሉ በመፈተሽ ላይ"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"አዲስ <xliff:g id="NAME">%s</xliff:g> ተገኝቷል"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"አጥፋ"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>ን በመፈተሽ ላይ…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"አሁን ያለ ይዘትን በመገምገም ላይ"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"አዲስ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ለማዋቀር መታ ያድርጉ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ፎቶዎችን እና ማህደረመረጃን ለማስተላለፍ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ተበላሽቷል <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ተበላሽቷል። ለማስተካከል መታ ያድርጉ።"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ከ<xliff:g id="NAME">%s</xliff:g> ጋር ችግር"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ለማስተካከል መታ ያድርጉ"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> የተበላሸ ነው። ለማስተካከል ይምረጡ።"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ያልተደገፈ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ይህ መሣሪያ ይህን <xliff:g id="NAME">%s</xliff:g> አይደግፍም። በሚደገፍ ቅርጸት ለማዘጋጀት መታ ያድርጉ።"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ይህ መሣሪያ ይህን <xliff:g id="NAME">%s</xliff:g> አይደግፍም። በሚደገፍ ቅርጸት ለማዘጋጀት ይምረጡ።"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ሳይታሰብ ተወግዷል"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ውሂብ እንዳይጠፋ ለመከላከል ከማስወገድዎ በፊት <xliff:g id="NAME">%s</xliff:g>ን ያላቅቁት"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"«<xliff:g id="NAME">%s</xliff:g>» ተወግዷል"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ተወግዷል፤ አዲስ ያስገቡ"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"አሁንም <xliff:g id="NAME">%s</xliff:g>ን በማስወጣት ላይ…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"አያስወግዱ"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ይዘት መጥፋትን ለማስቅረት ከማስወገድ በፊት ማህደረ መረጃን ያስወጡ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ተወግደዋል"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"አንዳንድ ትግበራዎች በአግባቡ ላይሠሩ ይችሉ ይሆናል። አዲስ ማከማቻ ያስገቡ።"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>ን በማስወጣት ላይ…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"አያስወግዱ"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ይጎድላል"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ይህን መሣሪያ ዳግም ያስገቡ"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"ውሂብን በመውሰድ ላይ"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"መውሰድ ተጠናቅቋል"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ውሂብ ወደ <xliff:g id="NAME">%s</xliff:g> ተወስዷል"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ውሂብ መውሰድ አልተቻለም"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ውሂብ በመጀመሪያው አካባቢ ላይ ተትቷል"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"የይዘት ማስተላለፍ ተከናውኗል"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ይዘት ወደ <xliff:g id="NAME">%s</xliff:g> ተንቀሳቅሷል"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ይዘትን ማንቀሳቀስ አልተቻለም"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ይዘትን እንደገና ለማንቀሳቀስ ይሞክሩ"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ተወግዷል"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ወጥቷል"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"በማረጋገጥ ላይ…"</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ሁልጊዜ የበራ VPN በመገናኘት ላይ…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ሁልጊዜ የበራ VPN ተገናኝቷል"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ሁልጊዜ ከበራ ቪፒኤን ጋር ግንኙነት ተቋርጧል"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ሁልጊዜ የበራ VPN ስህተት"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ሁልጊዜ ከበራ ቪፒኤን ጋር መገናኘት አልተቻለም"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"የአውታረ መረብ ወይም የቪፒኤን ቅንብሮችን ይቀይሩ"</string>
<string name="upload_file" msgid="2897957172366730416">"ፋይል ምረጥ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ምንም ፋይል አልተመረጠም"</string>
<string name="reset" msgid="2448168080964209908">"ዳግም አስጀምር"</string>
<string name="submit" msgid="1602335572089911941">"አስረክብ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"የመኪና ሁነታ ነቅቷል"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ከመኪና ሁነታ ለመውጣት መታ ያድርጉ።"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"የመንዳት መተግበሪያ እያሄደ ነው"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ከመንዳት መተግበሪያ ለመውጣት መታ ያድርጉ።"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"መሰካት ወይም ገባሪ ድረስ ነጥብ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ለማዋቀር መታ ያድርጉ።"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"እንደ ሞደም መሰካት ተሰናክሏል"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"የ<xliff:g id="MANUFACTURER">%s</xliff:g> ዩኤስቢ አንጻፊ"</string>
<string name="storage_usb" msgid="3017954059538517278">"የUSB ማከማቻ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"አርትዕ"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"የውሂብ አጠቃቀም ማንቂያ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"አጠቃቀምን እና ቅንብሮችን ለማየት መታ ያድርጉ።"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"የ2ጂ-3ጂ ውሂብ ገደብ ላይ ተደርሷል"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"የ4ጂ ውሂብ ገደብ ላይ ተደርሷል"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"የውሂብ ማስጠንቀቂያ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ከውሂብ <xliff:g id="APP">%s</xliff:g> ተጠቅመዋል"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"የተንቀሳቃሽ ስልክ ውሂብ ገደብ ላይ ተደርሷል"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"የWi-Fi ውሂብ ገደብ ላይ ተደርሷል"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ለተቀረው ዑደት ውሂብ ለአፍታ ቆሟል"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G የውሂብ ወሰን አልፏል"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ውሂብ ወሰን አልፏል"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"የተንቀሳቃሽ ውሂብ ወሰን አልፏል"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi ውሂብ ገደብ ታልፏል"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ከተወሰነለት በላይ።"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ለእርስዎ የተቀረው ዑደት ውሂብ ላፍታ ቆሟል"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ከእርስዎ የተንቀሳቃሽ ስልክ ውሂብ ገደብ በላይ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ከእርስዎ Wi-Fi ውሂብ ገደብ በላይ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ከተቀመጠው የእርስዎ ገደብ <xliff:g id="SIZE">%s</xliff:g> በላይ ሄደዋል"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"ዳራ ውሂብ የተገደበ ነው"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ገደብን ለማስወገድ መታ ያድርጉ።"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ትልቅ የውሂብ አጠቃቀም"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ባለፉት ጥቂት ቀናት ላይ የነበረው የእርስዎ የውሂብ አጠቃቀም ከተለመደው የበለጠ ነው። አጠቃቀምን እና ቅንብሮችን ለመመልከት መታ ያድርጉ።"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ከፍተኛ የተንቀሳቃሽ ውሂብ አጠቃቀም"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"የእርስዎ መተግበሪያ ከተለመደው በላይ ተጨማሪ ውሂብ ተጠቅሟል"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ከተለመደው በላይ ተጨማሪ ውሂብ ተጠቅሟል"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"የደህንነት ዕውቅና ማረጋገጫ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ይህ የዐዕውቅና ማረጋገጫ ትክክል ነው።"</string>
<string name="issued_to" msgid="454239480274921032">"ለ፡ ተዘጋጀ"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"በእርስዎ አስተዳዳሪ ተጭኗል"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"በእርስዎ አስተዳዳሪ ተዘምኗል"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"በእርስዎ አስተዳዳሪ ተሰርዟል"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"የባትሪ ዕድሜን እንዲሻሻል ለማገዝ የመሣሪያዎን አፈጻጸም ይቀንሳል እና ንዝረትን፣ የአካባቢ አገልግሎቶችን እና አብዛኛው ውሂብ ይገድባል። ኢሜይል፣ መልዕክት መላላኪያ እና ሌሎች በስምረት ላይ የሚወሰኑ መተግበሪያዎች እርስዎ ካልከፈቷቸው በስተቀር ላይዘመኑ ይችላሉ።\n\nየእርስዎ መሣሪያ ኃይል በሚሞላበት ጊዜ ባትሪ ቆጣቢ በራስ-ሰር ይጠፋል።"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"የባትሪ ህይወትን ለማሻሻል ባትሪ ቆጣቢ የመሣሪያዎን አፈጻጸምን ይቀንስና ንዝረትን፣ የአካባቢ አገልግሎቶችን እና የጀርባ ውሂብን ይገድባል። ኢሜይል፣ መልዕክት መላላክ እና ሌሎች በስምረት ላይ የሚወሰኑ መተግበሪያዎች እስኪከፍቷቸው ድረስ ላያዘምኑ ይችላሉ።\n\nመሣሪያዎ ኃይል በሚሞላበት ማንኛውም ጊዜ ላይ ባትሪ ቆጣቢ በራስ-ሰር ይጠፋል።"</string>
<string name="data_saver_description" msgid="6015391409098303235">"የውሂብ አጠቃቀም እንዲቀንስ ለማገዝ ውሂብ ቆጣቢ አንዳንድ መተግበሪያዎች ከበስተጀርባ ሆነው ውሂብ እንዳይልኩ ወይም እንዳይቀበሉ ይከለክላቸዋል። በአሁኑ ጊዜ እየተጠቀሙበት ያለ መተግበሪያ ውሂብ ሊደርስ ይችላል፣ ነገር ግን ባነሰ ተደጋጋሚነት ሊሆን ይችላል። ይሄ ማለት ለምሳሌ ምስሎችን መታ እስኪያደርጓቸው ድረስ ላይታዩ ይችላሉ ማለት ነው።"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ውሂብ ቆጣቢ ይጥፋ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"አብራ"</string>
@@ -1681,9 +1702,9 @@
<item quantity="one">ለ%1$d ደቂቃ (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">ለ%1$d ደቂቃ (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">ለ%1$d ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
- <item quantity="other">ለ%1$d ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">ለ1 ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
+ <item quantity="other">ለ1 ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">ለ%1$d ሰዓት (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,7 +1718,7 @@
<item quantity="one">ለ%d ደቂቃ</item>
<item quantity="other">ለ%d ደቂቃ</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">ለ%d ሰዓቶች</item>
<item quantity="other">ለ%d ሰዓቶች</item>
</plurals>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"ድምጽ በ<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ተዘግቷል"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ፣ የፋብሪካ ውሂብ ዳግም እስኪያስጀምሩት ድረስ ላይረጋጋ ይችላል።"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ። ዝርዝሮችን ለማግኘት አምራችዎን ያነጋግሩ።"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD ጥያቄ ወደ ደውል ጥያቄ ተሻሽሎዋል።"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD ጥያቄ ወደ SS ጥያቄ ተሻሽሎዋል።"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD ጥያቄ ወደ አዲስ USSD ጥያቄ ተሻሽሎዋል።"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"የUSSD ጥያቄ ወደ የቪድዪኦ ደውል ጥያቄ ተቀይሯል።"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ጥያቄ ወደ ደውል ጥያቄ ተሻሽሎዋል።"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"የSS ጥያቄ ወደ የቪዲዮ ደውል ጥያቄ ተቀይሯል።"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ጥያቄ ወደ USSD ጥያቄ ተሻሽሎዋል።"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ጥያቄ ወደ አዲስ SS ጥያቄ ተሻሽሎዋል።"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"የUSSD ጥያቄ ወደ መደበኛ ጥሪ ተለውጧል"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"የUSSD ጥያቄ ወደ ኤስኤስ ጥያቄ ተለውጧል"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"ወደ አዲስ የUSSD ጥያቄ ተለውጧል"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"የUSSD ጥያቄ ወደ የቪዲዮ ጥሪ ተለውጧል"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"የSS ጥያቄ ወደ መደበኛ ጥሪ ተለውጧል"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"የSS ጥያቄ ወደ የቪዲዮ ጥሪ ተለውጧል"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"የSS ጥያቄ ወደ የUSSD ጥያቄ ተለውጧል"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"ወደ አዲስ የSS ጥያቄ ተለውጧል"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"የስራ መገለጫ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ዘርጋ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ሰብስብ"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ሲም ለድምጽ አልቀረበም"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ሲም ለድምጽ አይፈቀድም"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ስልክ ለድምጽ አይፈቀድም"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"ሲም <xliff:g id="SIMNUMBER">%d</xliff:g> አይፈቀድም"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ሲም <xliff:g id="SIMNUMBER">%d</xliff:g> አልቀረበም"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"ሲም <xliff:g id="SIMNUMBER">%d</xliff:g> አይፈቀድም"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"ሲም <xliff:g id="SIMNUMBER">%d</xliff:g> አይፈቀድም"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ብቅ-ባይ መስኮት"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"የመተግበሪያ ስሪት ደረጃው ዝቅ ብሏል ወይም ከዚህ አቋራጭ ጋር ተኳዃኝ አይደለም"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ጎጂ መተግበሪያ ተገኝቷል"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን ማሳየት ይፈልጋል"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"አርትዕ"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ጥሪዎች እና ማሳወቂያዎች ይነዝራሉ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ጥሪዎች እና ማሳወቂያዎች ድምፀ-ከል ይሆናሉ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"የሥርዓት ለውጦች"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"አትረብሽ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"እርስዎ ትኩረት እንዲሰጡ ለማገዝ አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ይህ አዲስ ባሕሪ ነው። ለመለወጥ መታ ያድርጉ።"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"አትረብሽ ተቀይሯል"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ለማቋረጦች የባህሪ ቅንብሮችዎን ለመፈተሽ መታ ያድርጉ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ምን እንደታገደ ለመፈተሽ መታ ያድርጉ።"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ሥርዓት"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ቅንብሮች"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 1d48e88..73b9c0b 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -81,15 +81,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"الإعداد الافتراضي لمعرف المتصل هو غير محظور . الاتصال التالي: غير محظور"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"الخدمة غير متوفرة."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"لا يمكنك تغيير إعداد معرّف المتصل."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ليست هناك خدمة بيانات"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"لا يوجد اتصال في حالات الطوارئ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"لا تتوفّر خدمة بيانات جوّال."</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"لا تتوفّر مكالمات طوارئ."</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"لا تتوفر خدمة صوتية"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"لا تتوفر خدمة الصوت/الطوارئ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"مؤقتا لا تقدمها شبكة الجوال في موقعك"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"يتعذر الوصول إلى الشبكة"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"لتحسين الاستقبال، يمكنك محاولة تغيير النوع المحدّد من خلال الإعدادات > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"الاتصال عبر Wi-Fi نشط"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"تتطلب مكالمات الطوارئ شبكة جوّال."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"لا تتوفّر خدمة صوتية أو مكالمات طوارئ."</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"أجرى مشغّل شبكة الجوّال إيقافًا مؤقتًا للخدمة."</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"أجرى مشغّل شبكة الجوّال إيقافًا مؤقتًا للخدمة لشريحة SIM رقم <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"يتعذّر الوصول إلى شبكة الجوّال."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"حاول تغيير الشبكة المفضلة. انقر لتغييرها."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"لا تتوفر إمكانية الاتصال في حالات الطوارئ."</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"يتعذّر إجراء مكالمات طوارئ عبر Wi‑Fi."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"التنبيهات"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"إعادة توجيه المكالمة"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"وضع معاودة الاتصال بالطوارئ"</string>
@@ -124,12 +125,12 @@
<string name="roamingText11" msgid="4154476854426920970">"إعلان بانر للتجوال قيد التشغيل"</string>
<string name="roamingText12" msgid="1189071119992726320">"إعلان بانر للتجوال متوقف"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"البحث عن خدمة"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"الاتصال عبر Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"تعذّر إعداد الاتصال عبر Wi‑Fi."</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذه الخدمة، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات. (رمز الخطأ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"التسجيل لدى مشغِّل شبكة الجوّال (رمز الخطأ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"حدثت مشكلة أثناء تسجيل الاتصال عبر Wi‑Fi باستخدام مشغِّل شبكة الجوّال: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -164,8 +165,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"تتم الآن معالجة طلبات كثيرة للغاية. حاول مرة أخرى في وقت لاحق."</string>
<string name="notification_title" msgid="8967710025036163822">"حدث خطأ أثناء تسجيل الدخول إلى <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"مزامنة"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"مزامنة"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"عمليات حذف <xliff:g id="CONTENT_TYPE">%s</xliff:g> كثيرة للغاية."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"تتعذّر المزامنة."</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"تمت محاولة حذف مقدار كبير من محتوى <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"سعة تخزين الجهاز اللوحي ممتلئة! احذف بعض الملفات لإخلاء مساحة."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"سعة تخزين المشاهدة ممتلئة! احذف بعض الملفات لتحرير مساحة."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"سعة تخزين التلفزيون ممتلئة. يمكنك حذف بعض الملفات لتوفير مساحة فارغة."</string>
@@ -182,14 +183,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"بواسطة مشرف الملف الشخصي للعمل"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"بواسطة <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"تم حذف الملف الشخصي للعمل."</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"تم حذف الملف الشخصي للعمل نتيجة فقد تطبيق المشرف"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"تطبيق المشرف للملف الشخصي للعمل مفقود أو تالف لذا تم حذف الملف الشخصي للعمل والبيانات ذات الصلة. اتصل بالمشرف للحصول على المساعدة."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"لم يعد ملفك الشخصي للعمل متاحًا على هذا الجهاز"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"تم إجراء محاولات كثيرة جدًا لإدخال كلمة المرور"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"تتم إدارة الجهاز"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"تدير مؤسستك هذا الجهاز ويمكنها مراقبة حركة بيانات الشبكة. يمكنك النقر للحصول على تفاصيل."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"سيتم محو بيانات جهازك."</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"تعذر استخدام تطبيق المشرف. سيتم محو بيانات جهازك الآن.\n\nإذا كانت لديك أسئلة، فاتصل بمشرف مؤسستك."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"تعذّر استخدام تطبيق المشرف. سيتم محو بيانات جهازك الآن.\n\nإذا كانت لديك أسئلة، اتصل بمشرف مؤسستك."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"تم تعطيل الطباعة بواسطة <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"أنا"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"خيارات الجهاز اللوحي"</string>
@@ -248,6 +248,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"وضع الطائرة"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"وضع الطائرة قيد التشغيل"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقف"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"توفير شحن البطارية"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"توفير شحن البطارية غير مفعّل"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"توفير شحن البطارية مفعّل"</string>
<string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"مساعدة"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"المساعد الصوتي"</string>
@@ -281,31 +284,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"التبديل إلى الملف الشخصي للعمل"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"جهات الاتصال"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"الوصول إلى جهات اتصالك"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى جهات الاتصال"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى جهات الاتصال؟"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"الموقع"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"الوصول إلى موقع هذا الجهاز"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى موقع هذا الجهاز"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى الموقع الجغرافي لهذا الجهاز؟"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"التقويم"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"الوصول تقويمك"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى التقويم"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى التقويم؟"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"إرسال رسائل قصيرة SMS وعرضها"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإرسال رسائل SMS وعرضها"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتوجيه رسائل SMS وعرضها؟"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"التخزين"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"الوصول إلى الصور والوسائط والملفات على جهازك"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى الصور والوسائط والملفات على جهازك"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى الصور والوسائط والملفات على جهازك؟"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"الميكروفون"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"تسجيل الصوت"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت؟"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"الكاميرا"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"التقاط صور وتسجيل فيديو"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالتقاط الصور وتسجيل الفيديو"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالتقاط الصور وتسجيل الفيديو؟"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"الهاتف"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"إجراء مكالمات هاتفية وإدارتها"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها؟"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"أجهزة استشعار الجسم"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى بيانات المستشعر حول علاماتك الحيوية؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"استرداد محتوى النافذة"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"فحص محتوى نافذة يتم التفاعل معها."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"تشغيل الاستكشاف باللمس"</string>
@@ -317,7 +320,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"تنفيذ إيماءات"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"يمكن النقر والتمرير بسرعة والتصغير وتنفيذ إيماءات أخرى."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"إيماءات بصمات الإصبع"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"يمكن أن تلتقط الإيماءات التي تم تنفيذها على مستشعر بصمات الإصبع في الأجهزة."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"يمكن أن تلتقط الإيماءات التي تم تنفيذها على مستشعر بصمات الإصبع في الجهاز."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"تعطيل شريط الحالة أو تعديله"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"للسماح للتطبيق بتعطيل شريط الحالة أو إضافة رموز نظام وإزالتها."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"العمل كشريط للحالة"</string>
@@ -368,6 +371,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"للسماح للتطبيق بجعل أجزاء منه ثابتة في الذاكرة. وقد يؤدي هذا إلى تقييد الذاكرة المتاحة للتطبيقات الأخرى مما يؤدي إلى حدوث بطء في الجهاز اللوحي."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"يتيح للتطبيق تعيين أجزاء من التطبيق نفسه لتظل ثابتة في الذاكرة. وقد يقيد هذا من الذاكرة المتاحة للتطبيقات الأخرى، مما يؤدي إلى بطء في التلفزيون."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"للسماح للتطبيق بجعل أجزاء منه ثابتة في الذاكرة. وقد يؤدي هذا إلى تقييد الذاكرة المتاحة للتطبيقات الأخرى مما يؤدي إلى حدوث بطء في الهاتف."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"تشغيل الخدمة في المقدمة"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"للسماح للتطبيق بالاستفادة من الخدمات التي تعمل في المقدمة."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"قياس مساحة تخزين التطبيق"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"للسماح للتطبيق باسترداد شفرته وبياناته وأحجام ذاكرات التخزين المؤقت"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"تعديل إعدادات النظام"</string>
@@ -490,6 +495,8 @@
<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_useBiometric" msgid="8837753668509919318">"استخدام الأجهزة البيومترية"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"للسماح للتطبيق باستخدام الأجهزة البيومترية للمصادقة"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"لإدارة أجهزة بصمة الإصبع"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"للسماح للتطبيق باستدعاء طرق لإضافة نماذج من بصمات الأصابع وحذفها."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"لاستخدام أجهزة بصمة الإصبع"</string>
@@ -502,6 +509,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"لم يتم التعرف عليها"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"تم مصادقة بصمة الإصبع"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"جهاز بصمة الإصبع غير متاح."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string>
@@ -814,6 +822,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القفل باستخدام النقش."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"تأمين الجهاز بالوجه."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القفل باستخدام رمز PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"إلغاء قفل رقم التعريف الشخصي لشريحة SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"إلغاء قفل مفتاح PUK لشريحة SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"إلغاء القفل باستخدام كلمة المرور."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"منطقة النقش."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"منطقة التمرير."</string>
@@ -875,6 +885,12 @@
<string name="text_copied" msgid="4985729524670131385">"تم نسخ النص إلى الحافظة."</string>
<string name="more_item_label" msgid="4650918923083320495">"المزيد"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"القائمة+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"مسافة"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"حذف"</string>
@@ -1074,14 +1090,23 @@
<string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string>
<string name="email" msgid="4560673117055050403">"بريد إلكتروني"</string>
+ <string name="email_desc" msgid="3638665569546416795">"مراسلة العنوان المختار عبر البريد الإلكتروني"</string>
<string name="dial" msgid="1253998302767701559">"اتصال"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"الاتصال برقم الهاتف المختار"</string>
<string name="map" msgid="6521159124535543457">"تحديد الموقع"</string>
+ <string name="map_desc" msgid="9036645769910215302">"تحديد موقع العنوان المختار"</string>
<string name="browse" msgid="1245903488306147205">"فتح"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"فتح عنوان URL المختار"</string>
<string name="sms" msgid="4560537514610063430">"رسالة"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"مراسلة رقم الهاتف المختار"</string>
<string name="add_contact" msgid="7867066569670597203">"إضافة"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"إضافة إلى جهات الاتصال"</string>
<string name="view_calendar" msgid="979609872939597838">"عرض"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"عرض الوقت المختار في التقويم"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"تحديد موعد حدث"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"جدولة الحدث في الوقت المختار"</string>
<string name="view_flight" msgid="7691640491425680214">"تتبّع"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"تتبُّع الرحلة الجوية المختارة"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"مساحة التخزين منخفضة"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"قد لا تعمل بعض وظائف النظام"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ليست هناك سعة تخزينية كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ٢٥٠ ميغابايت وأعد التشغيل."</string>
@@ -1154,31 +1179,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"البحث عن تحديث"</string>
<string name="smv_application" msgid="3307209192155442829">"انتهك التطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> (العملية <xliff:g id="PROCESS">%2$s</xliff:g>) سياسة StrictMode المفروضة ذاتيًا."</string>
<string name="smv_process" msgid="5120397012047462446">"انتهكت العملية <xliff:g id="PROCESS">%1$s</xliff:g> سياسة StrictMode المفروضة ذاتيًا."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"جارٍ ترقية Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"جارٍ تشغيل Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"جارٍ تحديث الهاتف…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"جارٍ تحديث الجهاز اللوحي…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"جارٍ تحديث الجهاز…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"جارٍ بدء تشغيل الهاتف…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"جارٍ بدء تشغيل الجهاز اللوحي…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"جارٍ بدء تشغيل الجهاز…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"جارٍ تحسين السعة التخزينية."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"جارٍ إتمام تحديث Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"قد لا تعمل بعض التطبيقات بشكل مناسب إلا بعد انتهاء الترقية"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"جارٍ إنهاء تحديث النظام…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"جارٍ ترقية <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"جارٍ تحسين التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"جارٍ تحضير <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"بدء التطبيقات."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"جارٍ إعادة التشغيل."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"انقر للعودة إلى اللعبة"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"اختيار اللعبة"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"للحصول على أداء أفضل، يمكن فتح لعبة واحدة فقط من هذه الألعاب في كل مرة."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"الرجوع إلى <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"تم نسخ الذاكرة، انقر للمشاركة."</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"اختيار إجراء للنص"</string>
@@ -1221,12 +1243,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"الاتصال بشبكة Wi-Fi المفتوحة"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"الاتصال بشبكة Wi‑Fi لمشغِّل شبكة الجوّال"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"جارٍ الاتصال بشبكة Wi-Fi المفتوحة"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"جارٍ الاتصال بشبكة Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"تم الاتصال بشبكة Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"تعذَّر الاتصال بشبكة Wi‑Fi"</string>
<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="1100098935861622985">"جميع الشبكات"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"جميع الشبكات"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"سيتم تشغيل شبكة Wi-Fi تلقائيًا."</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"عندما تكون بالقرب من شبكة محفوظة عالية الجودة"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"عدم إعادة التشغيل"</string>
@@ -1292,6 +1314,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"إعادة التشغيل"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"تفعيل خدمة الجوّال"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"تنزيل تطبيق مشغل شبكة الجوّال لتفعيل شريحة SIM الجديدة"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"تنزيل تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> لتفعيل شريحة SIM الجديدة"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"تنزيل التطبيق"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"تم إدخال شريحة SIM جديدة."</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"انقر لإعداده."</string>
@@ -1310,13 +1333,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"تمّ تفعيل PTP عبر USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"تمّ تفعيل التوصيل عبر USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"تمّ تفعيل MIDI عبر USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"تمّ تفعيل وضع ملحق USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"تم توصيل ملحق USB."</string>
<string name="usb_notification_message" msgid="3370903770828407960">"انقر للحصول على المزيد من الخيارات."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"جارٍ شحن الجهاز المتصل. انقر لعرض خيارات أكثر."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"تم اكتشاف ملحق صوتي تناظري"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"الجهاز الذي تم توصيله بالهاتف غير متوافق معه. انقر للحصول على المزيد من المعلومات."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"تم توصيل تصحيح أخطاء USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"انقر لتعطيل تصحيح أخطاء USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"انقر لإيقاف تصحيح أخطاء USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"اختيار تعطيل تصحيح أخطاء USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"جارٍ الحصول على تقرير الخطأ…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"هل تريد مشاركة تقرير الخطأ؟"</string>
@@ -1335,34 +1358,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر تعطيلها."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"إيقاف"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"جارٍ تحضير <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"جارٍ التحقق من الأخطاء"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"تم اكتشاف <xliff:g id="NAME">%s</xliff:g> جديدة"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"إيقاف"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"جارٍ التحقق من <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"جارٍ مراجعة المحتوى الحالي"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> جديدة"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"انقر للإعداد."</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"لنقل الصور والوسائط"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"أصاب <xliff:g id="NAME">%s</xliff:g> التلف"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> تالف. انقر لإصلاحه."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"هناك مشكلة في <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"انقر للإصلاح"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> تالف، ويمكنك اختيار إصلاحه."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> غير متوافق"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"هذا الجهاز غير متوافق مع <xliff:g id="NAME">%s</xliff:g> هذا. انقر للإعداد بتنسيق متوافق."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"لا يتوافق هذا الجهاز مع <xliff:g id="NAME">%s</xliff:g>. يمكنك النقر للإعداد بتنسيق متوافق."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"تمت إزالة <xliff:g id="NAME">%s</xliff:g> بشكل غير متوقع"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"إلغاء تحميل <xliff:g id="NAME">%s</xliff:g> قبل الإزالة لتجنب فقد البيانات"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>؛ أدخل واحدة جديدة"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"لا يزال إخراج <xliff:g id="NAME">%s</xliff:g> جاريًا…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"لا تزِلها"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"إخراج الوسائط قبل الإزالة لتجنّب فقدان المحتوى"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"قد لا تعمل بعض الوظائف بشكل صحيح. أدخل وحدة تخزين جديدة."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"جارٍ إخراج <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"عدم الإزالة"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> مفقود"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"أعد إدخال هذا الجهاز"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"جارٍ نقل البيانات"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"اكتمل النقل"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"تم نقل البيانات إلى <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"تعذر نقل البيانات"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"تم ترك البيانات في الموقع الأصلي"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"تم نقل المحتوى"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"تم نقل المحتوى إلى <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"تعذّر نقل المحتوى"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"جرّب نقل المحتوى مرة أخرى"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"تم الإخراج"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"تم إنهاء التحميل"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"جارٍ التحقق…"</string>
@@ -1421,14 +1445,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"جارٍ الاتصال بشبكة افتراضية خاصة (VPN) دائمة التشغيل..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"تم الاتصال بشبكة افتراضية خاصة (VPN) دائمة التشغيل"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"تم قطع الاتصال بالشبكة الافتراضية الخاصة (VPN) التي يتم تشغيلها دائمًا"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطأ بشبكة افتراضية خاصة (VPN) دائمة التشغيل"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"تعذّر الاتصال بشبكة VPN التي يتم تشغيلها دائمًا."</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"تغيير إعدادات الشبكة أو الشبكة الافتراضية الخاصة (VPN)"</string>
<string name="upload_file" msgid="2897957172366730416">"اختيار ملف"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"لم يتم اختيار أي ملف"</string>
<string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string>
<string name="submit" msgid="1602335572089911941">"إرسال"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"تم تمكين وضع السيارة"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"انقر للخروج من وضع السيارة."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"تطبيق القيادة قيد التشغيل"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"انقر للخروج من تطبيق القيادة."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"النطاق أو نقطة الاتصال نشطة"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"انقر للإعداد."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"تم تعطيل التوصيل"</string>
@@ -1510,22 +1534,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"محرك أقراص USB من <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"وحدة تخزين USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"تعديل"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"تنبيه استخدام البيانات"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"انقر لعرض الاستخدام والإعدادات."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"تم بلوغ حد بيانات اتصال 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"تم بلوغ حد بيانات اتصال 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"تحذيرات البيانات"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"لقد استخدمت <xliff:g id="APP">%s</xliff:g> من البيانات."</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"تم بلوغ حد بيانات الجوّال"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"تم بلوغ حد بيانات Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"توقفت البيانات مؤقتًا لاستكمال الدورة"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"تم تجاوز حد بيانات شبكات 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"تم تجاوز حد بيانات 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"تم تجاوز حد بيانات الجوّال"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"تم تجاوز حد بيانات شبكة Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> فوق الحد المعين."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"تم إيقاف البيانات مؤقتًا لبقية الدورة"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"تم تجاوز أقصى حد لبيانات الجوّال"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"تم تجاوز أقصى حد لبيانات Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"تم تجاوز الحد الأقصى المسموح به الذي عيَّنته بمقدار <xliff:g id="SIZE">%s</xliff:g>."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"تم تقييد بيانات الخلفية"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"انقر لإزالة القيد."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"معدل مرتفع لاستخدام البيانات"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"لقد تجاوز استخدامك للبيانات خلال الأيام القليلة الماضية المعدل المعتاد. انقر لعرض البيانات عن الاستخدام والإعدادات."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"استخدام مرتفع لبيانات الجوّال"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"استخدمت تطبيقاتك بيانات أكثر من المعتاد"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"استخدمَ تطبيق <xliff:g id="APP">%s</xliff:g> بيانات أكثر من المعتاد"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"شهادة الأمان"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"هذه الشهادة صالحة."</string>
<string name="issued_to" msgid="454239480274921032">"إصدار لـ:"</string>
@@ -1769,7 +1790,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"تم التثبيت بواسطة المشرف"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"تم التحديث بواسطة المشرف"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"تم الحذف بواسطة المشرف"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"للمساعدة في تحسين عمر البطارية، تساعد ميزة توفير شحن البطارية في تقليل أداء الجهاز والحد من الاهتزاز وخدمات المواقع الجغرافي ومعظم بيانات الخلفية. وقد لا يتم تحديث البريد الإلكتروني والمراسلة والتطبيقات الأخرى التي تعتمد على المزامنة ما لم يتم فتحها.\n\nيتم إيقاف ميزة توفير شحن البطارية تلقائيًا عند شحن الجهاز."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"لإطالة عمر البطارية، تعمل ميزة \"توفير شحن البطارية\" على تقليل أداء الجهاز والحد من استخدام الاهتزاز وخدمات الموقع الجغرافي وبيانات الخلفية أو إيقافه. وقد لا يتم تحديث البريد الإلكتروني والمراسلة والتطبيقات الأخرى التي تعتمد على المزامنة ما لم يتم فتحها.\n\nيتم إيقاف ميزة \"توفير شحن البطارية\" تلقائيًا عند شحن الجهاز."</string>
<string name="data_saver_description" msgid="6015391409098303235">"للمساعدة في خفض استخدام البيانات، يمنع توفير البيانات بعض التطبيقات من إرسال البيانات وتلقيها في الخلفية. يمكن للتطبيق الذي تستخدمه الآن الوصول إلى البيانات، ولكن لا يمكنه تنفيذ ذلك كثيرًا. وهذا يعني أن الصور على سبيل المثال لا تظهر حتى تنقر عليها."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"هل تريد تشغيل توفير البيانات؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"تشغيل"</string>
@@ -1789,12 +1810,12 @@
<item quantity="other">لمدة %1$d من الدقائق (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">لمدة دقيقة (حتى <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="zero">لمدة أقل من ساعة (%1$d) (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="zero">لمدة %1$d ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="two">لمدة ساعتين (%1$d) (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">لمدة %1$d ساعات (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">لمدة %1$d ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">لمدة %1$d من الساعات (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="many">لمدة %1$d ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">لمدة %1$d ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">لمدة ساعة واحدة (حتى <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
@@ -1821,12 +1842,12 @@
<item quantity="other">لمدة %d من الدقائق</item>
<item quantity="one">لمدة دقيقة</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="zero">لمدة أقل من ساعة (%d)</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="zero">لمدة %d ساعة</item>
<item quantity="two">لمدة ساعتين (%d)</item>
<item quantity="few">لمدة %d ساعات</item>
<item quantity="many">لمدة %d ساعة</item>
- <item quantity="other">لمدة %d من الساعات</item>
+ <item quantity="other">لمدة %d ساعة</item>
<item quantity="one">لمدة ساعة واحدة</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
@@ -1852,14 +1873,14 @@
<string name="muted_by" msgid="6147073845094180001">"تم كتم الصوت بواسطة <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"حدثت مشكلة داخلية في جهازك، وقد لا يستقر وضعه حتى إجراء إعادة الضبط بحسب بيانات المصنع."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"حدثت مشكلة داخلية في جهازك. يمكنك الاتصال بالمصنِّع للحصول على تفاصيل."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"يتم تعديل طلب USSD لطلب الاتصال."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"يتم تعديل طلب USSD إلى طلب SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"يتم تعديل طلب USSD إلى طلب USSD الجديد."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"تم تعديل طلب USSD إلى طلب Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"يتم تعديل الطلب SS لطلب الاتصال."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"تم تعديل طلب SS إلى طلب Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"يتم تعديل طلب SS إلى طلب USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"يتم تعديل طلب SS إلى طلب SS الجديد."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"تم تغيير طلب USSD إلى مكالمة عادية."</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"تم تغيير طلب USSD إلى طلب SS."</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"تم التغيير إلى طلب USSD الجديد."</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"تم تغيير طلب USSD إلى مكالمة فيديو."</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"تم تغيير طلب SS إلى مكالمة عادية."</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"تم تغيير طلب SS إلى مكالمة فيديو."</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"تم تغيير طلب SS إلى طلب USSD."</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"تم التغيير إلى طلب SS الجديد."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"الملف الشخصي للعمل"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"توسيع"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"تصغير"</string>
@@ -1965,6 +1986,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"لم يتم توفير SIM للصوت"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"غير مسموح باستخدام SIM للصوت"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"غير مسموح باستخدام الهاتف للصوت"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"غير مسموح بشريحة SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"لم يتم توفير شريحة SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"غير مسموح بشريحة SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"غير مسموح بشريحة SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"نافذة منبثقة"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"إصدار التطبيق أقدم من إصداره على الجهاز الآخر أو أنه ليس متوافقًا مع هذا الاختصار."</string>
@@ -1977,7 +2002,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"تم العثور على تطبيق ضار"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"تعديل"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقي المكالمات والإشعارات"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"تغييرات النظام"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"الرجاء عدم الإزعاج"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"يؤدي تفعيل وضع \"الرجاء عدم الإزعاج\" إلى إخفاء الإشعارات لمساعدتك على التركيز."</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"هذا السلوك جديد. انقر لتغييره."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"تم تغيير وضع \"الرجاء عدم الإزعاج\"."</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"انقر للتأكد من عدم وجود انقطاع في إعدادات السلوك."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"انقر للاطّلاع على ما تم حظره."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"النظام"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"الإعدادات"</string>
</resources>
diff --git a/core/res/res/values-as-watch/strings.xml b/core/res/res/values-as-watch/strings.xml
index 1c91d10..a3498c0 100644
--- a/core/res/res/values-as-watch/strings.xml
+++ b/core/res/res/values-as-watch/strings.xml
@@ -20,7 +20,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for android_upgrading_apk (1090732262010398759) -->
- <skip />
+ <string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g>টা এপৰ ভিতৰত <xliff:g id="NUMBER_0">%1$d</xliff:g>টা"</string>
<string name="permgrouplab_sensors" msgid="202675452368612754">"ছেন্সৰসমূহ"</string>
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 5ab2fa6..90f9822 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"কলাৰ আইডি সীমিত নকৰিবলৈ পূর্বনির্ধাৰণ কৰা হৈছে। পৰৱৰ্তী কল: সীমিত কৰা হোৱা নাই"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"সুবিধা যোগান ধৰা হোৱা নাই।"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"আপুনি কলাৰ আইডি ছেটিং সলনি কৰিব নোৱাৰে।"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"কোনো ডেটা সেৱা নাই"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"জৰুৰীকালীন কল অৱৰোধিত কৰা হৈছে"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"কোনো ম\'বাইল ডেটা সেৱা নাই"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"জৰুৰীকালীন কল কৰাৰ সুবিধা উপলব্ধ নহয়"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"কোনো ভইচ সেৱা নাই"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"কোনো ভইচ/জৰুৰীকালীন সেৱা নাই"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"আপোনাৰ এলেকাত সাময়িকভাৱে ম\'বাইল নেটৱৰ্কটোৱে যোগান ধৰা নাই"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটৱর্ক পাব পৰা নাই"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"বেতাঁৰ সম্প্ৰচাৰ লাভৰ মান উন্নত কৰিবলৈ, ছেটিংসমূহ > নেটৱৰ্ক আৰু ইণ্টাৰনেট > ম\'বাইল নেটৱৰ্কসমূহ > পচন্দৰ নেটৱৰ্কৰ প্ৰকাৰ-লৈ গৈ বাছনি কৰি থোৱা নেটৱৰ্কৰ প্ৰকাৰটো সলনি কৰি চাওক।"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ৱাই-ফাই কলিং সক্ৰিয় হৈ আছে"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"জৰুৰীকালীন কল কৰিবলৈ নেটৱৰ্কৰ প্ৰয়োজন।"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ধ্বনি সেৱা বা জৰুৰীকালীন কলৰ সেৱা উপলব্ধ নহয়"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"আপোনাৰ বাহকে সাময়িকভাৱে অফ কৰি থৈছে"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ম\'বাইল নেটৱৰ্কৰ লগত সংযোগ কৰিব পৰা নাই"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"পচন্দৰ নেটৱৰ্ক সলনি কৰি চেষ্টা কৰি চাওক। সলনি কৰিবলৈ টিপক।"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"জৰুৰীকালীন কল কৰাৰ সুবিধা উপলব্ধ নহয়"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ৱাই-ফাইৰ জৰিয়তে জৰুৰীকালীন কল কৰিব নোৱাৰি"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"সতৰ্কবাণীসমূহ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফৰৱাৰ্ডিং"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জৰুৰীকালীন ক\'লবেক ম\'ড"</string>
@@ -93,8 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"এছএমএছ বার্তাবোৰ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভইচমেইলৰ বাৰ্তাসমূহ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ৱাই-ফাই কলিং"</string>
- <!-- no translation found for notification_channel_sim (4052095493875188564) -->
- <skip />
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ছিমৰ স্থিতি"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড FULLলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
@@ -121,25 +122,21 @@
<string name="roamingText11" msgid="4154476854426920970">"ৰ\'মিঙৰ বেনাৰ অন অৱস্থাত আছে"</string>
<string name="roamingText12" msgid="1189071119992726320">"ৰ\'মিঙৰ বেনাৰ অফ অৱস্থাত আছে"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"সেৱাৰ বাবে অনুসন্ধান কৰি থকা হৈছে"</string>
- <!-- no translation found for wfcRegErrorTitle (2301376280632110664) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ৱাই-ফাই কলিং ছেট আপ কৰিব পৰা নগ\'ল"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ৱাই-ফাইৰ জৰিয়তে কল কৰিবলৈ আৰু বাৰ্তা পঠাবলৈ, প্ৰথমে আপোনাৰ বাহকক আপোনাৰ ডিভাইচটো ছেট আপ কৰিব দিবলৈ কওক। তাৰ পিচত, ছেটিংসমূহলৈ গৈ আকৌ ৱাই-ফাই কলিং অন কৰক। (ত্ৰুটি ক\'ড: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"আপোনাৰ বাহকৰ ওচৰত পঞ্জীয়ন কৰক (ত্ৰুটি ক\'ড: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"আপোনাৰ বাহকৰ ওচৰত ৱাই-ফাই কলিং সুবিধা পঞ্জীয়ন কৰাত সমস্যাৰ উদ্ভৱ হৈছে: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ৱাই- ফাই কলিং"</item>
</string-array>
- <!-- no translation found for wifi_calling_off_summary (8720659586041656098) -->
- <skip />
- <!-- no translation found for wfc_mode_wifi_preferred_summary (1994113411286935263) -->
- <skip />
+ <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_only_summary (2379919155237869320) -->
- <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>
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> ছেকেণ্ডৰ পাছত"</string>
@@ -165,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"বহুত বেছি অনুৰোধৰ প্ৰক্ৰিয়া চলি আছে৷ অনুগ্ৰহ কৰি পিছত আকৌ চেষ্টা কৰক৷"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>ত ছাইন ইন কৰাত আসোঁৱাহ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ছিংক ত্ৰুটি"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ছিংক ত্ৰুটি"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"বহুতো <xliff:g id="CONTENT_TYPE">%s</xliff:g> একেলগে মচা হৈছে।"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ছিংক কৰিব নোৱাৰি"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"একেলগে বহুত <xliff:g id="CONTENT_TYPE">%s</xliff:g> মচিবলৈ চেষ্টা কৰা হৈছে"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"টেবলেটৰ সঞ্চয়াগাৰত খালী ঠাই নাই। ঠাই খালী কৰিবলৈ কিছুমান ফাইল মচক।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ঘড়ীৰ সঞ্চয়াগাৰ ভৰি পৰিছে। খালী স্থান উলিয়াবলৈ কিছুমান ফাইল মচক।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"টিভিৰ সঞ্চয়াগাৰ ভৰি পৰিছে। খালী ঠাই উলিয়াবলৈ কিছুমান ফাইল মচক।"</string>
@@ -186,10 +183,8 @@
<string name="network_logging_notification_title" msgid="6399790108123704477">"পৰিচালিত ডিভাইচ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"আপোনাৰ প্ৰতিষ্ঠানটোৱে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে। সবিশেষ জানিবলৈ টিপক।"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"আপোনাৰ ডিভাইচৰ ডেটা মচা হ\'ব"</string>
- <!-- no translation found for factory_reset_message (9024647691106150160) -->
- <skip />
- <!-- no translation found for printing_disabled_by (8936832919072486965) -->
- <skip />
+ <string name="factory_reset_message" msgid="9024647691106150160">"এই প্ৰশাসক এপটো ব্যৱহাৰ কৰিব নোৱাৰি। এতিয়া আপোনাৰ ডিভাইচটোৰ ডেটা মচা হ\'ব।\n\nআপোনাৰ কিবা প্ৰশ্ন থাকিলে আপোনাৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="printing_disabled_by" msgid="8936832919072486965">"প্ৰিণ্ট কৰা কাৰ্য <xliff:g id="OWNER_APP">%s</xliff:g>এ অক্ষম কৰি ৰাখিছে।"</string>
<string name="me" msgid="6545696007631404292">"মই"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"টে\'বলেটৰ বিকল্পসমূহ"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"টিভিৰ বিকল্পসমূহ"</string>
@@ -207,8 +202,7 @@
<string name="reboot_to_update_package" msgid="3871302324500927291">"পেকেজ আপডেট কৰা প্ৰক্ৰিয়া চলি আছে…"</string>
<string name="reboot_to_update_reboot" msgid="6428441000951565185">"ৰিষ্টাৰ্ট কৰা হৈছে…"</string>
<string name="reboot_to_reset_title" msgid="4142355915340627490">"ফেক্টৰী ডেটা ৰিছেট কৰক"</string>
- <!-- no translation found for reboot_to_reset_message (2432077491101416345) -->
- <skip />
+ <string name="reboot_to_reset_message" msgid="2432077491101416345">"ৰিষ্টার্ট হৈ আছে…"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"বন্ধ কৰি থকা হৈছে…"</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"আপোনাৰ টে\'বলেটটো বন্ধ হ\'ব।"</string>
<string name="shutdown_confirm" product="tv" msgid="476672373995075359">"আপোনাৰ টিভি বন্ধ কৰা হ\'ব৷"</string>
@@ -227,8 +221,7 @@
<string name="global_action_emergency" msgid="7112311161137421166">"জৰুৰীকালীন কল"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"বাগ সম্পর্কীয় অভিযোগ"</string>
<string name="global_action_logout" msgid="935179188218826050">"ছেশ্বন সমাপ্ত কৰক"</string>
- <!-- no translation found for global_action_screenshot (8329831278085426283) -->
- <skip />
+ <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string>
<string name="bugreport_title" msgid="2667494803742548533">"বাগ সম্পর্কীয় অভিযোগ লওক"</string>
<string name="bugreport_message" msgid="398447048750350456">"এই কার্যই ইমেইল বাৰ্তা হিচাপে পঠিয়াবলৈ আপোনাৰ ডিভাইচৰ বৰ্তমান অৱস্থাৰ বিষয়ে তথ্য সংগ্ৰহ কৰিব৷ ইয়াক বাগ সম্পর্কীয় অভিযোগ পঠিওৱা কাৰ্য আৰম্ভ কৰোঁতে অলপ সময় লাগিব; অনুগ্ৰহ কৰি ধৈৰ্য ধৰক।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইণ্টাৰেক্টিভ অভিযোগ"</string>
@@ -245,19 +238,13 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"এয়াৰপ্লেইন ম\'ড"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"এয়াৰপ্লেইন ম\'ড অন কৰা আছে"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"এয়াৰপ্লেইন ম\'ড অফ কৰা আছে"</string>
- <!-- no translation found for global_action_toggle_battery_saver (708515500418994208) -->
- <skip />
- <!-- no translation found for global_action_battery_saver_on_status (484059130698197787) -->
- <skip />
- <!-- no translation found for global_action_battery_saver_off_status (75550964969478405) -->
- <skip />
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"বেটাৰি সঞ্চয়কাৰী"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"বেটাৰি সঞ্চয়কাৰী অফ হৈ আছে"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"বেটাৰি সঞ্চয়কাৰী অন হৈ আছে"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ছেটিংসমূহ"</string>
- <!-- no translation found for global_action_assist (3892832961594295030) -->
- <skip />
- <!-- no translation found for global_action_voice_assist (7751191495200504480) -->
- <skip />
- <!-- no translation found for global_action_lockdown (1099326950891078929) -->
- <skip />
+ <string name="global_action_assist" msgid="3892832961594295030">"সহায়"</string>
+ <string name="global_action_voice_assist" msgid="7751191495200504480">"কণ্ঠধ্বনিৰে সহায়"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"লকডাউন"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"নতুন জাননী"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ভাৰ্শ্বুৱল কীব\'ৰ্ড"</string>
@@ -283,46 +270,35 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"সুৰক্ষিত ম\'ড"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ছিষ্টেম"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
- <!-- no translation found for permgrouplab_contacts (3657758145679177612) -->
- <skip />
- <!-- no translation found for permgroupdesc_contacts (6951499528303668046) -->
- <skip />
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ সম্পৰ্কসূচী চাবলৈ অনুমতি দিয়ক"</string>
- <!-- no translation found for permgrouplab_location (7275582855722310164) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"ব্যক্তিগত প্ৰ\'ফাইললৈ সলনি কৰক"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"কৰ্মস্থানৰ প্ৰ’ফাইললৈ সলনি কৰক"</string>
+ <string name="permgrouplab_contacts" msgid="3657758145679177612">"সম্পর্কসূচী"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"আপোনাৰ সম্পৰ্কসূচী চাব পাৰে"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ সম্পৰ্কসূচী চাবলৈ অনুমতি দিবনে?"</string>
+ <string name="permgrouplab_location" msgid="7275582855722310164">"অৱস্থান"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইচৰ অৱস্থান ব্যৱহাৰ কৰিব পাৰে"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক ডিভাইচৰ অৱস্থান জানিবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক এই ডিভাইচটোৰ অৱস্থান জানিবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"কেলেণ্ডাৰ"</string>
- <!-- no translation found for permgroupdesc_calendar (3889615280211184106) -->
- <skip />
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ কেলেণ্ডাৰ চাবলৈ অনুমতি দিয়ক"</string>
- <!-- no translation found for permgrouplab_sms (228308803364967808) -->
- <skip />
+ <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>
+ <string name="permgrouplab_sms" msgid="228308803364967808">"এছএমএছ"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"এছএমএছ বার্তা পঠিয়াব আৰু চাব পাৰে"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক এছএমএছ বাৰ্তা পঠিয়াবলৈ আৰু চাবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক এছএমএছ বাৰ্তা পঠিয়াবলৈ আৰু চাবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"সঞ্চয়াগাৰ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"আপোনাৰ ডিভাইচৰ ফট\', মিডিয়া আৰু ফাইলসমূহ ব্যৱহাৰ কৰিব পাৰে"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ ডিভাইচত থকা ফট\', মিডিয়া আৰু ফাইল চাবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ ডিভাইচত থকা ফট\', মিডিয়া আৰু ফাইল চাবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"মাইক্ৰ\'ফ\'ন"</string>
- <!-- no translation found for permgroupdesc_microphone (4988812113943554584) -->
- <skip />
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক অডিঅ\' ৰেকৰ্ড কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"অডিঅ\' ৰেকর্ড কৰিব পাৰে"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক অডিঅ\' ৰেকৰ্ড কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"কেমেৰা"</string>
- <!-- no translation found for permgroupdesc_camera (3250611594678347720) -->
- <skip />
- <string name="permgrouprequest_camera" msgid="810824326507258410">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক ছবি তুলিবলৈ আৰু ভিডিঅ\' ৰেকৰ্ড কৰিবলৈ অনুমতি দিয়ক"</string>
- <!-- no translation found for permgrouplab_phone (5229115638567440675) -->
- <skip />
- <!-- no translation found for permgroupdesc_phone (6234224354060641055) -->
- <skip />
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক ফ\'ন কল কৰিবলৈ আৰু পৰিচালনা কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"ফট\' তুলিব আৰু ভিডিঅ\' ৰেকৰ্ড কৰিব পাৰে"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক ছবি তুলিবলৈ আৰু ভিডিঅ\' ৰেকৰ্ড কৰিবলৈ অনুমতি দিবনে?"</string>
+ <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>
<string name="permgrouplab_sensors" msgid="416037179223226722">"শৰীৰৰ ছেন্সৰসমূহ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিব পাৰে"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ৱিণ্ড\' সমল বিচাৰি উলিয়াওক"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপুনি যোগাযোগ কৰি থকা ৱিণ্ড\'খনৰ সমল পৰীক্ষা কৰক।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰদ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰক"</string>
@@ -334,8 +310,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"আঙুলিৰ স্পৰ্শেৰে নিৰ্দেশ কৰা কার্যসমূহ কৰক"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"টেপ কৰা, ছোৱাইপ কৰা, পিঞ্চ কৰা আৰু আঙুলিৰ স্পৰ্শেৰে নিৰ্দেশ কৰা অন্যান্য কাৰ্যসমূহ কৰিব পাৰে।"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ফিংগাৰপ্ৰিণ্ট নিৰ্দেশসমূহ"</string>
- <!-- no translation found for capability_desc_canCaptureFingerprintGestures (4386487962402228670) -->
- <skip />
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ডিভাইচটোৰ ফিংগাৰপ্ৰিণ্ট ছেন্সৰত দিয়া নিৰ্দেশ বুজিব পাৰে।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"স্থিতি দণ্ড অক্ষম কৰক বা সলনি কৰক"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"স্থিতি দণ্ড অক্ষম কৰিবলৈ বা ছিষ্টেম আইকন আঁতৰাবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"স্থিতি দণ্ড হ\'ব পাৰে"</string>
@@ -358,8 +333,7 @@
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"আপোনাৰ ডিভাইচে লাভ কৰা চেল সম্প্ৰচাৰৰ বার্তাবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। আপোনাক জৰুৰীকালীন পৰিস্থিতিবোৰত সর্তক কৰিবলৈ চেল সম্প্ৰচাৰৰ বার্তাবোৰ প্ৰেৰণ কৰা হয়। জৰুৰীকালীন চেল সম্প্ৰচাৰ লাভ কৰাৰ সময়ত আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা বা কাৰ্যপ্ৰণালীত ক্ষতিকাৰক এপবোৰে হস্তক্ষেপ কৰিব পাৰে।"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"আপুনি সদস্যভুক্ত হোৱা ফীডসমূহ পঢ়ক"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"বৰ্তমান ছিংক কৰা ফীডৰ সবিশেষ লাভ কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
- <!-- no translation found for permlab_sendSms (7544599214260982981) -->
- <skip />
+ <string name="permlab_sendSms" msgid="7544599214260982981">"এছএমএছ ৰ বার্তাবোৰ প্ৰেৰণ কৰিব আৰু চাব পাৰে"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"এপটোক এছএমএছ বাৰ্তা পঠিয়াবলৈ অনুমতি দিয়ে৷ ইয়াৰ ফলত অপ্ৰত্যাশিত মাচুল ভৰিবলগা হ\'ব পাৰে৷ ক্ষতিকাৰক এপসমূহে আপোনাৰ অনুমতি নোলোৱাকৈয়ে বাৰ্তা পঠিয়াই আপোনাৰ পৰা মাচুল কাটিব পাৰে৷"</string>
<string name="permlab_readSms" msgid="8745086572213270480">"আপোনাৰ পাঠ বার্তাবোৰ পঢ়ক (এছএমএছ বা এমএমএছ)"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"এই এপটোৱে আপোনাৰ টেবলেটটোত সংৰক্ষিত সকলো এছএমএছ (পাঠ) বাৰ্তা পঢ়িব পাৰে।"</string>
@@ -370,8 +344,7 @@
<string name="permlab_getTasks" msgid="6466095396623933906">"চলি থকা এপসমূহ বিচাৰি উলিয়াওক"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"এপটোক বৰ্তমানে আৰু শেহতীয়াভাৱে চলি থকা কাৰ্যসমূহৰ বিষয়ে তথ্য পুনৰুদ্ধাৰ কৰিবলৈ অনুমতি দিয়ে৷ এইটোৱে এপটোক ডিভাইচটোত কোনবোৰ এপ্লিকেশ্বন ব্যৱহাৰ হৈ আছে তাৰ বিষয়ে তথ্য বিচাৰি উলিয়াবলৈ অনুমতি দিব পাৰে৷"</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"প্ৰ\'ফাইল আৰু ডিভাইচৰ গৰাকীসকলক পৰিচালনা কৰিব পাৰে"</string>
- <!-- no translation found for permdesc_manageProfileAndDeviceOwners (106894851498657169) -->
- <skip />
+ <string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"প্ৰ\'ফাইলৰ গৰাকী আৰু ডিভাইচৰ গৰাকী ছেট কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"চলি থকা এপসমূহক পুনৰাই ক্ৰমবদ্ধ কৰক"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"গতিবিধিক অগ্ৰভাগ আৰু নেপথ্যলৈ নিবলৈ এপক অনুমতি দিয়ে। এপে এই কার্য আপোনাৰ ইনপুট অবিহনেই কৰিব পাৰে।"</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"গাড়ীৰ ম\'ড সক্ষম কৰক"</string>
@@ -388,10 +361,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"মেম\'ৰিত নিজৰ বাবে প্ৰয়োজনীয় ঠাই পৃথক কৰিবলৈ এপক অনুমতি দিয়ে। এই কার্যই টেবলেটৰ কার্যক লেহেমীয়া কৰি অন্য এপবোৰৰ বাবে উপলব্ধ মেম\'ৰিক সীমাবদ্ধ কৰে।"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"মেম\'ৰিত নিজৰ বাবে প্ৰয়োজনীয় ঠাই পৃথক কৰিবলৈ এপটোক অনুমতি দিয়ে। এই কার্যই অন্য এপবোৰৰ বাবে উপলব্ধ মেম\'ৰিক সীমাবদ্ধ কৰে যাৰ বাবে টিভিটো লেহেমীয়া হয়।"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"মেম\'ৰিত নিজৰ বাবে প্ৰয়োজনীয় ঠাই পৃথক কৰিবলৈ এপক অনুমতি দিয়ে। এই কার্যই ফ\'নৰ কার্যক লেহেমীয়া কৰি অন্য এপবোৰৰ বাবে উপলব্ধ মেম\'ৰিক সীমাবদ্ধ কৰে।"</string>
- <!-- no translation found for permlab_foregroundService (3310786367649133115) -->
- <skip />
- <!-- no translation found for permdesc_foregroundService (6471634326171344622) -->
- <skip />
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"অগ্ৰভূমিৰ সেৱা চলাব পাৰে"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"এপটোক অগ্ৰভূমি সেৱাসমূহ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"এপৰ সঞ্চয়াগাৰৰ খালী ঠাই হিচাপ কৰক"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"এপটোক ইয়াৰ ক\'ড, ডেটা আৰু কেশ্বৰ আকাৰ বিচাৰি উলিয়াবলৈ অনুমতি দিয়ে"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ছিষ্টেম ছেটিংসমূহ সংশোধন কৰক"</string>
@@ -454,10 +425,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"ডিভাইচত থকা ফ\'নৰ সুবিধাসমূহ ব্য়ৱহাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে৷ এই অনুমতিয়ে কোনো কল সক্ৰিয় হৈ থাককেই বা নাথাকক আৰু দূৰবৰ্তী নম্বৰটো কলৰ দ্বাৰা সংযোজিত হওকেই বা নহওক এপটোক ফ\'ন নম্বৰ আৰু ডিভাইচৰ পৰিচয় নিৰ্ধাৰণ কৰিবলৈ অনুমতি দিয়ে৷"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ছিষ্টেমৰ জৰিয়তে কল কৰিব পাৰে"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"কল কৰাৰ অভিজ্ঞতাক উন্নত কৰিবলৈ এপটোক ছিষ্টেমৰ জৰিয়তে কলসমূহ কৰিবলৈ দিয়ে।"</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"অইন এটা এপত আৰম্ভ হোৱা কল এটা অব্যাহত ৰাখিব পাৰে"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"এপটোক এনে কল কৰিবলৈ দিয়ে যিটোৰ আৰম্ভণি অইন এটা এপত হৈছিল।"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ফ\'ন নম্বৰসমূহ পঢ়ে"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"এপটোক ডিভাইচটোৰ ফ\'ন নম্বৰসমূহ চাবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"টে\'বলেট সুপ্ত অৱস্থালৈ যোৱাত বাধা দিয়ক"</string>
@@ -516,49 +485,35 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"এপটোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"আপোনাৰ স্ক্ৰীণ ল\'ক অক্ষম কৰক"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"এপটোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণ স্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰপিছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷"</string>
- <!-- no translation found for permlab_manageFingerprint (5640858826254575638) -->
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
<skip />
- <!-- no translation found for permdesc_manageFingerprint (178208705828055464) -->
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
<skip />
- <!-- no translation found for permlab_useFingerprint (3150478619915124905) -->
- <skip />
- <!-- no translation found for permdesc_useFingerprint (9165097460730684114) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_partial (735082772341716043) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_insufficient (4596546021310923214) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_imager_dirty (1087209702421076105) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
- <!-- no translation found for fingerprint_acquired_too_slow (59250885689661653) -->
- <skip />
+ <string name="permlab_manageFingerprint" msgid="5640858826254575638">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ পৰিচালনা কৰিব পাৰে"</string>
+ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"ফিংগাৰপ্ৰিণ্ট টেম্প্লেটসমূহ যোগ কৰা বা মচাৰ পদ্ধতিসমূহ কামত লগাবলৈ নিৰ্দেশ দিবলৈ এপটোক অনুমতি দিয়ে।"</string>
+ <string name="permlab_useFingerprint" msgid="3150478619915124905">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ ব্যৱহাৰ কৰিব পাৰে"</string>
+ <string name="permdesc_useFingerprint" msgid="9165097460730684114">"প্ৰমাণীকৰণৰ বাবে ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে"</string>
+ <string name="fingerprint_acquired_partial" msgid="735082772341716043">"ফিংগাৰপ্ৰিণ্ট আংশিকভাৱে চিনাক্ত কৰা হৈছে। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
+ <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ফিগাৰপ্ৰিণ্টৰ প্ৰক্ৰিয়া সম্পাদন কৰিবপৰা নগ\'ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো লেতেৰা হৈ আছে। অনুগ্ৰহ কৰি পৰিষ্কাৰ কৰি আকৌ চেষ্টা কৰক।"</string>
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"আঙুলিৰ গতি অতি ক্ষিপ্ৰ আছিল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
+ <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"আঙুলিৰ গতি অতি মন্থৰ আছিল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_not_recognized (2690661881608146617) -->
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"চিনাক্ত কৰিবপৰা নগ\'ল"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
<skip />
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
- <!-- no translation found for fingerprint_error_no_space (1055819001126053318) -->
- <skip />
- <!-- no translation found for fingerprint_error_timeout (3927186043737732875) -->
- <skip />
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ নাই।"</string>
+ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ফিংগাৰপ্ৰিণ্ট সঞ্চয় কৰিব পৰা নগ\'ল। পূর্বে সঞ্চিত ফিংগাৰপ্ৰিণ্ট এটা আঁতৰাওক।"</string>
+ <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ফিংগাৰপ্ৰিণ্ট গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string>
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ফিংগাৰপ্ৰিণ্ট কাৰ্য বাতিল কৰা হ\'ল।"</string>
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ব্যৱহাৰকাৰীয়ে ফিংগাৰপ্ৰিণ্ট ক্ৰিয়া বাতিল কৰিছে।"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"অত্যধিক প্ৰয়াস। ফিংগাৰপ্ৰিণ্ট ছেন্সৰ অক্ষম কৰা হ\'ল।"</string>
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
- <!-- no translation found for fingerprint_name_template (5870957565512716938) -->
- <skip />
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আকৌ চেষ্টা কৰক।"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"কোনো ফিংগাৰপ্ৰিণ্ট যোগ কৰা নহ\'ল।"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"এই ডিভাইচটোত ফিংগাৰপ্ৰিণ্ট ছেন্সৰ নাই"</string>
+ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> আঙুলি"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
@@ -618,52 +573,35 @@
<string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"এটা এপ্লিকেশ্বনক DRM প্ৰমাণপত্ৰ আঁতৰাবলৈ অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে কেতিয়াও প্ৰয়োজন নহয়।"</string>
<string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"বাহকৰ মেছেজিং সেৱাৰ লগত সংযোগ কৰে"</string>
<string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"বাহক মেছেজিং সেৱাৰ উচ্চ স্তৰৰ ইণ্টাৰফেইচত সংযোগ কৰিবলৈ ধাৰকক অনুমতি দিয়ে। এয়া সাধাৰণ এপবোৰৰ বাবে কেতিয়াও প্ৰয়োজন নহয়।"</string>
- <!-- no translation found for permlab_bindCarrierServices (3233108656245526783) -->
- <skip />
- <!-- no translation found for permdesc_bindCarrierServices (1391552602551084192) -->
- <skip />
- <!-- no translation found for permlab_access_notification_policy (4247510821662059671) -->
- <skip />
- <!-- no translation found for permdesc_access_notification_policy (3296832375218749580) -->
- <skip />
+ <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"বাহক সেৱাসমূহৰ সৈতে সংযুক্ত হ\'ব পাৰে"</string>
+ <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"বাহক সেৱাৰ সৈতে সংযুক্ত হ\'বলৈ ধাৰকক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন হ\'ব নালাগে।"</string>
+ <string name="permlab_access_notification_policy" msgid="4247510821662059671">"অসুবিধা নিদিব চাব পাৰে"</string>
+ <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"পাছৱর্ডৰ নিয়ম ছেট কৰক"</string>
- <!-- no translation found for policydesc_limitPassword (2502021457917874968) -->
- <skip />
+ <string name="policydesc_limitPassword" msgid="2502021457917874968">"স্ক্ৰীণ লক পাছৱৰ্ড আৰু পিনৰ দৈর্ঘ্য আৰু কি কি আখৰ ব্যৱহাৰ কৰিব পাৰে তাক নিয়ন্ত্ৰণ কৰক।"</string>
<string name="policylab_watchLogin" msgid="5091404125971980158">"স্ক্ৰীণ আনলক কৰা প্ৰয়াসবোৰ পৰ্যবেক্ষণ কৰিব পাৰে"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ ৰাখক, আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড লিখা হয় তেন্তে টে\'বলেটটো লক কৰক বা টে\'বলেটটোৰ সকলো ডেটা মোহাৰক।"</string>
<string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ ৰাখক, আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড লিখা হয় তেন্তে টিভিটো লক কৰক বা টিভিটোৰ সকলো ডেটা মোহাৰক।"</string>
<string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ ৰাখক, আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড লিখা হয় তেন্তে ফ\'নটো লক কৰক বা ফ\'নটোৰ সকলো ডেটা মোহাৰক।"</string>
- <!-- no translation found for policydesc_watchLogin_secondaryUser (4280246270601044505) -->
- <skip />
- <!-- no translation found for policydesc_watchLogin_secondaryUser (3484832653564483250) -->
- <skip />
- <!-- no translation found for policydesc_watchLogin_secondaryUser (2185480427217127147) -->
- <skip />
- <!-- no translation found for policylab_resetPassword (4934707632423915395) -->
- <skip />
- <!-- no translation found for policydesc_resetPassword (1278323891710619128) -->
- <skip />
+ <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"স্ক্ৰীণ আনলক কৰোতে লিখা অশুদ্ধ পাছৱৰ্ডৰ হিচাপ নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড দিয়া হয় তেন্তে টে\'বলেটটো লক কৰক বা এই ব্যৱহাৰকাৰীৰ সকলো ডেটা মচক।"</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"স্ক্ৰীণ আনলক কৰোতে দিয়া অশুদ্ধ পাছৱৰ্ডৰ সংখ্যা নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড দিয়া হয় তেন্তে টিভিটো লক কৰক বা এই ব্যৱহাৰকাৰীৰ সকলো ডেটা মচক।"</string>
+ <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"স্ক্ৰীণ আনলক কৰোতে দিয়া অশুদ্ধ পাছৱৰ্ডৰ হিচাপ নিৰীক্ষণ কৰক আৰু যদিহে অত্যধিকবাৰ অশুদ্ধ পাছৱৰ্ড দিয়া হয় তেন্তে ফ\'নটো লক কৰক বা এই ব্যৱহাৰকাৰীৰ সকলো ডেটা মচক।"</string>
+ <string name="policylab_resetPassword" msgid="4934707632423915395">"স্ক্ৰীণ লক সলনি কৰক"</string>
+ <string name="policydesc_resetPassword" msgid="1278323891710619128">"স্ক্ৰীণ লক সলনি কৰক।"</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"স্ক্ৰীণখন লক কৰক"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"স্ক্ৰীণ কেনেকৈ আৰু কেতিয়া ল\'ক হ\'ব লাগে সেয়া নিয়ন্ত্ৰণ কৰক।"</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"সকলো ডেটা মচক"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"সতৰ্কবাণী প্ৰেৰণ নকৰাকৈয়ে ফেক্টৰী ডেটা ৰিছেট কৰি টেবলেটৰ ডেটা মচক।"</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"সতৰ্কবাণী প্ৰেৰণ নকৰাকৈয়ে ফেক্টৰী ডেটা ৰিছেট কৰি টিভিৰ ডেটা মোহাৰক।"</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"সতৰ্কবাণী প্ৰেৰণ নকৰাকৈয়ে ফেক্টৰী ডেটা ৰিছেট কৰি ফ\'নৰ ডেটা মচক।"</string>
- <!-- no translation found for policylab_wipeData_secondaryUser (8362863289455531813) -->
- <skip />
- <!-- no translation found for policydesc_wipeData_secondaryUser (6336255514635308054) -->
- <skip />
- <!-- no translation found for policydesc_wipeData_secondaryUser (2086473496848351810) -->
- <skip />
- <!-- no translation found for policydesc_wipeData_secondaryUser (6787904546711590238) -->
- <skip />
+ <string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"ব্য়ৱহাৰকাৰীৰ তথ্য় মচক"</string>
+ <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"এই টেবলেটটোত থকা এই ব্যৱহাৰকাৰীৰ তথ্য কোনো সর্তকবাণী নিদিয়াকৈ মচি পেলাওক।"</string>
+ <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"এই টিভিটোত থকা এই ব্যৱহাৰকাৰীৰ তথ্য কোনো সর্তকবাণী নিদিয়াকৈ মচি পেলাওক।"</string>
+ <string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"এই ফ\'নটোত থকা এই ব্যৱহাৰকাৰীৰ তথ্য কোনো সর্তকবাণী নিদিয়াকৈ মচি পেলাওক।"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"ডিভাইচৰ বাবে গ্ল\'বেল প্ৰক্সী ছেট কৰক"</string>
- <!-- no translation found for policydesc_setGlobalProxy (8459859731153370499) -->
- <skip />
- <!-- no translation found for policylab_expirePassword (5610055012328825874) -->
- <skip />
- <!-- no translation found for policydesc_expirePassword (5367525762204416046) -->
- <skip />
+ <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"নীতি সক্ষম কৰি থোৱা অৱস্থাত ব্য়ৱহাৰ কৰিবৰ বাবে ডিভাইচৰ বাবে গ্ল\'বেল প্ৰক্সী ছেট কৰক। কেৱল ডিভাইচৰ গৰাকীয়েহে গ্ল\'বেল প্ৰক্সী ছেট কৰিব পাৰে।"</string>
+ <string name="policylab_expirePassword" msgid="5610055012328825874">"স্ক্ৰীণ লক পাছৱৰ্ডৰ ম্যাদ ওকলাৰ দিন ছেট কৰক"</string>
+ <string name="policydesc_expirePassword" msgid="5367525762204416046">"স্ক্ৰীণ লকৰ পাছৱৰ্ড, পিন বা আর্হি কিমান ঘনাই সলনি কৰিব লাগিব তাক সলনি কৰক।"</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"সঞ্চয়াগাৰৰ এনক্ৰিপশ্বন ছেট কৰক"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"সঞ্চয় কৰি ৰখা ডেটাক এনক্ৰিপ্ট কৰাৰ প্ৰয়োজন।"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"কেমেৰাবোৰ অক্ষম কৰক"</string>
@@ -799,8 +737,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"আনলক কৰিবলৈ বা জৰুৰীকালীন কল কৰিবলৈ মেনু টিপক।"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"আনলক কৰিবলৈ মেনু টিপক।"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"আনলক কৰিবলৈ আর্হি আঁকক"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"জৰুৰীকালীন"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"কললৈ উভতি যাওক"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"শুদ্ধ!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"আকৌ চেষ্টা কৰক"</string>
@@ -878,10 +815,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"আৰ্হিৰদ্বাৰা আনলক।"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"গৰাকীৰ মুখাৱয়বৰদ্বাৰা আনলক।"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"পিনৰদ্বাৰা আনলক।"</string>
- <!-- no translation found for keyguard_accessibility_sim_pin_unlock (9149698847116962307) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_unlock (9106899279724723341) -->
- <skip />
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ছিম পিন আনলক।"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ছিম পিইউকে আনলক।"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"পাছৱৰ্ডৰদ্বাৰা আনলক।"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"আৰ্হি ক্ষেত্ৰ।"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"শ্লাইড ক্ষেত্ৰ।"</string>
@@ -906,8 +841,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"পৰামৰ্শ: জুম ইন আৰু আউট কৰিবলৈ দুবাৰ টিপক৷"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"স্বয়ংপূৰ্তি"</string>
<string name="setup_autofill" msgid="7103495070180590814">"স্বয়ংপূৰ্তি ছেট আপ কৰক"</string>
- <!-- no translation found for autofill_window_title (921006636895825007) -->
- <skip />
+ <string name="autofill_window_title" msgid="921006636895825007">"স্বয়ংপূৰ্তি"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -944,6 +878,12 @@
<string name="text_copied" msgid="4985729524670131385">"ক্লিপব\'র্ডলৈ বাৰ্তা প্ৰতিলিপি কৰা হ\'ল।"</string>
<string name="more_item_label" msgid="4650918923083320495">"অধিক"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"মেনু+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"মেটা+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"শ্বিফ্ট+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"ফাংশ্বন+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"স্পেচ"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"লিখক"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"মচক"</string>
@@ -959,7 +899,10 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>এ স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰিব বিচাৰে। যেতিয়া স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰা সুবিধা অন কৰা থাকে তেতিয়া আপোনাৰ আঙুলিৰ তলত থকা বিৱৰণবোৰ শুনিব বা চাব পাৰে বা আঙুলিৰ ইংগিতৰ জৰিয়তে ফ\'ন ব্যৱহাৰ কৰিব পাৰে।"</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"১ মাহ আগত"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"১ মাহতকৈও আগত"</string>
- <!-- no translation found for last_num_days (5104533550723932025) -->
+ <plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
+ <item quantity="one">যোৱা <xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
+ <item quantity="other">যোৱা <xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
+ </plurals>
<string name="last_month" msgid="3959346739979055432">"যোৱা মাহ"</string>
<string name="older" msgid="5211975022815554840">"পুৰণি"</string>
<string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> তাৰিখে"</string>
@@ -1072,16 +1015,31 @@
<string name="inputMethod" msgid="1653630062304567879">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"পাঠ বিষয়ক কাৰ্য"</string>
<string name="email" msgid="4560673117055050403">"ইমেইল"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"কল কৰক"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"অৱস্থান নিৰূপণ কৰক"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"খোলক"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"বাৰ্তা"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"যোগ দিয়ক"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
<skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
+ <string name="view_calendar" msgid="979609872939597838">"চাওক"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
<skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
+ <string name="add_calendar_event" msgid="1953664627192056206">"সূচী"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
+ <string name="view_flight" msgid="7691640491425680214">"ট্ৰেক কৰক"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
<skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"সঞ্চয়াগাৰৰ খালী ঠাই শেষ হৈ আছে"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ছিষ্টেমৰ কিছুমান কাৰ্যকলাপে কাম নকৰিবও পাৰে"</string>
@@ -1155,47 +1113,30 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"আপডেট আছে নেকি চাওক"</string>
<string name="smv_application" msgid="3307209192155442829">"এপটোৱে <xliff:g id="APPLICATION">%1$s</xliff:g> (প্ৰক্ৰিয়াটোৱে <xliff:g id="PROCESS">%2$s</xliff:g>) নিজে বলবৎ কৰা StrictMode নীতি ভংগ কৰিলে।"</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> প্ৰক্ৰিয়াটোৱে নিজে বলৱৎ কৰা StrictMode নীতি ভংগ কৰিলে।"</string>
- <!-- no translation found for android_upgrading_title (7513829952443484438) -->
- <skip />
- <!-- no translation found for android_upgrading_title (4503169817302593560) -->
- <skip />
- <!-- no translation found for android_upgrading_title (7009520271220804517) -->
- <skip />
- <!-- no translation found for android_start_title (4536778526365907780) -->
- <skip />
- <!-- no translation found for android_start_title (4929837533850340472) -->
- <skip />
- <!-- no translation found for android_start_title (7467484093260449437) -->
- <skip />
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ফ\'নটো আপডেট হৈ আছে…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"টেবলেটটো আপডেট হৈ আছে…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ডিভাইচটো আপডেট হৈ আছে…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ফ\'নটো আৰম্ভ হৈছে…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"টেবলেটটো আৰম্ভ হৈছে…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ডিভাইচটো আৰম্ভ হৈছে…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"সঞ্চয়াগাৰ অপ্টিমাইজ কৰি থকা হৈছে।"</string>
- <!-- no translation found for android_upgrading_notification_title (1511552415039349062) -->
- <skip />
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"ছিষ্টেম আপডেট সম্পূৰ্ণ কৰা হৈছে…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ক আপগ্ৰেড কৰি থকা হৈছে…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>ৰ ভিতৰত <xliff:g id="NUMBER_0">%1$d</xliff:g> এপ্ অপ্টিমাইজ কৰি থকা হৈছে৷"</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>সাজু কৰি থকা হৈছে।"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"আৰম্ভ হৈ থকা এপসমূহ।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"বুট কাৰ্য সমাপ্ত কৰিছে।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> চলি আছে"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
- <!-- no translation found for dump_heap_notification (2618183274836056542) -->
- <skip />
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"হীপ ডাম্প সংগ্ৰহ কৰা হ\'ল। শ্বেয়াৰ কৰিবলৈ টিপক"</string>
- <!-- no translation found for dump_heap_title (5864292264307651673) -->
- <skip />
- <!-- no translation found for dump_heap_text (4809417337240334941) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"গেইমলৈ উভতি যাওক"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"গেইম বাছনি কৰক"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"উচ্চ কাৰ্যদক্ষতাৰ বাবে এই গেইমসমূহৰ মাত্ৰ এটাহে এবাৰত খুলিব পাৰি।"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>লৈ উভতি যাওক"</string>
+ <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>
+ <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>
<string name="sendText" msgid="5209874571959469142">"বার্তাৰ বাবে কাৰ্য বাছনি কৰক"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ৰিংগাৰৰ ধ্বনি"</string>
<string name="volume_music" msgid="5421651157138628171">"মিডিয়াৰ ধ্বনি"</string>
@@ -1227,25 +1168,20 @@
<item quantity="other">পাছৱৰ্ড অবিহনে সংযোগ কৰিব পৰা ৱাই-ফাই নেটৱর্ক উপলব্ধ</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"পাছৱৰ্ড অবিহনে সংযোগ কৰিবপৰা ৱাই-ফাই নেটৱর্কৰ সৈতে সংযোগ কৰক"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"পাছৱৰ্ড অবিহনে সংযোগ কৰিবপৰা ৱাই-ফাই নেটৱর্কৰ সৈতে সংযোগ কৰি থকা হৈছে"</string>
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"বাহকৰ ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰক"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰি থকা হৈছে"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰা হ\'ল"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰিবপৰা নগ\'ল"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সকলো নেটৱৰ্ক চাবলৈ টিপক"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযোগ কৰক"</string>
- <!-- no translation found for wifi_available_action_all_networks (4368435796357931006) -->
- <skip />
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সকলো নেটৱৰ্ক"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"যেতিয়া আপুনি ছেভ কৰি থোৱা উচ্চ মানৰ নেটৱৰ্কৰ কাষত থাকে"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"পুনৰাই অন নকৰিব"</string>
- <!-- no translation found for wifi_wakeup_enabled_title (6534603733173085309) -->
- <skip />
- <!-- no translation found for wifi_wakeup_enabled_content (189330154407990583) -->
- <skip />
+ <string name="wifi_wakeup_enabled_title" msgid="6534603733173085309">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন কৰা হ\'ল"</string>
+ <string name="wifi_wakeup_enabled_content" msgid="189330154407990583">"আপুনি ছেভ কৰি থোৱা নেটৱৰ্ক এটাৰ কাষত আছে: <xliff:g id="NETWORK_SSID">%1$s</xliff:g>"</string>
<string name="wifi_available_sign_in" msgid="9157196203958866662">"ৱাই-ফাই নেটৱৰ্কত ছাইন ইন কৰক"</string>
- <!-- no translation found for network_available_sign_in (1848877297365446605) -->
- <skip />
+ <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>
@@ -1264,8 +1200,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ৱাই-ফাইৰ লগত সংযোগ কৰিব পৰা নগ\'ল"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" ইণ্টাৰনেট সংযোগ যথেষ্ট দুর্বল।"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"সংযোগ কৰাৰ অনুমতি দিবনে?"</string>
- <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
- <skip />
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s এপ্লিকেশ্বনটোৱে ৱাই-ফাই নেটৱৰ্ক %2$sৰ সৈতে সংযুক্ত হ\'ব বিচাৰিছে"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"এপ্লিকেশ্বন"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"ৱাই-ফাই ডাইৰেক্ট"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ৱাই-ফাই ডাইৰেক্ট আৰম্ভ কৰক। এই কার্যই ৱাই-ফাই ক্লাইণ্ট/হ\'টস্প\'ট অফ কৰিব।"</string>
@@ -1303,14 +1238,10 @@
<string name="sim_added_title" msgid="3719670512889674693">"ছিম কাৰ্ড যোগ কৰা হ\'ল"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ম\'বাইলৰ নেটৱর্ক ব্যৱহাৰ কৰিবলৈ আপোনাৰ ডিভাইচটো ৰিষ্টার্ট কৰক।"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ৰিষ্টাৰ্ট কৰক"</string>
- <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_text_app_name (1196505084835248137) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) -->
- <skip />
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ম\'বাইল সেৱা সক্ৰিয় কৰক"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ বাহকৰ এপটো ডাউনল\'ড কৰক"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"আপোনাৰ নতুন ছিমখন সক্ৰিয় কৰিবলৈ <xliff:g id="APP_NAME">%1$s</xliff:g> এপটো ডাউনল\'ড কৰক"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"এপ্ ডাউনল\'ড কৰক"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"নতুন ছিম ভৰোৱা হৈছে"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ছেট আপ কৰিবলৈ টিপক"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"সময় ছেট কৰক"</string>
@@ -1322,27 +1253,19 @@
<string name="no_permissions" msgid="7283357728219338112">"কোনো অনুমতিৰ প্ৰয়োজন নাই"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ইয়াৰ ফলত আপোনাৰ টকা খৰচ হ\'ব পাৰে"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ঠিক আছে"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"ইউএছবিৰ জৰিয়তে এই ডিভাইচটো চ্চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"ইউএছবিৰ জৰিয়তে সংযুক্ত ডিভাইচটো চ্চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"ইউএছবি জৰিয়তে ফাইল স্থানান্তৰণ অন কৰা হ\'ল"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"ইউএছবিৰ জৰিয়তে পিটিপি অন কৰা হ\'ল"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"ইউএছবি টেডাৰিং অন কৰা হ\'ল"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"ইউএছবিৰ জৰিয়তে এমআইডিআই অন কৰা হ\'ল"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"ইউএছবি সহায়ক সামগ্ৰী সংযোগ কৰা হ\'ল"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"অধিক বিকল্পৰ বাবে টিপক।"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"সংযুক্ত ডিভাইচ চ্চাৰ্জ কৰি থকা হৈছে। অধিক বিকল্পৰ বাবে টিপক।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"এনাল\'গ অডিঅ\' সহায়ক সামগ্ৰী পোৱা গৈছে"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"সংলগ্ন কৰা ডিভাইচটোৱে এই ফ\'নটোৰ সৈতে কাম কৰিব নোৱাৰে। অধিক জানিবলৈ টিপক।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ইউএছবি ডিবাগিং সংযোগ কৰা হ\'ল"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"ইউএছবি ডিবাগিং অক্ষম কৰিবলৈ টিপক।"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএছবি ডিবাগিং বন্ধ কৰিবলৈ টিপক"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ইউএছবি ডিবাগিং অক্ষম কৰিবলৈ বাছনি কৰক।"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"বাগ সম্পর্কীয় অভিযোগ গ্ৰহণ কৰি থকা হৈছে…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবনে?"</string>
@@ -1361,53 +1284,49 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> অন্য এপসমূহৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>এ অইন এপবোৰৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g>এ এই সুবিধাটো ব্যৱহাৰ কৰাটো নিবিচাৰে তেন্তে টিপি ছেটিংসমূহ খোলক আৰু ইয়াক অফ কৰক।"</string>
- <!-- no translation found for alert_windows_notification_turn_off_action (2902891971380544651) -->
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"অফ কৰক"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
<skip />
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
<skip />
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"আসোঁৱাহ বিচাৰি থকা হৈছে"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
<skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
<skip />
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ব্যৱহাৰযোগ্য নহয়"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ব্যৱহাৰযোগ্য নহয়। সমস্যাটো সমাধান কৰিবলৈ টিপক।"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ব্যৱহাৰযোগ্য হৈ থকা নাই। ঠিক কৰিবলৈ বাছনি কৰক।"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফট\' আৰু মিডিয়া স্থানান্তৰণৰ বাবে"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰি"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰে। ব্যৱহাৰ কৰিব পৰা ফৰ্মেটত ছেট আপ কৰিবলৈ টিপক।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক চলাব নোৱাৰে। চলাব পৰা কোনো ফৰ্মেটত ছেট আপ কৰিবলৈ বাছনি কৰক।"</string>
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্ৰত্য়াশিতভাৱে আঁতৰোৱা হ\'ল"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
<skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
<skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
<skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
<skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
<skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"ছেট আপ কৰক"</string>
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"বাহিৰ কৰক"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"অন্বেষণ কৰক"</string>
+ <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> উপলব্ধ নহয়"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
<skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
+ <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ক স্থানান্তৰ কৰি থকা হৈছে"</string>
+ <string name="ext_media_move_title" msgid="1022809140035962662">"ডেটা স্থানান্তৰ কৰি থকা হৈছে"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
<skip />
- <!-- no translation found for ext_media_missing_title (620980315821543904) -->
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
<skip />
- <!-- no translation found for ext_media_missing_message (5761133583368750174) -->
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
<skip />
- <!-- no translation found for ext_media_move_specific_title (1471100343872375842) -->
- <skip />
- <!-- no translation found for ext_media_move_title (1022809140035962662) -->
- <skip />
- <!-- no translation found for ext_media_move_success_title (8575300932957954671) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (4199002148206265426) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (7613189040358789908) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (1978096440816403360) -->
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
<skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"আঁতৰোৱা হ\'ল"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"বাহিৰলৈ উলিওৱা হ\'ল"</string>
@@ -1426,8 +1345,7 @@
<string name="permlab_readInstallSessions" msgid="3713753067455750349">"ইনষ্টল কৰা ছেশ্বনসমূহ পঢ়িব পাৰে"</string>
<string name="permdesc_readInstallSessions" msgid="2049771699626019849">"এটা এপ্লিকেশ্বনক ইনষ্টল কৰা ছেশ্বনসমূহ পঢ়িবলৈ অনুমতি দিয়ে। এই কাৰ্যই সক্ৰিয় পেকেজ ইনষ্টলেশ্বনৰ বিষয়ে চাবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_requestInstallPackages" msgid="5782013576218172577">"পেকেজ ইনষ্টলৰ বাবে অনুৰোধ কৰিব পাৰে"</string>
- <!-- no translation found for permdesc_requestInstallPackages (5740101072486783082) -->
- <skip />
+ <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"পেকেজ ইনষ্টল কৰাৰ অনুৰোধ প্ৰেৰণ কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_requestDeletePackages" msgid="1703686454657781242">"পেকেজ মচাৰ অনুৰোধ কৰিব পাৰে"</string>
<string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"এপটোক পেকেজবোৰ মচাৰ অনুৰোধ কৰিবলৈ দিয়ে।"</string>
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"বেটাৰি অপ্টিমাইজেশ্বন উপেক্ষা কৰিবলৈ বিচাৰক"</string>
@@ -1468,14 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"সদা-সক্ৰিয় ভিপিএন সংযোগ কৰি থকা হৈছে…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"সদা-সক্ৰিয় ভিপিএন সংযোগ কৰা হ\'ল"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ বিচ্ছিন্ন কৰা হৈছে"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"সদা-সক্ৰিয় ভিপিএনত আসোঁৱাহ"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"সদা-সক্ৰিয় ভিপিএনৰ লগত সংযোগ কৰিব পৰা নাই"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"নেটৱৰ্ক বা ভিপিএন ছেটিংসমূহ সলনি কৰক"</string>
<string name="upload_file" msgid="2897957172366730416">"ফাইল বাছনি কৰক"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"কোনো ফাইল বাছনি কৰা হোৱা নাই"</string>
<string name="reset" msgid="2448168080964209908">"ৰিছেট কৰক"</string>
<string name="submit" msgid="1602335572089911941">"দাখিল কৰক"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"গাড়ীৰ ম’ড সক্ষম কৰা হ\'ল"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"গাড়ীৰ ম\'ডৰ পৰা বাহিৰ হ\'বলৈ টিপক।"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ড্ৰাইভিং এপ্ চলি আছে"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ড্ৰাইভিং এপৰ পৰা বাহিৰ হ\'বলৈ টিপক।"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"টেডাৰিং বা হটস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ছেট আপ কৰিবলৈ টিপক।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"টেডাৰিং অক্ষম কৰি থোৱা হৈছে"</string>
@@ -1526,10 +1444,8 @@
<string name="date_picker_decrement_day_button" msgid="4131881521818750031">"দিন হ্ৰাস কৰক"</string>
<string name="date_picker_increment_year_button" msgid="6318697384310808899">"বছৰ বৃদ্ধি কৰক"</string>
<string name="date_picker_decrement_year_button" msgid="4482021813491121717">"বছৰ হ্ৰাস কৰক"</string>
- <!-- no translation found for date_picker_prev_month_button (2858244643992056505) -->
- <skip />
- <!-- no translation found for date_picker_next_month_button (5559507736887605055) -->
- <skip />
+ <string name="date_picker_prev_month_button" msgid="2858244643992056505">"পূৰ্বৱৰ্তী মাহ"</string>
+ <string name="date_picker_next_month_button" msgid="5559507736887605055">"পৰৱৰ্তী মাহ"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"বাতিল কৰক"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"মচক"</string>
@@ -1550,36 +1466,24 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="3570990907910199483">"শ্বেয়াৰ কৰা আভ্যন্তৰীণ সঞ্চয়াগাৰ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"এছডি কাৰ্ড"</string>
- <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
- <skip />
- <!-- no translation found for storage_usb_drive (6261899683292244209) -->
- <skip />
- <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
- <skip />
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> এছডি কাৰ্ড"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"ইউএছবি ড্ৰাইভ"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> ইউএছবি ড্ৰাইভ"</string>
<string name="storage_usb" msgid="3017954059538517278">"ইউএছবি সঞ্চয়াগাৰ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"সম্পাদনা কৰক"</string>
- <!-- no translation found for data_usage_warning_title (6499834033204801605) -->
- <skip />
- <!-- no translation found for data_usage_warning_body (7340198905103751676) -->
- <skip />
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ডেটা সকীয়নি"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"আপুনি <xliff:g id="APP">%s</xliff:g> ডেটা ব্যৱহাৰ কৰিছে"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ম\'বাইল ডেটা ব্যৱাহৰৰ সীমা শেষ হৈছে"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ৱাই-ফাই ডেটাৰ সীমাত উপনীত হৈছে"</string>
- <!-- no translation found for data_usage_limit_body (2908179506560812973) -->
- <skip />
- <!-- no translation found for data_usage_mobile_limit_snoozed_title (3171402244827034372) -->
- <skip />
- <!-- no translation found for data_usage_wifi_limit_snoozed_title (3547771791046344188) -->
- <skip />
- <!-- no translation found for data_usage_limit_snoozed_body (1671222777207603301) -->
- <skip />
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"আপোনাৰ ডেটা চক্ৰৰ বাকী অংশৰ বাবে ডেটা পজ কৰা হৈছে"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ম\'বাইল ডেটাৰ সীমা পাৰ কৰিছে"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ৱাই-ফাই ডেটাৰ সীমা পাৰ কৰিছে"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"আপুনি নিৰ্ধাৰিত সীমাতকৈ <xliff:g id="SIZE">%s</xliff:g> অধিক ব্যৱহাৰ কৰিছে"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"নেপথ্য ডেটা সীমিত কৰি ৰখা হৈছে৷"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"সীমাবদ্ধতা আঁতৰাবলৈ টিপক।"</string>
- <!-- no translation found for data_usage_rapid_title (1809795402975261331) -->
- <skip />
- <!-- no translation found for data_usage_rapid_body (6897825788682442715) -->
- <skip />
- <!-- no translation found for data_usage_rapid_app_body (5396680996784142544) -->
- <skip />
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"অত্যধিক ম\'বাইল ডেটাৰ ব্যৱহাৰ"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"আপোনাৰ এপসমূহে সচৰাচৰতকৈ অধিক ডেটা ব্যৱহাৰ কৰিছে"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g>এ সচৰাচৰতকৈ অধিক ডেটা ব্যৱহাৰ কৰিছে"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"নিৰাপত্তা সম্পৰ্কীয় প্ৰমাণপত্ৰ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"এই প্ৰমাণপত্ৰখন মান্য৷"</string>
<string name="issued_to" msgid="454239480274921032">"প্ৰদান কৰা হৈছে:"</string>
@@ -1795,12 +1699,9 @@
<item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"পিছত আকৌ চেষ্টা কৰক"</string>
- <!-- no translation found for immersive_cling_title (8394201622932303336) -->
- <skip />
- <!-- no translation found for immersive_cling_description (3482371193207536040) -->
- <skip />
- <!-- no translation found for immersive_cling_positive (5016839404568297683) -->
- <skip />
+ <string name="immersive_cling_title" msgid="8394201622932303336">"স্ক্ৰীণ পূৰ্ণৰূপত চাই আছে"</string>
+ <string name="immersive_cling_description" msgid="3482371193207536040">"বাহিৰ হ\'বলৈ ওপৰৰপৰা তললৈ ছোৱাইপ কৰক।"</string>
+ <string name="immersive_cling_positive" msgid="5016839404568297683">"বুজি পালোঁ"</string>
<string name="done_label" msgid="2093726099505892398">"সম্পন্ন কৰা হ\'ল"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"ঘড়ীৰ বৃত্তাকাৰ শ্লাইডাৰ"</string>
<string name="minute_picker_description" msgid="8606010966873791190">"মিনিটৰ বৃত্তাকাৰ শ্লাইডাৰ"</string>
@@ -1818,7 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপোনাৰ প্ৰশাসকে ইনষ্টল কৰিছে"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপোনাৰ প্ৰশাসকে আপেডট কৰিছে"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপোনাৰ প্ৰশাসকে মচিছে"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"বেটাৰিৰ অৱস্থা উন্নত কৰাত সহায় কৰিবলৈ বেটাৰি সঞ্চয়কাৰী সুবিধাই আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা হ্ৰাস কৰে আৰু কম্পন, অৱস্থান সেৱা আৰু অধিকাংশ নেপথ্য ডেটা সীমিত কৰে। ছিংকৰ ওপৰত নির্ভৰশীল ইমেইল, মেছেজিং আৰু অন্য এপসমূহ আপুনি নোখোলা পৰ্যন্ত আপডেট নহ\'বও পাৰে।\n\nআপোনাৰ ডিভাইচ চ্চার্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী সুবিধা স্বয়ংক্ৰিয়ভাৱে অফ হ\'ব।"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"বেটাৰিৰ জীৱনকাল বৃদ্ধি কৰিবলৈ বেটাৰি সঞ্চয়কাৰী সুবিধাই আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা হ্ৰাস কৰে আৰু কম্পন, অৱস্থান সেৱা আৰু নেপথ্য ডেটা সীমিত কৰে বা বন্ধ কৰে। ছিংকৰ ওপৰত নির্ভৰশীল ইমেইল, মেছেজিং আৰু অন্য এপসমূহ আপুনি নোখোলা পৰ্যন্ত আপডেট নহ\'বও পাৰে।\n\nআপোনাৰ ডিভাইচ চ্চার্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী সুবিধা স্বয়ংক্ৰিয়ভাৱে বন্ধ হ\'ব।"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ডেটা ব্য়ৱহাৰ মাত্ৰা কম কৰিবৰ বাবে ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা ব্য়ৱহাৰ কৰিব পাৰে, কিন্তু সঘনাই এই কার্য কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ এইয়ে হ\'ব পাৰে যে, উদাহৰণস্বৰূপে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ\'ব।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সঞ্চয়কাৰী অন কৰিবনে?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"অন কৰক"</string>
@@ -1826,67 +1727,66 @@
<item quantity="one"> %1$d মিনিটৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পৰ্যন্ত)</item>
<item quantity="other"> %1$d মিনিটৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পৰ্যন্ত)</item>
</plurals>
- <!-- no translation found for zen_mode_duration_minutes_summary_short (6830154222366042597) -->
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597">
+ <item quantity="one">%1$d মিনিটৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ <item quantity="other">%1$d মিনিটৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ </plurals>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d ঘণ্টাৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পৰ্যন্ত)</item>
<item quantity="other">%1$d ঘণ্টাৰ বাবে (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পৰ্যন্ত)</item>
</plurals>
- <!-- no translation found for zen_mode_duration_hours_summary_short (4787552595253082371) -->
+ <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
+ <item quantity="one">%1$d ঘণ্টা (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ <item quantity="other">%1$d ঘণ্টা (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ </plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571">
<item quantity="one">%d মিনিটৰ বাবে</item>
<item quantity="other">%d মিনিটৰ বাবে</item>
</plurals>
- <!-- no translation found for zen_mode_duration_minutes_short (2199350154433426128) -->
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128">
+ <item quantity="one">%d মিনিটৰ বাবে</item>
+ <item quantity="other">%d মিনিটৰ বাবে</item>
+ </plurals>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d ঘণ্টাৰ বাবে</item>
<item quantity="other">%d ঘণ্টাৰ বাবে</item>
</plurals>
- <!-- no translation found for zen_mode_duration_hours_short (6748277774662434217) -->
+ <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
+ <item quantity="one">%d ঘণ্টাৰ বাবে</item>
+ <item quantity="other">%d ঘণ্টাৰ বাবে</item>
+ </plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পৰ্যন্ত"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (পৰৱৰ্তী এলার্ম) পর্যন্ত"</string>
- <!-- no translation found for zen_mode_forever (931849471004038757) -->
- <skip />
- <!-- no translation found for zen_mode_forever_dnd (3792132696572189081) -->
- <skip />
- <!-- no translation found for zen_mode_rule_name_combination (191109939968076477) -->
- <skip />
+ <string name="zen_mode_forever" msgid="931849471004038757">"আপুনি অফ নকৰা পর্যন্ত"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"আপুনি যেতিয়ালৈকে অসুবিধা নিদিব অফ নকৰে"</string>
+ <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"সংকুচিত কৰক"</string>
- <!-- no translation found for zen_mode_feature_name (5254089399895895004) -->
- <skip />
- <!-- no translation found for zen_mode_downtime_feature_name (2626974636779860146) -->
- <skip />
- <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) -->
- <skip />
- <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) -->
- <skip />
- <!-- no translation found for zen_mode_default_events_name (8158334939013085363) -->
- <skip />
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"অসুবিধা নিদিব"</string>
+ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ডাউনটাইম"</string>
+ <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"কাৰ্য-দিনৰ নিশা"</string>
+ <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"সপ্তাহ অন্ত"</string>
+ <string name="zen_mode_default_events_name" msgid="8158334939013085363">"কার্যক্ৰম"</string>
<string name="zen_mode_default_every_night_name" msgid="3012363838882944175">"নিদ্ৰাৰত"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>ৰ দ্বাৰা মিউট কৰা হৈছে"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে আৰু আপুনি ফেক্টৰী ডেটা ৰিছেট নকৰালৈকে ই সুস্থিৰভাৱে কাম নকৰিব পাৰে।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে। সবিশেষ জানিবৰ বাবে আপোনাৰ ডিভাইচ নির্মাতাৰ সৈতে যোগাযোগ কৰক।"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD অনুৰোধক DIAL অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD অনুৰোধক SS অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD অনুৰোধক নতুন USSD অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD অনুৰোধক ভিডিঅ\' DIAL অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS অনুৰোধক DIAL অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS অনুৰোধক ভিডিঅ\' DIAL অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS অনুৰোধক USSD অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS অনুৰোধক নতুন SS অনুৰোধলৈ সংশোধিত কৰা হৈছে।"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD অনুৰোধ নিয়মীয়া কললৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD অনুৰোধ SS অনুৰোধলৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"নতুন USSD অনুৰোধলৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD SS অনুৰোধ ভিডিঅ\' কললৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS অনুৰোধ নিয়মীয়া কললৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS অনুৰোধ ভিডিঅ\' কললৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS অনুৰোধ USSD অনুৰোধলৈ সলনি কৰা হ\'ল"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"নতুন SS অনুৰোধলৈ সলনি কৰা হ\'ল"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"বিস্তাৰ কৰক"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"সংকুচিত কৰক"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"সম্প্ৰসাৰণ ট’গল কৰক"</string>
- <!-- no translation found for usb_midi_peripheral_name (7221113987741003817) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_product_name (4971827859165280403) -->
- <skip />
- <!-- no translation found for floating_toolbar_open_overflow_description (4797287862999444631) -->
- <skip />
- <!-- no translation found for floating_toolbar_close_overflow_description (559796923090723804) -->
- <skip />
+ <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidৰ ইউএছবি পেৰিফেৰেল প\'ৰ্ট"</string>
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"ইউএছবিৰ পেৰিফেৰেল প\'ৰ্ট"</string>
+ <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"অধিক বিকল্প"</string>
+ <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"টুলবাৰ অভাৰফ্ল\' বন্ধ কৰক"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"সৰ্বাধিক মাত্ৰালৈ বঢ়াওক"</string>
<string name="close_button_text" msgid="3937902162644062866">"বন্ধ কৰক"</string>
<string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
@@ -1906,15 +1806,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"সকলো ভাষা"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"সকলো অঞ্চল"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"অনুসন্ধান কৰক"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"কৰ্মস্থানৰ প্ৰ\'ফাইল অন কৰিবনে?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"আপোনাৰ কৰ্মস্থানৰ এপসমূহ, জাননীসমূহ, ডেটা আৰু কৰ্মস্থানৰ প্ৰ\'ফাইলৰ অইন সুবিধাসমূহ অন কৰা হ\'ব"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"অন কৰক"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"এই এপটো Androidৰ এটা পুৰণা সংস্কৰণৰ বাবে প্ৰস্তুত কৰা হৈছিল, আৰু ই বিচৰাধৰণে কাম নকৰিবও পাৰে। ইয়াৰ আপডেট আছে নেকি চাওক, বা বিকাশকৰ্তাৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"আপডেট আছে নেকি চাওক"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"আপুনি নতুন বার্তা লাভ কৰিছে"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"চাবলৈ এছএমএছ এপ্ খোলক"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"কিছুমান কৰ্মক্ষমতা সীমিত হ\'ব পাৰে"</string>
@@ -1979,28 +1875,34 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ভইচৰ বাবে ছিমৰ প্ৰ\'ভিজন কৰা হোৱা নাই"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ভইচৰ বাবে ছিম ব্যৱহাৰৰ অনুমতি নাই"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ভইচৰ বাবে ফ\'ন ব্যৱহাৰৰ অনুমতি নাই"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"পপআপ ৱিণ্ড\'"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"এপৰ সংস্কৰণ অৱনমিত কৰা হৈছে, বা ই এই শ্বৰ্টকাটটোৰ লগত খাপ নাখায়"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"এপটোত বেকআপ আৰু পুনঃস্থাপন সুবিধা নথকাৰ বাবে শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"এপৰ স্বাক্ষৰৰ অমিল হোৱাৰ বাবে শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"শ্বৰ্টকাট পুনঃস্থাপন কৰিবপৰা নগ\'ল"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"শ্বৰ্টকাট অক্ষম কৰি থোৱা হৈছে"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
- <!-- no translation found for slices_permission_request (8484943441501672932) -->
- <skip />
- <!-- no translation found for screenshot_edit (7867478911006447565) -->
- <skip />
- <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"আনইনষ্টল কৰক"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"যিহ\'লেও খোলক"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"ক্ষতিকাৰক এপ্ চিনাক্ত কৰা হৈছে"</string>
+ <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>এ <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাব খুজিছে"</string>
+ <string name="screenshot_edit" msgid="7867478911006447565">"সম্পাদনা কৰক"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"কল আৰু জাননীসমূহে কম্পন কৰিব"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"কল আৰু জাননীসমূহ মিউট কৰা হ\'ব"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ছিষ্টেমৰ সালসলনি"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"অসুবিধা নিদিব"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"আপুনি যাতে মনোযোগ দিব পাৰে তাৰ কাৰণে অসুবিধা নিদিবই জাননীসমূহ লুকুৱাই থৈছে"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"এইটো এটা নতুন আচৰণ। সলনি কৰিবলৈ টিপক।"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"অসুবিধা নিদিব সলনি হৈছে"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"কি কি অৱৰোধ কৰা হৈছে জানিবলৈ টিপক।"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ছিষ্টেম"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ছেটিংসমূহ"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 34b4b3d..c51249f 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Səsli xidmət yoxdur"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Səs xidməti və ya təcili zəng yoxdur"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Operator tərəfindən müvəqqəti olaraq deaktiv edildi"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> üçün operator tərəfindən müvəqqəti olaraq deaktiv edildi"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil şəbəkəyə daxil olmaq mümkün deyil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tərcih edilən şəbəkəni dəyişin. Dəyişmək üçün klikləyin."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Təcili zəng əlçatan deyil"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Rominq Banneri Açıqdır"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi zəngi ayarlana bilmədi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Zəng etmək və Wi-Fi üzərindən mesaj göndərmək üçün əvvəlcə operatordan bu cihazı quraşdırmağı tələb edin. Sonra Ayarlardan Wi-Fi zəngini deaktiv edin. (Xəta kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Operatorla Wi‑Fi zənglərini qeydə alarkən xəta baş verdi: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Zəngi"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Proqrama istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək üçün üsullara müraciət etməyə imkan verir."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"barmaq izi avadanlığından istifadə edin"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tanınmır"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmaq izi doğrulandı"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmaq izi üçün avadanlıq yoxdur."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmaq izi saxlana bilməz. Lütfən, mövcud barmaq izini silin."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmaq izinin vaxtı başa çatdı. Yenidən cəhd edin."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Daxiletmə metodu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Mətn əməliyyatları"</string>
<string name="email" msgid="4560673117055050403">"E-poçt"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Seçilmiş ünvana e-məktub yazın"</string>
<string name="dial" msgid="1253998302767701559">"Zəng"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Seçilmiş telefon nömrəsinə zəng edin"</string>
<string name="map" msgid="6521159124535543457">"Tapmaq"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Seçilmiş ünvanı yerləşdirin"</string>
<string name="browse" msgid="1245903488306147205">"Açın"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Seçilmiş linki açın"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Seçilmiş telefon nömrəsini mesajla göndərin"</string>
<string name="add_contact" msgid="7867066569670597203">"Əlavə edin"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Kontakta əlavə edin"</string>
<string name="view_calendar" msgid="979609872939597838">"Baxın"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Təqvimdə seçilmiş vaxta baxın"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Cədvəl"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Tədbiri seçilmiş vaxta planlaşdırın"</string>
<string name="view_flight" msgid="7691640491425680214">"Trek"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Seçilmiş uçuşu izləyin"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Yaddaş yeri bitir"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bəzi sistem funksiyaları işləməyə bilər"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistem üçün yetərincə yaddaş ehtiyatı yoxdur. 250 MB yaddaş ehtiyatının olmasına əmin olun və yenidən başladın."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Açıq Wi‑Fi şəbəkəsinə qoşulun"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Operatorun Wi‑Fi şəbəkəsinə qoşulun"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi şəbəkəsinə qoşulur"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi şəbəkəsinə qoşuldu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi şəbəkəsinə qoşulmaq mümkün deyil"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> tətbiq üzərindən göstərilir"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> adlı şəxsin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktiv edin"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanır"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Səhvlər yoxlanılır"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> aşkarlandı"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> yoxlanılır…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Cari kontent nəzərdən keçirilir"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Yeni <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Quraşdırmaq üçün klikləyin"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoların və medianın köçürülməsi üçün"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Zədələnmiş <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> zədələnib. Düzəltmək üçün tıklayın."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> ilə bağlı problem"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Həll etmək üçün klikləyin"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> zədələnib. Düzəltmək üçün seçin."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Dəstəklənməyən <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir. Dəstəklənən formatda ayarlamaq üçün tıklayın."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir. Dəstəklənən formatda ayarlamaq üçün seçin."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> gözlənilmədən çıxarıldı"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Data itkisinin qarşısını almaq üçün <xliff:g id="NAME">%s</xliff:g> kartını çıxarın"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> çıxarıldı"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> çıxarıldı; yenisini daxil edin"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> hələ də çıxarılır…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Çıxarmayın"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Kontenti itirməmək üçün silmədən öncə medianı çıxarın"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> silindi"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Bəzi funksiyalar düzgün işləməyə bilər. Yeni yaddaşı daxil edin."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> çıxarılır"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Silməyin"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Quraşdırın"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Çıxarın"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Araşdır"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> yoxdur"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Bu cihazı yenidən daxil edin"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Cihazı yenidən daxil edin"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> daşınır"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Data daşınır"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Köçürmə tamamdır"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data <xliff:g id="NAME">%s</xliff:g> adına köçürüldü"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Data daşına bilmədi"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data orijinal yerində saxlanıldı"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Kontent transferi tamamlandı"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Kontent <xliff:g id="NAME">%s</xliff:g> ünvanına köçürüldü"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kontent köçürülmədi"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Kontenti yenidən köçürün"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Silinib"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Çıxarılıb"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Yoxlanılır..."</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM səs üçün konfiqurasiya edilməyib"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Səs üçün SIM-ə icazə verilmir"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Səs üçün telefona icazə verilmir"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> icazəli deyil"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> təmin edilməyib"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> icazəli deyil"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> icazəli deyil"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Popap Pəncərəsi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Tətbiq versiyası əvvəlki versiyaya endirilib və ya bu qısayol ilə uyğun deyil"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 6941579..c4b9fa3 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -78,15 +78,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID pozivaoca podrazumevano nije ograničen. Sledeći poziv: Nije ograničen."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Usluga nije dobavljena."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ne možete da promenite podešavanje ID-a korisnika."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Nema usluge prenosa podataka"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Hitni pozivi nisu mogući"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nema usluge prenosa podataka preko mobilnog operatera"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hitni pozivi nisu dostupni"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nema glasovne usluge"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovne usluge/usluge za hitne pozive"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Privremeno je onemogućeno na mobilnoj mreži na vašoj lokaciji"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezivanje sa mrežom nije uspelo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Podešavanja > Mreža i internet > Mobilne mreže > Željeni tip mreže."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi pozivanje je aktivno"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Hitni pozivi zahtevaju mobilnu mrežu."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nema glasovne usluge ni hitnih poziva"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Privremeno isključio mobilni operater"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Privremeno je isključio mobilni operater za SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Povezivanje sa mobilnom mrežom nije uspelo"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probajte da promenite željenu mrežu. Dodirnite da biste promenili."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hitni pozivi nisu dostupni"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Ne možete da upućujete hitne pozive preko Wi‑Fi-ja"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Obaveštenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim za hitan povratni poziv"</string>
@@ -121,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Baner rominga je uključen"</string>
<string name="roamingText12" msgid="1189071119992726320">"Baner rominga je isključen"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pretraživanje usluge"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Pozivanje preko Wi-Fi-ja"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Podešavanje pozivanja preko Wi-Fi-ja nije uspelo"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja. (kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrujte se kod mobilnog operatera (kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Problem u vezi sa registrovanjem pozivanja preko Wi‑Fi-ja kod mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -161,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Previše zahteva se obrađuje. Probajte ponovo kasnije."</string>
<string name="notification_title" msgid="8967710025036163822">"Greška pri prijavljivanju za <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizacija"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizacija"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Previše <xliff:g id="CONTENT_TYPE">%s</xliff:g> izbrisanih stavki."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sinhronizacija nije uspela"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Previše pokušaja brisanja sadržaja <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Memorija tableta je puna! Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Memorijski prostor na TV-u je popunjen. Izbrišite neke datoteke da biste oslobodili prostor."</string>
@@ -176,14 +177,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Od strane administratora profila za Work"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Od strane <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Poslovni profil je izbrisan"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil za Work je izbrisan jer nedostaje aplikacija za administratore"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplikacija za administratore na profilu za Work nedostaje ili je oštećena. Zbog toga su profil za Work i povezani podaci izbrisani. Obratite se administratoru za pomoć."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profil za Work više nije dostupan na ovom uređaju"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Previše pokušaja unosa lozinke"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Uređajem se upravlja"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organizacija upravlja ovim uređajem i može da nadgleda mrežni saobraćaj. Dodirnite za detalje."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Uređaj će biti obrisan"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Ne možete da koristite ovu aplikaciju za administratore. Uređaj će sada biti obrisan.\n\nAko imate pitanja, kontaktirajte administratora organizacije."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Ne možete da koristite ovu aplikaciju za administratore. Uređaj će sada biti obrisan.\n\nAko imate pitanja, kontaktirajte administratora organizacije."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Štampanje je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ja"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcije za tablet"</string>
@@ -239,6 +239,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim rada u avionu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim rada u avionu je UKLJUČEN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim rada u avionu je ISKLJUČEN"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ušteda baterije"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ušteda baterije je ISKLJUČENA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ušteda baterije je UKLJUČENA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Podešavanja"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -272,31 +275,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Pređi na poslovni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupi kontaktima"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa kontaktima"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa kontaktima?"</string>
<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="8903573681261610809">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa lokaciji 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupi kalendaru"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"šalje i pregleda SMS poruke"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> šalje i pregleda SMS-ove"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> šalje i pregleda SMS-ove?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Skladište"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupa slikama, medijima i datotekama na uređaju"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Dozvolite <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa slikama, medijskim datotekama i datotekama na uređaju"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>pristupa slikama, medijskim datotekama i datotekama na uređaju?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snima zvuk"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snima zvuk"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snima zvuk?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"snima slike i video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snima slike i video snimke"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snima slike i video snimke?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"upućuje telefonske pozive i upravlja njima"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> upućuje pozive i upravlja njima"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> upućuje pozive i upravlja njima?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori za telo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vitalnim funkcijama"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa podacima senzora o vitalnim funkcijama"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>pristupa podacima senzora o vitalnim funkcijama?"</string>
<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>
@@ -308,7 +311,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Obavljanje pokreta"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Može da dodiruje, lista, skuplja prikaz i obavlja druge pokrete."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Pokreti za otisak prsta"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Može da registruje pokrete na senzoru za otisak prsta na uređaju."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Može da registruje pokrete na senzoru za otisak prsta na uređaju."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogućavanje ili izmena statusne trake"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Dozvoljava aplikaciji da onemogući statusnu traku ili da dodaje i uklanja sistemske ikone."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"funkcionisanje kao statusna traka"</string>
@@ -359,6 +362,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Dozvoljava aplikaciji da učini sopstvene komponente trajnim u memoriji. Ovo može da ograniči memoriju dostupnu drugim aplikacijama i uspori tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Dozvoljava aplikaciji da neke svoje delove trajno zadrži u memoriji. To može da ograniči memoriju dostupnu drugim aplikacijama i uspori TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Dozvoljava aplikaciji da učini sopstvene komponente trajnim u memoriji. Ovo može da ograniči memoriju dostupnu drugim aplikacijama i uspori telefon."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"pokreni uslugu u prvom planu"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Dozvoljava aplikaciji da koristi usluge u prvom planu."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"merenje memorijskog prostora u aplikaciji"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Dozvoljava aplikaciji da preuzme veličine kôda, podataka i keša."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"izmena podešavanja sistema"</string>
@@ -481,6 +486,8 @@
<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_useBiometric" msgid="8837753668509919318">"koristi biometrijski hardver"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Dozvoljava aplikaciji da koristi biometrijski hardver za potvrdu autentičnosti"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljaj hardverom za otiske prstiju"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Dozvoljava aplikaciji da aktivira metode za dodavanje i brisanje šablona otisaka prstiju koji će se koristiti."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"koristi hardver za otiske prstiju"</string>
@@ -493,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznat"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otiske prstiju nije dostupan."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string>
@@ -805,6 +813,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Otključavanje šablonom."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Otključava SIM karticu PIN-om."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključava SIM karticu PUK-om."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast šablona."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast prevlačenja."</string>
@@ -866,6 +876,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekst je kopiran u privremenu memoriju."</string>
<string name="more_item_label" msgid="4650918923083320495">"Još"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Meni+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"razmak"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"izbriši"</string>
@@ -1014,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metod unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje u vezi sa tekstom"</string>
<string name="email" msgid="4560673117055050403">"Pošalji imejl"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Pošaljite imejl na izabranu adresu"</string>
<string name="dial" msgid="1253998302767701559">"Pozovi"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Pozovite izabrani broj telefona"</string>
<string name="map" msgid="6521159124535543457">"Pronađi"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Pronađite izabranu adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otvorite izabrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Pošalji SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Pošaljite SMS na izabrani broj telefona"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Dodajte u kontakte"</string>
<string name="view_calendar" msgid="979609872939597838">"Prikaži"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Pogledajte izabrano vreme u kalendaru"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Zakaži"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Zakažite događaj u izabrano vreme"</string>
<string name="view_flight" msgid="7691640491425680214">"Prati"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Pratite izabrani let"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Memorijski prostor je na izmaku"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke sistemske funkcije možda ne funkcionišu"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string>
@@ -1094,31 +1119,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Potraži ažuriranje"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) je prekršila samonametnute StrictMode smernice."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> je prekršio samonametnute StrictMode smernice."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android se nadograđuje…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android se pokreće…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon se ažurira…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet se ažurira…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Uređaj se ažurira…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon se pokreće…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet se pokreće…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Uređaj se pokreće…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Memorija se optimizuje."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršavamo ažuriranje Android-a…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće ispravno funkcionisati dok se nadogradnja ne dovrši"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Ažuriranje sistema se dovršava…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se nadograđuje…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizovanje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Priprema se <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Završavanje pokretanja."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Dodirnite da biste se vratili u igru"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Odaberite igru"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Da bi učinak bio bolji, možete da otvorite samo jednu od ovih igara odjednom."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Nazad na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog dela memorije je napravljen; dodirnite za deljenje"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Izaberite radnju za tekst"</string>
@@ -1155,12 +1177,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povežite se sa otvorenom Wi‑Fi mrežom"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se na Wi-Fi mrežu mobilnog operatera"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezujete se sa otvorenom Wi‑Fi mrežom"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Povezuje se sa Wi-Fi mrežom..."</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezali ste se sa Wi‑Fi mrežom"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezivanje sa Wi‑Fi mrežom nije uspelo"</string>
<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="1100098935861622985">"Sve mreže"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se automatski uključiti"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne uključuj ponovo"</string>
@@ -1226,6 +1248,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovo pokreni"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilnu uslugu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Preuzmite aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> da biste aktivirali novu SIM karticu"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova SIM kartica je umetnuta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite za podešavanje"</string>
@@ -1244,13 +1267,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Režim PTP preko USB-a je uključen"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB privezivanje je uključeno"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Režim MIDI preko USB-a je uključen"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Režim USB dodatka je uključen"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB dodatak je povezan"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za još opcija."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Povezani uređaj se puni. Dodirnite za još opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkrivena je analogna dodatna oprema za audio sadržaj"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan sa ovim telefonom. Dodirnite da biste saznali više."</string>
<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="4948470599328424059">"Dodirnite da biste onemogućili otklanjanje grešaka sa USB-a."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Izveštaj o grešci se generiše…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite li da podelite izveštaj o grešci?"</string>
@@ -1269,34 +1292,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplikacija"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplik."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite ovu funkciju za <xliff:g id="NAME">%s</xliff:g>, dodirnite da biste otvorili podešavanja i isključili je."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> se priprema"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Proverava se da li postoje greške"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novi uređaj <xliff:g id="NAME">%s</xliff:g> je otkriven"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Isključi"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Proverava se <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Pregleda se aktuelni sadržaj"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novi/a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Dodirnite da biste podesili"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prenos slika i medija"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen. Dodirnite da biste ga popravili."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem sa: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Dodirnite da biste ispravili"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Medij <xliff:g id="NAME">%s</xliff:g> je oštećen. Izaberite da ga popravite."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Uređaj <xliff:g id="NAME">%s</xliff:g> nije podržan"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ovaj uređaj ne podržava ovaj uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da biste podesili podržani format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ovaj uređaj ne podržava ovaj medij (<xliff:g id="NAME">%s</xliff:g>). Izaberite da ga podesite u podržanom formatu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Uređaj <xliff:g id="NAME">%s</xliff:g> je neočekivano uklonjen"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> pre uklanjanja da ne biste izgubili podatke"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen; umetnite novi"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> se još uvek izbacuje…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne uklanjajte"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Izbacite medijum pre nego što ga uklonite da ne biste izgubili sadržaj"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> je uklonjen/a"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Neke funkcije možda neće ispravno raditi. Umetnite nov memorijski uređaj."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Izbacuje se <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne uklanjajte"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Aktiviraj"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Umetnite uređaj ponovo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo umetnite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Prenosi se <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Podaci se prenose"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Prenos je završen"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Podaci su preneseni na uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Prenos podataka nije uspeo"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Podaci su ostali na originalnoj lokaciji"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Prenos sadržaja je gotov"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Sadržaj je premešen na: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Premeštanje sadržaja nije uspelo"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Probajte da ponovo premestite sadržaj"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Uklonjen je"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Izbačen je"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Proverava se..."</string>
@@ -1355,14 +1379,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje stalno uključenog VPN-a..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Stalno uključeni VPN je povezan"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Veza sa uvek uključenim VPN-om je prekinuta"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Greška stalno uključenog VPN-a"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Povezivanje na stalno uključeni VPN nije uspelo"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Promenite podešavanja VPN-a"</string>
<string name="upload_file" msgid="2897957172366730416">"Odaberi datoteku"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nije izabrana nijedna datoteka"</string>
<string name="reset" msgid="2448168080964209908">"Resetuj"</string>
<string name="submit" msgid="1602335572089911941">"Pošalji"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Režim rada u automobilu je omogućen"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Dodirnite da biste izašli iz režima rada u automobilu."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikacija za vožnju je pokrenuta"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Dodirnite da biste izašli iz aplikacije za vožnju."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Aktivno povezivanje sa internetom preko mobilnog uređaja ili hotspot"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste podesili."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Privezivanje je onemogućeno"</string>
@@ -1441,22 +1465,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB disk"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB memorija"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Izmeni"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Obaveštenje o potrošnji podataka"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Dodirnite za potrošnju i podešavanja."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Nema više 2G-3G podataka"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Nema više 4G podataka"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Upozorenje na potrošnju podataka"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Potrošili ste <xliff:g id="APP">%s</xliff:g> podataka"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dostigli ste ograničenje podataka"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Nema više Wi-Fi podataka"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Potrošili ste podatke za ovaj mesec"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Prekoračen prenos 2G-3G podataka"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Prekoračenje prenosa 4G podataka"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekoračeno ogranič. pren. pod."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Prekoračenje prenosa Wi-Fi podat."</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> preko navedenog ograničenja."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Podaci su pauzirani tokom ostatka ciklusa"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Potrošili ste mobilne podatke"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Potrošili ste Wi-Fi podatke"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Prekoračili ste <xliff:g id="SIZE">%s</xliff:g> od podešenog ograničenja"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Pozadinski podaci su ograničeni"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Dodirnite za uklanjanje ograničenja."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Velika potrošnja podataka"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Potrošnja podataka tokom poslednjih par dana je veća nego obično. Dodirnite da biste pregledali potrošnju i podešavanja."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Velika potrošnja mob. podataka"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikacije su potrošile više podataka nego obično"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikacija <xliff:g id="APP">%s</xliff:g> je potrošila više podataka nego obično"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Bezbednosni sertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ovaj sertifikat je važeći."</string>
<string name="issued_to" msgid="454239480274921032">"Izdato za:"</string>
@@ -1694,7 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je administrator"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Da bi produžila trajanje baterije, Ušteda baterije smanjuje performanse uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Imejl, razmena poruka i druge aplikacije koje se oslanjaju na sinhronizaciju se neće ažurirati ako ih ne otvorite.\n\nUšteda baterije se automatski isključuje kada se uređaj puni."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Da bi produžila trajanje baterije, Ušteda baterije smanjuje performanse uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Imejl, razmena poruka i druge aplikacije koje se oslanjaju na sinhronizaciju se možda neće ažurirati ako ih ne otvorite.\n\nUšteda baterije se automatski isključuje kada se uređaj puni."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1708,7 +1729,7 @@
<item quantity="few">Za %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Za %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d sat (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">%1$d sata (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d sati (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1728,7 +1749,7 @@
<item quantity="few">Za %d min</item>
<item quantity="other">Za %d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d sat</item>
<item quantity="few">%d sata</item>
<item quantity="other">%d sati</item>
@@ -1753,14 +1774,14 @@
<string name="muted_by" msgid="6147073845094180001">"Zvuk je isključio/la <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Došlo je do internog problema u vezi sa uređajem i možda će biti nestabilan dok ne obavite resetovanje na fabrička podešavanja."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Došlo je do internog problema u vezi sa uređajem. Potražite detalje od proizvođača."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD zahtev je promenjen u DIAL zahtev."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD zahtev je promenjen u SS zahtev."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD zahtev je promenjen u novi USSD zahtev."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD zahtev je promenjen u Video DIAL zahtev."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS zahtev je promenjen u DIAL zahtev."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS zahtev je promenjen u Video DIAL zahtev."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtev je promenjen u USSD zahtev."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtev je promenjen u novi SS zahtev."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD zahtev je promenjen u običan poziv"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD zahtev je promenjen u SS zahtev"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Promenjeno je u novi USSD zahtev"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD zahtev je promenjen u video poziv"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS zahtev je promenjen u običan poziv"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS zahtev je promenjen u video poziv"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS zahtev je promenjen u USSD zahtev"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promenjeno je u novi SS zahtev"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za Work"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
@@ -1860,6 +1881,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM kartica nije podešena za glasovne usluge"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM kartica nije prilagođena za glasovne usluge"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije prilagođen za glasovne usluge"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije podešen"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iskačući prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"i još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikacija je vraćena na stariju verziju ili nije kompatibilna sa ovom prečicom"</string>
@@ -1872,7 +1897,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Izmeni"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibracija za pozive i obaveštenja je uključena"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Melodija zvona za pozive i obaveštenje je isključena"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promene"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne uznemiravaj"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Ne uznemiravaj krije obaveštenja da bi vam pomogao da se fokusirate"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da biste promenili."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režim Ne uznemiravaj je promenjen"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite da biste proverili da li podešavanja ponašanja obuhvataju prekide"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da biste proverili šta je blokirano."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Podešavanja"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 564790d..7a43e8b 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -84,6 +84,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма сэрвісу галасавых выклікаў"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Галасавыя або экстранныя выклікі недаступныя"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Часова выключана аператарам сувязі"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Сетка мабільнай сувязі недаступная"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Націсніце, каб выбраць іншую сетку."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Экстранныя выклікі недаступныя"</string>
@@ -122,12 +124,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Банэр роўмінгу ўключаны"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банэр роўмінгу адключаны"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Пошук службы"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Не атрымалася падключыць Wi‑Fi-тэлефанію"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Каб рабіць выклікі і адпраўляць паведамленні па Wi-Fi, спачатку папрасіце свайго аператара наладзіць гэту паслугу. Затым зноў уключыце Wi-Fi-тэлефанію ў меню Налады. (Код памылкі: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Памылка падключэння Wi‑Fi-тэлефаніі ў вашага аператара: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi-тэлефанія %s"</item>
@@ -161,10 +164,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Апрацоўваецца занадта шмат запытаў. Паспрабуйце яшчэ раз пазней."</string>
<string name="notification_title" msgid="8967710025036163822">"Памылка ўваходу ва ўлiковы запiс <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Сінхранізацыя"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Немагчыма сінхранізаваць"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Вы прабавалі выдаліць надта шмат элементаў <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Памяць планшэта поўная. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Сховішча гадзінніка перапоўнена. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Сховішча тэлевізара перапоўнена. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
@@ -278,40 +279,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Пераключыцца на працоўны профіль"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Кантакты"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"атрымліваць доступ да вашых кантактаў"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да вашых кантактаў?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Месцазнаходжанне"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"атрымліваць доступ да месцазнаходжання гэтай прылады"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да звестак аб месцазнаходжанні гэтай прылады?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Каляндар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"атрымліваць доступ да вашага календара"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да вашага календара?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"адпраўляць і праглядаць SMS-паведамленні"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> адпраўляць і праглядаць SMS-паведамленні?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Сховішча"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"атрымліваць доступ да фатаграфій, медыяфайлаў і файлаў на вашай прыладзе"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да фота, мультымедыя і файлаў на вашай прыладзе?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Мікрафон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"запісваць аўдыя"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> запісваць аўдыя?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"рабіць фатаздымкі і запісваць відэа"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> рабіць фота і запісваць відэа?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Тэлефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"рабіць тэлефонныя выклікі і кіраваць імі"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> рабіць тэлефонныя выклікі і кіраваць імі?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Датчыкі цела"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"атрымліваць з датчыка даныя асноўных фізіялагічных паказчыкаў"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да даных з датчыкаў пра вашы асноўныя фізіялагічныя паказчыкі?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымліваць змесціва вакна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Аналізаваць змесціва актыўнага вакна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключаць Азнаямленне дотыкам"</string>
@@ -498,6 +490,8 @@
<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_useBiometric" msgid="8837753668509919318">"выкарыстоўваць біяметрычнае абсталявання"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Дазваляе праграме выкарыстоўваць для аўтэнтыфікацыі біяметрычнае абсталяванне"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"кіраваць апаратнымі сродкамі для адбіткаў пальцаў"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Дазваляе праграме выкарыстоўваць спосабы дадання і выдалення шаблонаў адбіткаў пальцаў для выкарыстання."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"выкарыстоўваць апаратныя сродкі для адбіткаў пальцаў"</string>
@@ -510,6 +504,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не распазнаны"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратныя сродкі адбіткаў пальцаў недаступныя."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Адбіткі пальцаў нельга захаваць. Выдаліце існы адбітак."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз."</string>
@@ -1056,14 +1052,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Метад уводу"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дзеянні з тэкстам"</string>
<string name="email" msgid="4560673117055050403">"Электронная пошта"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Напісаць электронны ліст"</string>
<string name="dial" msgid="1253998302767701559">"Выклікаць"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Звязацца з абанентам"</string>
<string name="map" msgid="6521159124535543457">"Знайсці"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Паказаць адрас на карце"</string>
<string name="browse" msgid="1245903488306147205">"Адкрыць"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Адкрыць URL у браўзеры"</string>
<string name="sms" msgid="4560537514610063430">"Паведамленне"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Адправіць паведамленне"</string>
<string name="add_contact" msgid="7867066569670597203">"Дадаць"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Дадаць у кантакты"</string>
<string name="view_calendar" msgid="979609872939597838">"Прагледзець"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Паказаць выбраны час у календары"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Графік"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Запланаваць падзею ў выбраны час"</string>
<string name="view_flight" msgid="7691640491425680214">"Сачыць"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Адсочваць рэйс"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Месца для захавання на зыходзе"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некаторыя сістэмныя функцыі могуць не працаваць"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Не хапае сховішча для сістэмы. Пераканайцеся, што ў вас ёсць 250 МБ свабоднага месца, і перазапусціце."</string>
@@ -1157,8 +1162,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Выберыце дзеянне для тэкста"</string>
@@ -1197,8 +1201,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Падключыцеся да адкрытай сеткі Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Падключэнне да сеткі Wi‑Fi аператара"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Падключэнне да сеткі Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Выканана падключэнне да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не атрымалася падключыцца да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string>
@@ -1314,33 +1317,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> паказв. паверх іншых праграм"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць гэта."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Выключыць"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Падрыхтоўка <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Праверка на наяўнасць памылак"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Выяўлены новы носьбіт <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перадачы фатаграфій і медыяфайлаў"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Пашкоджаны носьбіт <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носьбіт <xliff:g id="NAME">%s</xliff:g> пашкоджаны. Дакраніцеся, каб выправіць."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Носьбіт <xliff:g id="NAME">%s</xliff:g> пашкоджаны. Выберыце, каб выправіць."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не падтрымліваецца"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Дакраніцеся, каб наладзіць яго ў фармаце, які падтрымліваецца."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Выберыце, каб наладзіць яго ў фармаце, які падтрымліваецца."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Носьбіт <xliff:g id="NAME">%s</xliff:g> нечакана выняты"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Адключыце носьбіт <xliff:g id="NAME">%s</xliff:g>, перш чым вымаць яго, каб пазбегнуць страты даных."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Носьбіт <xliff:g id="NAME">%s</xliff:g> выдалены"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Носьбіт <xliff:g id="NAME">%s</xliff:g> выдалены; устаўце новы"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Выманне <xliff:g id="NAME">%s</xliff:g> працягваецца..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не выдаляць"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> адсутнічае"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Паўторна ўстаўце прыладу"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Перамяшчэнне <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Перамяшчэнне даных"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Перамяшчэнне завершана"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Даныя перамешчаны на <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Не атрымалася перамясціць даныя"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Даныя пакінуты ў зыходным месцы"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Носьбіт выдалены"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Носьбіт выняты"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Праверка..."</string>
@@ -1399,17 +1418,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Падключэнне заўсёды ўключанага VPN..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Заўсёды ўключаны i падключаны VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Адключана ад заўсёды ўключанай VPN"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Няма падключэння да пастаяннай VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Змяніць налады сеткі ці VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Выберыце файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Файл не выбраны"</string>
<string name="reset" msgid="2448168080964209908">"Скінуць"</string>
<string name="submit" msgid="1602335572089911941">"Перадаць"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Праграма для ваджэння ўключана"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Націсніце, каб выйсці з праграмы для ваджэння."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"USB-мадэм або кропка доступу Wi-Fi актыўныя"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Дакраніцеся, каб наладзіць."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Рэжым мадэма адключаны"</string>
@@ -1741,8 +1757,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Усталяваны вашым адміністратарам"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Абноўлены вашым адміністратарам"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Выдалены вашым адміністратарам"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Каб падоўжыць час працы акумулятара, у рэжыме эканоміі зараду памяншаецца прадукцыйнасць вашай прылады, абмяжоўваецца выкарыстанне вібрацыі, службаў вызначэння месцазнаходжання і большасці задач фонавай перадачы даных. Электронная пошта, абмен паведамленнямі і іншыя праграмы, якія патрабуюць сінхранізацыі, могуць абнаўляцца, толькі калі вы іх адкрыеце.\n\nРэжым эканоміі зараду адключаецца аўтаматычна, калі прылада зараджаецца."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Каб паменшыць выкарыстанне даных, Эканомія трафіку не дазваляе некаторым праграмам адпраўляць ці атрымліваць даныя ў фонавым рэжыме. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але можа рабіць гэта радзей. Гэта можа азначаць, напрыклад, што відарысы не паказваюцца, пакуль вы не дакраняцеся да іх."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Уключыць Эканомію трафіка?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Уключыць"</string>
@@ -1809,22 +1824,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> адключыў(-ла) гук"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"На вашай прыладзе ўзнікла ўнутраная праблема, і яна можа працаваць нестабільна, пакуль вы не зробіце скід да заводскіх налад."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"На вашай прыладзе ўзнікла ўнутраная праблема. Для атрымання дадатковай інфармацыі звярніцеся да вытворцы."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-запыт заменены на стандартны выклік"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-запыт заменены на SS-запыт"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Заменена на новы USSD-запыт"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-запыт заменены на відэавыклік"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-запыт заменены на стандартны выклік"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-запыт заменены на відэавыклік"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-запыт заменены на USSD-запыт"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Зроблена замена на новы SS-запыт"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Працоўны профіль"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгарнуць"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Згарнуць"</string>
@@ -1926,6 +1933,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Няма SIM-карты для дзеянняў з голасам"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Дзеянні з голасам для гэтай SIM-карты не дапускаюцца"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Дзеянні з голасам для гэтага тэлефона не дапускаюцца"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Выплыўное акно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ярлык адносіцца да старэйшай версіі праграмы або несумяшчальны з ёю"</string>
@@ -1946,8 +1961,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Гэта новае дзеянне. Націсніце, каб перайсці ў налады."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Зменены налады рэжыму \"Не турбаваць\""</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Націсніце, каб паглядзець заблакіраванае."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Сістэма"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Налады"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 5ef9c72..c31decc 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма услуга за гласови обаждания"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Няма достъп до гласовата услуга, нито до спешните обаждания"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Временно е изключено от оператора ви"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Временно е изключено от оператора ви за SIM карта <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Не може да се установи връзка с мобилната мрежа"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Изберете друга предпочитана мрежа. Докоснете за промяна."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Няма достъп до спешните обаждания"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Банерът за роуминг е включен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банерът за роуминг е изключен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Търси се покритие"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Функцията за обаждания през Wi-Fi не можа да бъде настроена"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо, помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките. (Код на грешката: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"При регистрирането на функцията за обаждания през Wi-Fi с оператора ви възникна грешка: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s – обаждания през Wi-Fi"</item>
@@ -481,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"използване на хардуера за биометрични данни"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Разрешава на приложението да използва хардуера за биометрични данни с цел удостоверяване"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управление на хардуера за отпечатъци"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Разрешава на приложението да извиква начини за добавяне и изтриване на шаблони за отпечатъци, които да се използват."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"използване на хардуера за отпечатъци"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не е разпознато"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатъкът е удостоверен"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардуерът за отпечатъци не е налице."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string>
<string name="email" msgid="4560673117055050403">"Имейл"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Изпращане на имейл до избрания адрес"</string>
<string name="dial" msgid="1253998302767701559">"Обаждане"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Обаждане на избрания телефонен номер"</string>
<string name="map" msgid="6521159124535543457">"Намиране"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Намиране на избрания адрес"</string>
<string name="browse" msgid="1245903488306147205">"Отваряне"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Отваряне на избрания URL адрес"</string>
<string name="sms" msgid="4560537514610063430">"Съобщение"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Изпращане на съобщение до избрания телефонен номер"</string>
<string name="add_contact" msgid="7867066569670597203">"Добавяне"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Добавяне към контактите"</string>
<string name="view_calendar" msgid="979609872939597838">"Преглед"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Преглед на избраната дата в календара"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Насрочване"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Насрочване на събитие за избраната дата"</string>
<string name="view_flight" msgid="7691640491425680214">"Проследяване"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Проследяване на избрания полет"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Мястото в хранилището е на изчерпване"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Възможно е някои функции на системата да не работят"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"За системата няма достатъчно място в хранилището. Уверете се, че имате свободни 250 МБ, и рестартирайте."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Свързване с отворена Wi‑Fi мрежа"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Свържете се с Wi‑Fi мрежа на оператор"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Установява се връзка с Wi-Fi мрежата"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Установихте връзка с Wi-Fi мрежата"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можа да се установи връзка с Wi‑Fi мрежата"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Докоснете, за да видите всички мрежи"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Изключване"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>: Подготвя се"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверява се за грешки"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Открито е ново хранилище (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> се проверява…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Текущото съдържание се преглежда"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Ново хранилище (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Докоснете, за да настроите"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За прехвърляне на снимки и мултимедия"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>: Има повреда"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носителят (<xliff:g id="NAME">%s</xliff:g>) е повреден. Докоснете, за да отстраните проблема."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Проблем с хранилището (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Докоснете за коригиране"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Носителят (<xliff:g id="NAME">%s</xliff:g>) е повреден. Изберете, за да отстраните проблема."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>: Не се поддържа"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Устройството не поддържа този носител (<xliff:g id="NAME">%s</xliff:g>). Докоснете, за да настроите в поддържан формат."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Устройството не поддържа този носител (<xliff:g id="NAME">%s</xliff:g>). Изберете, за да настроите в поддържан формат."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: Неочаквано премахване"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Спрете хранилището (<xliff:g id="NAME">%s</xliff:g>), преди да го извадите, за да не загубите данни"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Премахнахте <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Хранилището (<xliff:g id="NAME">%s</xliff:g>) е премахнато. Поставете ново"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>: Още се изважда…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не премахвайте"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Спрете носителя, преди да го премахнете, за да избегнете загубата на съдържание"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Премахнахте <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Някои функции може да не работят правилно. Поставете ново хранилище."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> се спира"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не премахвайте"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"Липсва <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Поставете отново това у-во"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Данните се преместват"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Преместването завърши"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Данните са преместени в/ъв <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Данните не бяха преместени"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Данните останаха в първоначалното местоположение"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Прехвърлянето на съдърж. завърши"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Съдържанието е преместено в хранилището (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Съдърж. не можа да се премести"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Опитайте да преместите съдържанието отново"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Премахнато"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Извадено"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Проверява се…"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано от администратора ви"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Актуализирано от администратора ви"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Изтрито от администратора ви"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"С цел удължаване на живота на батерията режимът за запазването й намалява ефективността на устройството ви и ограничава или изключва вибрирането, услугите за местоположение и преноса на данни на заден план. Приложенията за електронна поща, съобщения и др., които разчитат на синхронизиране, може да не се актуализират, освен ако не ги отворите.\n\nРежимът за запазване на батерията се изключва автоматично, когато устройството ви се зарежда."</string>
<string name="data_saver_description" msgid="6015391409098303235">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ще вкл. ли Икономия на данни?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Включване"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Заглушено от <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Възникна вътрешен проблем с устройството ви. То може да е нестабилно, докато не възстановите фабричните настройки."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Възникна вътрешен проблем с устройството ви. За подробности се свържете с производителя."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD заявката е променена на обикновено обаждане"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD заявката е променена на SS заявка"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Променено на нова USSD заявка"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD заявката е променена на видеообаждане"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS заявката е променена на обикновено обаждане"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS заявката е променена на видеообаждане"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS заявката е променена на USSD заявка"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Променено на нова SS заявка"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Служебен потребителски профил"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгъване"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Свиване"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM картата не е обезпечена за гласови услуги"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Гласовите услуги не са разрешени за SIM картата"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Гласовите услуги не са разрешени за телефона"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM карта <xliff:g id="SIMNUMBER">%d</xliff:g> не е разрешена"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM карта <xliff:g id="SIMNUMBER">%d</xliff:g> не е обезпечена"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM карта <xliff:g id="SIMNUMBER">%d</xliff:g> не е разрешена"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM карта <xliff:g id="SIMNUMBER">%d</xliff:g> не е разрешена"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Изскачащ прозорец"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версията на приложението е понижена или не е съвместима с този пряк път"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index e189d2f..80bf8cf 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ভয়েস পরিষেবা নেই"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ভয়েস পরিষেবা অথবা জরুরি কলের সুবিধা নেই"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"পরিষেবা প্রদানকারী এই সুবিধা সাময়িকভাবে বন্ধ রেখেছে"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"মোবাইল নেটওয়ার্কে কানেক্ট করা যাচ্ছে না"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"পছন্দের নেটওয়ার্ক পরিবর্তন করে দেখুন। অন্য নেটওয়ার্ক বেছে নিতে ট্যাপ করুন।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"জরুরি কল করা যাবে না"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"রোমিং ব্যানার চালু আছে"</string>
<string name="roamingText12" msgid="1189071119992726320">"রোমিং ব্যানার বন্ধ আছে"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"পরিষেবা অনুসন্ধান করা হচ্ছে"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ওয়াই-ফাই কলিং সেট-আপ করা যায়নি"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ওয়াই-ফাই এর মাধ্যমে কল করতে ও মেসেজ পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট-আপ করতে বলুন। তারপর আবার সেটিংস থেকে ওয়াই-ফাই কলিং চালু করুন। (ত্রুটি কোড: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"পরিষেবা প্রদানকারীতে ওয়াই-ফাই কলিং রেজিস্টার করতে সমস্যা হয়েছে: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ওয়াই-ফাই কলিং"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"অনেকগুলি অনুরোধের প্রক্রিয়া করা হচ্ছে৷ পরে আবার চেষ্টা করুন৷"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> এ প্রবেশ করায় ত্রুটি"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"সিঙ্ক"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"সিঙ্ক করা যাচ্ছে না"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"অনেক <xliff:g id="CONTENT_TYPE">%s</xliff:g> মুছে ফেলার চেষ্টা করেছেন।"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ট্যাবলেটের স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ঘড়ির স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"টিভির স্টোরেজ পূর্ণ হয়েছে। জায়গা খালি করতে কিছু ফাইল মুছে ফেলুন৷"</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"এর বদলে কাজের প্রোফাইল ব্যবহার করুন"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"পরিচিতি"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"আপনার পরিচিতিগুলিতে অ্যাক্সেস"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে আপনার পরিচিতিতে অ্যাক্সেস দেবেন?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"অবস্থান"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইসের অবস্থান অ্যাক্সেস"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে এই ডিভাইসের লোকেশন অ্যাক্সেস করতে দেবেন?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ক্যালেন্ডার"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে আপনার ক্যালেন্ডারে অ্যাক্সেস দেবেন?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে এসএমএস দেখতে ও পাঠাতে দেবেন?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"স্টোরেজ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"আপনার ডিভাইসে ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে আপনার ডিভাইসের ফটো, মিডিয়া এবং ফাইলে অ্যাক্সেস দেবেন?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"মাইক্রোফোন"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"অডিও রেকর্ড"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে অডিও রেকর্ড করতে দেবেন?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ক্যামেরা"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ছবি তোলা এবং ভিডিও রেকর্ড"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে ফটো তুলতে এবং ভিডিও রেকর্ড করতে দেবেন?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফোন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফোন কলগুলি এবং পরিচালনা"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে কল করতে এবং কল পরিচালনা করতে দেবেন?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"বডি সেন্সরগুলি"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপনার অত্যাবশ্যক লক্ষণগুলির সম্পর্কে সেন্সর ডেটা অ্যাক্সেস করে"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে সেন্সর থেকে আপনার ভাইটাল সাইনের ডেটা অ্যাক্সেস করতে দেবেন?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপনি ইন্টারঅ্যাক্ট করছেন এমন একটি উইন্ডোর সামগ্রীকে সযত্নে নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"অ্যাপ্লিকেশানকে নিয়ার ফিল্ড কমিউনিকেশন (NFC) ট্যাগ, কার্ড এবং রিডারগুলির সাথে যোগাযোগ করতে দেয়৷"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"আপনার স্ক্রিন লক অক্ষম করুন"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"কী-লক এবং যেকোনো সংশ্লিষ্ট পাসওয়ার্ড সুরক্ষা অক্ষম করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ উদাহরণস্বরূপ, একটি ইনকামিং ফোন কল গ্রহণ করার সময়ে ফোনটি কী-লক অক্ষম করে, তারপরে কল শেষ হয়ে গেলে কী-লকটিকে আবার সক্ষম করে৷"</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার পরিচালনা করুন"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ব্যবহার করার জন্য আঙ্গুলের ছাপের টেম্প্লেটগুলি যোগ করা এবং মোছার পদ্ধতিগুলি গ্রহন করতে অ্যাপ্লিকেশানটিতে অমুমতি দেয়৷"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার ব্যবহার করুন"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"স্বীকৃত নয়"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার অনুপলব্ধ৷"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"পাঠ্য ক্রিয়াগুলি"</string>
<string name="email" msgid="4560673117055050403">"ইমেল"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"কল"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"অবস্থান নির্ণয় করুন"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"খুলুন"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"মেসেজ"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"যোগ করুন"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"দেখুন"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"সময়সূচী"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ট্র্যাক"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"স্টোরেজ পূর্ণ হতে চলেছে"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"কিছু কিছু সিস্টেম ক্রিয়াকলাপ কাজ নাও করতে পারে"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"সিস্টেমের জন্য যথেষ্ট স্টোরেজ নেই৷ আপনার কাছে ২৫০এমবি ফাঁকা স্থান রয়েছে কিনা সে বিষয়ে নিশ্চিত হন এবং সিস্টেম চালু করুন৷"</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"পাঠ্যের জন্য একটি কাজ বেছে নিন"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"পরিষেবা প্রদানকারীর ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করা হচ্ছে"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করা হয়েছে"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা গেল না"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের ওপর প্রদর্শিত হচ্ছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে, ট্যাপ করে সেটিংসে যান ও বৈশিষ্ট্যটি বন্ধ করে দিন।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"বন্ধ করুন"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> প্রস্তুত করা হচ্ছে"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"নতুন <xliff:g id="NAME">%s</xliff:g> শনাক্ত করা হয়েছে"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটো এবং মিডিয়া ট্রান্সফার"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ৷ ঠিক করতে আলতো চাপুন৷"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ। মেরামত করতে বেছে নিন।"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> অসমর্থিত"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে আলতো চাপুন।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে চাইলে বেছে নিন।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ডেটা যাতে হারিয়ে না যায় তার জন্য সরানোর আগে <xliff:g id="NAME">%s</xliff:g> আনমাউন্ট করুন"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> মুছে ফেলা হয়েছে; নতুন একটি ঢোকান"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"এখনও <xliff:g id="NAME">%s</xliff:g> সরিয়ে ফেলা হচ্ছে..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"সরাবেন না"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> অনুপস্থিত"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"এই ডিভাইসটিকে আবার সন্নিবেশ করান"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> সরানো হচ্ছে"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ডেটা সরানো হচ্ছে"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"সরানো সম্পূর্ণ হয়েছে"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ডেটা <xliff:g id="NAME">%s</xliff:g> এ সরানো হয়েছে"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ডেটা সরানো যায়নি"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"মূল অবস্থানে ডেটা রাখুন"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"সরানো হয়েছে"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"সরিয়ে দেওয়া হয়েছে"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"পরীক্ষা করা হচ্ছে..."</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"সর্বদা-চালু VPN সংযুক্ত হচ্ছে..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"সর্বদা-চালু VPN সংযুক্ত হয়েছে"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"সবসময়-চালু VPN এর সংযোগ বিচ্ছিন্ন আছে"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"সবসময়-চালু VPN-এর সাথে কানেক্ট করা যাচ্ছে না"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"নেটওয়ার্ক অথবা VPN সেটিংস পরিবর্তন করুন"</string>
<string name="upload_file" msgid="2897957172366730416">"ফাইল বেছে নিন"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"কোনো ফাইল নির্বাচন করা হয়নি"</string>
<string name="reset" msgid="2448168080964209908">"আবার সেট করুন"</string>
<string name="submit" msgid="1602335572089911941">"জমা দিন"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ড্রাইভিং অ্যাপ চালু আছে"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ড্রাইভিং অ্যাপ বন্ধ করতে ট্যাপ করুন।"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"টিথারিং বা হটস্পট সক্রিয় আছে"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"সেট আপ করার জন্য আলতো চাপুন৷"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"টিথারিং অক্ষম করা আছে"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপনার প্রশাসক ইনস্টল করেছেন"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ব্যাটারির চার্জ যাতে আরও বেশিক্ষণ থাকে, তার জন্য ব্যাটারি সেভার আপনার ডিভাইসের পারফরম্যান্স হ্রাস করে এবং ভাইব্রেশন, লোকেশন ভিত্তিক পরিষেবা ও ব্যাকগ্রাউন্ড ডেটা সীমিত অথবা বন্ধ করে দেয়৷ ইমেল, মেসেজ এবং সিঙ্কের উপর নির্ভরশীল অন্যান্য অ্যাপগুলি যতক্ষণ না আপনি নিজে চালু করবেন, ততক্ষণ সেগুলি আপডেট নাও হতে পারে।\n\nডিভাইস চার্জে বসালে ব্যাটারি সেভার নিজে থেকেই বন্ধ হয়ে যায়৷"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"চালু করুন"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> দ্বারা নিঃশব্দ করা হয়েছে"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে, এবং আপনি যতক্ষণ না পর্যন্ত এটিকে ফ্যাক্টরি ডেটা রিসেট করছেন ততক্ষণ এটি ঠিকভাবে কাজ নাও করতে পারে৷"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে৷ বিস্তারিত জানার জন্য প্রস্তুতকারকের সাথে যোগাযোগ করুন৷"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD অনুরোধ সাধারণ কলে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD অনুরোধ SS অনুরোধে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"নতুন USSD অনুরোধে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD অনুরোধ ভিডিও কলে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS অনুরোধ সাধারণ কলে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS অনুরোধ ভিডিও কলে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS অনুরোধ USSD অনুরোধে পরিবর্তন করা হয়েছে"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"নতুন SS অনুরোধে পরিবর্তন করা হয়েছে"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"কর্মস্থলের প্রোফাইল"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"বড় করুন"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"সঙ্কুচিত করুন"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"সিমটি ভয়েস কলের জন্য প্রস্তুত নয়"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"এই সিম দিয়ে ভয়েস কল করা যাবে না"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"এই ফোন দিয়ে ভয়েস কল করা যাবে না"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"পপ-আপ উইন্ডো"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>টি"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"অ্যাপের ভার্সন ডাউনগ্রেড করা হয়েছে অথবা এই শর্টকাটের জন্য উপযুক্ত নয়"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"এটি নতুন বৈশিষ্ট্য। পরিবর্তন করতে ট্যাপ করুন।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"সিস্টেম"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"সেটিংস"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 3e903de..70e51b9 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -83,6 +83,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nema usluge govornih poziva"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nema glasovne usluge ili hitnih poziva"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Privremeno isključio mobilni operater"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Privremeno isključio mobilni operater za SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nije moguće dosegnuti mobilnu mrežu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Pokušajte promijeniti preferiranu mrežu. Dodirnite za promjenu."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hitni pozivi su nedostupni"</string>
@@ -121,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Oznaka da je uređaj u roamingu uključena"</string>
<string name="roamingText12" msgid="1189071119992726320">"Oznaka da je uređaj u roamingu ugašena"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Traženje usluge"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Nije moguće postaviti Wi-Fi pozivanje"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Da biste pozivali i slali poruke koristeći Wi-Fi mrežu, prvo zatražite od operatera da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozivanje u Postavkama. (Kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Došlo je do problema prilikom registracije pozivanja putem Wi-Fi mreže kod vašeg operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi pozivanje preko operatera %s"</item>
@@ -160,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trenutno se obrađuje previše zahtjeva. Pokušajte ponovo kasnije."</string>
<string name="notification_title" msgid="8967710025036163822">"Greška u prijavi za račun <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinhroniziranje"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nije moguće sinhronizirati"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pokušali ste izbrisati previše sadržaja iz kategorije <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pohrana tableta je puna. Izbrišite fajlove kako biste oslobodili prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Prostor za gledanje je pun. Obrišite neke fajlove da oslobodite prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Prostor TV-a za pohranu je pun. Obrišite neke fajlove da oslobodite prostor."</string>
@@ -275,40 +275,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Pređite na radni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupa vašim kontaktima"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristup vašim kontaktima?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupa lokaciji ovog uređaja"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupa vašem kalendaru"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"šalje i pregleda SMS poruke"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> slanje i pregled SMS poruka?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Pohrana"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupa slikama, medijskim fajlovima i fajlovima na vašem uređaju"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristup fotografijama, medijima i fajlovima na vašem uređaju?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snima zvuk"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snimanje zvuka?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"slika i snima videozapise"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snimanje slika i videozapisa?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"poziva i upravlja pozivima"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uspostavljanje poziva i njihovo upravljanje?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tjelesni senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vašim vitalnim funkcijama"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristup senzornim podacima o vašim vitalnim znacima?"</string>
<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>
@@ -495,6 +486,8 @@
<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_useBiometric" msgid="8837753668509919318">"koristi hardver za otiske prstiju"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Omogućava aplikaciji da za autentifikaciju koristi hardver za otiske prstiju"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje hardverom za otiske prstiju"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Omogućava aplikaciji da koristi metode za dodavanje i brisanje šablona otisaka prstiju za upotrebu."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"korištenje hardvera za otiske prstiju"</string>
@@ -507,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznat"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta se ne može pohraniti. Uklonite postojeći otisak prsta."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo."</string>
@@ -1036,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Akcije za tekst"</string>
<string name="email" msgid="4560673117055050403">"E-pošta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"E-pošta odabrane adrese"</string>
<string name="dial" msgid="1253998302767701559">"Pozovite"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Pozovite odabrani broj telefona"</string>
<string name="map" msgid="6521159124535543457">"Odredite lokaciju"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Lokacija odabrane adrese"</string>
<string name="browse" msgid="1245903488306147205">"Otvorite"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otvorite odabrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Poruka"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Pošaljite poruku odabranom broju telefona"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodajte"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Dodaj u kontakte"</string>
<string name="view_calendar" msgid="979609872939597838">"Prikaži"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Pogledajte odabrano vrijeme u kalendaru"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Zakaži"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Zakažite događaj za odabrano vrijeme"</string>
<string name="view_flight" msgid="7691640491425680214">"Prati"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Pratite odabrani let"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ponestaje prostora za pohranu"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke funkcije sistema možda neće raditi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno prostora za sistem. Obezbijedite 250MB slobodnog prostora i ponovo pokrenite uređaj."</string>
@@ -1139,8 +1142,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Biranje akcije za tekst"</string>
@@ -1177,8 +1179,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povežite se na otvorenu Wi‑Fi mrežu"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se na Wi‑Fi mrežu mobilnog operatera"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Povezivanje na Wi-Fi mrežu"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezani ste na Wi‑Fi mrežu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije se moguće povezati na Wi‑Fi mrežu"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string>
@@ -1294,33 +1295,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva druge apl."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Isključi"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema se <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Provjera grešaka"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novi uređaj <xliff:g id="NAME">%s</xliff:g> je otkriven"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Provjeravanje medija <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Pregledanje trenutnog sadržaja"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novi medij <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Dodirnite za postavke"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prebacivanje slika i medijskih fajlova"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen. Dodirnite da biste popravili."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem s medijem <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Dodirnite da popravite"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen. Odaberite za popravak."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Uređaj <xliff:g id="NAME">%s</xliff:g> nije podržan"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ovaj uređaj ne podržava uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da biste ga postavili u podržanom formatu."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ovaj uređaj ne podržava uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da ga postavite u podržanom formatu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Neočekivano uklonjen uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> prije uklanjanja da izbjegnete gubitak podataka"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen, umetnite novi"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Još uvijek se izbacuje <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne uklanjajte"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Izbacite medij prije uklanjanja da izbjegnete gubitak sadržaja"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Medij <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Neke funkcionalnosti možda neće raditi ispravno. Ubacite novu memoriju."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Izbacivanje medija <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nemojte uklanjati"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Postavi"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Ponovo umetnite ovaj uređaj"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo ubacite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premješta se <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Premještanje podataka"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Premještanje je završeno"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Podaci su premješteni na uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Podaci se ne mogu premjestiti"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Podaci su ostali na prvobitnoj lokaciji"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Prijenos sadržaja je završen"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Sadržaj je premješten na uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Nije moguće premjestiti sadržaj"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Pokušajte ponovo premjestiti sadržaj"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Uređaj je uklonjen"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Uređaj je izbačen"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Provjerava se..."</string>
@@ -1379,17 +1381,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje na uvijek aktivni VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan na uvijek aktivni VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Prekinuta je veza s uvijek uključenim VPN-om"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ne može se povezati na stalno uključen VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Promijenite postavke mreže ili VPN-a"</string>
<string name="upload_file" msgid="2897957172366730416">"Odabir fajla"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nije izabran nijedan fajl"</string>
<string name="reset" msgid="2448168080964209908">"Vraćanje na zadano"</string>
<string name="submit" msgid="1602335572089911941">"Potvrdi"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikacija za vožnju je pokrenuta"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Dodirnite za izlaz iz aplikacije za vožnju."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Uređaj dijeli vezu ili djeluje kao pristupna tačka"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite za postavke"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezivanje putem mobitela je onemogućeno"</string>
@@ -1718,7 +1717,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je vaš administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je vaš administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je vaš administrator"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Da bi se produljilo trajanje baterije, Štednja baterije smanjuje rad uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nŠtednja baterije isključuje se automatski dok se uređaj puni."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Za produženje vijeka trajanja baterije, Ušteda umanjuje performanse uređaja i ograničava ili isključuje vibriranje, usluge lokacije i pozadinske podatke. Moguće je da se aplikacije za e-poštu, razmjenu poruka i druge aplikacije koje se oslanjaju na sinhronizaciju neće ažurirati dok ih ne otvorite.\n\nUšteda baterije se automatski isključuje prilikom punjenja uređaja."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio prijenos podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1777,13 +1776,13 @@
<string name="muted_by" msgid="6147073845094180001">"Ton isključila aplikacija <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Postoji problem u vašem uređaju i može biti nestabilan dok ga ne vratite na fabričke postavke."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Postoji problem u vašem uređaju. Za više informacija obratite se proizvođaču."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD zahtjev promijenjen je u običan poziv"</string>
- <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD zahtjev promijenjen je u SS zahtjev"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD zahtjev je promijenjen u obični poziv"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD zahtjev je promijenjen u SS zahtjev"</string>
<string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Promijenjeno u novi USSD zahtjev"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD zahtjev promijenjen je u videopoziv"</string>
- <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS zahtjev promijenjen je u običan poziv"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS zahtjev promijenjen je u videopoziv"</string>
- <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS zahtjev promijenjen je u USSD zahtjev"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD zahtjev je promijenjen u video poziv"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS zahtjev je promijenjen u obični poziv"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS zahtjev je promijenjen u video poziv"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS zahtjev je promijenjen u USSD zahtjev"</string>
<string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promijenjeno u novi SS zahtjev"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za posao"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
@@ -1884,6 +1883,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM kartica nije dodijeljena za govor"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM kartica nije dozvoljena za govor"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije dozvoljen za govor"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dodijeljen"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dozvoljen"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iskočni prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Instalirana je starija verzija aplikacije ili aplikacija nije kompatibilna s ovom prečicom"</string>
@@ -1904,8 +1907,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da promijenite."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način rada Ne ometaj je promijenjen"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da provjerite šta je blokirano."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Postavke"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 132cffd..bd3b602 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sense servei de veu"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hi ha servei de veu ni trucades d\'emergència"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"L\'operador de telefonia mòbil ho ha desactivat temporalment"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No es pot accedir a la xarxa mòbil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova de canviar de xarxa preferida. Toca per canviar-la."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Les trucades d\'emergència no estan disponibles"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Bàner d\'itinerància activat"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bàner d\'itinerància desactivat"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"S\'està cercant el servei"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"No s\'ha pogut configurar la funció Trucades per Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi a Configuració. (Codi d\'error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Hi ha hagut un problema en registrar la funció Trucades per Wi-Fi amb el teu operador de telefonia mòbil: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Trucada de Wi-Fi de: %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"S\'estan processant massa sol·licituds. Torneu-ho a provar més tard."</string>
<string name="notification_title" msgid="8967710025036163822">"Error d\'inici de sessió per a <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronització"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"No es pot sincronitzar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"S\'han provat de suprimir massa <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"L\'emmagatzematge de la tauleta és ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"L\'emmagatzematge del rellotge està ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'emmagatzematge del televisor està ple. Suprimeix uns quants fitxers per alliberar espai."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Canvia al perfil professional"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactes"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedir als contactes"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi als contactes?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicació"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedir a la ubicació del dispositiu"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi a la ubicació del dispositiu?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedir al calendari"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi al calendari?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar i llegir missatges SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> enviï i llegeixi missatges SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Emmagatzematge"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accedir a fotos, contingut multimèdia i fitxers del dispositiu"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi a les fotos, al contingut multimèdia i als fitxers del dispositiu?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micròfon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar àudio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> gravi àudio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Càmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fer fotos i vídeos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> faci fotos i vídeos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telèfon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades telefòniques"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> faci trucades i les gestioni?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensors corporals"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedir a les dades del sensor sobre els signes vitals"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi a les dades del sensor de constants vitals?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contingut de la finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
@@ -492,6 +484,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permet que l\'aplicació es comuniqui amb les etiquetes, les targetes i els lectors de Comunicació de camp proper (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desactivació del bloqueig de pantalla"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permet que l\'aplicació desactivi el bloqueig del teclat i qualsevol element de seguretat de contrasenyes associat. Per exemple, el telèfon desactiva el bloqueig del teclat en rebre una trucada entrant i, a continuació, reactiva el bloqueig del teclat quan finalitza la trucada."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"utilitza maquinari biomètric"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Permet que l\'aplicació faci servir maquinari biomètric per a l\'autenticació"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Gestionar el maquinari d\'empremtes digitals"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permet que l\'aplicació invoqui mètodes per afegir i suprimir plantilles d\'empremtes digitals que es puguin fer servir."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Utilitzar el maquinari d\'empremtes digitals"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"No s\'ha reconegut"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Mètode d\'introducció de text"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Accions de text"</string>
<string name="email" msgid="4560673117055050403">"Correu electrònic"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Envia un correu electrònic a l\'adreça seleccionada"</string>
<string name="dial" msgid="1253998302767701559">"Truca"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Truca al número de telèfon seleccionat"</string>
<string name="map" msgid="6521159124535543457">"Localitza"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Obre l\'adreça seleccionada al mapa"</string>
<string name="browse" msgid="1245903488306147205">"Obre"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Obre l\'URL seleccionat"</string>
<string name="sms" msgid="4560537514610063430">"Missatge"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Envia un SMS al número de telèfon seleccionat"</string>
<string name="add_contact" msgid="7867066569670597203">"Afegeix"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Afegeix als contactes"</string>
<string name="view_calendar" msgid="979609872939597838">"Mostra"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Consulta l\'hora seleccionada al calendari"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programa"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programa un esdeveniment per a la data seleccionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Fes un seguiment"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Fes un seguiment del vol seleccionat"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"L\'espai d\'emmagatzematge s\'està esgotant"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"És possible que algunes funcions del sistema no funcionin"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hi ha prou espai d\'emmagatzematge per al sistema. Comprova que tinguis 250 MB d\'espai lliure i reinicia."</string>
@@ -1117,8 +1122,7 @@
<string name="new_app_action" msgid="6694851182870774403">"Obre <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> es tancarà sense desar els canvis"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria"</string>
- <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
- <skip />
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"S\'ha recopilat un procés \"heap dump\". Toca per compartir-lo."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vols compartir el \"heap dump\"?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"El procés <xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de <xliff:g id="SIZE">%2$s</xliff:g> de memòria del procés. Hi ha un procés \"heap dump\" disponible perquè el comparteixis amb el desenvolupador. Ves amb compte: aquest \"heap dump\" pot contenir les dades personals a les quals l\'aplicació tingui accés."</string>
<string name="sendText" msgid="5209874571959469142">"Tria una acció per al text"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connecta\'t a una xarxa Wi-Fi oberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connecta\'t a la xarxa Wi-Fi de l\'operador de telefonia mòbil"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"S\'està connectant a una xarxa Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"S\'ha connectat a la xarxa Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No s\'ha pogut connectar a una xarxa Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca per veure totes les xarxes"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactiva"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"S\'està preparant <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"S\'està comprovant si hi ha errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"S\'ha detectat <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per transferir fotos i fitxers multimèdia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"S\'ha malmès <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"La unitat <xliff:g id="NAME">%s</xliff:g> està malmesa. Toca per solucionar-ho."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"La unitat següent està malmesa: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per solucionar-ho."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no és compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositiu no admet la unitat <xliff:g id="NAME">%s</xliff:g>. Toca per configurar-la amb un format compatible."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Aquest dispositiu no admet la unitat següent: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per configurar-la en un format compatible."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva <xliff:g id="NAME">%s</xliff:g> abans d\'extraure\'l per evitar perdre dades"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"S\'ha extret <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"S\'ha extret <xliff:g id="NAME">%s</xliff:g>; insereix-ne de nou"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Encara s\'està expulsant <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No l\'extreguis"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsa"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explora"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"No es detecta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Torna a inserir el dispositiu"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"S\'està desplaçant l\'aplicació <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"S\'estan desplaçant dades"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"S\'ha completat el desplaçament"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"S\'han desplaçat dades a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"No s\'han pogut desplaçar dades"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"S\'han deixat dades a la ubicació original"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"S\'ha retirat"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"S\'ha expulsat"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"S\'està comprovant..."</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"T\'estàs connectant a la VPN sempre activada…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Estàs connectat a la VPN sempre activada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"S\'ha desconnectat de la VPN sempre activada"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"No s\'ha pogut establir la connexió a la VPN sempre activada"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Canvia la configuració de la xarxa o de la VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Tria un fitxer"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No s\'ha escollit cap fitxer"</string>
<string name="reset" msgid="2448168080964209908">"Restableix"</string>
<string name="submit" msgid="1602335572089911941">"Envia"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"S\'està executant l\'aplicació de conducció"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toca per sortir de l\'aplicació de conducció."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Compartició de xarxa o punt d\'accés Wi-Fi activat"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toca per configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"La compartició de xarxa està desactivada"</string>
@@ -1553,7 +1569,7 @@
<string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"Si la drecera està activada, prem els dos botons de volum durant 3 segons, per iniciar una funció d\'accessibilitat.\n\n Funció d\'accessibilitat actual:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n Pots canviar la funció a Configuració > Accessibilitat."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"Desactiva la drecera"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"Utilitza la drecera"</string>
- <string name="color_inversion_feature_name" msgid="4231186527799958644">"Inversió de color"</string>
+ <string name="color_inversion_feature_name" msgid="4231186527799958644">"Inversió dels colors"</string>
<string name="color_correction_feature_name" msgid="6779391426096954933">"Correcció del color"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La drecera d\'accessibilitat ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La drecera d\'accessibilitat ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instal·lat per l\'administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualitzat per l\'administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Suprimit per l\'administrador"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Per tal d\'augmentar la durada de la bateria, la funció Estalvi de bateria redueix el rendiment del dispositiu i en limita o desactiva la vibració, els serveis d\'ubicació i les dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nLa funció Estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activar Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activa"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciat per <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"S\'ha produït un error intern al dispositiu i és possible que funcioni de manera inestable fins que restableixis les dades de fàbrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"S\'ha produït un error intern al dispositiu. Contacta amb el fabricant del dispositiu per obtenir més informació."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"La sol·licitud USSD s\'ha canviat per una trucada estàndard"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"La sol·licitud USSD s\'ha canviat per una sol·licitud SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"S\'ha canviat a una nova sol·licitud USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"La sol·licitud USSD s\'ha canviat per una videotrucada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"La sol·licitud SS s\'ha canviat per una trucada estàndard"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"La sol·licitud SS s\'ha canviat per una videotrucada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"La sol·licitud SS s\'ha canviat per una sol·licitud USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"S\'ha canviat a una nova sol·licitud SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil professional"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Desplega"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Replega"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"La SIM no està proporcionada per a la veu"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"La SIM no és compatible per a la veu"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"El telèfon no és compatible per a la veu"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"S\'ha canviat a una versió anterior de l\'aplicació o la versió actual no és compatible amb aquesta drecera"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Aquest comportament és nou. Toca per canviar-lo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"S\'ha canviat el mode No molestis"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca per consultar què s\'ha bloquejat."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Configuració"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index d9e15b2..0fb65ea 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Neomezeno"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Služba není zřízena."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nastavení identifikace volajícího nesmíte měnit."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Datová služba není k dispozici"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Žádná tísňová volání"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Není k dispozici žádná mobilní datová služba"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Tísňová volání jsou nedostupná"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hlasová volání nejsou k dispozici"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasová ani tísňová volání nejsou k dispozici"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Mobilní síť ve vaší oblasti tuto službu dočasně nenabízí"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"K síti se nelze připojit"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v Nastavení > Síť a internet > Mobilní sítě > Preferovaný typ sítě."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Volání přes Wi-Fi je aktivní"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Tísňová volání vyžadují mobilní síť."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Není k dispozici žádná hlasová služba ani tísňová volání"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dočasně vypnuto operátorem"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dočasně vypnuto operátorem (SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g>)"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilní síť není dostupná"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Zkuste změnit preferovanou síť. Změníte ji klepnutím."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Tísňová volání jsou nedostupná"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Přes Wi‑Fi nelze uskutečňovat tísňová volání"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornění"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Přesměrování hovorů"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tísňového zpětného volání"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roamingu je zapnutý"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roamingu je vypnutý"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Vyhledávání služby"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volání přes Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Volání přes Wi-Fi se nepodařilo nastavit"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Chcete-li volat a odesílat SMS přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Zaregistrujte se u operátora (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Při registraci volání přes Wi-Fi u operátora <xliff:g id="CODE">%1$s</xliff:g> došlo k chybě"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Je zpracováváno příliš mnoho požadavků. Opakujte akci později."</string>
<string name="notification_title" msgid="8967710025036163822">"Chyba přihlášení k účtu <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronizace"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronizace"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Příliš mnoho smazaných položek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nelze synchronizovat"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pokusili jste se smazat příliš mnoho položek <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Úložiště tabletu je plné. Uvolněte místo smazáním některých souborů."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Úložiště hodinek je plné. Uvolněte místo smazáním některých souborů."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Úložiště televize je plné. Uvolněte místo smazáním některých souborů."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Sledování má na starosti administrátor pracovního profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Původce: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Pracovní profil byl smazán."</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Pracovní profil byl smazán, protože není k dispozici aplikace pro správu"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplikace pro správu pracovního profilu chybí nebo je poškozena. Váš pracovní profil a související data proto byla smazána. Požádejte o pomoc administrátora."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Váš pracovní profil v tomto zařízení již není k dispozici"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Příliš mnoho pokusů o zadání hesla"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Zařízení je spravováno"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Toto zařízení je spravováno vaší organizací, která může sledovat síťový provoz. Podrobnosti zobrazíte klepnutím."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Zařízení bude vymazáno"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Aplikaci pro správu nelze použít. Zařízení nyní bude vymazáno.\n\nV případě dotazů vám pomůže administrátor organizace."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Aplikaci pro správu nelze použít. Zařízení nyní bude vymazáno.\n\nV případě dotazů vám pomůže administrátor organizace."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Aplikace <xliff:g id="OWNER_APP">%s</xliff:g> tisk zakazuje."</string>
<string name="me" msgid="6545696007631404292">"Já"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Možnosti tabletu"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim Letadlo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim Letadlo je ZAPNUTÝ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim Letadlo je VYPNUTÝ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Spořič baterie"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Spořič baterie je VYPNUTÝ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Spořič baterie je ZAPNUTÝ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavení"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistence"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlas. asistence"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Přepnout na pracovní profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"přístup ke kontaktům"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup ke kontaktům"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup ke kontaktům?"</string>
<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="8903573681261610809">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendář"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"přístup ke kalendáři"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"odesílání a zobrazování zpráv SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> odesílat a zobrazovat SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> odesílat a zobrazovat SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Úložiště"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"přístup k fotkám, médiím a souborům v zařízení"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k fotkám, mediálnímu obsahu a souborům v zařízení"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k fotkám, mediálnímu obsahu a souborům v zařízení?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"nahrávání zvuku"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> nahrávat zvuk"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> nahrávat zvuk?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"pořizování fotografií a nahrávání videa"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> fotit a nahrávat video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> fotit a nahrávat video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uskutečňování a spravování telefonních hovorů"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uskutečňovat a spravovat telefonní hovory"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uskutečňovat a spravovat telefonní hovory?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tělesné senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"přístup k údajům snímačů vašich životních funkcí"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k údajům ze snímačů vašich životních funkcí"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k údajům ze snímačů vašich životních funkcí?"</string>
<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>
@@ -311,7 +314,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Provádění gest"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Může provádět gesta klepnutí, přejetí, stažení prstů a další."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesta otiskem prstu"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Dokáže rozpoznat gesta zadaná na snímači otisků prstů."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Dokáže rozpoznat gesta zadaná na snímači otisků prstů."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zakázání či změny stavového řádku"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"vydávání se za stavový řádek"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Umožňuje aplikaci uložit některé své části trvale do paměti. Může to omezit paměť dostupnou pro ostatní aplikace a zpomalit tak tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Umožňuje aplikaci zapsat své jednotlivé části natrvalo do paměti. To může omezit paměť dostupnou pro ostatní aplikace a zpomalit tak televizi."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Umožňuje aplikaci uložit některé své části trvale do paměti. Může to omezit paměť dostupnou pro ostatní aplikace a zpomalit tak telefon."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"spouštění služeb na popředí"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Povolte aplikaci využívání služeb na popředí."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"výpočet místa pro ukládání aplikací"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Umožňuje aplikaci načtení svého kódu, dat a velikostí mezipaměti."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"změna nastavení systému"</string>
@@ -484,6 +489,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Umožňuje aplikaci volat metody k přidání a smazání šablon otisků prstů, které budou použity."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"použití hardwaru na čtení otisků prstů"</string>
@@ -496,6 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nerozpoznáno"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisk byl ověřen"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Není k dispozici hardware ke snímání otisků prstů."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisk prstu nelze uložit. Odstraňte existující otisk prstu."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string>
@@ -808,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odemknutí gestem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odemknutí obličejem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odemknutí kódem PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Odemknutí SIM karty kódem PIN."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Odemknutí SIM karty kódem PUK."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odemknutí heslem."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast pro zadání bezpečnostního gesta."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast pro přejetí prstem."</string>
@@ -869,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text byl zkopírován do schránky."</string>
<string name="more_item_label" msgid="4650918923083320495">"Více"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"mezerník"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"smazat"</string>
@@ -1034,14 +1050,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metoda zadávání dat"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operace s textem"</string>
<string name="email" msgid="4560673117055050403">"Poslat e-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Napsat na vybranou e-mailovou adresu"</string>
<string name="dial" msgid="1253998302767701559">"Zavolat"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Zavolat na vybrané telefonní číslo"</string>
<string name="map" msgid="6521159124535543457">"Najít"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Vyhledat vybranou adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otevřít"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otevřít vybranou adresu URL"</string>
<string name="sms" msgid="4560537514610063430">"Zpráva"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Napsat SMS na vybrané telefonní číslo"</string>
<string name="add_contact" msgid="7867066569670597203">"Přidat"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Přidat do kontaktů"</string>
<string name="view_calendar" msgid="979609872939597838">"Zobrazit"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Zobrazit vybraný čas v kalendáři"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Naplánovat"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Naplánovat událost na vybraný čas"</string>
<string name="view_flight" msgid="7691640491425680214">"Sledovat"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Sledovat vybraný let"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"V úložišti je málo místa"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Některé systémové funkce nemusí fungovat"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Pro systém není dostatek místa v úložišti. Uvolněte alespoň 250 MB místa a restartujte zařízení."</string>
@@ -1114,31 +1139,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Zkontrolovat aktualizace"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) porušila své vlastní vynucené zásady StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> porušil své vlastní vynucené zásady StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android se upgraduje..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Spouštění systému Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon se aktualizuje…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet se aktualizuje…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Zařízení se aktualizuje…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon se spouští…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet se spouští…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Zařízení se spouští…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Probíhá optimalizace úložiště."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončování aktualizace Androidu…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Před dokončením upgradu nemusí některé aplikace fungovat správně"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Dokončování aktualizace systému…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> se upgraduje…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimalizování aplikace <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Příprava aplikace <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Spouštění aplikací."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončování inicializace."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Běží aplikace <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Klepnutím se vrátíte do hry"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Vyberte hru"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Aby byl zajištěn lepší výkon, v jednu chvíli může být otevřena jen jedna taková hra."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Zpět do aplikace <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Byl shromážděn výpis haldy, klepnutím jej můžete sdílet"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Vyberte akci pro text"</string>
@@ -1177,12 +1199,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Připojení k otevřené síti Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Připojte se k síti Wi-Fi operátora"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Připojování k otevřené síti Wi-Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Připojování k síti Wi-Fi..."</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Připojeno k síti Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Připojení k síti Wi-Fi se nezdařilo"</string>
<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="1100098935861622985">"Všechny sítě"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všechny sítě"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se zapne automaticky"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Když budete v dosahu kvalitní uložené sítě"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Znovu nezapínat"</string>
@@ -1248,6 +1270,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restartovat"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivovat mobilní službu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Chcete-li aktivovat novou SIM kartu, stáhněte si aplikaci operátora"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Chcete-li aktivovat novou SIM kartu, stáhněte si aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Stáhnout aplikaci"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Byla vložena nová SIM karta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Klepnutím zahájíte nastavení"</string>
@@ -1266,13 +1289,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Byl zapnut režim PTP přes USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Byl zapnut tethering přes USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Byl zapnut režim MIDI přes USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Byl zapnut režim příslušenství USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Je připojeno příslušenství USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Klepnutím zobrazíte další možnosti."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Nabíjení připojeného zařízení. Klepnutím zobrazíte další možnosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Bylo zjištěno analogové zvukové příslušenství"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Připojené zařízení není s tímto telefonem kompatibilní. Klepnutím zobrazíte další informace."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Klepnutím zakážete ladění USB."</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í USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Vytváření zprávy o chybě…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Sdílet zprávu o chybě?"</string>
@@ -1291,34 +1314,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikace <xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNOUT"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Probíhá příprava úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrola chyb"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zjištěno nové úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Vypnout"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Kontroluje se <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Kontrola aktuálního obsahu"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nové médium <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Klepnutím médium nastavíte"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"K přenosu fotek a médií"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno. Klepnutím zahájíte opravu."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problém s médiem <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Problém odstraníte klepnutím"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno. Vyberte ho a zahajte opravu."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Úložiště <xliff:g id="NAME">%s</xliff:g> není podporováno"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno. Klepnutím zahájíte nastavení v podporovaném formátu."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno. Vyberte ho a zahajte nastavení v podporovaném formátu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úložiště <xliff:g id="NAME">%s</xliff:g> neočekávaně odpojeno"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Před odebráním úložiště <xliff:g id="NAME">%s</xliff:g> jej nejprve odpojte. Zabráníte tak ztrátě dat."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložiště <xliff:g id="NAME">%s</xliff:g> bylo odpojeno."</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Úložiště <xliff:g id="NAME">%s</xliff:g> bylo odpojeno. Vložte nové úložiště."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Probíhá odpojování úložiště <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neodebírat"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Před odebráním médium nejprve odpojte, zabráníte tak ztrátě obsahu"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Médium <xliff:g id="NAME">%s</xliff:g> bylo odebráno"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Některé funkce nemusí být k dispozici. Vložte nové úložiště."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Odpojování média <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Neodebírat"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastavit"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojit"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Otevřít"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> chybí"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Znovu toto zařízení vložte"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Znovu vložte zařízení"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Přesouvání aplikace <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Probíhá přesun dat"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Přesunutí bylo dokončeno"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data byla přesunuta do úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Data nelze přesunout"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data zůstala v původním umístění"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Přenos obsahu je dokončen"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Obsah byl přesunut na médium <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Obsah se nepodařilo přesunout"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Zkuste obsah přesunout znovu"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Odebráno"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Odpojeno"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Probíhá kontrola…"</string>
@@ -1377,14 +1401,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Připojování k trvalé síti VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Je připojena trvalá síť VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Odpojeno od trvalé sítě VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba trvalé sítě VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"K trvalé VPN se nelze připojit"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Změňte síť nebo nastavení VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Zvolit soubor"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Není vybrán žádný soubor"</string>
<string name="reset" msgid="2448168080964209908">"Resetovat"</string>
<string name="submit" msgid="1602335572089911941">"Odeslat"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Aktivován režim V autě"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Klepnutím ukončíte režim V autě."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Jízdní aplikace je spuštěna"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Jízdní aplikaci zavřete klepnutím."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Sdílené připojení nebo hotspot je aktivní."</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím zahájíte nastavení."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je zakázán"</string>
@@ -1464,22 +1488,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Jednotka USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Úložiště USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Upravit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Upozornění na používání dat"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Klepnutím zobrazíte nastavení."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dosáhli jste limitu dat 2G–3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dosáhli jste limitu dat 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Upozornění na data"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Využili jste <xliff:g id="APP">%s</xliff:g> dat"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Byl dosažen limit mobilních dat"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dosáhli jste limitu dat Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data pro zbytek cyklu pozastavena"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Překročili jste limit dat 2G–3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Překročili jste limit dat 4G."</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Překročili jste limit mobilních dat."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Datový limit Wi-Fi byl překročen"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> nad stanoveným limitem."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data jsou po zbytek cyklu pozastavena"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Byl překročen limit dat"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Byl překročen limit Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Překročili jste limit o <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Data na pozadí jsou omezena"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Klepnutím odstraníte omezení."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Velké využití dat"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Za posledních několik dní máte větší využití dat než obvykle. Klepnutím zobrazíte využití a nastavení."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Vysoké využití mobilních dat"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vaše aplikace využily více dat, než je obvyklé"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikace <xliff:g id="APP">%s</xliff:g> využila více dat, než je obvyklé"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certifikát zabezpečení"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Tento certifikát je platný."</string>
<string name="issued_to" msgid="454239480274921032">"Vydáno pro:"</string>
@@ -1719,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainstalováno administrátorem"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizováno administrátorem"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Smazáno administrátorem"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Spořič baterie za účelem prodloužení výdrže baterie snižuje výkon zařízení a omezuje vibrace, služby určování polohy a většinu dat na pozadí. E-mail, aplikace pro zasílání zpráv a další aplikace, které používají synchronizaci, se nemusejí aktualizovat, dokud je neotevřete.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Spořič baterie za účelem prodloužení výdrže baterie snižuje výkon zařízení a omezuje nebo vypíná vibrace, služby určování polohy a data na pozadí. E-mail, aplikace pro zasílání zpráv a další aplikace, které používají synchronizaci, se nemusejí aktualizovat, dokud je neotevřete.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Spořič dat z důvodu snížení využití dat některým aplikacím brání v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnout Spořič dat?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnout"</string>
@@ -1735,11 +1756,11 @@
<item quantity="other">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 min (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="few">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d hodin (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Jednu hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 hodina (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="few">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,11 +1780,11 @@
<item quantity="other">%d min</item>
<item quantity="one">1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="few">%d hodiny</item>
<item quantity="many">%d hodiny</item>
<item quantity="other">%d hodin</item>
- <item quantity="one">Jednu hodinu</item>
+ <item quantity="one">1 hodina</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="few">%d h</item>
@@ -1786,14 +1807,14 @@
<string name="muted_by" msgid="6147073845094180001">"Ignorováno stranou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"V zařízení došlo k internímu problému. Dokud neprovedete obnovení továrních dat, může být nestabilní."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"V zařízení došlo k internímu problému. Další informace vám sdělí výrobce."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Požadavek USSD byl změněn na požadavek DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Požadavek USSD byl změněn na požadavek SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Požadavek USSD byl změněn na nový požadavek USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Požadavek USSD byl změněn na požadavek Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Požadavek SS byl změněn na požadavek DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Požadavek SS byl změněn na požadavek Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Požadavek SS byl změněn na požadavek USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Požadavek SS byl změněn na nový požadavek SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Požadavek USSD byl změněn na běžný hovor"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Požadavek USSD byl změněn na požadavek SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Změněno na nový požadavek USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Požadavek USSD byl změněn na videohovor"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Požadavek SS byl změněn na běžný hovor"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Požadavek SS byl změněn na videohovor"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Požadavek SS byl změněn na požadavek USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Změněno na nový požadavek SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Pracovní profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozbalit"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sbalit"</string>
@@ -1895,6 +1916,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM karta není poskytována pro hlasovou komunikaci"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM karta není povolena pro hlasovou komunikaci"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon není povolen pro hlasovou komunikaci"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> není povolena"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> není poskytována"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> není povolena"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> není povolena"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Vyskakovací okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"a ještě <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Verze aplikace byla snížena, případně aplikace není s touto zkratkou kompatibilní"</string>
@@ -1907,7 +1932,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Byla zjištěna škodlivá aplikace"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikace <xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Upravit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Volání a oznámení budou vibrovat"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Volání a oznámení budou ztlumena"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Změny nastavení systému"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nerušit"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Nerušit skrývá oznámení, abyste se mohli soustředit"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Toto je nové chování. Změníte ho klepnutím."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavení režimu Nerušit se změnilo"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Klepnutím zkontrolujete nastavení chování v souvislosti s vyrušeními"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Klepnutím zkontrolujete, co je blokováno."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Systém"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Nastavení"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 47cf038..03ced00 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Standarder for opkalds-id til ikke begrænset. Næste opkald: Ikke begrænset"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Tjenesten leveres ikke!"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Du kan ikke ændre indstillingen for opkalds-id\'et."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ingen datatjeneste"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Ingen nødopkald"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ingen mobildatatjeneste"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Det er ikke muligt at foretage nødopkald"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ingen taletjeneste"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale- og nødtjenester"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbydes i øjeblikket ikke af mobilnetværket på din placering"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Der er ingen forbindelse til netværket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i Indstillinger > Netværk og internet > Mobilnetværk > Foretrukken netværkstype."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi-opkald er aktiveret"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Nødopkald kræver adgang til et mobilnetværk."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ingen taletjeneste eller nødopkald"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Midlertidigt deaktiveret af dit mobilselskab"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Der er ingen forbindelse til mobilnetværket"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv at skifte dit foretrukne netværk. Tryk for skifte."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Det er ikke muligt at foretage nødopkald"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Det er ikke muligt at foretage nødopkald via Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roamingbanner til"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roamingbanner fra"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Søger efter tjeneste"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Opkald via Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi-Fi-opkald kunne ikke konfigureres"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Hvis du vil foretage opkald og sende beskeder via Wi-Fi, skal du først anmode dit mobilselskab om at konfigurere denne tjeneste. Derefter skal du aktivere Wi-Fi-opkald igen fra Indstillinger. (Fejlkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrer dig hos dit mobilselskab (fejlkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Der opstod et problem under registrering af Wi-Fi-opkald hos dit mobilselskab: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Der behandles for mange anmodninger. Prøv igen senere."</string>
<string name="notification_title" msgid="8967710025036163822">"Loginfejl for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkroniser"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkroniser"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"For mange <xliff:g id="CONTENT_TYPE">%s</xliff:g> sletninger"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Det er ikke muligt at synkronisere"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Forsøgte at slette for mange <xliff:g id="CONTENT_TYPE">%s</xliff:g>-elementer."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Din tablets lager er fuldt. Slet nogle filer for at frigøre plads."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Urets lager er fuldt. Slet nogle filer for at frigøre plads."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Fjernsynets hukommelse er fuld. Slet nogle filer for at frigøre plads."</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Af administratoren af din arbejdsprofil"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbejdsprofilen blev slettet"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Arbejdsprofilen blev slettet, fordi der mangler en administrationsapp"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Administrationsappen til arbejdsprofilen mangler eller er beskadiget. Derfor er din arbejdsprofil og dine relaterede data blevet slettet. Kontakt din administrator for at få hjælp."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Din arbejdsprofil er ikke længere tilgængelig på denne enhed"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"For mange mislykkede adgangskodeforsøg"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Dette er en administreret enhed"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Din organisation administrerer denne enhed og kan overvåge netværkstrafik. Tryk for at se oplysninger."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Enheden slettes"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administrationsappen kan ikke bruges. Enheden vil nu blive ryddet. \n\nKontakt din organisations administrator, hvis du har nogen spørgsmål."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administrationsappen kan ikke bruges. Enheden vil nu blive ryddet. \n\nKontakt din organisations administrator, hvis du har spørgsmål."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Udskrivning er deaktiveret af <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Mig"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Valgmuligheder for tabletcomputeren"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flytilstand"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparefunktion"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparefunktion er slået FRA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparefunktion er slået TIL"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Taleassistent"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Skift til arbejdsprofil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersoner"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"have adgang til dine kontaktpersoner"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til dine kontaktpersoner"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til dine kontaktpersoner?"</string>
<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="8903573681261610809">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"have adgang til din kalender"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sende og se sms-beskeder"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at sende og se sms-beskeder"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at sende og se sms-beskeder?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagerplads"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"få adgang til billeder, medier og filer på din enhed"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til billeder, medier og filer på din enhed"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til billeder, medier og filer på din enhed?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"optage lyd"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at optage lyd"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at optage lyd?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tage billeder og optage video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at tage billeder og optage video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at tage billeder og optage video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foretage og administrere telefonopkald"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at foretage og administere telefonopkald"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilladelse til at foretage og administrere telefonopkald?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kropssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få adgang til sensordata om dine livstegn"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Giv <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til sensordata om dine livstegn"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til sensordata om dine livstegn?"</string>
<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>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Udfør bevægelser"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan trykke, stryge, knibe sammen og udføre andre bevægelser."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingeraftryksbevægelser"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Kan registrere bevægelser, der foretages på enhedernes fingeraftrykslæser."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Kan registrere bevægelser, der foretages på enhedens fingeraftrykslæser."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktivere eller redigere statuslinje"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Tillader, at appen kan deaktivere statusbjælken eller tilføje og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"vær statusbjælken"</string>
@@ -337,7 +341,7 @@
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"modtage tekstbeskeder (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tillader, at appen kan modtage og behandle WAP-beskeder. Denne tilladelse omfatter muligheden for at overvåge eller slette de beskeder, der sendes til dig, uden at vise dem til dig."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"hente kørende apps"</string>
- <string name="permdesc_getTasks" msgid="7454215995847658102">"Tillader, at appen kan hente oplysninger om nuværende og seneste opgaver. Med denne tilladelse kan appen finde oplysninger om, hvilke applikationer der bruges på enheden."</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Tillader, at appen kan hente oplysninger om nuværende og seneste opgaver. Med denne tilladelse kan appen finde oplysninger om, hvilke apps der bruges på enheden."</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"administrer profil- og enhedsejere"</string>
<string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"Tillader, at apps konfigurerer profilejerne og enhedens ejer."</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"omorganisere kørende apps"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør tabletten langsommere."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Giver appen lov til at gøre dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps og derved gøre fjernsynet langsommere."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør telefonen langsommere."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"kør tjeneste i forgrunden"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Tillad, at appen anvender tjenester i forgrunden."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"måle appens lagerplads"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tillader, at en app kan hente sin kode, data og cachestørrelser"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ændre systemindstillinger"</string>
@@ -441,13 +447,13 @@
<string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"Giver appen lov til at ændre tidszonen på dit tv."</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Tillader, at appen kan ændre tidszonen på din telefon."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"finde konti på enheden"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tillader, at appen kan hente listen over konti, der er kendt af tabletten. Dette kan omfatte alle konti, der er oprettet af de applikationer, som du har installeret."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tillader, at appen kan hente listen over konti, der er kendt af tabletten. Dette kan omfatte alle konti, der er oprettet af de apps, som du har installeret."</string>
<string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"Giver appen lov til at hente listen over konti, der er kendt af tv\'et. Dette kan omfatte konti, der er oprettet af programmer, som du har installeret."</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tillader, at appen kan hente listen over konti, der er kendt af telefonen. Dette kan omfatte alle konti, der er oprettet af de applikationer, som du har installeret."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tillader, at appen kan hente listen over konti, der er kendt af telefonen. Dette kan omfatte alle konti, der er oprettet af de apps, som du har installeret."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"se netværksforbindelser"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Tillader, at appen kan læse oplysninger om netværksforbindelser, f.eks. eksisterende og forbundne netværk."</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"få fuld netværksadgang"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Tillader, at appen kan oprette netværkssockets og bruge tilpassede netværksprotokoller. Browseren og andre applikationer indeholder midler til at sende data til internettet, så med denne tilladelse er der ingen forpligtelse til at sende data til internettet."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Tillader, at appen kan oprette netværkssockets og bruge tilpassede netværksprotokoller. Browseren og andre apps indeholder midler til at sende data til internettet, så med denne tilladelse er der ingen forpligtelse til at sende data til internettet."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"skifte netværksforbindelse"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Tillader, at appen kan ændre netværksforbindelsens tilstand."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"skifte forbindelse til netdeling"</string>
@@ -478,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Tillader, at appen kan køre metoder til at tilføje og slette fingeraftryksskabeloner"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"bruge fingeraftrykhardware"</string>
@@ -490,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke genkendt"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardwaren til fingeraftryk er ikke tilgængelig."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeraftrykket kan ikke gemmes. Fjern et eksisterende fingeraftryk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string>
@@ -802,6 +812,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås op med mønster."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås op med ansigt."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås op med pinkode."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Lås op ved hjælp af pinkoden til SIM-kortet."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Lås op ved hjælp af PUK-koden til SIM-kortet."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås op med adgangskode."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Strygeområde."</string>
@@ -844,11 +856,11 @@
<string name="autofill_area" msgid="3547409050889952423">"Område"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"Emirat"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"læse dine webbogmærker og -historik"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tillader, at appen kan læse historikken om alle webadresser, som browseren har besøgt, og alle browserens bogmærker. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre applikationer med websøgningsfunktioner."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tillader, at appen kan læse historikken om alle webadresser, som browseren har besøgt, og alle browserens bogmærker. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre apps med websøgningsfunktioner."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"skrive webbogmærker og -historik"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tillader, at appen kan ændre browserens historik eller de bogmærker, der er gemt på din tablet. Dette kan give appen tilladelse til at slette eller ændre browserdata. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre applikationer med websøgningsfunktioner."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tillader, at appen kan ændre browserens historik eller de bogmærker, der er gemt på din tablet. Dette kan give appen tilladelse til at slette eller ændre browserdata. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre apps med websøgningsfunktioner."</string>
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"Giver appen lov til at ændre browserens historik eller bogmærker, der er gemt på dit tv. Dette kan give appen tilladelse til at slette eller ændre browserdata. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre programmer med mulighed for webbrowsing."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tillader, at appen kan ændre browserens historik eller de bogmærker, der er gemt på din telefon. Dette kan give appen tilladelse til at slette eller ændre browserdata. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre applikationer med websøgningsfunktioner."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tillader, at appen kan ændre browserens historik eller de bogmærker, der er gemt på din telefon. Dette kan give appen tilladelse til at slette eller ændre browserdata. Bemærk! Denne tilladelse håndhæves muligvis ikke af tredjepartsbrowsere eller andre apps med websøgningsfunktioner."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"indstille en alarm"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"Tillader, at appen kan indstille en alarm i en installeret alarmapp. Nogle alarmapps har muligvis ikke denne funktion."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"tilføje telefonsvarer"</string>
@@ -863,6 +875,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teksten er kopieret til udklipsholderen."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mere"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"plads"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"indtast"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"slet"</string>
@@ -994,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Send en mail til den valgte adresse"</string>
<string name="dial" msgid="1253998302767701559">"Ring op"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ring til det valgte telefonnummer"</string>
<string name="map" msgid="6521159124535543457">"Find"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Find den valgte adresse"</string>
<string name="browse" msgid="1245903488306147205">"Åbn"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Åbn den valgte webadresse"</string>
<string name="sms" msgid="4560537514610063430">"Besked"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Send en besked til det valgte telefonnummer"</string>
<string name="add_contact" msgid="7867066569670597203">"Tilføj"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Føj til kontaktpersoner"</string>
<string name="view_calendar" msgid="979609872939597838">"Se"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Se det valgte tidspunkt i kalenderen"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Planlæg"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planlæg begivenhed på det valgte tidspunkt"</string>
<string name="view_flight" msgid="7691640491425680214">"Spor"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Følg det valgte fly"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Der er snart ikke mere lagerplads"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Nogle systemfunktioner virker måske ikke"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Der er ikke nok ledig lagerplads til systemet. Sørg for, at du har 250 MB ledig plads, og genstart."</string>
@@ -1074,31 +1101,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Søg efter opdatering"</string>
<string name="smv_application" msgid="3307209192155442829">"Appen <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) har overtrådt sin egen StrictMode-politik."</string>
<string name="smv_process" msgid="5120397012047462446">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> har overtrådt sin egen StrictMode-politik."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android opgraderes..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android starter..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefonen opdaterer…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Denne tablet opdaterer…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Enheden opdaterer…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefonen starter…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Denne tablet starter…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Enheden starter…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lageret optimeres."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Afslutter Android-opdateringen…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Nogle apps fungerer muligvis ikke korrekt, før opgraderingen er gennemført"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Afslutter systemopdatering…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> opgraderer…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerer app <xliff:g id="NUMBER_0">%1$d</xliff:g> ud af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Åbner dine apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Gennemfører start."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er i gang"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tryk for at vende tilbage til spillet"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Vælg et spil"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Du kan forbedre ydeevnen ved kun at åbne ét af disse spil ad gangen."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Gå tilbage til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"En heap dump er blevet indsamlet. Tryk for at dele"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Vælg en handling for teksten"</string>
@@ -1133,12 +1157,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Opret forbindelse til et åbent Wi-Fi-netværk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Opret forbindelse til dit mobilselskabs Wi‑Fi-netværk"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Opretter forbindelse til et åbent Wi‑Fi-netværk"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Opretter forbindelse til Wi-Fi-netværket"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Forbundet til Wi-Fi-netværket"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Der kan ikke oprettes forbindelse til Wi-Fi-netværket"</string>
<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="1100098935861622985">"Alle netværk"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netværk"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi aktiveres automatisk"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Når du er i nærheden af et gemt netværk af høj kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Aktivér ikke igen"</string>
@@ -1204,6 +1228,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Genstart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivér mobilselskab"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download mobilselskabsappen for at aktivere dit nye SIM-kort"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download appen <xliff:g id="APP_NAME">%1$s</xliff:g> for at aktivere dit nye SIM-kort"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nyt SIM-kort er indsat"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tryk for at konfigurere"</string>
@@ -1222,13 +1247,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB er slået til"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Netdeling via USB er slået til"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB er slået til"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Tilstanden USB-tilbehør er slået til"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-tilbehør er tilsluttet"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tryk for at se flere muligheder."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Den tilsluttede enhed oplades. Tryk for at få flere valgmuligheder."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Der blev registreret et analogt lydtilbehør"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den tilsluttede enhed er ikke kompatibel med denne telefon. Tryk for at få flere oplysninger."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tryk for at deaktivere fejlretning via USB."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Opretter fejlrapport…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vil du dele fejlrapporten?"</string>
@@ -1247,34 +1272,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ FRA"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrollerer for fejl"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Der blev registreret et nyt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktiver"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til overførsel af billeder og medier"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> er beskadiget"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er beskadiget. Tryk for at rette problemet."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er beskadiget. Vælg for at rette."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> understøttes ikke"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Tryk for at konfigurere det til et understøttet format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Vælg for at konfigurere mediet i et understøttet format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> blev fjernet uventet"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"For at undgå datatab skal <xliff:g id="NAME">%s</xliff:g> demonteres inden fjernelse"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> blev fjernet"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> er fjernet. Indsæt et nyt"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Skubber stadig <xliff:g id="NAME">%s</xliff:g> ud…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Fjern ikke"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Skub ud"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Udforsk"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> er ikke til stede"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sæt denne enhed i igen"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Flytter data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Flytningen er gennemført"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data flyttet til <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Dine data kunne ikke flyttes"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dine data er stadig på den oprindelige placering"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Fjernet"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Skubbet ud"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerer…"</string>
@@ -1333,14 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Opretter forbindelse til konstant VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Konstant VPN er forbundet"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Forbindelsen til konstant VPN blev afbrudt"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fejl i konstant VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Der kunne ikke oprettes forbindelse til konstant VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Skift netværks- eller VPN-indstillinger"</string>
<string name="upload_file" msgid="2897957172366730416">"Vælg fil"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string>
<string name="reset" msgid="2448168080964209908">"Nulstil"</string>
<string name="submit" msgid="1602335572089911941">"Send"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Biltilstand er aktiveret"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tryk for at afslutte biltilstand."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Bilkørselsappen er aktiv"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tryk for at lukke bilkørselsappen."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Netdeling eller hotspot er aktivt"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tryk for at konfigurere"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Netdeling er deaktiveret"</string>
@@ -1418,22 +1459,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-drev fra <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-lager"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Rediger"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Underretning om dataforbrug"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tryk for at se forbrug og indstillinger."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Grænsen for 2G-3G-data er nået"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Grænsen for 4G-data er nået"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Advarsel om dataforbrug"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Du har brugt <xliff:g id="APP">%s</xliff:g> data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Grænsen for mobildata er nået"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Grænsen for Wi-Fi-data er nået"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data er afbrudt i resten af perioden"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G-data overskredet"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Grænsen for 4G-data er overskredet"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobildatagrænsen er overskredet"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Grænsen for Wi-Fi-data er overskredet"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over den angivne grænse."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Dit forbrug af mobildata er sat på pause i resten af din cyklus"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Datagrænsen er overskredet"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi-datagrænsen er overskredet"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Du har overskredet din angivne grænse med <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Baggrundsdata er begrænsede"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tryk for at fjerne begrænsning."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Stort dataforbrug"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Dit dataforbrug i løbet af de seneste 7 dage er større end normalt. Tryk for at se forbrug og indstillinger."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Højt forbrug af mobildata"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Dine apps har haft et højere forbrug af mobildata end normalt"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> har haft et højere forbrug af mobildata end normalt"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sikkerhedscertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Dette certifikat er gyldigt."</string>
<string name="issued_to" msgid="454239480274921032">"Udstedt til:"</string>
@@ -1669,7 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installeret af din administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opdateret af din administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet af din administrator"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Batterisparefunktionen hjælper med at forlænge batteritiden ved at reducere enhedens ydeevne og begrænse vibration, placeringstjenester og det meste baggrundsdata. Mail, beskedfunktioner og andre apps, der benytter synkronisering, opdateres muligvis ikke, medmindre du åbner dem.\n\nBatterisparefunktionen deaktiveres automatisk, når enheden oplader."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Batterisparefunktionen forlænger batteritiden ved at reducere enhedens ydeevne og begrænse eller deaktivere vibration, placeringstjenester og baggrundsdata. Mail, beskedfunktioner og andre apps, der kræver synkronisering, opdateres muligvis ikke, medmindre du åbner dem.\n\nBatterisparefunktionen deaktiveres automatisk, når enheden oplader."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå Datasparefunktion til?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå til"</string>
@@ -1681,7 +1719,7 @@
<item quantity="one">I %1$d min. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">I %1$d min. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">I %1$d time (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">I %1$d timer (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
@@ -1697,7 +1735,7 @@
<item quantity="one">I %d min.</item>
<item quantity="other">I %d min.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">I %d time</item>
<item quantity="other">I %d timer</item>
</plurals>
@@ -1720,14 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Lyden blev afbrudt af <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Der er et internt problem med enheden, og den vil muligvis være ustabil, indtil du gendanner fabriksdataene."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Der er et internt problem med enheden. Kontakt producenten for at få yderligere oplysninger."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-anmodningen er ændret til en DIAL-anmodning."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-anmodningen er ændret til en SS-anmodning."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-anmodningen er ændret til en ny USSD-anmodning."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-anmodningen er ændret til en Video DIAL-anmodning."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-anmodningen er ændret til en DIAL-anmodning."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-anmodningen er ændret til en Vidieo DIAL-anmodning."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-anmodningen er ændret til en USSD-anmodning."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-anmodningen er ændret til en ny SS-anmodning."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-anmodningen blev ændret til et almindeligt opkald"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-anmodningen blev ændret til en SS-anmodning"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Ændret til en USSD-anmodning"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-anmodningen blev ændret til et videoopkald"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-anmodningen blev ændret til et almindeligt opkald"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-anmodningen blev ændret til et videoopkald"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-anmodningen blev ændret til en USSD-anmodning"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Ændret til en SS-anmodning"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbejdsprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Udvid"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skjul"</string>
@@ -1825,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kort er ikke aktiveret for tale"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort er ikke tilladt for tale"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon er ikke tilladt for tale"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop op-vindue"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> mere"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Appversionen er nedgraderet, eller også er den ikke kompatibel med denne genvej"</string>
@@ -1837,7 +1883,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Der er registreret en skadelig app"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> anmoder om tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Rediger"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Telefonen vil vibrere ved opkald og underretninger"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Der afspilles ikke lyd ved opkald og underretninger"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemændringer"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Forstyr ikke"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Forstyr ikke skjuler underretninger, så du bedre kan koncentrere dig"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dette er en ny adfærd. Tryk for at ændre den."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Tilstanden Forstyr ikke blev ændret"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryk for at tjekke indstillingerne for adfærd ved underretninger"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tryk for at se, hvad der er blokeret."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Indstillinger"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 0a98f91..97298b1 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Keine Anrufe"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Keine Anrufe oder Notrufe"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Vorübergehend von deinem Mobilfunkanbieter deaktiviert"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilfunknetz nicht erreichbar"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Notrufe nicht möglich"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-Banner ein"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-Banner aus"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Suche nach Dienst"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"WLAN-Telefonie konnte nicht eingerichtet werden"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen. (Fehlercode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Probleme beim Registrieren der WLAN-Telefonie bei deinem Mobilfunkanbieter: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Anrufe über WLAN"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Es werden zurzeit zu viele Anfragen verarbeitet. Versuche es später erneut."</string>
<string name="notification_title" msgid="8967710025036163822">"Fehler bei Anmeldung für <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronisierung"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synchronisierung nicht möglich"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Es wurde versucht, zu viele <xliff:g id="CONTENT_TYPE">%s</xliff:g> zu löschen."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Der Tablet-Speicher ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Der Speicher deiner Uhr ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Der TV-Speicher ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Zum Arbeitsprofil wechseln"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf deine Kontakte zugreifen"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> Zugriff auf deine Kontakte erlauben?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zugreifen"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, den Gerätestandort abzurufen?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf deinen Kalender zugreifen"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> Zugriff auf deinen Kalender erlauben?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS senden und abrufen"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, SMS zu senden und aufzurufen?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Speicher"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"auf Fotos, Medien und Dateien auf deinem Gerät zugreifen"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, auf Fotos, Medien und Dateien auf deinem Gerät zuzugreifen?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"Audio aufnehmen"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, Audioaufnahmen zu machen?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"Bilder und Videos aufnehmen"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, Bilder und Videos aufzunehmen?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe tätigen und verwalten"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, Anrufe zu tätigen und zu verwalten?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Körpersensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zugreifen"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> erlauben, auf Sensordaten zu deinen Vitalfunktionen zuzugreifen?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen & Entdecken\" aktivieren"</string>
@@ -492,6 +484,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Ermöglicht der App die Kommunikation mit Tags für die Nahfeldkommunikation, Karten und Readern"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"Displaysperre deaktivieren"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ermöglicht der App, die Tastensperre sowie den damit verbundenen Passwortschutz zu deaktivieren. Das Telefon deaktiviert die Tastensperre beispielsweise, wenn ein Anruf eingeht, und aktiviert sie wieder, nachdem das Gespräch beendet wurde."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"Biometrische Hardware verwenden"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Erlaubt der App, biometrische Hardware zur Authentifizierung zu verwenden"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Fingerabdruckhardware verwalten"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Erlaubt der App, Methoden zum Hinzufügen und Löschen zu verwendender Fingerabdruckvorlagen aufzurufen"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Fingerabdruckhardware verwenden"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nicht erkannt"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerabdruckhardware nicht verfügbar"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuche es erneut."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textaktionen"</string>
<string name="email" msgid="4560673117055050403">"E-Mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"E-Mail an ausgewählte Adresse senden"</string>
<string name="dial" msgid="1253998302767701559">"Anrufen"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ausgewählte Telefonnummer anrufen"</string>
<string name="map" msgid="6521159124535543457">"Suchen"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Ausgewählte Adresse finden"</string>
<string name="browse" msgid="1245903488306147205">"Öffnen"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Ausgewählte URL öffnen"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"SMS an ausgewählte Telefonnummer senden"</string>
<string name="add_contact" msgid="7867066569670597203">"Hinzufügen"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Zu Kontakten hinzufügen"</string>
<string name="view_calendar" msgid="979609872939597838">"Anzeigen"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ausgewählte Zeit im Kalender anzeigen"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Terminübersicht"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Termin für die ausgewählte Zeit planen"</string>
<string name="view_flight" msgid="7691640491425680214">"Verfolgen"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Ausgewählten Flug verfolgen"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Der Speicherplatz wird knapp"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Einige Systemfunktionen funktionieren möglicherweise nicht."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Der Speicherplatz reicht nicht für das System aus. Stelle sicher, dass 250 MB freier Speicherplatz vorhanden sind, und starte das Gerät dann neu."</string>
@@ -1117,8 +1122,7 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> öffnen"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> wird ohne Speichern geschlossen"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Speicherlimit für \"<xliff:g id="PROC">%1$s</xliff:g>\" überschritten"</string>
- <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
- <skip />
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap-Dump wurde erfasst. Tippe, um ihn zu teilen."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Heap-Dump teilen?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Für den Prozess \"<xliff:g id="PROC">%1$s</xliff:g>\" wurde das Prozessspeicherlimit von <xliff:g id="SIZE">%2$s</xliff:g> überschritten. Es steht ein Heap-Dump zur Verfügung, den du mit dem Entwickler teilen kannst. Beachte jedoch unbedingt, dass der Heap-Dump personenbezogene Daten von dir enthalten kann, auf die die App zugreifen kann."</string>
<string name="sendText" msgid="5209874571959469142">"Aktion für Text auswählen"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Mit offenem WLAN verbinden"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Mit WLAN des Mobilfunkanbieters verbinden"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Verbindung zu WLAN wird hergestellt"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Mit WLAN verbunden"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WLAN-Verbindung konnte nicht hergestellt werden"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tippen, um alle Netzwerke zu sehen"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktivieren"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Neue <xliff:g id="NAME">%s</xliff:g> entdeckt"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Zum Übertragen von Fotos und Medien"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> beschädigt"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt. Zum Reparieren tippen."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt. Zur Problembehebung auswählen."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nicht unterstützt"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zum Einrichten in einem unterstützten Format tippen."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zur Einrichtung eines unterstützten Formats auswählen."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Trenne die <xliff:g id="NAME">%s</xliff:g> vor dem Entfernen, um Datenverluste zu vermeiden."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> entfernt. Neuen Speicher einlegen"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> wird gerade ausgeworfen…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nicht entfernen"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Einrichten"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Auswerfen"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Ansehen"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> fehlt"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Dieses Medium wieder einlegen"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> wird verschoben"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Daten werden verschoben"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Verschieben abgeschlossen"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Daten auf <xliff:g id="NAME">%s</xliff:g> verschoben"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Fehler bei Datenverschiebung"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Daten verbleiben am ursprünglichen Speicherort"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Entfernt"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ausgeworfen"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Wird überprüft…"</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Verbindung zu durchgehend aktivem VPN wird hergestellt…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Mit durchgehend aktivem VPN verbunden"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Verbindung mit dauerhaft aktivem VPN getrennt"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Verbindungsaufbau zu dauerhaft aktivem VPN nicht möglich"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Netzwerk- oder VPN-Einstellungen ändern"</string>
<string name="upload_file" msgid="2897957172366730416">"Datei auswählen"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Keine ausgewählt"</string>
<string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string>
<string name="submit" msgid="1602335572089911941">"Senden"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Fahr-App wird ausgeführt"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tippen, um die Fahr-App zu beenden."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oder Hotspot aktiv"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Zum Einrichten tippen."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering ist deaktiviert"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Von deinem Administrator installiert"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Von deinem Administrator aktualisiert"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Von deinem Administrator gelöscht"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion, Standortdienste sowie die Hintergrunddaten einschränkt oder deaktiviert. E-Mail, Messaging und andere Apps, die auf deinem Gerät synchronisiert werden, werden möglicherweise nur aktualisiert, wenn du sie öffnest.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn dein Gerät aufgeladen wird."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Mit dem Datensparmodus wird die Datennutzung verringert, indem verhindert wird, dass im Hintergrund Daten von Apps gesendet oder empfangen werden. Datenzugriffe sind mit einer aktiven App zwar möglich, erfolgen aber seltener. Als Folge davon könnten Bilder beispielsweise erst dann sichtbar werden, wenn sie angetippt werden."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivieren"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Stummgeschaltet durch <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Es liegt ein internes Problem mit deinem Gerät vor. Möglicherweise verhält es sich instabil, bis du es auf die Werkseinstellungen zurücksetzt."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Es liegt ein internes Problem mit deinem Gerät vor. Bitte wende dich diesbezüglich an den Hersteller."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-Anfrage wurde in normalen Anruf geändert"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-Anfrage wurde in SS-Anfrage geändert"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"In neue USSD-Anfrage geändert"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-Anfrage wurde in Videoanruf geändert"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-Anfrage wurde in normalen Anruf geändert"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-Anfrage wurde in Videoanruf geändert"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-Anfrage wurde in USSD-Anfrage geändert"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"In neue SS-Anfrage geändert"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeitsprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Maximieren"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Minimieren"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM nicht für Sprachfunktion eingerichtet"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM unterstützt die Sprachfunktion nicht"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone unterstützt Sprachfunktion nicht"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up-Fenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Die App-Version wurde zurückgestuft oder ist mit dieser Verknüpfung nicht kompatibel"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Das ist ein neues Verhalten. Tippe, um die Einstellung zu ändern."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Bitte nicht stören\" wurde geändert"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Einstellungen"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 1371000..6c42468 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"μη περιορισμένη\". Επόμενη κλήση: Μη περιορισμένη"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Η υπηρεσία δεν προβλέπεται."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Δεν μπορείτε να αλλάξετε τη ρύθμιση του αναγνωριστικού καλούντος."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Δεν υπάρχει υπηρεσία δεδομένων"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Δεν επιτρέπονται οι κλήσεις έκτακτης ανάγκης"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Δεν υπάρχει υπηρεσία δεδομένων κινητής τηλεφωνίας"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Οι κλήσεις έκτακτης ανάγκης δεν είναι διαθέσιμες"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Δεν υπάρχει φωνητική υπηρεσία"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Δεν υπάρχει φωνητική υπηρεσία/υπηρεσία έκτακτης ανάγκης"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Δεν προσφέρεται προσωρινά από το δίκτυο κινητής τηλεφωνίας στην τοποθεσία σας"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Δεν είναι δυνατή η σύνδεση στο δίκτυο"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από τις Ρυθμίσεις > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Η κλήση Wi‑Fi είναι ενεργή"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Για κλήσεις έκτακτης ανάγκης, απαιτείται δίκτυο κινητής τηλεφωνίας."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Δεν υπάρχει φωνητική υπηρεσία ή κλήσεις έκτακτης ανάγκης"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Απενεργοποιήθηκε προσωρινά από την εταιρεία κινητής τηλεφωνίας σας"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Απενεργοποιήθηκε προσωρινά από την εταιρεία κινητής τηλεφωνίας σας για τον αριθμό SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Δεν είναι δυνατή η σύνδεση στο δίκτυο κινητής τηλεφωνίας"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Δοκιμάστε να αλλάξετε το προτιμώμενο δίκτυο. Πατήστε για αλλαγή."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Οι κλήσεις έκτακτης ανάγκης δεν είναι διαθέσιμες"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Δεν είναι δυνατή η πραγματοποίηση κλήσεων έκτακτης ανάγκης μέσω Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ειδοποιήσεις"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Προώθηση κλήσης"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Ενεργό διαφημιστικό πλαίσιο περιαγωγής"</string>
<string name="roamingText12" msgid="1189071119992726320">"Διαφημιστικό πλαίσιο περιαγωγής απενεργοποιημένο"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Αναζήτηση υπηρεσιών"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Κλήση Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Δεν ήταν δυνατή η ρύθμιση της κλήσης Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά την Κλήση Wi-Fi από τις Ρυθμίσεις. (Κωδικός σφάλματος: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας που χρησιμοποιείτε (Κωδικός σφάλματος: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Παρουσιάστηκε πρόβλημα με την εγγραφή της κλήσης Wi‑Fi με την εταιρεία κινητής τηλεφωνίας: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Πραγματοποιείται επεξεργασία πάρα πολλών αιτημάτων. Προσπαθήστε ξανά αργότερα."</string>
<string name="notification_title" msgid="8967710025036163822">"Σφάλμα σύνδεσης για τον λογαριασμό <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Συγχρονισμός"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Συγχρονισμός"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Πάρα πολλές <xliff:g id="CONTENT_TYPE">%s</xliff:g> διαγραφές."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Αδυναμία συγχρονισμού"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Επιχειρήθηκε η διαγραφή πάρα πολλών <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Ο αποθηκευτικός χώρος του tablet είναι πλήρης. Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Ο αποθηκευτικός χώρος παρακολούθησης είναι πλήρης! Διαγράψτε μερικά αρχεία για να απελευθερώσετε χώρο."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Ο αποθηκευτικός χώρος της τηλεόρασης είναι πλήρης. Διαγράψτε ορισμένα αρχεία, για να ελευθερώσετε χώρο."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Από τον διαχειριστή του προφίλ εργασίας σας"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Από <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Το προφίλ εργασίας διαγράφηκε"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Το προφίλ εργασίας διαγράφηκε λόγω απουσίας της εφαρμογής διαχείρισης"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Η εφαρμογή διαχείρισης προφίλ εργασίας είτε λείπει είτε είναι κατεστραμμένη. Ως αποτέλεσμα, διαγράφηκε το προφίλ εργασίας και τα σχετικά δεδομένα. Επικοινωνήστε με τον διαχειριστή σας για βοήθεια."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Το προφίλ εργασίας σας δεν είναι πια διαθέσιμο σε αυτήν τη συσκευή"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Πάρα πολλές προσπάθειες εισαγωγής κωδικού πρόσβασης"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Η συσκευή είναι διαχειριζόμενη"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ο οργανισμός σας διαχειρίζεται αυτήν τη συσκευή και ενδέχεται να παρακολουθεί την επισκεψιμότητα δικτύου. Πατήστε για λεπτομέρειες."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Η συσκευή σας θα διαγραφεί"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Δεν είναι δυνατή η χρήση της εφαρμογής διαχείρισης. Θα πραγματοποιηθεί διαγραφή της συσκευής σας.\n\nΕάν έχετε ερωτήσεις, επικοινωνήστε με τον διαχειριστή του οργανισμού σας."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Δεν είναι δυνατή η χρήση της εφαρμογής διαχειριστή. Η συσκευή σας θα διαγραφεί.\n\nΕάν έχετε ερωτήσεις, επικοινωνήστε με τον διαχειριστή του οργανισμού σας."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Η εκτύπωση απενεργοποιήθηκε από τον χρήστη <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Για εμένα"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Επιλογές tablet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Λειτουργία πτήσης"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Λειτ. πτήσης είναι ανενεργή"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Εξοικονόμηση μπαταρίας"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Η εξοικονόμηση μπαταρίας είναι ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Η Εξοικονόμηση μπαταρίας είναι ΕΝΕΡΓΗ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Βοήθεια"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Φων.υποβοηθ."</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Εναλλαγή σε προφίλ εργασίας"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Επαφές"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"πρόσβαση στις επαφές σας"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στις επαφές σας"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στις επαφές σας;"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Τοποθεσία"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"έχει πρόσβαση στην τοποθεσία της συσκευής"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στην τοποθεσία της συσκευής"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στην τοποθεσία αυτής της συσκευής;"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ημερολόγιο"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"έχει πρόσβαση στο ημερολόγιό σας"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στο ημερολόγιό σας"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στο ημερολόγιό σας;"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"στέλνει και να διαβάζει μηνύματα SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η αποστολή και η προβολή μηνυμάτων SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η αποστολή και η προβολή μηνυμάτων SMS;"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Αποθηκευτικός χώρος"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"έχει πρόσβαση στις φωτογραφίες/πολυμέσα/αρχεία στη συσκευή σας"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση σε φωτογραφίες, μέσα και αρχεία στη συσκευή σας"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση σε φωτογραφίες, μέσα και αρχεία στη συσκευή σας;"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Μικρόφωνο"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ηχογραφεί"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η εγγραφή ήχου"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η εγγραφή ήχου;"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Κάμερα"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"γίνεται λήψη φωτογραφιών και εγγραφή βίντεο"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η λήψη φωτογραφιών και η εγγραφή βίντεο"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η λήψη φωτογραφιών και η εγγραφή βίντεο;"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"πραγματοποιεί και να διαχειρίζεται τηλ/κές κλήσεις"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η πραγματοποίηση και η διαχείριση τηλεφωνικών κλήσεων"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η πραγματοποίηση και η διαχείριση τηλεφωνικών κλήσεων;"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Αισθητήρες σώματος"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας."</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας;"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ανάκτηση του περιεχομένου του παραθύρου"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Εκτέλεση κινήσεων"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Επιτρέπει το πάτημα, την ολίσθηση, το πλησίασμα και άλλες κινήσεις."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Κινήσεις δακτυλικών αποτυπωμάτων"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Μπορεί να αναγνωρίσει κινήσεις που εκτελούνται στον αισθητήρα δακτυλικών αποτυπωμάτων των συσκευών."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Μπορεί να αναγνωρίσει κινήσεις που εκτελούνται στον αισθητήρα δακτυλικών αποτυπωμάτων της συσκευής."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"απενεργοποιεί ή να τροποποιεί την γραμμή κατάστασης"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ορίζεται ως γραμμή κατάστασης"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Επιτρέπει στην εφαρμογή να καθιστά τμήματά της μόνιμα στη μνήμη. Αυτό μπορεί να περιορίσει τη μνήμη που διατίθεται σε άλλες εφαρμογές, επιβραδύνοντας τη λειτουργία της τηλεόρασης."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του τηλεφώνου."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"εκτέλεση υπηρεσίας προσκηνίου"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί υπηρεσίες προσκηνίου."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"υπολογίζει τον αποθηκευτικό χώρο εφαρμογής"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Επιτρέπει στην εφαρμογή να ανακτήσει τα μεγέθη κώδικα, δεδομένων και προσωρινής μνήμης"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"τροποποίηση ρυθμίσεων συστήματος"</string>
@@ -478,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"χρήση βιομετρικού εξοπλισμού"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί βιομετρικό εξοπλισμό για έλεγχο ταυτότητας"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"διαχειρίζεται τον εξοπλισμό δακτυλικού αποτυπώματος"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους για την προσθήκη και τη διαγραφή προτύπων μοναδικού χαρακτηριστικού για χρήση."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"χρησιμοποιεί τον εξοπλισμό δακτυλικού αποτυπώματος"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Δεν αναγνωρίστηκε"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Η ταυτότητα του δακτυλικού αποτυπώματος ελέγχθηκε"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ο εξοπλισμός μοναδικού χαρακτηριστικού δεν είναι διαθέσιμος."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ξεκλείδωμα μοτίβου."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ξεκλείδωμα κωδικού ασφαλείας"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Ξεκλείδωμα αριθμού PIN κάρτας SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Ξεκλείδωμα αριθμού PUK κάρτας SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ξεκλείδωμα κωδικού πρόσβασης."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Περιοχή μοτίβου."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Περιοχή ολίσθησης"</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"Το κείμενο αντιγράφηκε στο πρόχειρο."</string>
<string name="more_item_label" msgid="4650918923083320495">"Περισσότερα"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Πλήκτρο Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"διάστημα"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"εισαγωγή"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"διαγραφή"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ενέργειες κειμένου"</string>
<string name="email" msgid="4560673117055050403">"Ηλεκτρονικό ταχυδρομείο"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου στην επιλεγμένη διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
<string name="dial" msgid="1253998302767701559">"Κλήση"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Κλήση επιλεγμένου αριθμού τηλεφώνου"</string>
<string name="map" msgid="6521159124535543457">"Εντοπισμός"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Εντοπισμός επιλεγμένης διεύθυνσης"</string>
<string name="browse" msgid="1245903488306147205">"Άνοιγμα"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Άνοιγμα επιλεγμένου URL"</string>
<string name="sms" msgid="4560537514610063430">"Μήνυμα"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Αποστολή μηνύματος στον επιλεγμένο αριθμό τηλεφώνου"</string>
<string name="add_contact" msgid="7867066569670597203">"Προσθήκη"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Προσθήκη στις επαφές"</string>
<string name="view_calendar" msgid="979609872939597838">"Προβολή"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Προβολή επιλεγμένης ώρας στο ημερολόγιο"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Χρονοδιάγραμμα"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Προγραμματισμός συμβάντος για επιλεγμένο χρόνο"</string>
<string name="view_flight" msgid="7691640491425680214">"Κομμάτι"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Παρακολούθηση επιλεγμένης πτήσης"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ο αποθηκευτικός χώρος εξαντλείται"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Ορισμένες λειτουργίες συστήματος ενδέχεται να μην λειτουργούν"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Δεν υπάρχει αρκετός αποθηκευτικός χώρος για το σύστημα. Βεβαιωθείτε ότι διαθέτετε 250 MB ελεύθερου χώρου και κάντε επανεκκίνηση."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Έλεγχος για ενημέρωση"</string>
<string name="smv_application" msgid="3307209192155442829">"Η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> (διεργασία <xliff:g id="PROCESS">%2$s</xliff:g>) παραβίασε την αυτοεπιβαλλόμενη πολιτική StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Η διεργασία <xliff:g id="PROCESS">%1$s</xliff:g> παραβίασε την αυτοεπιβαλόμενη πολιτική StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Το Android αναβαθμίζεται..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Εκκίνηση Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Ενημέρωση τηλεφώνου…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Ενημέρωση tablet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Ενημέρωση συστήματος…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Εκκίνηση τηλεφώνου…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Εκκίνηση tablet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Εκκίνηση συσκευής…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Βελτιστοποίηση αποθηκευτικού χώρου."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Ολοκλήρωση ενημέρωσης Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Ορισμένες εφαρμογές ενδέχεται να μην λειτουργούν σωστά μέχρι την ολοκλήρωση της αναβάθμισης"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Ολοκλήρωση ενημέρωσης συστήματος…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> αναβαθμίζεται…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Βελτιστοποίηση της εφαρμογής <xliff:g id="NUMBER_0">%1$d</xliff:g> από <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Προετοιμασία <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Έναρξη εφαρμογών."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ολοκλήρωση εκκίνησης."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Πατήστε για να επιστρέψετε στο παιχνίδι"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Επιλέξτε παιχνίδι"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Για καλύτερη απόδοση, μόνο ένα από αυτά τα παιχνίδια μπορεί να ανοίγει κάθε φορά."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Επιστρέψτε στην εφαρμογή <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Έγινε λήψη του στιγμιότυπου μνήμης, πατήστε για κοινή χρήση"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Επιλέξτε μια ενέργεια για το κείμενο"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Σύνδεση με δίκτυο Wi‑Fi εταιρείας κινητής τηλεφωνίας"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Σύνδεση σε δίκτυο Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ολοκληρώθηκε η σύνδεση στο δίκτυο Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Δεν ήταν δυνατή η σύνδεση σε δίκτυο Wi‑Fi"</string>
<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="1100098935861622985">"Όλα τα δίκτυα"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Όλα τα δίκτυα"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Το Wi‑Fi θα ενεργοποιηθεί αυτόματα"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Όταν βρίσκεστε κοντά σε αποθηκευμένο δίκτυο υψηλής ποιότητας"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Να μην ενεργοποιηθεί ξανά"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Επανεκκίνηση"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ενεργοποίηση υπηρεσίας κινητής τηλεφωνίας"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Κατεβάστε την εφαρμογή της εταιρείας κινητής τηλεφωνίας, για να ενεργοποιήσετε τη νέα SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Κατεβάστε την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> για να ενεργοποιήσετε τη νέα SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Λήψη εφαρμογής"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Τοποθετήθηκε νέα SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Πατήστε για ρύθμιση"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Η λειτουργία PTP μέσω USB ενεργοποιήθηκε"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Η σύνδεση μέσω USB ενεργοποιήθηκε"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Η λειτουργία MIDI μέσω USB ενεργοποιήθηκε"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Η λειτουργία αξεσουάρ USB ενεργοποιήθηκε"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Συνδέθηκε αξεσουάρ USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Πατήστε για περισσότερες επιλογές."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Φόρτιση συνδεδεμένης συσκευής. Πατήστε για περισσότερες επιλογές."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Εντοπίστηκε αναλογικό αξεσουάρ ήχου"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Η συνδεδεμένη συσκευή δεν είναι συμβατή με αυτό το τηλέφωνο. Πατήστε για να μάθετε περισσότερα."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Πατήστε για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Πατήστε για να απενεργοποιήσετε τον εντοπισμό και τη διόρθωση σφαλμάτων USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Επιλογή για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Λήψη αναφοράς σφάλματος…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Κοινή χρήση αναφοράς σφάλματος;"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> προβάλλεται πάνω από άλλες εφαρμογές"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικαλύπτει άλλες"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Προετοιμασία <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Έλεγχος για σφάλματα"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Εντοπίστηκε νέο μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Απενεργοποίηση"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Έλεγχος <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Έλεγχος τρέχοντος περιεχομένου"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Νέο <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Πατήστε για ρύθμιση"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Για μεταφορά φωτ./πολυμέσων"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Η κάρτα <xliff:g id="NAME">%s</xliff:g> είναι κατεστραμμένη"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Το μέσο <xliff:g id="NAME">%s</xliff:g> είναι κατεστραμμένο. Πατήστε για επιδιόρθωση."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Πρόβλημα με <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Πατήστε για επιδιόρθωση"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Το μέσο <xliff:g id="NAME">%s</xliff:g> έχει καταστραφεί. Επιλέξτε να γίνει επιδιόρθωση."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Η κάρτα <xliff:g id="NAME">%s</xliff:g> δεν υποστηρίζεται"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Αυτή η συσκευή δεν υποστηρίζει αυτό το μέσο <xliff:g id="NAME">%s</xliff:g>. Πατήστε για ρύθμιση σε μια υποστηριζόμενη μορφή."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Αυτή η συσκευή δεν υποστηρίζει το μέσο <xliff:g id="NAME">%s</xliff:g>. Επιλέξτε να ρυθμιστεί σε μια υποστηριζόμενη μορφή."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Μη αναμενόμενη αφαίρεση <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Αποπροσαρτήστε το μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g> πριν τον αφαιρέσετε, προς αποφυγή απώλειας δεδομένων."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Καταργήθηκε το <xliff:g id="NAME">%s</xliff:g>."</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Καταργήθηκε <xliff:g id="NAME">%s</xliff:g>. Τοποθετήστε μια νέα κάρτα"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Εξακολουθεί να γίνεται κατάργηση <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Να μην καταργηθεί"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Κάντε εξαγωγή των μέσων πριν τα καταργήσετε, για να μην χάσετε το περιεχόμενό σας"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Το <xliff:g id="NAME">%s</xliff:g> καταργήθηκε"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ορισμένες δυνατότητες ενδέχεται να μην λειτουργούν σωστά. Τοποθετήστε νέο αποθηκευτικό χώρο."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Εξαγωγή <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Μην το αφαιρείτε"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"Λείπει το μέσο <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Τοποθετήστε ξανά τη συσκευή"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Μετακίνηση δεδομένων"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Η μετακίνηση ολοκληρώθηκε"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Τα δεδομένα μεταφέρθηκαν σε <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Αδύνατη μετακίνηση των δεδομένων"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Δεδομένα που απέμειναν στην αρχική τοποθεσία"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Η μεταφορά περιεχ. ολοκληρώθηκε"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Το περιεχόμενο μετακινήθηκε σε <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Μη δυνατή μετακίν. περιεχομένου"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Δοκιμάστε ξανά να μετακινήσετε το περιεχόμενο"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Αφαιρέθηκε"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Καταργήθηκε"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Έλεγχος..."</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Σύνδεση πάντα ενεργοποιημένου VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Έχει συνδεθεί πάντα ενεργοποιημένο VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Αποσύνδεση από μονίμως ενεργό VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Σφάλμα πάντα ενεργοποιημένου VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Δεν ήταν δυνατή η σύνδεση σε πάντα ενεργό VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Αλλαγή δικτύου ή ρυθμίσεις VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Επιλογή αρχείου"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Δεν επιλέχθηκε κανένα αρχείο."</string>
<string name="reset" msgid="2448168080964209908">"Επαναφορά"</string>
<string name="submit" msgid="1602335572089911941">"Υποβολή"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Η λειτουργία αυτοκινήτου είναι ενεργοποιημένη"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Πατήστε για έξοδο από τη λειτουργία αυτοκινήτου."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Η εφαρμογή οδήγησης εκτελείται"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Πατήστε για να εξέλθετε από την εφαρμογή οδήγησης."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Πατήστε για ρύθμιση."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Η σύνδεση είναι απενεργοποιημένη"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Μονάδα USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Αποθηκευτικός χώρος USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Επεξεργασία"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Ειδοποίηση χρήσης δεδομένων"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Πατήστε για προβολή χρήσης/ρυθμ."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Συμπλ. το όριο δεδομένων 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Συμπλ. το όριο δεδομένων 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Προειδοποίηση δεδομένων"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Έχετε χρησιμοποιήσει <xliff:g id="APP">%s</xliff:g> δεδομένων"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Συμπληρώθηκε όριο δεδ. κιν.τηλ."</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Συμπλ. το όριο δεδ. Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Παύση δεδ. για το υπ. του κύκλ."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Ξεπεράστηκε το όριο δεδομ. 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Ξεπεράστηκε το όριο δεδομένων 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Ξεπεράστηκε το όριο δεδομένων κινητής τηλεφωνίας"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Υπέρβ. ορίου Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> πάνω από το καθορισμένο όριο."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Τα δεδομένα τέθηκαν σε παύση για τον υπόλοιπο κύκλο σας"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Υπέρβαση ορίου δεδομ. κιν. τηλ."</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Υπέρβαση ορίου δεδομένων Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Υπερβήκατε το καθορισμένο όριο κατά <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Περ.δεδομ.παρασκ."</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Πατήστε για κατάργ. περιορισμών."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Εκτεταμένη χρήση δεδομένων"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Η χρήση δεδομένων κατά τις τελευταίες ημέρες είναι μεγαλύτερη από το κανονικό. Πατήστε για να δείτε τη χρήση και τις ρυθμίσεις."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Υψηλή χρήση δεδομ. κιν. τηλεφ."</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Οι εφαρμογές σας έχουν χρησιμοποιήσει περισσότερα δεδομένα από το συνηθισμένο"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> έχει χρησιμοποιήσει περισσότερα δεδομένα από το συνηθισμένο"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Πιστοποιητικό ασφαλείας"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Αυτό το πιστοποιητικό είναι έγκυρο."</string>
<string name="issued_to" msgid="454239480274921032">"Εκδόθηκε σε:"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Εγκαταστάθηκε από τον διαχειριστή σας"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ενημερώθηκε από τον διαχειριστή σας"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Διαγράφηκε από τον διαχειριστή σας"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στον συγχρονισμό μπορεί να μην ενημερώνονται έως ότου τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα κατά τη διάρκεια της φόρτισης της συσκευής σας."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Προκειμένου να επεκτείνει τη διάρκεια ζωής της μπαταρίας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει ή απενεργοποιεί τη δόνηση, τις υπηρεσίες τοποθεσίας και τα δεδομένα παρασκηνίου. Οι εφαρμογές ηλεκτρονικού ταχυδρομείου, ανταλλαγής μηνυμάτων και άλλες, οι οποίες βασίζονται στον συγχρονισμό μπορεί να μην ενημερωθούν, εκτός εάν τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα κατά τη φόρτιση της συσκευής σας."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ενεργ.Εξοικονόμησης δεδομένων;"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ενεργοποίηση"</string>
@@ -1681,9 +1702,9 @@
<item quantity="other">Για %1$d λεπτά (μέχρι <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Για 1 λεπτό (μέχρι <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Για %1$d ώρες (έως τις <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Για μία ώρα (έως τις <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Για %1$d ώρες (μέχρι τις <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Για 1 ώρα (μέχρι τις <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Για %1$d ώρες (μέχρι <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1718,9 @@
<item quantity="other">Για %d λεπτά</item>
<item quantity="one">Για 1 λεπτό</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Για %d ώρες</item>
- <item quantity="one">Για μία ώρα</item>
+ <item quantity="one">Για 1 ώρα</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Για %d ώρες</item>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Σίγαση από <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας και ενδέχεται να είναι ασταθής μέχρι την επαναφορά των εργοστασιακών ρυθμίσεων."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας. Επικοινωνήστε με τον κατασκευαστή σας για λεπτομέρειες."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Το αίτημα USSD τροποποιήθηκε σε αίτημα DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Το αίτημα USSD τροποποιήθηκε σε αίτημα SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Το αίτημα USSD τροποποιήθηκε σε νέο αίτημα USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Το αίτημα USSD τροποποιήθηκε σε αίτημα Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Το αίτημα SS τροποποιήθηκε σε αίτημα DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Το αίτημα SS τροποποιήθηκε σε αίτημα Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Το αίτημα SS τροποποιήθηκε σε αίτημα USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Το αίτημα SS τροποποιήθηκε σε νέο αίτημα SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Το αίτημα USSD τροποποιήθηκε σε κανονική κλήση"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Το αίτημα USSD τροποποιήθηκε σε αίτημα SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Τροποποιήθηκε σε νέο αίτημα USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Το αίτημα USSD τροποποιήθηκε σε βιντεοκλήση"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Το αίτημα SS τροποποιήθηκε σε κανονική κλήση"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Το αίτημα SS τροποποιήθηκε σε βιντεοκλήση"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Το αίτημα SS τροποποιήθηκε σε αίτημα USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Τροποποιήθηκε σε νέο αίτημα SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Προφίλ εργασίας"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Ανάπτυξη"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Σύμπτυξη"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Δεν παρέχεται κάρτα SIM για φωνητικές εντολές"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Δεν επιτρέπεται η χρήση της κάρτας SIM για φωνητικές εντολές"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Δεν επιτρέπεται η χρήση του τηλεφώνου για φωνητικές εντολές"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Ο αριθμός SIM <xliff:g id="SIMNUMBER">%d</xliff:g> δεν επιτρέπεται"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Ο αριθμός SIM <xliff:g id="SIMNUMBER">%d</xliff:g> δεν παρέχεται"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Ο αριθμός SIM <xliff:g id="SIMNUMBER">%d</xliff:g> δεν επιτρέπεται"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Ο αριθμός SIM <xliff:g id="SIMNUMBER">%d</xliff:g> δεν επιτρέπεται"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Αναδυόμενο παράθυρο"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Η έκδοση εφαρμογής υποβαθμίστηκε ή δεν είναι συμβατή με αυτήν τη συντόμευση"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Εντοπίστηκε επιβλαβής εφαρμογή"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Η εφαρμογή <xliff:g id="APP_0">%1$s</xliff:g> θέλει να εμφανίζει τμήματα της εφαρμογής <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Επεξεργασία"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Θα υπάρχει δόνηση για κλήσεις και ειδοποιήσεις"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Οι κλήσεις και οι ειδοποιήσεις θα τεθούν σε παύση"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Αλλαγές στο σύστημα"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Μην ενοχλείτε"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις, για να μπορείτε να συγκεντρώνεστε καλύτερα"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Αυτή η συμπεριφορά είναι νέα. Πατήστε για αλλαγή."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Η λειτουργία \"Μην ενοχλείτε\" άλλαξε"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Πατήστε για να ελέγξετε τις ρυθμίσεις συμπεριφοράς για διακοπές"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Πατήστε για να ελέγξετε το περιεχόμενο που έχει αποκλειστεί."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Σύστημα"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ρυθμίσεις"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 14bc016..e7f40b0 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporarily turned off by your operator for SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Couldn’t set up Wi‑Fi calling"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Allows the app to invoke methods to add and delete fingerprint templates for use."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Use fingerprint hardware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="6521159124535543457">"Locate"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Message selected phone number"</string>
<string name="add_contact" msgid="7867066569670597203">"Add"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Add to contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"View"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"View selected time in calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schedule event for selected time"</string>
<string name="view_flight" msgid="7691640491425680214">"Track"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Track selected flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connecting to Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Checking <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Reviewing current content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"New <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap to set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Issue with <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Select to fix."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Select to set up in a supported format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Eject media before removing to avoid losing content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removed"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Some functionality may not work properly. Insert new storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejecting <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Don’t remove"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinsert this device"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moving data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Move complete"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data moved to <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Couldn\'t move data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data left at original location"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Content transfer is finished"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content moved to <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Couldn’t move content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Try moving content again"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removed"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejected"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Checking…"</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM not provisioned for voice"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM not allowed for voice"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not provisioned"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index d04d10a..21115a8 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporarily turned off by your operator for SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Couldn’t set up Wi‑Fi calling"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Allows the app to invoke methods to add and delete fingerprint templates for use."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Use fingerprint hardware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="6521159124535543457">"Locate"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Message selected phone number"</string>
<string name="add_contact" msgid="7867066569670597203">"Add"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Add to contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"View"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"View selected time in calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schedule event for selected time"</string>
<string name="view_flight" msgid="7691640491425680214">"Track"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Track selected flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connecting to Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Checking <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Reviewing current content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"New <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap to set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Issue with <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Select to fix."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Select to set up in a supported format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Eject media before removing to avoid losing content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removed"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Some functionality may not work properly. Insert new storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejecting <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Don’t remove"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinsert this device"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moving data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Move complete"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data moved to <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Couldn\'t move data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data left at original location"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Content transfer is finished"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content moved to <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Couldn’t move content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Try moving content again"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removed"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejected"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Checking…"</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM not provisioned for voice"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM not allowed for voice"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not provisioned"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 14bc016..e7f40b0 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporarily turned off by your operator for SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Couldn’t set up Wi‑Fi calling"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Allows the app to invoke methods to add and delete fingerprint templates for use."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Use fingerprint hardware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="6521159124535543457">"Locate"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Message selected phone number"</string>
<string name="add_contact" msgid="7867066569670597203">"Add"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Add to contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"View"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"View selected time in calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schedule event for selected time"</string>
<string name="view_flight" msgid="7691640491425680214">"Track"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Track selected flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connecting to Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Checking <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Reviewing current content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"New <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap to set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Issue with <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Select to fix."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Select to set up in a supported format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Eject media before removing to avoid losing content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removed"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Some functionality may not work properly. Insert new storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejecting <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Don’t remove"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinsert this device"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moving data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Move complete"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data moved to <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Couldn\'t move data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data left at original location"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Content transfer is finished"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content moved to <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Couldn’t move content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Try moving content again"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removed"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejected"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Checking…"</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM not provisioned for voice"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM not allowed for voice"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not provisioned"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 14bc016..e7f40b0 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporarily turned off by your operator for SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Couldn’t set up Wi‑Fi calling"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Allows the app to invoke methods to add and delete fingerprint templates for use."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Use fingerprint hardware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="6521159124535543457">"Locate"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Message selected phone number"</string>
<string name="add_contact" msgid="7867066569670597203">"Add"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Add to contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"View"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"View selected time in calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schedule event for selected time"</string>
<string name="view_flight" msgid="7691640491425680214">"Track"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Track selected flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connecting to Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Checking <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Reviewing current content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"New <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap to set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Issue with <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Select to fix."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Select to set up in a supported format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Eject media before removing to avoid losing content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removed"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Some functionality may not work properly. Insert new storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejecting <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Don’t remove"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinsert this device"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moving data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Move complete"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data moved to <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Couldn\'t move data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data left at original location"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Content transfer is finished"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content moved to <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Couldn’t move content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Try moving content again"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removed"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejected"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Checking…"</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM not provisioned for voice"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM not allowed for voice"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not provisioned"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 06129e0..09d735b 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your carrier"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporarily turned off by your carrier for SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Couldn’t set up Wi‑Fi calling"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your carrier: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Allows the app to invoke methods to add and delete fingerprint templates for use."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"use fingerprint hardware"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognized"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint time out reached. Try again."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="6521159124535543457">"Locate"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Message selected phone number"</string>
<string name="add_contact" msgid="7867066569670597203">"Add"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Add to contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"View"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"View selected time in calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schedule event for selected time"</string>
<string name="view_flight" msgid="7691640491425680214">"Track"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Track selected flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure you have 250MB of free space and restart."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to carrier Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connecting to Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Checking <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Reviewing current content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"New <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap to set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Issue with <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Select to fix."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Select to set up in a supported format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Eject media before removing to avoid losing content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removed"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Some functionality may not work properly. Insert new storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejecting <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Don’t remove"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Set up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinsert this device"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moving data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Move complete"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data moved to <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Couldn\'t move data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data left at original location"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Content transfer is done"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content moved to <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Couldn’t move content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Try moving content again"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removed"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejected"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Checking…"</string>
@@ -1832,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM not provisioned for voice"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM not allowed for voice"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not provisioned"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> not allowed"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Popup Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded, or isn’t compatible with this shortcut"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index f81f4f8..8a58972 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu proveedor"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede acceder a la red móvil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Presiona para cambiar la red preferida."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"No se pudo configurar la Llamada con Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes mediante Wi-Fi, solicítale a tu proveedor que configure este servicio. Luego, vuelve a activar la Llamada con Wi-Fi en Configuración. (código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Error al registrar la Llamada con Wi‑Fi con tu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Llamada por Wi-Fi de %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Error de acceso de <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronización"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"No se puede sincronizar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Se intentaron borrar demasiados elementos de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento de la tablet. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"El almacenamiento de la TV está completo. Elimina algunos archivos para liberar espacio."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a los contactos"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tus contactos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder al calendario"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tu calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envíe y vea SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Espacio de almacenamiento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a las fotos, el contenido multimedia y los archivos"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a las fotos, el contenido multimedia y los archivos de tu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grabar audio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grabe audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tomar fotografías y grabar videos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tome fotos y grabe videos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"realizar y administrar llamadas telefónicas"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> haga y administre las llamadas telefónicas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a los datos del sensor acerca de tus signos vitales"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a los datos del sensor de tus signos vitales?"</string>
<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>
@@ -492,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas digitales para su uso."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Utilizar hardware de huellas digitales"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware para detectar huellas digitales no está disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="email" msgid="4560673117055050403">"Correo electrónico"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Enviar un correo electrónico a la dirección seleccionada"</string>
<string name="dial" msgid="1253998302767701559">"Llamar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
<string name="map" msgid="6521159124535543457">"Buscar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Abrir la dirección seleccionada en el mapa"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abrir URL seleccionada"</string>
<string name="sms" msgid="4560537514610063430">"Mensaje"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Enviar un mensaje al número de teléfono seleccionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Agregar"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Agregar a contactos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ver la hora seleccionada en el calendario"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programar un evento para la hora seleccionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Realizar seguimiento"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Seguir el vuelo seleccionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Queda poco espacio de almacenamiento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Es posible que algunas funciones del sistema no estén disponibles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hay espacio suficiente para el sistema. Asegúrate de que haya 250 MB libres y reinicia el dispositivo."</string>
@@ -1117,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Seleccionar una acción para el texto"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi-Fi del proveedor"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Estableciendo conexión con la red Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Se conectó a la red Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No fue posible conectarse a la red Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando el medio <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Se detectó un nuevo medio (<xliff:g id="NAME">%s</xliff:g>)."</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> está dañado"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está dañado. Presiona para solucionar el problema."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> se dañó. Selecciona el medio para solucionar el problema."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no es compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no es compatible con <xliff:g id="NAME">%s</xliff:g>. Presiona la pantalla para configurarlo en un formato compatible."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo no es compatible con: <xliff:g id="NAME">%s</xliff:g>. Selecciona para configurar el medio en un formato compatible."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Para evitar que se pierdan datos, desactiva el dispositivo <xliff:g id="NAME">%s</xliff:g> antes de extraerlo."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>. Inserta uno nuevo."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Expulsando el medio <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No extraer"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"No se encuentra dispositivo <xliff:g id="NAME">%s</xliff:g>."</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Volver a insertar dispositivo"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfiriendo la aplicación <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Transfiriendo los datos"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Transferencia completa"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Se transfirieron los datos a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"No se pudieron transferir datos."</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Los datos quedaron en la ubicación original"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando…"</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Estableciendo conexión con la VPN siempre activada..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Se estableció conexión con la VPN siempre activada."</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado de la VPN siempre activa"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"No se puede conectar a la VPN siempre activa"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambiar configuración de red o VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Elegir archivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No se seleccionó un archivo."</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Se está ejecutando la app de conducción"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Presiona para salir de la app de conducción."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Presiona para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Tu administrador instaló este paquete"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Tu administrador actualizó este paquete"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Tu administrador borró este paquete"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para extender la duración de la batería, el Ahorro de batería reduce el rendimiento del dispositivo y limita o desactiva la vibración, los servicios de ubicación y los datos en segundo plano. Es posible que las apps que se sincronizan, como las de correo electrónico y mensajes, no se actualicen a menos que las abras de forma manual.\n\nEl Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para reducir el uso de datos, \"Reducir datos\" evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciados por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Existe un problema interno con el dispositivo, de modo que el dispositivo puede estar inestable hasta que restablezcas la configuración de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Existe un problema interno con el dispositivo. Comunícate con el fabricante para obtener más información."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Se cambió la solicitud USSD por una llamada normal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Se cambió la solicitud USSD por una solicitud SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Se cambió a una nueva solicitud USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Se cambió la solicitud USSD por una videollamada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Se cambió la solicitud SS por una llamada normal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Se cambió la solicitud SS por una videollamada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Se cambió la solicitud SS por una solicitud USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Se cambió a una nueva solicitud SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"No se brindó una SIM para las acciones de voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"La SIM no admite acciones de voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"El teléfono no admite acciones de voz"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La app pasó a una versión anterior o no es compatible con este acceso directo"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Presiona para cambiarlo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Se modificó la opción No interrumpir"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Presiona para consultar lo que está bloqueado."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Configuración"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 049a773..ec406d4 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu operador"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede establecer conexión con la red móvil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Toca para cambiar la red preferida."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de itinerancia activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de itinerancia desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"No se ha podido configurar la llamada por Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes por Wi-Fi, pide antes a tu operador que configure este servicio. Una vez hecho esto, vuelva a activar la llamada por Wi-Fi en Ajustes. (Código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"No se ha podido registrar la llamada por Wi‑Fi con tu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Llamada Wi-Fi de %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Error de inicio de sesión de <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronización"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"No se puede sincronizar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Se han intentado eliminar demasiados elementos de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento del tablet. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"No queda espacio de almacenamiento en la TV. Elimina algunos archivos para liberar espacio."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a tus contactos"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tus contactos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a la ubicación de este dispositivo?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder a tu calendario"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tu calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envíe y lea mensajes SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamiento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a fotos, contenido multimedia y archivos de tu dispositivo"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a las fotos, al contenido multimedia y a los archivos de tu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grabar audio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grabe audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"hacer fotos y grabar vídeos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> haga fotos y grabe vídeos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hacer y administrar llamadas telefónicas"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> haga y gestione llamadas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a datos de sensores de tus constantes vitales"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a los datos del sensor sobre tus constantes vitales?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Comprobar el contenido de la ventana"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de una ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la exploración táctil"</string>
@@ -492,6 +484,8 @@
<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">"inhabilitar el bloqueo de pantalla"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que la aplicación inhabilite el bloqueo del teclado y cualquier protección con contraseña asociada. Por ejemplo, el teléfono puede inhabilitar el bloqueo del teclado cuando se recibe una llamada telefónica y volver a habilitarlo cuando finaliza la llamada."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"usar hardware biométrico"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que la aplicación utilice el hardware biométrico para realizar la autenticación"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"administrar hardware de huellas digitales"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que la aplicación invoque métodos para añadir y eliminar plantillas de huellas digitales y utilizarlas."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"utilizar hardware de huellas digitales"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware de huella digital no está disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="email" msgid="4560673117055050403">"Correo electrónico"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Enviar un correo electrónico a la dirección seleccionada"</string>
<string name="dial" msgid="1253998302767701559">"Llamar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
<string name="map" msgid="6521159124535543457">"Localizar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Abrir la dirección seleccionada en el mapa"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abrir la URL seleccionada"</string>
<string name="sms" msgid="4560537514610063430">"Mensaje"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Enviar un mensaje al número de teléfono seleccionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Añadir"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Añadir a contactos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ver la hora seleccionada en el calendario"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programar un evento para la hora seleccionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Buscar"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Seguir el vuelo seleccionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Queda poco espacio"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Es posible que algunas funciones del sistema no funcionen."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hay espacio suficiente para el sistema. Comprueba que haya 250 MB libres y reinicia el dispositivo."</string>
@@ -1117,8 +1122,7 @@
<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> ha superado el límite de memoria"</string>
- <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
- <skip />
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Se ha recopilado un 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> ha superado su límite de memoria de <xliff:g id="SIZE">%2$s</xliff:g>. Hay un volcado de pila disponible que puedes compartir con su desarrollador (ten cuidado, ya que puede incluir información personal a la que tenga acceso la aplicación)."</string>
<string name="sendText" msgid="5209874571959469142">"Selecciona una acción para el texto"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi‑Fi de un operador"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Estableciendo conexión con la red Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a la red Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No se ha podido conectar a la red Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas las redes"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando errores"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nueva <xliff:g id="NAME">%s</xliff:g> detectada"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y multimedia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Medio externo (<xliff:g id="NAME">%s</xliff:g>) dañado"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está en mal estado. Toca para solucionar el problema."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> está dañada. Selecciónala para arreglarla."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Medio externo (<xliff:g id="NAME">%s</xliff:g>) no admitido"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no admite este medio externo (<xliff:g id="NAME">%s</xliff:g>). Toca para configurarlo con un formato admitido."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"El dispositivo no admite esta <xliff:g id="NAME">%s</xliff:g>. Selecciónala para configurarla en un formato admitido."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Extracción inesperada de <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecta tu <xliff:g id="NAME">%s</xliff:g> antes de extraer la unidad para evitar pérdidas de datos"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Tu <xliff:g id="NAME">%s</xliff:g> se ha extraído"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Tu <xliff:g id="NAME">%s</xliff:g> se ha extraído: inserta otra unidad"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Expulsando <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No extraer"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Falta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Volver a insertar dispositivo"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moviendo <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Moviendo datos"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Datos movidos"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Datos movidos a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"No se pudieron mover los datos"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Han quedado datos en la ubicación original"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando..."</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Conectando VPN siempre activada…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN siempre activada conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado de VPN siempre activada"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"No se ha podido establecer la conexión con la VPN siempre activada"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambiar ajustes de red o VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Seleccionar archivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Archivo no seleccionado"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Se está utilizando la aplicación con el modo de conducción"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toca para salir de la aplicación del modo de conducción."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"La conexión compartida está inhabilitada"</string>
@@ -1847,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM no proporcionada para voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM no permitida para voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Teléfono no permitido para voz"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Se ha instalado una versión anterior de la aplicación o no es compatible con este acceso directo"</string>
@@ -1867,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Toca para cambiarlo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ha cambiado el modo No molestar"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para consultar lo que se está bloqueando."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ajustes"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index a307784..1dd6cef 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Häälkõned pole saadaval"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Häälteenused ja hädaabikõned puuduvad"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Operaator on ajutiselt välja lülitanud"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiilsidevõrguga ei saa ühendust"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Proovige eelistatud võrku vahetada. Puudutage muutmiseks."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hädaabikõned pole saadaval"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Rändluse bänner sees"</string>
<string name="roamingText12" msgid="1189071119992726320">"Rändlusbänner väljas"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Teenuse otsimine"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"WiFi-kõnede seadistamine ebaõnnestus"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse. (Veakood: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Probleem WiFi-kõnede registreerimisel teie operaatoriga: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s WiFi kaudu helistamine"</item>
@@ -481,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Võimaldab rakendusel tühistada meetodid kasutatavate sõrmejäljemallide lisamiseks ja kustutamiseks."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"sõrmejälje riistvara kasutamine"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tuvastatud"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sõrmejälje riistvara pole saadaval."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Sisestusmeetod"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoimingud"</string>
<string name="email" msgid="4560673117055050403">"E-post"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Valitud aadressile meili saatmine"</string>
<string name="dial" msgid="1253998302767701559">"Helista"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Valitud telefoninumbrile helistamine"</string>
<string name="map" msgid="6521159124535543457">"Leia"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Valitud aadressi leidmine"</string>
<string name="browse" msgid="1245903488306147205">"Ava"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Valitud URL-i avamine"</string>
<string name="sms" msgid="4560537514610063430">"Saada sõnum"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Valitud telefoninumbrile sõnumi saatmine"</string>
<string name="add_contact" msgid="7867066569670597203">"Lisa"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Kontaktide hulka lisamine"</string>
<string name="view_calendar" msgid="979609872939597838">"Kuva"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Valitud aja vaatamine kalendris"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Lisa ajakavasse"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Ürituse ajastamine valitud ajale"</string>
<string name="view_flight" msgid="7691640491425680214">"Jälgi"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Valitud lennu jälgimine"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Talletusruum saab täis"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Mõned süsteemifunktsioonid ei pruugi töötada"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Süsteemis pole piisavalt talletusruumi. Veenduge, et seadmes oleks 250 MB vaba ruumi, ja käivitage seade uuesti."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Looge ühendus avatud WiFi-võrguga"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Ühendatud operaatori WiFi-võrguga"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"WiFi-võrguga ühendamine"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ühendatud WiFi-võrguga"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WiFi-võrguga ei õnnestunud ühendust luua"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> kuvat. teiste rakenduste peal"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Lülita välja"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Üksuse <xliff:g id="NAME">%s</xliff:g> ettevalmistamine"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Vigade kontrollimine"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tuvastati uus üksus <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotode ja meedia ülekandmiseks"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Rikutud <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Üksus <xliff:g id="NAME">%s</xliff:g> on rikutud. Puudutage parandamiseks."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Kaart <xliff:g id="NAME">%s</xliff:g> on rikutud. Valige parandamiseks."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Toetamata <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"See seade ei toeta üksust <xliff:g id="NAME">%s</xliff:g>. Puudutage toetatud vormingus seadistamiseks."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"See seade ei toeta kaarti <xliff:g id="NAME">%s</xliff:g>. Valige toetatud vormingus seadistamiseks."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati ootamatult"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Andmekao vältimiseks lahutage üksus <xliff:g id="NAME">%s</xliff:g> enne eemaldamist"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Üksus <xliff:g id="NAME">%s</xliff:g> on eemaldatud"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati; sisestage uus"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Üksust <xliff:g id="NAME">%s</xliff:g> ikka eemaldatakse …"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ärge eemaldage"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Seadistus"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eemaldamine"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Avastamine"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Üksust <xliff:g id="NAME">%s</xliff:g> pole"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sisestage see seade uuesti"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Seadme <xliff:g id="NAME">%s</xliff:g> teisaldamine"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Andmete teisaldamine"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Teisaldamine lõpetati"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Andmed teisaldati üksusesse <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Andmeid ei saanud teisaldada"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Andmed on algses asukohas alles"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Eemaldatud"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Väljutatud"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollimine ..."</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administraator on selle installinud"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administraator on seda värskendanud"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administraator on selle kustutanud"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Aku tööea parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibratsiooni, asukohateenuseid ja taustaandmeid (või lülitab need välja). E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui need avate.\n\nSeadme laadimise ajal lülitatakse akusäästja automaatselt välja."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmeside mahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks kujutised kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Lül. andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Lülita sisse"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistas"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Seadmes ilmnes sisemine probleem ja seade võib olla ebastabiilne seni, kuni lähtestate seadme tehase andmetele."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Seadmes ilmnes sisemine probleem. Üksikasjaliku teabe saamiseks võtke ühendust tootjaga."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-taotlus muudeti tavaliseks kõneks"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-taotlus muudeti SS-taotluseks"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Muudeti uueks USSD-taotluseks"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-taotlus muudeti videokõneks"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-taotlus muudeti tavaliseks kõneks"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-taotlus muudeti videokõneks"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-taotlus muudeti USSD-taotluseks"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Muudeti uueks SS-taotluseks"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Tööprofiil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laienda"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ahenda"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kaart pole häälega kasutamiseks ettevalmistatud"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kaarti ei lubata häälega kasutada"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoni ei lubata häälega kasutada"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Hüpikaken"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Rakendus viidi üle vanemale versioonile või see ei ühildu selle otseteega"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 783d05b..c576129 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ez dago ahots-deien zerbitzurik"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ez dago ahozko zerbitzurik eta ezin da egin larrialdi-deirik"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Operadoreak desaktibatu egin du aldi baterako"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ezin da konektatu sare mugikorrera"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Aldatu sare hobetsia. Sakatu aldatzeko."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Ezin da egin larrialdi-deirik"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Ibiltaritzari buruzko jakinarazpena aktibatuta"</string>
<string name="roamingText12" msgid="1189071119992726320">"Ibiltaritzari buruzko jakinarazpena desaktibatuta"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Zerbitzu bila"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Ezin izan dira konfiguratu Wi‑Fi bidezko deiak"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean. (Errore-kodea: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Arazo bat izan da Wi‑Fi bidezko deiak zure operadorearekin erregistratzean: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi bidezko deiak"</item>
@@ -293,8 +296,8 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"egin eta kudeatu telefono-deiak"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aplikazioari telefono-deiak egitea eta kudeatzea baimendu nahi diozu?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Gorputz-sentsoreak"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsore-datuak"</string>
- <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aplikazioari bizi-konstanteei buruzko sentsore-datuak atzitzea baimendu nahi diozu?"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsorearen datuak"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Bizi-konstanteei buruzko sentsorearen datuak atzitzea baimendu nahi diozu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aplikazioari?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Eskuratu leihoko edukia"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Arakatu irekita daukazun leihoko edukia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu \"Arakatu ukituta\""</string>
@@ -481,18 +484,22 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Near Field Communication (NFC) etiketekin, txartelekin eta irakurgailuekin komunikatzea baimentzen die aplikazioei."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desgaitu pantailaren blokeoa"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Teklen blokeoa eta erlazionatutako pasahitz-segurtasuna desgaitzeko baimena ematen die aplikazioei. Adibidez, telefonoak teklen blokeoa desgaitzen du telefono-deiak jasotzen dituenean, eta berriro gaitzen du deiak amaitzean."</string>
- <string name="permlab_manageFingerprint" msgid="5640858826254575638">"kudeatu hatz-marka digitalen hardwarea"</string>
- <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Hatz-marka digitalen txantiloiak gehitzeko eta ezabatzeko metodoei dei egitea baimentzen die aplikazioei."</string>
- <string name="permlab_useFingerprint" msgid="3150478619915124905">"erabili hatz-marka digitalen hardwarea"</string>
- <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Autentifikatzeko hatz-marka digitalen hardwarea erabiltzea baimentzen die aplikazioei."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"Erabili hardware biometrikoa"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Autentifikatzeko hardware biometrikoa erabiltzea baimentzen die aplikazioei."</string>
+ <string name="permlab_manageFingerprint" msgid="5640858826254575638">"kudeatu erreferentzia-gako digitalen hardwarea"</string>
+ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Erreferentzia-gako digitalen txantiloiak gehitzeko eta ezabatzeko metodoei dei egitea baimentzen die aplikazioei."</string>
+ <string name="permlab_useFingerprint" msgid="3150478619915124905">"erabili erreferentzia-gako digitalen hardwarea"</string>
+ <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Autentifikatzeko erreferentzia-gako digitalen hardwarea erabiltzea baimentzen die aplikazioei."</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hatz-marka digitala ez da osorik hauteman. Saiatu berriro."</string>
- <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ezin izan da hatza-marka prozesatu. Saiatu berriro."</string>
+ <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ezin izan da prozesatu hatz-marka. Saiatu berriro."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Hatz-marka digitalen sentsorea zikina dago. Garbi ezazu, eta saiatu berriro."</string>
<string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Hatza azkarregi mugitu duzu. Saiatu berriro."</string>
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Mantsoegi mugitu duzu hatza. Saiatu berriro."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ez da ezagutzen"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hatz-markaren hardwarea ez dago erabilgarri."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string>
@@ -840,7 +847,7 @@
<string name="autofill_postal_code" msgid="4696430407689377108">"Posta-kodea"</string>
<string name="autofill_state" msgid="6988894195520044613">"Estatua"</string>
<string name="autofill_zip_code" msgid="8697544592627322946">"Posta-kodea"</string>
- <string name="autofill_county" msgid="237073771020362891">"Eskualdea"</string>
+ <string name="autofill_county" msgid="237073771020362891">"Lurraldea"</string>
<string name="autofill_island" msgid="4020100875984667025">"Uhartea"</string>
<string name="autofill_district" msgid="8400735073392267672">"Barrutia"</string>
<string name="autofill_department" msgid="5343279462564453309">"Departamentua"</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Idazketa-metodoa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Testu-ekintzak"</string>
<string name="email" msgid="4560673117055050403">"Posta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Bidali mezu elektroniko bat hautatutako helbidera"</string>
<string name="dial" msgid="1253998302767701559">"Deitu"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Deitu hautatutako telefono-zenbakira"</string>
<string name="map" msgid="6521159124535543457">"Aurkitu"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Bilatu hautatutako helbidea"</string>
<string name="browse" msgid="1245903488306147205">"Ireki"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Ireki hautatutako URLa"</string>
<string name="sms" msgid="4560537514610063430">"Bidali mezua"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Bidali testu-mezu bat hautatutako telefono-zenbakira"</string>
<string name="add_contact" msgid="7867066569670597203">"Gehitu"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Gehitu kontaktuetan"</string>
<string name="view_calendar" msgid="979609872939597838">"Ikusi"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ikusi hautatutako ordua egutegian"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Antolatu"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Antolatu gertaera bat hautatutako ordurako"</string>
<string name="view_flight" msgid="7691640491425680214">"Egin jarraipena"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Egin hautatutako hegaldiaren jarraipena"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Memoria betetzen ari da"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Sistemaren funtzio batzuek ez dute agian funtzionatuko"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sisteman ez dago behar adina memoria. Ziurtatu gutxienez 250 MB erabilgarri dituzula eta, ondoren, berrabiarazi gailua."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Konektatu Wi‑Fi sare irekira"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Konektatu operadorearen Wi‑Fi sarera"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi sarera konektatzen"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi sare irekira konektatuta"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ezin izan da konektatu Wi‑Fi sare irekira"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Sakatu hau sare guztiak ikusteko"</string>
@@ -1259,33 +1274,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Besteen gainean agertzen da <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desaktibatu"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> prestatzen"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Errorerik dagoen egiaztatzen"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> berria hauteman da"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Argazkiak eta multimedia-fitxategiak transferitzeko"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago. Sakatu konpontzeko."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Hondatuta dago <xliff:g id="NAME">%s</xliff:g>. Hauta ezazu konpontzeko."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Ez da onartzen <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Sakatu onartzen den formatu batean konfiguratzeko."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Hauta ezazu onartzen den formatu batean konfiguratzeko."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Daturik ez galtzeko, desmuntatu <xliff:g id="NAME">%s</xliff:g> memoria kendu aurretik"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ez dago"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> kendu da. Sartu beste bat"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ateratzen oraindik…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ez kendu"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguratu"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Atera"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Arakatu"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Ez dago <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sartu gailua berriro"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> mugitzen"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Datuak mugitzen"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Mugitu dira datuak"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Mugitu dira datuak <xliff:g id="NAME">%s</xliff:g> gailura"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Ezin izan dira mugitu datuak"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Jatorrizko tokian utzi dira datuak"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Kendu egin da"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Kanporatu egin da"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Egiaztatzen…"</string>
@@ -1454,8 +1485,8 @@
<string name="expires_on" msgid="3676242949915959821">"Iraungitze-data:"</string>
<string name="serial_number" msgid="758814067660862493">"Serie-zenbakia:"</string>
<string name="fingerprints" msgid="4516019619850763049">"Erreferentzia-fitxategiak:"</string>
- <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 erreferentzia-fitxategia:"</string>
- <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 erreferentzia-fitxategia:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 erreferentzia-gako digitala:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 erreferentzia-gako digitala:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ikusi guztiak"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Aukeratu jarduera"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Partekatu hauekin:"</string>
@@ -1677,8 +1708,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratzaileak instalatu du"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratzaileak eguneratu du"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administratzaileak ezabatu du"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Bateriak gehiago iraun dezan, bateria-aurrezleak gailuaren funtzionamendua murrizten du, eta dardara, kokapen-zerbitzuak eta atzeko planoko datuen erabilera mugatzen edo desaktibatzen du. Posta elektronikoa, mezuak eta sinkronizatzen diren gainerako zerbitzuak ez dira eguneratuko haiek ireki ezean.\n\nGailua kargatzen ezarri orduko desaktibatzen da bateria-aurrezlea."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzi ditzake datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datu-aurrezlea aktibatu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktibatu"</string>
@@ -1729,22 +1759,14 @@
<string name="muted_by" msgid="6147073845094180001">"Audioa desaktibatu da (<xliff:g id="THIRD_PARTY">%1$s</xliff:g>)"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Barneko arazo bat dago zure gailuan eta agian ezegonkor egongo da jatorrizko datuak berrezartzen dituzun arte."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Barneko arazo bat dago zure gailuan. Xehetasunak jakiteko, jarri fabrikatzailearekin harremanetan."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD eskaera ohiko deira aldatu da"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD eskaera SS eskaerara aldatu da"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"USSD eskaera berrira aldatu da"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD eskaera bideo-deira aldatu da"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS eskaera ohiko deira aldatu da"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS eskaera bideo-deira aldatu da"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS eskaera USSD eskaerara aldatu da"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"SS eskaera berrira aldatu da"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profila"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Zabaldu"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tolestu"</string>
@@ -1842,6 +1864,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM txartela ez dago hornituta ahotsa erabiltzeko"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM txartela ezin da erabili ahotsa erabiltzeko"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonoa ezin da erabili ahotsa erabiltzeko"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Leiho gainerakorra"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Beste <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikazioaren bertsio zaharrago batera aldatu da, edo aplikazioa ez da lasterbide honekin bateragarria"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 52e986a..7738505 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"پیشفرض شناسه تماسگیرنده روی غیر محدود است. تماس بعدی: بدون محدودیت"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"سرویس دارای مجوز نیست."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"شما میتوانید تنظیم شناسه تماسگیرنده را تغییر دهید."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"سرویس داده دردسترس نیست"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"بدون تماس اضطراری"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"بدون سرویس داده تلفن همراه"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"تماس اضطراری دردسترس نیست"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"سرویس صوتی دردسترس نیست"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"سرویس صوتی/اضطراری دردسترس نیست"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"موقتاً توسط شبکه داده دستگاه همراه در مکان شما ارائه نمیشود"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"شبکه دردسترس نیست"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"برای بهبود دریافت، نوع شبکه انتخابشده را در «تنظیمات > شبکه و اینترنت > شبکههای تلفن همراه > نوع شبکه ترجیحی» تغییر دهید."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"تماس ازطریق Wi-Fi فعال است"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"برای انجام تماسهای اضطراری به شبکه تلفن همراه نیاز دارید."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"بدون سرویس صوتی یا تماس اضطراری"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"شرکت مخابراتی شما موقتاً آن را خاموش کرده است"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"شرکت مخابراتیتان موقتاً آن را برای سیمکارت <xliff:g id="SIMNUMBER">%d</xliff:g> خاموش کرده است"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"شبکه تلفن همراه دردسترس نیست"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"تغییر شبکه برگزیده را امتحان کنید. برای تغییر ضربه بزنید."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"تماس اضطراری امکانپذیر نیست"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"تماس اضطراری ازطریق Wi‑Fi امکانپذیر نیست"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"هشدارها"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"بازارسال تماس"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"حالت پاسخ تماس اضطراری"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"اعلان رومینگ روشن"</string>
<string name="roamingText12" msgid="1189071119992726320">"اعلان رومینگ خاموش"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"جستجوی سرویس"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"تماس از طریق Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"تماس ازطریق Wi‑Fi تنظیم نشد"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"برای برقراری تماس و ارسال پیام ازطریق Wi-Fi، ابتدا از شرکت مخابراتی خود بخواهید این سرویس را تنظیم کند. سپس در «تنظیمات»۷ دوباره «تماس ازطریق Wi-Fi» را روشن کنید. (کد خطا: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ازطریق شرکت مخابراتیتان ثبتنام کنید (کد خطا: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"مشکل هنگام ثبت تماس ازطریق Wi‑Fi با شرکت مخابراتی: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواستهای زیادی در حال پردازش است. بعداً دوباره امتحان کنید."</string>
<string name="notification_title" msgid="8967710025036163822">"خطای ورود به سیستم برای <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"همگامسازی"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"همگامسازی"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"تعداد موارد حذف شده <xliff:g id="CONTENT_TYPE">%s</xliff:g> بسیار زیاد است."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"همگامسازی نشد"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"تعداد <xliff:g id="CONTENT_TYPE">%s</xliff:g> برای حذف بیش از حد مجاز شد."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"حافظه رایانهٔ لوحی پر است! برخی از فایلها را حذف کنید تا فضا آزاد شود."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"حافظه ساعت پر است. برای آزادسازی فضا، چند فایل را حذف کنید."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"فضای ذخیرهسازی تلویزیون پر است. برای آزاد کردن فضا، برخی از فایلها را حذف کنید."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"توسط سرپرست نمایه کاری شما"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"توسط <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"نمایه کار حذف شد"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"به دلیل نداشتن برنامه سرپرست، نمایه کاری حذف شد"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"برنامه سرپرست نمایه کاری یا وجود ندارد یا خراب است. در نتیجه، نمایه کاری شما و دادههای مرتبط با آن حذف شده است. برای دریافت راهنمایی با سرپرست سیستم تماس بگیرید."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"نمایه کاری شما دیگر در این دستگاه دردسترس نیست"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"تلاشهای بسیار زیادی برای وارد کردن گذرواژه انجام شده است"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"دستگاه مدیریت میشود"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"سازمانتان این دستگاه را مدیریت میکند و ممکن است ترافیک شبکه را پایش کند. برای اطلاع از جزئیات، ضربه بزنید."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"دستگاهتان پاک خواهد شد"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"برنامه سرپرست سیستم نمیتواند استفاده شود. دستگاه شما در این لحظه پاک میشود.\n\nاگر سؤالی دارید، با سرپرست سیستم سازمانتان تماس بگیرید."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"برنامه سرپرست سیستم را نمیتوان استفاده کرد. دستگاه شما در این لحظه پاک میشود.\n\nاگر سؤالی دارید، با سرپرست سیستم سازمانتان تماس بگیرید."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> چاپ کردن را غیرفعال کرده است."</string>
<string name="me" msgid="6545696007631404292">"من"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"گزینههای رایانهٔ لوحی"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"حالت هواپیما"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"حالت هواپیما روشن است"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"حالت هواپیما خاموش است"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"بهینهسازی باتری"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"بهینهسازی باتری خاموش است"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"بهینهسازی باتری روشن است"</string>
<string name="global_action_settings" msgid="1756531602592545966">"تنظیمات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"دستیار"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"دستیار صوتی"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"جابهجا شدن به نمایه کاری"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"مخاطبین"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"دسترسی به مخاطبین شما"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> امکان دهید به مخاطبین شما دسترسی پیدا کند"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به مخاطبین شما دسترسی پیدا کند؟"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"مکان"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"دسترسی به موقعیت مکانی این دستگاه"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> امکان دهید به مکان این دستگاه دسترسی پیدا کند"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به مکان این دستگاه دسترسی پیدا کند؟"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"تقویم"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"دسترسی به تقویم شما"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> امکان دهید به تقویم شما دسترسی پیدا کند"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به تقویم شما دسترسی پیدا کند؟"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"پیامک"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ارسال و مشاهده پیامکها"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> امکان دهید پیامکها را ارسال و مشاهده کند"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> اجازه داده شود پیامکها را ارسال و مشاهده کند؟"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"حافظه"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"دسترسی به عکسها، رسانهها و فایلهای روی دستگاهتان"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> امکان دهید به عکسها، رسانه و فایلهای موجود در دستگاهتان دسترسی پیدا کند"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> اجازه داده شود به عکسها، رسانه و فایلهای موجود در دستگاهتان دسترسی پیدا کند؟"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"میکروفن"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ضبط صدا"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"به </b><xliff:g id="APP_NAME">%1$s</xliff:g></b>امکان دهید صدا ضبط کند"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"به </b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود صدا ضبط کند؟"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"دوربین"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"عکس گرفتن و فیلمبرداری"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> امکان دهید عکس بگیرد و ویدئو ضبط کند"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود عکس بگیرد و ویدیو ضبط کند؟"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"تلفن"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"برقراری و مدیریت تماسهای تلفنی"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> امکان دهید تماسهای تلفنی برقرار کند و آنها را مدیریت کند"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> اجازه داده شود تماسهای تلفنی برقرار کند و آنها را مدیریت کند؟"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"حسگرهای بدن"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"دسترسی به دادههای حسگر در رابطه با علائم حیاتی شما"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> امکان دهید به دادههای حسگر مربوط به علائم حیاتی شما دسترسی پیدا کند"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> اجازه داده شود به دادههای حسگر مربوط به علائم حیاتی شما دسترسی پیدا کند؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"محتوای پنجره را بازیابی کند"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجرهای را که درحال تعامل با آن هستید بررسی میکند."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعالسازی کاوش لمسی"</string>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"اجرای اشارهها"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"میتوانید ضربه بزنید، انگشتتان را تند بکشید، انگشتانتان را به هم نزدیک یا از هم دور کنید و اشارههای دیگری اجرا کنید."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"اشارههای اثر انگشت"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"میتواند اشارههای انجامشده روی حسگر اثرانگشت دستگاهها را ثبت کند."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"میتواند اشارههای اجراشده روی حسگر اثرانگشت دستگاه را ثبت کند."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"غیرفعال کردن یا تغییر نوار وضعیت"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"به برنامه اجازه میدهد تا نوار وضعیت را غیرفعال کند یا نمادهای سیستم را اضافه یا حذف کند."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"نوار وضعیت باشد"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"به برنامه امکان میدهد قسمتهایی از خود را در حافظه دائمی کند. این کار حافظه موجود را برای سایر برنامهها محدود کرده و باعث کندی رایانهٔ لوحی میشود."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"به برنامه اجازه میدهد تا بخشهایی از خودش را در حافظه پایدار کند. ممکن است حافظه در دسترس سایر برنامهها را محدود کند که باعث کند شدن تلویزیون میشود."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"به برنامه امکان میدهد قسمتهایی از خود را در حافظه دائمی کند. این کار حافظه موجود را برای سایر برنامهها محدود کرده و باعث کندی تلفن میشود."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"اجرای سرویس پیشزمینه"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"به برنامه اجازه میدهد از سرویسهای پیشزمینه استفاده کند."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"اندازه گیری فضای حافظه برنامه"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"به برنامه اجازه میدهد تا کدها، دادهها و اندازههای حافظهٔ پنهان خود را بازیابی کند"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"تغییر تنظیمات سیستم"</string>
@@ -478,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"استفاده از سختافزار بیومتریک"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"به برنامه امکان میدهد از سختافزار بیومتریک برای احراز هویت استفاده کند"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"مدیریت سختافزار اثر انگشت"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"به برنامه امکان میدهد روشهایی را برای افزودن و حذف الگوهای اثر انگشت جهت استفاده، فعال کند."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"استفاده از سختافزار اثر انگشت"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"شناخته نشد"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"اثر انگشت احراز هویت شد"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"سختافزار اثرانگشت در دسترس نیست."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string>
@@ -544,8 +552,8 @@
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"به دارنده اجازه میدهد به یک رابط سطح بالای سرویس شنونده اعلان متصل شود. هرگز نباید برای برنامههای عادی لازم شود."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"مقید بودن به سرویس ارائهدهنده وضعیت"</string>
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"به دارنده امکان میدهد تا به واسط سطح بالای سرویس ارائهدهنده وضعیت مقید باشد. برای برنامههای عادی هرگز نباید لازم باشد."</string>
- <string name="permlab_bindDreamService" msgid="4153646965978563462">"اتصال به سرویس مورد نظر"</string>
- <string name="permdesc_bindDreamService" msgid="7325825272223347863">"به برنامه اجازه میدهد که به رابط سطح بالای سرویس مورد نظر متصل شود. هرگز نباید برای برنامههای معمولی مورد نیاز باشد."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"اتصال به سرویس موردنظر"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"به برنامه اجازه میدهد که به رابط سطح بالای سرویس موردنظر متصل شود. هرگز نباید برای برنامههای معمولی مورد نیاز باشد."</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"لغو برنامه پیکربندی ارائه شده توسط شرکت مخابراتی"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"به دارنده اجازه میدهد که تنظیمات برنامه شرکت مخابراتی را لغو کند. هرگز برای برنامههای معمولی مورد نیاز نیست."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"گوش دادن برای بررسی شرایط شبکه"</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"باز کردن قفل با الگو."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"باز کردن قفل با چهره."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"باز کردن قفل با پین."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"قفل پین سیمکارت باز شد."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"قفل Puk سیمکارت باز شد."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"باز کردن قفل با گذرواژه."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ناحیه الگو."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ناحیه کشیدن انگشت روی صفحه."</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"متن در کلیپ بورد کپی شد."</string>
<string name="more_item_label" msgid="4650918923083320495">"بیشتر"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"منو+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"فاصله"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ورود"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"حذف"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"کنشهای متنی"</string>
<string name="email" msgid="4560673117055050403">"رایانامه"</string>
+ <string name="email_desc" msgid="3638665569546416795">"ارسال رایانامه به نشانی انتخابی"</string>
<string name="dial" msgid="1253998302767701559">"تماس"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"تماس با شماره تلفن انتخابی"</string>
<string name="map" msgid="6521159124535543457">"مکانیابی"</string>
+ <string name="map_desc" msgid="9036645769910215302">"مکانیابی نشانی انتخابی"</string>
<string name="browse" msgid="1245903488306147205">"باز کردن"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"باز کردن نشانی وب انتخابی"</string>
<string name="sms" msgid="4560537514610063430">"پیام"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"ارسال پیام به شماره تلفن انتخابی"</string>
<string name="add_contact" msgid="7867066569670597203">"افزودن"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"افزودن به مخاطبین"</string>
<string name="view_calendar" msgid="979609872939597838">"مشاهده"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"مشاهده زمان انتخابی در تقویم"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"زمانبندی"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"زمانبندی رویداد برای زمان انتخابی"</string>
<string name="view_flight" msgid="7691640491425680214">"پیگیری"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"ردیابی پرواز انتخابی"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"حافظه درحال پر شدن است"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"برخی از عملکردهای سیستم ممکن است کار نکنند"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"فضای ذخیرهسازی سیستم کافی نیست. اطمینان حاصل کنید که دارای ۲۵۰ مگابایت فضای خالی هستید و سیستم را راهاندازی مجدد کنید."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"بررسی وجود بهروزرسانی"</string>
<string name="smv_application" msgid="3307209192155442829">"برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> (پردازش <xliff:g id="PROCESS">%2$s</xliff:g>) خطمشی StrictMode اجرایی خود را نقض کرده است."</string>
<string name="smv_process" msgid="5120397012047462446">"فرآیند <xliff:g id="PROCESS">%1$s</xliff:g> خطمشی StrictMode اجرای خودکار خود را نقض کرده است."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android در حال ارتقا است..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android در حال راهاندازی است..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"تلفن درحال بهروزرسانی است…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"رایانه لوحی درحال بهروزرسانی است…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"دستگاه درحال بهروزرسانی است…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"تلفن درحال راهاندازی است…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"رایانه لوحی درحال راهاندازی است…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"دستگاه درحال راهاندازی است…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"بهینهسازی فضای ذخیرهسازی."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"درحال پایان بهروزرسانی Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"تا پایان ارتقا، ممکن است برخی از برنامهها بهدرستی کار نکنند."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"درحال اتمام بهروزرسانی سیستم…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> درحال ارتقا است...."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینهسازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"آمادهسازی <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"برای برگشت به بازی، ضربه بزنید"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"انتخاب بازی"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"برای عملکرد بهتر، هربار فقط یکی از این بازیها را میتوان باز کرد."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"به <xliff:g id="OLD_APP">%1$s</xliff:g> برگردید"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"رون حافظه آزاد جمعآوری شد؛ برای اشتراکگذاری، ضربه بزنید"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"انتخاب یک عملکرد برای نوشتار"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"اتصال به شبکه Wi‑Fi باز"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"اتصال به شبکه Wi-Fi شرکت مخابراتی"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"درحال اتصال به شبکه Wi‑Fi باز"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"درحال اتصال به شبکه Wi‑Fi..."</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"به شبکه Wi‑Fi متصل شد"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"به شبکه Wi-Fi متصل نشد"</string>
<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="1100098935861622985">"همه شبکهها"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"همه شبکهها"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi بهطور خودکار روشن خواهد شد"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"وقتی نزدیک شبکه ذخیرهشده با کیفیت بالا هستید"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"دوباره روشن نشود"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"راهاندازی مجدد"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"سرویس دستگاه همراه را فعال کنید"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"برای فعال کردن سیمکارت جدیدتان، برنامه شرکت مخابراتی را بارگیری کنید"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"برای فعال کردن سیمکارت جدیدتان، برنامه <xliff:g id="APP_NAME">%1$s</xliff:g> را بارگیری کنید"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"بارگیری برنامه"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"سیمکارت جدید جاگذاری شد"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"برای تنظیم آن ضربه بزنید"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP ازطریق USB روشن شد"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"اتصال به اینترنت با USB تلفن همراه روشن شد"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI ازطریق USB روشن شد"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"حالت لوازم جانبی USB روشن شد"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"وسیله جانبی USB متصل است"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"برای گزینههای بیشتر ضربه بزنید."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"درحال شارژ کردن دستگاه متصلشده. برای گزینههای بیشتر، ضربه بزنید."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"لوازم جانبی صوتی آنالوگ شناسایی شد"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"دستگاه متصلشده با این تلفن سازگار نیست. روی اطلاعات بیشتر، ضربه بزنید."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"اشکالزدایی USB متصل شد"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"برای غیرفعال کردن اشکالزدایی USB ضربه بزنید."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"برای خاموش کردن اشکالزدایی USB ضربه بزنید"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"انتخاب کنید تا رفع عیب USB غیرفعال شود."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"درحال گرفتن گزارش اشکال…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"گزارش اشکال به اشتراک گذاشته شود؟"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"خاموش کردن"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"در حال آمادهسازی <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"در حال بررسی برای خطاها"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> جدید شناسایی شد"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"خاموش کردن"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"درحال بررسی <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"درحال مرور محتوای کنونی"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> جدید"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"برای راهاندازی ضربه بزنید"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"برای انتقال عکسها و رسانه"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> خراب است"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> خراب است. برای برطرف کردن مشکل ضربه بزنید."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"مشکل مرتبط با <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"برای برطرف کردن مشکل، ضربه بزنید"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> خراب است. رفع خطا را انتخاب کنید."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> پشتیبانی نشده"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای نصب آن در قالب پشتیبانیشده ضربه بزنید."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای تنظیم در یک قالب پشتیبانیشده، آن را انتخاب کنید."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> بهطور غیرمنتظره جدا شد"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"قبل از جدا کردن، برای جلوگیری از از دست رفتن اطلاعات، ارتباط <xliff:g id="NAME">%s</xliff:g> را قطع کنید."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> جدا شده است"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> جدا شد؛ رسانه جدیدی وارد کنید"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"همچنان در حال بیرون راندن <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"جدا نکنید"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"برای جلوگیری از از دست رفتن محتوا، رسانه را قبل از برداشتن بیرون برانید"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> برداشته شد"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"برخی عملکردها ممکن است بهدرستی کار نکنند. فضای ذخیرهسازی جدید وارد کنید."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"درحال بیرون راندن <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"جدا نکنید"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> وجود ندارد"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"جاگذاری مجدد این دستگاه"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"در حال انتقال اطلاعات"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"انتقال کامل شد"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"اطلاعات به <xliff:g id="NAME">%s</xliff:g> منتقل شد"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"اطلاعات منتقل نشدند"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"اطلاعات در مکان اصلی باقی ماندند"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"انتقال محتوا انجام شد"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"محتوا به <xliff:g id="NAME">%s</xliff:g> منتقل شد"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"محتوا منتقل نشد"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"محتوا را دوباره انتقال دهید"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"جدا شده"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"بیرون رانده شده"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"در حال بررسی…"</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه فعال…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN همیشه فعال متصل شد"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ارتباط VPN همیشه روشن قطع شد"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطای VPN همیشه فعال"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"به «VPN همیشه روشن» متصل نشد"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"تغییر شبکه یا تنظیمات VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"انتخاب فایل"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"هیچ فایلی انتخاب نشد"</string>
<string name="reset" msgid="2448168080964209908">"بازنشانی"</string>
<string name="submit" msgid="1602335572089911941">"ارسال"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"حالت خودرو فعال شد"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"برای خروج از حالت خودرو ضربه بزنید."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"برنامه رانندگی درحال اجرا است"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"برای خروج از برنامه رانندگی ضربه بزنید."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"اتصال داده با سیم یا نقطه اتصال فعال"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"برای راهاندازی ضربه بزنید."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"اتصال به اینترنت با تلفن همراه غیرفعال شده است"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"درایو USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"حافظهٔ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ویرایش"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"هشدار مصرف داده"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"برای مشاهده مصرف و تنظیمات ضربه بزنید."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"به حد مجاز مصرف داده 2G-3G رسید"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"به حد مجاز مصرف داده 4G رسید"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"هشدار داده"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> از داده را مصرف کردهاید"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"مصرف داده به حد مجاز رسیده است"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"به حد مجاز مصرف داده Wi-Fi رسید"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"داده برای مابقی دوره متوقف شد"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"اطلاعات 2G-3G بیش از حد مجاز است"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"بیش از حد مجاز 4G است"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"دادههای تلفن همراه از مقدار مجاز بیشتر است"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"از محدوده مجاز دادههای Wi-Fi بیشتر شد"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> از حد تعیین شده بیشتر شد."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"برای بقیه دوره، داده موقتاً متوقف میشود"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"بیش از حداکثر مجاز داده تلفن همراه"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"بیش از حداکثر مجاز داده Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"مصرف داده شما <xliff:g id="SIZE">%s</xliff:g> از حداکثر مجاز بیشتر شده است"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"داده پسزمینه محدود شد"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"برای برداشتن محدودیت ضربه بزنید."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"مصرف داده زیاد"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"مصرف داده شما در چند روز گذشته بیشتر از حالت عادی بوده است. برای مشاهده میزان مصرف و تنظیمات، ضربه بزنید."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"مصرف بالای داده تلفن همراه"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"برنامههای شما بیش از معمول داده مصرف کردهاند"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> بیش از معمول داده مصرف کرده است"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"گواهی امنیتی"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"این گواهی معتبر است."</string>
<string name="issued_to" msgid="454239480274921032">"صادر شده برای:"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"توسط سرپرست سیستم نصب شد"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"توسط سرپرست سیستم بهروزرسانی شد"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"توسط سرپرست سیستم حذف شد"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"برای کمک به بهبود عمر باتری، بهینهسازی باتری عملکرد دستگاهتان را کاهش میدهد و لرزش، خدمات مکان و دسترسی به اکثر دادهها در پسزمینه را محدود میکند. رایانامه، پیامرسانی و برنامههای دیگری که به همگامسازی وابسته هستند، تا زمانیکه آنها را باز نکنید نمیتوانند بهروز شوند.\n\nبهینهسازی باتری بهصورت خودکار در هنگام شارژ شدن دستگاه خاموش میشود."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"برای افزایش عمر باتری، «بهینهسازی باتری» عملکرد دستگاهتان را کاهش میدهد و لرزش، خدمات مکان و دادههای پسزمینه را محدود یا خاموش میکند. رایانامه، پیامرسانی و دیگر برنامههای وابسته به همگامسازی تا زمانی که آنها را باز نکنید، بهروزرسانی نمیشوند.\n\n«بهینهسازی باتری» بهطور خودکار در هنگام شارژ شدن دستگاه خاموش میشود."</string>
<string name="data_saver_description" msgid="6015391409098303235">"برای کمک به کاهش مصرف داده، «صرفهجویی داده» از ارسال و دریافت داده در پسزمینه از طرف بعضی برنامهها جلوگیری میکند. برنامهای که درحالحاضر استفاده میکنید میتواند به دادهها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تا زمانی که روی آنها ضربه نزنید نشان داده نمیشوند."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"صرفهجویی داده روشن شود؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"روشن کردن"</string>
@@ -1681,9 +1702,9 @@
<item quantity="one">برای %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">برای %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">به مدت %1$d ساعت (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">به مدت %1$d ساعت (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d ساعت (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">%1$d ساعت (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">برای %1$d ساعت (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1718,9 @@
<item quantity="one">برای %d دقیقه</item>
<item quantity="other">برای %d دقیقه</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">به مدت %d ساعت</item>
- <item quantity="other">به مدت %d ساعت</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d ساعت</item>
+ <item quantity="other">%d ساعت</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">برای %d ساعت</item>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> آن را بیصدا کرد"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"دستگاهتان یک مشکل داخلی دارد، و ممکن است تا زمانی که بازنشانی دادههای کارخانه انجام نگیرد، بیثبات بماند."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"دستگاهتان یک مشکل داخلی دارد. برای جزئیات آن با سازندهتان تماس بگیرید."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"درخواست USSD به درخواست DIAL اصلاح میشود."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"درخواست USSD به درخواست SS اصلاح میشود."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"درخواست USSD به درخواست USSD جدید اصلاح میشود."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"درخواست USSD به درخواست Video DIAL تغییر کرد."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"درخواست SS به درخواست DIAL اصلاح میشود."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"درخواست SS به درخواست Video DIAL تغییر کرد."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"درخواست SS به درخواست USSD اصلاح میشود."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"درخواست SS به درخواست SS جدید اصلاح میشود."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"درخواست USSD به تماس معمولی تغییر کرد"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"درخواست USSD بهدرخواست SS تغییر کرد"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"به درخواست USSD جدید تغییر کرد"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"درخواست USSD به تماس ویدیویی تغییر کرد"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"درخواست SS به تماس معمولی تغییر کرد"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"درخواست SS به تماس ویدیویی تغییر کرد"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"درخواست SS به درخواست USSD تغییر کرد"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"به درخواست SS جدید تغییر کرد"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"نمایه کاری"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"بزرگ کردن"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"کوچک کردن"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"سیمکارت مجوز لازم برای عملیات صوتی را ندارد"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"سیمکارت برای عملیات صوتی مجاز نیست"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"تلفن برای عملیات صوتی مجاز نیست"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"سیمکارت <xliff:g id="SIMNUMBER">%d</xliff:g> مجاز نیست"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"سیمکارت <xliff:g id="SIMNUMBER">%d</xliff:g> مجوز لازم را ندارد"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"سیمکارت <xliff:g id="SIMNUMBER">%d</xliff:g> مجاز نیست"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"سیمکارت <xliff:g id="SIMNUMBER">%d</xliff:g> مجاز نیست"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"پنجره بازشو"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"نسخه برنامه تنزل داده شده است یا با این میانبر سازگار نیست"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"برنامه مضر شناسایی شد"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> میخواهد تکههای <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ویرایش"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"دستگاهتان برای تماسها و اعلانها میلرزد"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"دستگاهتان برای تماسها و اعلانها بیصدا خواهد شد"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"تغییرات سیستم"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"مزاحم نشوید"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«مزاحم نشوید» اعلانها را پنهان میکند تا تمرکز شما به هم نریزد"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"این رفتار جدید است. برای تغییر ضربه بزنید."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«مزاحم نشوید» تغییر کرده است"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"برای بررسی تنظیمات رفتار شما دربرابر وقفهها، ضربه بزنید"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"برای بررسی موارد مسدودشده ضربه بزنید."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"سیستم"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"تنظیمات"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index a22e741..b119911 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ei äänipuheluja"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ei äänipalvelua tai hätäpuheluita"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Operaattorin tilapäisesti käytöstä poistama"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiiliverkkoon ei saada yhteyttä"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Kokeile vaihtaa ensisijaista verkkoa. Vaihda se napauttamalla."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hätäpuhelut eivät ole käytettävissä"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-banneri käytössä"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-banneri pois käytöstä"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Etsitään signaalia"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi-Fi-puhelujen käyttöönotto epäonnistui"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa. (Virhekoodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Virhe otettaessa Wi-Fi-puheluita käyttöön operaattorille <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi-puhelut: %s"</item>
@@ -481,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa sormenjälkimalleja."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"sormenjälkilaitteiston käyttö"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tunnistettu"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sormenjälkilaitteisto ei ole käytettävissä."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Syöttötapa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoiminnot"</string>
<string name="email" msgid="4560673117055050403">"Sähköposti"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Lähetä sähköposti valittuun osoitteeseen"</string>
<string name="dial" msgid="1253998302767701559">"Soita"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Soita valittuun puhelinnumeroon"</string>
<string name="map" msgid="6521159124535543457">"Paikanna"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Etsi valittu osoite kartalta"</string>
<string name="browse" msgid="1245903488306147205">"Avaa"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Avaa valittu URL-osoite"</string>
<string name="sms" msgid="4560537514610063430">"Viesti"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Lähetä viesti valittuun puhelinnumeroon"</string>
<string name="add_contact" msgid="7867066569670597203">"Lisää"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Lisää yhteystietoihin"</string>
<string name="view_calendar" msgid="979609872939597838">"Näytä"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Näytä valittu aika kalenterissa"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Aikataulu"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Ajoita tapahtuma valitulle ajalle"</string>
<string name="view_flight" msgid="7691640491425680214">"Seuraa"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Seuraa valittua lentoa"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Tallennustila loppumassa"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Kaikki järjestelmätoiminnot eivät välttämättä toimi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tallennustila ei riitä. Varmista, että vapaata tilaa on 250 Mt, ja käynnistä uudelleen."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Yhdistä avoimeen Wi‑Fi-verkkoon"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Yhdistä operaattorin Wi-Fi-verkkoon"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Yhdistetään Wi-Fi-verkkoon"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Yhdistetty Wi-Fi-verkkoon"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi-verkkoon yhdistäminen epäonnistui"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> näkyy sovellusten päällä"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Poista käytöstä"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Valmistellaan kohdetta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tarkistetaan virheiden varalta."</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Uusi <xliff:g id="NAME">%s</xliff:g> on havaittu."</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kuvien ja median siirtämiseen"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Vioittunut <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> on viallinen. Korjaa napauttamalla."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> on viallinen. Korjaa valitsemalla."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Epäyhteensopiva <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> ei ole yhteensopiva tämän laitteen kanssa. Ota se käyttöön tuetussa tilassa napauttamalla."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Tämä laite ei tue laitetta <xliff:g id="NAME">%s</xliff:g>. Valitse laite, niin voit suorittaa määrityksen tuetussa muodossa."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> poistettiin yllättäen"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Poista <xliff:g id="NAME">%s</xliff:g> käytöstä ennen sen irrottamista estääksesi tietoja katoamasta."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> on poistettu"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> on poistettu. Aseta uusi."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Kohteen <xliff:g id="NAME">%s</xliff:g> poisto on kesken…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Älä poista."</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Määritä asetukset"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Poista"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Tutustu"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> puuttuu."</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Liitä tämä laite uudelleen."</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Siirretään <xliff:g id="NAME">%s</xliff:g>."</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Siirretään tietoja."</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Siirto on valmis."</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Tiedot on siirretty kohteeseen <xliff:g id="NAME">%s</xliff:g>."</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Tietojen siirto epäonnistui."</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Tietoja jäi alkuperäiseen paikkaan."</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Irrotettu"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Poistettu"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Tarkistetaan…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Järjestelmänvalvoja asensi tämän."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Järjestelmänvalvoja päivitti tämän."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Järjestelmänvalvoja poisti tämän."</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Parantaakseen akun kestoa virransäästö vähentää laitteesi suorituskykyä ja rajoittaa värinää, sijaintipalveluita ja taustadataa tai poistaa ne käytöstä. Sähköposti, viestit ja muut synkronointiin perustuvat sovellukset eivät välttämättä päivity, ellet avaa niitä.\n\nVirransäästö poistuu käytöstä automaattisesti, kun laitteesi latautuu."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Otetaanko Data Saver käyttöön?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ota käyttöön"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Mykistänyt <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Laitteellasi on sisäinen ongelma, joka aiheuttaa epävakautta. Voit korjata tilanteen palauttamalla tehdasasetukset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Laitteesi yhdistäminen ei onnistu sisäisen virheen takia. Saat lisätietoja valmistajalta."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-pyyntö vaihdettu tavalliseksi puheluksi"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-pyyntö vaihdettu SS-pyynnöksi"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Vaihdettu uudeksi USSD-pyynnöksi"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-pyyntö vaihdettu videopuheluksi"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-pyyntö vaihdettu tavalliseksi puheluksi"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-pyyntö vaihdettu videopuheluksi"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-pyyntö vaihdettu USSD-pyynnöksi"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Vaihdettu uudeksi SS-pyynnöksi"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Työprofiili"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laajenna"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tiivistä"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kortti ei käyttäjien hallinnassa"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Äänipalvelujen käyttö ei sallittua SIM-kortilla"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Äänipalvelujen käyttö ei sallittua puhelimella"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Ponnahdusikkuna"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Sovellusversio on päivitetty vanhempaan versioon tai ei ole yhteensopiva tämän pikakuvakkeen kanssa."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 1ed7b8f..fd5ab0a 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun de service vocal ni d\'appel d\'urgence"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporairement désactivé par votre fournisseur de services"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible de joindre le réseau cellulaire"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Bannière d\'itinérance activée"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bannière d\'itinérance désactivée"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Impossible de configurer les appels Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Une erreur s\'est produite lors de l\'enregistrement des appels Wi-Fi avec votre fournisseur de services : <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Appels Wi-Fi %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trop de requêtes sont en cours de traitement. Veuillez réessayer plus tard."</string>
<string name="notification_title" msgid="8967710025036163822">"Erreur de connexion au compte <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniser"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synchronisation impossible"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Vous avez tenté de supprimer trop de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'espace de stockage du téléviseur est plein. Supprimez des fichiers pour libérer de l\'espace."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de cet appareil"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à la position de cet appareil?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à votre agenda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Messagerie texte"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envoyer et afficher des messages texte"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à envoyer et à afficher des messages texte?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accéder aux photos, aux contenus multimédias et aux fichiers sur votre appareil"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux photos, aux médias et aux fichiers de votre appareil?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à enregistrer de l\'audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et filmer des vidéos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à prendre des photos et à filmer des vidéos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à faire et à gérer les appels téléphoniques?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"désactiver le verrouillage de l\'écran"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gérer le matériel d\'empreinte digitale"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permet à l\'application de faire appel à des méthodes d\'ajout et de suppression de modèles d\'empreinte digitale que vous pouvez utiliser."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"utiliser le matériel d\'empreinte digitale"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Doigt non reconnu"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string>
<string name="email" msgid="4560673117055050403">"Courriel"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"Appel"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"Localiser"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"Message"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"Ajouter"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"Afficher"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"Calendrier"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"Effectuer le suivi"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1117,8 +1133,7 @@
<string name="new_app_action" msgid="6694851182870774403">"Ouvrir <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> va fermer sans enregistrement"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a dépassé la limite de mémoire"</string>
- <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
- <skip />
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"L\'empreinte de mémoire a été recueillie. Touchez ici pour la partager."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de mémoire?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Le processus <xliff:g id="PROC">%1$s</xliff:g> a dépassé sa limite de mémoire de <xliff:g id="SIZE">%2$s</xliff:g>. Vous pouvez partager son empreinte de mémoire avec son développeur. Attention : cette empreinte peut contenir certains de vos renseignements personnels auxquels l\'application a accès."</string>
<string name="sendText" msgid="5209874571959469142">"Sélectionner une action pour le texte"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connectez-vous pour ouvrir un réseau Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi du fournisseur de services"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connexion au réseau Wi-Fi en cours…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Touchez pour afficher tous les réseaux"</string>
@@ -1270,33 +1284,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> aff. contenu par-dessus applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalités, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation de « <xliff:g id="NAME">%s</xliff:g> » en cours"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs en cours..."</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire « <xliff:g id="NAME">%s</xliff:g> » a été détectée"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrompue : <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> est corrompu. Touchez pour corriger le problème."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Le média « <xliff:g id="NAME">%s</xliff:g> » est corrompu. Sélectionnez-le pour corriger la situation."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> ». Touchez pour la configurer dans un format compatible."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Cet appareil ne prend pas en charge ce média « <xliff:g id="NAME">%s</xliff:g> ». Sélectionnez-le pour le configurer dans un format compatible."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de la mémoire « <xliff:g id="NAME">%s</xliff:g> »"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire « <xliff:g id="NAME">%s</xliff:g> » avant de la retirer pour éviter toute perte de données."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » retirée"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"La mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » a été retirée. Insérez-en une autre."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Éjection de la mémoire « <xliff:g id="NAME">%s</xliff:g> »..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne pas retirer"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Découvrir"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage <xliff:g id="NAME">%s</xliff:g> manquante"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Réinsérez le dispositif"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Déplacement de <xliff:g id="NAME">%s</xliff:g> en cours..."</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données..."</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Déplacement terminé"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Données déplacées vers <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Imposs. de déplacer les données"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Les données sont restées à l\'emplacement d\'origine"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Supprimée"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Éjectée"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Vérification en cours…"</string>
@@ -1355,17 +1385,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"RPV permanent en cours de connexion…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"RPV permanent connecté"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Déconnecté du RPV permanent"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Impossible de se connecter au RPV permanent?"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Modifier les paramètres réseau ou RPV"</string>
<string name="upload_file" msgid="2897957172366730416">"Choisir un fichier"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="submit" msgid="1602335572089911941">"Envoyer"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"L\'application de conduite est en cours d\'exécution"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Touchez pour quitter l\'application de conduite."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Touchez pour configurer."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
@@ -1691,8 +1718,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mise à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Pour améliorer l\'autonomie de la pile, la fonction Économie d\'énergie réduit les performances de votre appareil et limite ou désactive la vibration, les services de localisation ainsi que la plupart des données en arrière-plan. Les applications de courriels, de messages et d\'autres qui reposent sur la synchronisation ne peuvent pas se mettre à jour, sauf si vous les ouvrez.\n\nLa fonction Économie d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pour aider à diminuer l\'utilisation des données, la fonction Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'Économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1743,22 +1769,14 @@
<string name="muted_by" msgid="6147073845094180001">"Mis en sourdine par <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à sa configuration d\'usine."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"La demande USSD a été remplacée par une demande d\'appel régulier"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"La demande USSD a été remplacée par une demande SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"La demande a été remplacée par une nouvelle demande USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"La demande USSD a été remplacée par une demande d\'appel vidéo"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"La demande SS a été remplacée par une demande d\'appel régulier"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"La demande SS a été remplacée par une demande d\'appel vidéo"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"La demande SS a été remplacée par une demande USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"La demande a été remplacée par une nouvelle demande SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
@@ -1856,6 +1874,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ce téléphone n\'est pas autorisé pour la voix"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre contextuelle"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application a été rétrogradée ou n\'est pas compatible avec ce raccourci"</string>
@@ -1876,8 +1902,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"C\'est un nouveau comportement. Touchez l\'écran pour changer vos options."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Les paramètres du mode Ne pas déranger ont changé"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Touchez l\'écran pour vérifier ce qui est bloqué."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Système"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Paramètres"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 34ebece..f167b6f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun service vocal ni d\'appels d\'urgence"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Service temporairement désactivé par votre opérateur"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible d\'accéder au réseau mobile"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer le réseau préféré. Appuyez pour le modifier."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Appels d\'urgence non disponibles"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Bannière d\'itinérance activée"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bannière d\'itinérance désactivée"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Impossible de configurer les appels Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Problème lors de l\'enregistrement des appels Wi‑Fi avec votre opérateur : <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Appels Wi-Fi %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement."</string>
<string name="notification_title" msgid="8967710025036163822">"Erreur de connexion au compte \"<xliff:g id="ACCOUNT">%1$s</xliff:g>\""</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniser"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synchronisation impossible"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Vous avez dépassé le nombre limite de tentatives de suppression de ce type de contenu : <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'espace de stockage du téléviseur est saturé. Pour libérer de l\'espace, veuillez supprimer des fichiers."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder à vos contacts ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de l\'appareil"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder à la position de cet appareil ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder à votre agenda ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envoyer et consulter des SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'envoyer et d\'afficher des SMS ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accéder à des photos, à des contenus multimédias et à des fichiers sur votre appareil"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder aux photos, contenus multimédias et fichiers sur votre appareil ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'enregistrer des contenus audio ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et enregistrer des vidéos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> de prendre des photos et de filmer des vidéos ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> de passer et gérer des appels téléphoniques ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder aux données des capteurs relatives à vos signes vitaux ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -492,6 +484,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permet à l\'application de communiquer avec des tags, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"Désactiver le verrouillage de l\'écran"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité via mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"utiliser les composants biométriques"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Autoriser l\'application à utiliser les composants biométriques pour l\'authentification"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Gérer le matériel d\'empreintes digitales"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Autoriser l\'application à invoquer des méthodes pour ajouter et supprimer des modèles d\'empreintes digitales"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Utiliser le matériel d\'empreintes digitales"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non reconnu"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Envoyer un e-mail à l\'adresse sélectionnée"</string>
<string name="dial" msgid="1253998302767701559">"Appeler"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Appeler le numéro de téléphone sélectionné"</string>
<string name="map" msgid="6521159124535543457">"Localiser"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localiser l\'adresse sélectionnée"</string>
<string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Ouvrir l\'URL sélectionnée"</string>
<string name="sms" msgid="4560537514610063430">"Envoyer un message"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Envoyer un message au numéro de téléphone sélectionné"</string>
<string name="add_contact" msgid="7867066569670597203">"Ajouter"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Ajouter aux contacts"</string>
<string name="view_calendar" msgid="979609872939597838">"Afficher"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Afficher l\'heure sélectionnée dans l\'agenda"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Planifier"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planifier un événement à l\'heure sélectionnée"</string>
<string name="view_flight" msgid="7691640491425680214">"Suivre"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Obtenir des informations sur le vol sélectionné"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1117,8 +1122,7 @@
<string name="new_app_action" msgid="6694851182870774403">"Ouvrir <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> va se fermer sans enregistrer les données"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé la limite de mémoire"</string>
- <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
- <skip />
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Une empreinte de la mémoire a bien été générée. Appuyez pour partager."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de la mémoire ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé sa limite de mémoire fixée à <xliff:g id="SIZE">%2$s</xliff:g>. Une empreinte de la mémoire est disponible pour que vous la communiquiez à son développeur. Attention : celle-ci peut contenir des informations personnelles auxquelles l\'application a accès."</string>
<string name="sendText" msgid="5209874571959469142">"Sélectionner une action pour le texte"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Se connecter pour ouvrir le réseau Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi de l\'opérateur"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connexion au réseau Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Appuyer pour afficher tous les réseaux"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation mémoire \"<xliff:g id="NAME">%s</xliff:g>\" en cours"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été détectée."</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer photos et fichiers"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" corrompue"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"La mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" est corrompue. Appuyez ici pour la réparer."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"La <xliff:g id="NAME">%s</xliff:g> est corrompue. Sélectionnez cette option pour résoudre le problème."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\". Appuyez ici pour le configurer dans un format accepté."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Cet appareil n\'est pas compatible avec cette <xliff:g id="NAME">%s</xliff:g>. Sélectionnez cette option pour la configurer dans un format accepté."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" avant de la retirer pour éviter toute perte de données."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" retirée"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"La mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été retirée. Insérez-en une autre."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Éjection de la mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne retirez pas la mémoire de stockage."</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Parcourir"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" manquante"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Réinsérez cette mémoire."</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfert de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données en cours"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Transfert terminé"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Les données ont bien été transférées sur la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Impossible de transférer données"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Les données sont restées à l\'emplacement d\'origine"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Supprimé"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Éjecté"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Vérification en cours…"</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Déconnecté du VPN permanent"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Impossible de se connecter au VPN permanent"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Modifier les paramètres réseau ou VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Sélectionner un fichier"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="submit" msgid="1602335572089911941">"Envoyer"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"L\'application de conduite est en cours d\'exécution"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Appuyez ici pour quitter l\'application de conduite."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Appuyez ici pour configurer."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mis à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances de votre appareil et limite le vibreur, les services de localisation et la plupart des données en arrière-plan. Vous devrez peut-être ouvrir manuellement vos applications d\'e-mail, de SMS/MMS et autres applications synchronisées pour les mettre à jour.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque l\'appareil est en charge."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'économiseur de données ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Son coupé par : <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne lié à votre appareil est survenu. Ce dernier risque d\'être instable jusqu\'à ce que vous rétablissiez la configuration d\'usine."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne lié à votre appareil est survenu. Veuillez contacter le fabricant pour en savoir plus."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Requête USSD transformée en appel standard"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Requête USSD transformée en requête SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Remplacement par une nouvelle requête USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Requête USSD transformée en appel vidéo"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Requête SS transformée en appel standard"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Requête SS transformée en appel vidéo"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Requête SS transformée en requête USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Remplacement par une nouvelle requête SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
@@ -1798,7 +1805,7 @@
<string name="user_encrypted_message" msgid="4923292604515744267">"Appuyer pour déverrouiller"</string>
<string name="user_encrypted_detail" msgid="5708447464349420392">"Infos sur utilis. verrouillées"</string>
<string name="profile_encrypted_detail" msgid="3700965619978314974">"Profil professionnel verrouillé"</string>
- <string name="profile_encrypted_message" msgid="6964994232310195874">"App. pour déver. profil profes."</string>
+ <string name="profile_encrypted_message" msgid="6964994232310195874">"Appuyez pour déverrouiller profil pro"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connecté à <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Appuyez ici pour voir les fichiers."</string>
<string name="pin_target" msgid="3052256031352291362">"Épingler"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Carte SIM non provisionnée pour les commandes vocales"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Carte SIM non autorisée pour les commandes vocales"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Téléphone non autorisé pour les commandes vocales"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> autres"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application est revenue à une version antérieure ou n\'est pas compatible avec cet raccourci"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Il s\'agit d\'un nouveau comportement. Appuyez pour modifier les paramètres."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Le mode Ne pas déranger a été modifié"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Appuyez pour vérifier les contenus bloqués."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Système"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Paramètres"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 2373b6c..9bbc82a 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Non hai servizo de chamadas de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Non hai servizo de voz nin chamadas de urxencia"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"O teu operador desactivou este servizo temporalmente"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"O teu operador desactivou este servizo temporalmente para a SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Non se puido conectar coa rede de telefonía móbil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Proba a cambiar a rede preferida. Toca para cambiar."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"As chamadas de emerxencia non están dispoñibles"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de itinerancia activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de itinerancia desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servizo"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Non se puideron configurar as chamadas por wifi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro solicítalle ao operador que configure este servizo. Despois, activa de novo as chamadas por wifi en Configuración. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Produciuse un problema ao rexistrar as chamadas por wifi co teu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chamadas wifi de %s"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Estanse a procesar demasiadas solicitudes. Téntao de novo máis tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de inicio de sesión en <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Non se puido realizar a sincronización"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Tentáronse eliminar demasiados elementos de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O almacenamento da tableta está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"O almacenamento do reloxo está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O almacenamento da televisión está cheo. Elimina algúns ficheiros para liberar espazo."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar ao perfil de traballo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder aos teus contactos"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda aos teus contactos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Localización"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder á localización deste dispositivo"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder ao teu calendario"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar e consultar mensaxes de SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envíe e vexa mensaxes SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a fotos, contido multimedia e ficheiros no teu dispositivo"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a fotos, contido multimedia e ficheiros no teu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar audio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grave audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> realice fotos e grave vídeos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> realice e xestione chamadas telefónicas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos do sensor sobre as túas constantes vitais"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda aos datos do sensor sobre as túas constantes vitais?"</string>
<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>
@@ -492,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que a aplicación invoque métodos para engadir e eliminar modelos de uso de impresión dixital."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"usar hardware de impresión dixital"</string>
@@ -504,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non se recoñece"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autenticouse a impresión dixital"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impresión dixital non dispoñible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string>
@@ -1016,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de introdución de texto"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Accións de texto"</string>
<string name="email" msgid="4560673117055050403">"Correo electrónico"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Envía un correo electrónico ao enderezo seleccionado"</string>
<string name="dial" msgid="1253998302767701559">"Chamar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Chama ao número de teléfono seleccionado"</string>
<string name="map" msgid="6521159124535543457">"Localizar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localiza o enderezo seleccionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abre o URL seleccionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensaxe"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Envía unha mensaxe ao número de teléfono seleccionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Engadir"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Engade o elemento aos contactos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Consulta a hora seleccionada no calendario"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programa o evento para a hora seleccionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Realizar seguimento"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Fai un seguimento do voo seleccionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Estase esgotando o espazo de almacenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"É posible que algunhas funcións do sistema non funcionen"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Non hai almacenamento suficiente para o sistema. Asegúrate de ter un espazo libre de 250 MB e reinicia o dispositivo."</string>
@@ -1117,8 +1120,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Seleccionar unha acción para o texto"</string>
@@ -1153,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conéctate a unha rede wifi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse á rede wifi dun operador"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Conectándose á rede wifi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectouse á rede wifi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Non se puido conectar á rede wifi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string>
@@ -1271,33 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> móstrase sobre outras aplicacións"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactívaa."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Detectouse unha <xliff:g id="NAME">%s</xliff:g> nova"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Comprobando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Revisando contido actual"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nova <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toca para configurar"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e contidos multimedia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danado"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"A <xliff:g id="NAME">%s</xliff:g> está danada. Toca para corrixir o problema."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Produciuse un problema coa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toca para solucionalo"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"A <xliff:g id="NAME">%s</xliff:g> está danada. Selecciona para corrixir o problema."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> incompatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo non é compatible con esta <xliff:g id="NAME">%s</xliff:g>. Toca para configurala nun formato compatible."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo non é compatible con esta <xliff:g id="NAME">%s</xliff:g>. Selecciona para configurala nun formato compatible."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retirouse a <xliff:g id="NAME">%s</xliff:g> de forma inesperada"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva a <xliff:g id="NAME">%s</xliff:g> antes de retirala para evitar a perda de datos"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Retirouse a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Retirouse a <xliff:g id="NAME">%s</xliff:g>. Insire unha nova"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Aínda expulsando a <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Non retirar"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Para evitar perder contido, expulsa os dispositivos multimedia antes de quitalos"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Quitouse a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"É posible que algunhas características non funcionen correctamente. Insire un dispositivo de almacenamento novo."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Expulsando a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Non quitar"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Falta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Volve inserir o dispositivo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Volve inserir o dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Migrando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Migrando datos"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Migración completa"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Migráronse os datos a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Non se puideron migrar os datos"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Quedan datos na localización orixinal"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Rematou a migración de contido"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Migrouse o contido á <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Non se puido migrar o contido"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Volve tentar migrar o contido"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando..."</string>
@@ -1356,17 +1358,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre activada conectándose..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre activada conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectácheste da VPN sempre activada"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Non se puido establecer conexión coa VPN sempre activada"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambia a configuración da rede ou da VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Escoller un ficheiro"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Non se seleccionou ningún ficheiro"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Estase executando a aplicación de condución"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toca para saír da aplicación de condución."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Conexión compartida ou zona wifi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tocar para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"A conexión compartida está desactivada"</string>
@@ -1692,8 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado polo teu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado polo teu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado polo teu administrador"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para ampliar a duración da batería, a función Aforro de batería reduce o rendemento do teu dispositivo e limita ou apaga a vibración, os servizos de localización e os datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que as abras.\n\nA función Aforro de batería desactívase automaticamente cando pos a cargar o dispositivo."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para contribuír a reducir o uso de datos, o Economizador de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Queres activar o economizador de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1744,22 +1742,14 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Produciuse un erro interno no teu dispositivo e quizais funcione de maneira inestable ata o restablecemento dos datos de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Produciuse un erro interno co teu dispositivo. Contacta co teu fabricante para obter máis información."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"A solicitude USSD transformouse nunha chamada normal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"A solicitude USSD transformouse nunha solicitude SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Transformouse nunha nova solicitude USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"A solicitude USSD transformouse nunha videochamada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"A solicitude SS transformouse nunha chamada normal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"A solicitude SS transformouse nunha videochamada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"A solicitude SS transformouse nunha solicitude USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Transformouse nunha nova solicitude SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de traballo"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Despregar"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
@@ -1857,6 +1847,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Non se introduciu ningunha tarxeta SIM para as accións de voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Non se permite a tarxeta SIM para as accións de voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Non se permite o teléfono para as accións de voz"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Non se permite usar a SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Non se inseriu a SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Non se permite usar a SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Non se permite usar a SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventá emerxente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> máis"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A aplicación mudou a unha versión anterior ou non é compatible con este atallo"</string>
@@ -1877,8 +1871,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é un comportamento novo. Toca para cambialo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Non molestar cambiou"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para comprobar o contido bloqueado."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Configuración"</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 36dadd6..1ea5c5a 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"કોઈ વૉઇસ સેવા નથી"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"કોઈ વૉઇસ સેવા અથવા કટોકટીની કૉલિંગ સેવા નથી"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"તમારા કૅરિઅરે હંગામી રૂપે બંધ કરી છે"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"મોબાઇલ નેટવર્ક સુધી પહોંચી શકાતું નથી"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"પસંદગીનું નેટવર્ક બદલવાનો પ્રયાસ કરો. બદલવા માટે ટૅપ કરો."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"કટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"રોમિંગ બેનર ચાલુ"</string>
<string name="roamingText12" msgid="1189071119992726320">"રૉમિંગ બૅનર બંધ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"સેવા શોધી રહ્યું છે"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"વાઇ-ફાઇ કૉલિંગ સેટ કરી શકાયું નથી"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"વાઇ-ફાઇ પરથી કૉલ કરવા અને સંદેશા મોકલવા માટે પહેલાં તમારા કૅરિઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી વાઇ-ફાઇ કૉલિંગ ફરીથી ચાલુ કરો. (ભૂલ કોડ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"તમારા કૅરિઅરમાં વાઇ-ફાઇ કૉલિંગ રજિસ્ટર કરવામાં સમસ્યા આવી: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s વાઇ-ફાઇ કૉલિંગ"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ઘણી બધી વિનંતીઓ પર પ્રક્રિયા કરવામાં આવી રહી છે. પછીથી ફરી પ્રયાસ કરો."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> માટે સાઇન ઇન ભૂલ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"સમન્વયન"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"સિંક કરી શકાતું નથી"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ઘણા બધા <xliff:g id="CONTENT_TYPE">%s</xliff:g> ડિલીટ કરવાનો પ્રયાસ કર્યો."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ટેબ્લેટ સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ઘડિયાળ સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"કાર્યાલયની પ્રોફાઇલ પર સ્વિચ કરો"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"સંપર્કો"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"તમારા સંપર્કોને ઍક્સેસ કરવાની"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા સંપર્કોને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"સ્થાન"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"કૅલેન્ડર"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા કૅલેન્ડરને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS સંદેશા મોકલવાની અને જોવાની"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને SMS સંદેશા મોકલવા અને જોવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"સ્ટોરેજ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"તમારા ઉપકરણ પર ફોટો, મીડિયા અને ફાઇલો ઍક્સેસ કરવાની"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા ઉપકરણ પર ફોટા, મીડિયા અને ફાઇલોને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"માઇક્રોફોન"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ઑડિઓ રેકોર્ડ કરવાની"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને ઑડિઓ રેકૉર્ડ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"કૅમેરો"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ચિત્રો લેવાની અને વીડિઓ રેકોર્ડ કરવાની"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને ચિત્રો લેવાની અને વીડિઓ રેકૉર્ડ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ફોન"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ફોન કૉલ કરો અને સંચાલિત કરો"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને ફોન કૉલ કરવાની અને તેને મેનેજ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"બોડી સેન્સર્સ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારી મહત્વપૂર્ણ સહી વિશેના સેન્સર ડેટાને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"વિંડો સામગ્રી પુનર્પ્રાપ્ત કરો"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયાપ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોની સામગ્રીની તપાસ કરો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"સ્પર્શ કરીને શોધખોળ કરવું સક્ષમ કરો"</string>
@@ -349,11 +341,11 @@
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ટેક્સ્ટ સંદેશા (WAP) પ્રાપ્ત કરો"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"એપ્લિકેશનને WAP સંદેશા પ્રાપ્ત કરવાની અને તેના પર પ્રક્રિયા કરવાની મંજૂરી આપે છે. આ પરવાનગીમાં તમને દર્શાવ્યા વિના તમને મોકલેલ સંદેશાઓનું નિરીક્ષણ કરવાની અને કાઢી નાખવાની ક્ષમતાનો સમાવેશ થાય છે."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ચાલુ ઍપ્લિકેશનો પુનઃપ્રાપ્ત કરો"</string>
- <string name="permdesc_getTasks" msgid="7454215995847658102">"એપ્લિકેશનને વર્તમાનમાં અને તાજેતરમાં ચાલી રહેલ કાર્યો વિશેની વિગતવાર માહિતી પુનઃપ્રાપ્ત કરવાની મંજૂરી આપે છે. આ એપ્લિકેશનને ઉપકરણ પર કઈ એપ્લિકેશન્સનો ઉપયોગ થાય છે તેના વિશેની માહિતી શોધવાની મંજૂરી આપી શકે છે."</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"એપ્લિકેશનને વર્તમાનમાં અને તાજેતરમાં ચાલી રહેલ Tasks વિશેની વિગતવાર માહિતી પુનઃપ્રાપ્ત કરવાની મંજૂરી આપે છે. આ એપ્લિકેશનને ઉપકરણ પર કઈ એપ્લિકેશન્સનો ઉપયોગ થાય છે તેના વિશેની માહિતી શોધવાની મંજૂરી આપી શકે છે."</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"પ્રોફાઇલ અને ઉપકરણ માલિકોને સંચાલિત કરો"</string>
<string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"એપ્લિકેશન્સને પ્રોફાઇલ માલિકો અને ઉપકરણ માલિકો સેટ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"ચાલુ એપ્લિકેશન્સને ફરી ગોઠવો"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"ઍપ્લિકેશનને અગ્રભૂમિ અને પૃષ્ટભૂમિમાં કાર્યો ખસેડવાની મંજૂરી આપે છે. તમારા ઇનપુટ વિના ઍપ્લિકેશન આ કરી શકે છે."</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"ઍપ્લિકેશનને અગ્રભૂમિ અને પૃષ્ટભૂમિમાં Tasks ખસેડવાની મંજૂરી આપે છે. તમારા ઇનપુટ વિના ઍપ્લિકેશન આ કરી શકે છે."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"કાર મોડ સક્ષમ કરો"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"એપ્લિકેશનને કાર મોડ સક્ષમ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"અન્ય ઍપ્લિકેશનો બંધ કરો"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ઍપ્લિકેશનને નિઅર ફીલ્ડ કમ્યુનિકેશન (NFC) ટૅગ, કાર્ડ અને રીડર સાથે સંચાર કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"તમારું સ્ક્રીન લૉક અક્ષમ કરો"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"એપ્લિકેશનને કીલૉક અને કોઈપણ સંકળાયેલ પાસવર્ડ સુરક્ષા અક્ષમ કરવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, ઇનકમિંગ ફોન કૉલ પ્રાપ્ત કરતી વખતે ફોન, કીલૉકને અક્ષમ કરે છે, પછી કૉલ સમાપ્ત થઈ જવા પર કીલૉક ફરીથી સક્ષમ કરે છે."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ફિંગરપ્રિન્ટ હાર્ડવેરને સંચાલિત કરો"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"એપ્લિકેશનને ઉપયોગ માટે ફિંગરપ્રિન્ટ નમૂના ઉમેરવા અને કાઢી નાખવા માટે પદ્ધતિઓની વિનંતી કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ફિંગરપ્રિન્ટ હાર્ડવેરનો ઉપયોગ કરો"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ઓળખાયેલ નથી"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ફિંગરપ્રિન્ટ હાર્ડવેર ઉપલબ્ધ નથી."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ફિંગરપ્રિન્ટ સંગ્રહિત કરી શકાતી નથી. કૃપા કરીને અસ્તિત્વમાંની ફિંગરપ્રિન્ટ દૂર કરો."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string>
@@ -1016,16 +1014,34 @@
<string name="inputMethod" msgid="1653630062304567879">"ઇનપુટ પદ્ધતિ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ટેક્સ્ટ ક્રિયાઓ"</string>
<string name="email" msgid="4560673117055050403">"ઇમેઇલ"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"કૉલ કરો"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"શોધો"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"ખોલો"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"સંદેશ મોકલો"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"ઉમેરો"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"જુઓ"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"શેડ્યૂલ કરો"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ટ્રૅક કરો"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"સ્ટોરેજ સ્થાન સમાપ્ત થયું"</string>
- <string name="low_internal_storage_view_text" msgid="6640505817617414371">"કેટલાક સિસ્ટમ કાર્યો કામ કરી શકશે નહીં"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"કેટલાક સિસ્ટમ Tasks કામ કરી શકશે નહીં"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"સિસ્ટમ માટે પર્યાપ્ત સ્ટોરેજ નથી. ખાતરી કરો કે તમારી પાસે 250MB ખાલી સ્થાન છે અને ફરીથી પ્રારંભ કરો."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> ચાલી રહી છે"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"વધુ માહિતી માટે અથવા ઍપ્લિકેશન રોકવા માટે ટૅપ કરો."</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"ટેક્સ્ટ માટે ક્રિયા પસંદ કરો"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ખુલ્લા વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"કૅરિઅરના વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"કનેક્ટ કરી રહ્યાં છીએ તે વાઇ-ફાઇ નેટવર્ક"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કર્યુ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરી શકાયું નથી"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર દેખાઈ છે"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"બંધ કરો"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ને તૈયાર કરી રહ્યું છે"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ભૂલો માટે તપાસી રહ્યું છે"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"નવું <xliff:g id="NAME">%s</xliff:g> મળ્યું"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ફોટો અને મીડિયા ટ્રાન્સફર કરવા માટે"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"દૂષિત <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. ઠીક કરવા માટે ટૅપ કરો."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. સુધારવા માટે પસંદ કરો."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"અસમર્થિત <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફોર્મેટમાં સેટ કરવા માટે ટૅપ કરો."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફૉર્મેટમાં સેટ કરવા માટે પસંદ કરો."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> અનપેક્ષિત રીતે દૂર કર્યું"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ડેટા નુકસાનને ટાળવા માટે <xliff:g id="NAME">%s</xliff:g> ને દૂર કરતાં પહેલાં અનમાઉન્ટ કરો."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> દૂર કર્યું"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> દૂર કર્યું; એક નવું શામેલ કરો"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"હજીએ <xliff:g id="NAME">%s</xliff:g> ને બહાર કાઢી રહ્યાં છે…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"દૂર કરશો નહીં"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ખૂટે છે"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"આ ઉપકરણ ફરીથી દાખલ કરો"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ખસેડી રહ્યાં છીએ"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ડેટાને ખસેડી રહ્યાં છીએ"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ખસેડવાનું પૂર્ણ થયું"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ડેટાને <xliff:g id="NAME">%s</xliff:g> પર ખસેડી રહ્યાં છીએ"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ડેટા ખસેડી શક્યાં નથી"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"મૂળ સ્થાન પર બાકી ડેટા"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"દૂર કર્યું"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"બહાર કાઢ્યું"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"તપાસી રહ્યું છે..."</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"હંમેશા-ચાલુ VPN કનેક્ટ થઈ રહ્યું છે…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"હંમેશા-ચાલુ VPN કનેક્ટ થયું"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"હંમેશાં-ચાલુ VPN થી ડિસ્કનેક્ટ થયું"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"હંમેશાં-ચાલુ VPN સાથે કનેક્ટ કરી શકાયું નથી"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"નેટવર્ક અથવા VPN સેટિંગ્સ બદલો"</string>
<string name="upload_file" msgid="2897957172366730416">"ફાઇલ પસંદ કરો"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"કોઈ ફાઇલ પસંદ કરેલી નથી"</string>
<string name="reset" msgid="2448168080964209908">"ફરીથી સેટ કરો"</string>
<string name="submit" msgid="1602335572089911941">"સબમિટ કરો"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ડ્રાઇવિંગ ઍપ ચાલી રહી છે"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ડ્રાઇવિંગ ઍપથી બહાર નીકળવા માટે ટૅપ કરો."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ટિથરિંગ અથવા હૉટસ્પૉટ સક્રિય"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"સેટ કરવા માટે ટૅપ કરો."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ટિથરિંગ અક્ષમ કરેલ છે"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"તમારા વ્યવસ્થાપક દ્વારા ઇન્સ્ટૉલ કરવામાં આવેલ છે"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"બૅટરીની આવરદા વધારવામાં સહાય કરવા માટે, બૅટરી સેવર તમારા ઉપકરણના કાર્યપ્રદર્શનને ઘટાડે છે અને વાઇબ્રેશન, સ્થાન સેવાઓ અને બૅકગ્રાઉન્ડ ડેટાને સીમિત કરે છે અથવા બંધ કરે છે. ઇમેઇલ, મેસેજિંગ અને અન્ય ઍપ જે સિંક થવા પર આધાર રાખે છે, તેઓ કદાચ તમે ખોલો નહીં ત્યાં સુધી અપડેટ થશે નહીં.\n\nજ્યારે તમારું ઉપકરણ ચાર્જ થઈ રહ્યું હોય ત્યારે બૅટરી સેવર આપમેળે બંધ થઈ જતું હોય છે."</string>
<string name="data_saver_description" msgid="6015391409098303235">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપ્લિકેશનોને પૃષ્ઠભૂમિમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ્લિકેશન ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ડેટા સેવર ચાલુ કરીએ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ચાલુ કરો"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> દ્વારા મ્યૂટ કરાયું"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે અને જ્યાં સુધી તમે ફેક્ટરી ડેટા ફરીથી સેટ કરશો નહીં ત્યાં સુધી તે અસ્થિર રહી શકે છે."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે. વિગતો માટે તમારા નિર્માતાનો સંપર્ક કરો."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD વિનંતીને નિયમિત કૉલમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD વિનંતીને SS વિનંતીમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"નવી USSD વિનંતીમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD વિનંતીને વીડિઓ કૉલમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS વિનંતીને નિયમિત કૉલમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS વિનંતીને વીડિઓ કૉલમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS વિનંતીને USSD વિનંતીમાં બદલવામાં આવી છે"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"નવી SS વિનંતીમાં બદલવામાં આવી છે"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"કાર્યાલયની પ્રોફાઇલ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"વિસ્તૃત કરો"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"સંકુચિત કરો"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"આ સિમમાં વૉઇસ માટે કોઈ જોગવાઈ નથી"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"વૉઇસ માટે આ સિમને મંજૂરી નથી"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"વૉઇસ માટે આ ફોનને મંજૂરી નથી"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"આ ઍપનું વર્ઝન ડાઉનગ્રેડ કરવામાં આવ્યું છે અથવા આ શૉર્ટકટ સાથે સુસંગત નથી"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"આ નવી વર્તણૂક છે. બદલવા માટે ટૅપ કરો."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"શું બ્લૉક કરેલ છે તે તપાસવા માટે ટૅપ કરો."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"સિસ્ટમ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"સેટિંગ"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 57f841b..3b4f26a 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -82,10 +82,12 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कोई वॉइस सेवा नहीं है"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"सामान्य (वॉइस) कॉल या आपातकालीन कॉल पर रोक लगा दी गई है"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने सेवा पर कुछ समय के लिए रोक लगा दी है"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क से कनेक्ट नहीं किया जा सका"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"पसंदीदा नेटवर्क बदलकर देखें. बदलने के लिए टैप करें."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आपातकालीन कॉल करने की सुविधा उपलब्ध नहीं है"</string>
- <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"वाई-फ़ाई नेटवर्क पर आपातकालीन कॉल नहीं की जा सकती"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"वाई-फ़ाई के ज़रिए आपातकालीन कॉल नहीं किया जा सकता"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल को दूसरे नंबर पर भेजना"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिंग बैनर चालू"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिंग बैनर बंद"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"नेटवर्क खोज रहा है"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"वाई-फ़ाई कॉलिंग की सुविधा सेट नहीं की जा सकी"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"वाई-फ़ाई से फ़ोन करने और मैसेज भेजने के लिए, सबसे पहले अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से इस सेवा को सेट अप करने के लिए कहें. उसके बाद सेटिंग से वाई-फ़ाई कॉलिंग को फिर से चालू करें. (गड़बड़ी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"वाई-फ़ाई कॉलिंग की सुविधा के लिए आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के साथ रजिस्टर करने से जुड़ी समस्या: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s वाई-फ़ाई कॉलिंग"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"बहुत सारे अनुरोधों का संसाधन हो रहा है. बाद में पुन: प्रयास करें."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> के लिए प्रवेश गड़बड़ी"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"समन्वयन"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"सिंक नहीं किया जा सकता"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"बहुत ज़्यादा <xliff:g id="CONTENT_TYPE">%s</xliff:g> मिटाने की कोशिश की गई."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"टैबलेट की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"घड़ी की मेमोरी भर गई है. स्थान खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"टीवी की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"प्रोफ़ाइल बदलकर कार्य प्रोफ़ाइल पर जाएं"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"अपने संपर्कों को ऐक्सेस करने की"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने संपर्क देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"जगह"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस की जगह तक पहुंचने दें"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को इस डिवाइस की जगह की जानकारी देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"अपने कैलेंडर को ऐक्सेस करने"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपना कैलेंडर देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"मैसेज (एसएमएस)"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"मैसेज (एसएमएस) भेजें और देखें"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को एसएमएस (मैसेज) भेजने और देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"मेमोरी"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडियो रिकॉर्ड करें"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को ऑडियो रिकॉर्ड करने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"कैमरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्र लेने और वीडियो रिकॉर्ड करने"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को फ़ोटो खींचने और वीडियो रिकॉर्ड करने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"फ़ोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फ़ोन कॉल करें और प्रबंधित करें"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर संवेदक"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने स्वास्थ्य से जुड़ी ज़रूरी जानकारी इस्तेमाल करने की अनुमति देना चाहते हैं?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री प्राप्त करें"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छूकर, उससे जुड़ी जानकारी सुनने की सुविधा चालू करें"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ऐप्स को नियर फ़ील्ड कम्यूनिकेशन (NFC) टैग, कार्ड, और रीडर के साथ संचार करने देता है."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"अपना स्क्रीन लॉक अक्षम करें"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा अक्षम करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल प्राप्त करते समय फ़ोन, कीलॉक को अक्षम कर देता है, फिर कॉल समाप्त होने पर कीलॉक को पुन: सक्षम कर देता है."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"उंगली की छाप के लिए हार्डवेयर को प्रबंधित करें"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"उंगली की छाप वाले टेम्पलेट का उपयोग करने के लिए जोड़ने और हटाने हेतु ऐप को विधियां प्रारंभ करने देती है."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"उंगली की छाप के लिए हार्डवेयर का उपयोग करें"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"पहचाना नहीं गया"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फ़िंगरप्रिंट हार्डवेयर उपलब्ध नहीं है."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहित नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"इनपुट विधि"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"लेख क्रियाएं"</string>
<string name="email" msgid="4560673117055050403">"ईमेल करें"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"कॉल करें"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"पता लगाएं"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"खोलें"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"मैसेज"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"जोड़ें"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"देखें"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"शेड्यूल करें"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"मौजूदा स्थिति जानें"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"मेमोरी में जगह नहीं बची है"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"हो सकता है कुछ सिस्टम फ़ंक्शन कार्य न करें"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टम के लिए ज़रूरी मेमोरी नहीं है. पक्का करें कि आपके पास 250एमबी की खाली जगह है और फिर से शुरू करें."</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"मैसेज करने के लिए कोई कार्रवाई चुनें"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"वाई-फ़ाई नेटवर्क से जोड़ा जा रहा है"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"वाई-फ़ाई नेटवर्क से कनेक्ट हो गया है"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाई-फ़ाई नेटवर्क से कनेक्ट नहीं हो सका"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
@@ -1270,33 +1284,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करें"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> को तैयार किया जा रहा है"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटियों की जाँच कर रहा है"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नए <xliff:g id="NAME">%s</xliff:g> का पता लगा"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फ़ोटो और मीडिया ट्रांसफर करने के लिए"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"दूषित <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> दूषित है. ठीक करने के लिए टैप करें."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> काम नहीं कर रहा है. ठीक करने के लिए चुनें."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"यह डिवाइस इस <xliff:g id="NAME">%s</xliff:g> का समर्थन नहीं करता है. समर्थित प्रारूप में सेट करने के लिए टैप करें."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"इस डिवाइस पर <xliff:g id="NAME">%s</xliff:g> काम नहीं करता है. काम करने वाले प्रारूप में सेट अप करने के लिए चुनें."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूप से निकाला गया"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा हानि से बचने के लिए <xliff:g id="NAME">%s</xliff:g> को निकालने से पहले अनमाउंट करें"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> निकाल दिया गया"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> निकाल दिया गया है; नया डालें"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> अभी भी निकाला जा रहा है…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"निकालें नहीं"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गुम है"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"इस डिवाइस को पुन: लगाएं"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> को ले जाया जा रहा है"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"डेटा ले जाया जा रहा है"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ले जाना पूर्ण हुआ"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"डेटा को <xliff:g id="NAME">%s</xliff:g> पर ले जाया गया"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"डेटा नहीं ले जाया जा सका"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा शुरुआती जगह पर छूट गया है"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"निकाल दिया गया"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"निकाला गया"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"जाँच की जा रही है..."</string>
@@ -1355,17 +1385,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"हमेशा-चालू VPN कनेक्ट हो रहा है…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"हमेशा-चालू VPN कनेक्ट है"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"हमेशा चालू रहने वाले VPN से डिसकनेक्ट किया गया"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"हमेशा चालू रहने वाले वीपीएन से नहीं जुड़ पाया"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क या VPN सेटिंग बदलें"</string>
<string name="upload_file" msgid="2897957172366730416">"फ़ाइल चुनें"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"कोई फ़ाइल चुनी नहीं गई"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करें"</string>
<string name="submit" msgid="1602335572089911941">"सबमिट करें"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ड्राइविंग ऐप्लिकेशन चल रहा है"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ड्राइविंग ऐप्लिकेशन से निकलने के लिए टैप करें."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग या हॉटस्पॉट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेट करने के लिए टैप करें."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग अक्षम है"</string>
@@ -1691,8 +1718,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपके व्यवस्थापक ने इंस्टॉल किया है"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपके व्यवस्थापक ने हटा दिया है"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर आपके डिवाइस पर सिर्फ़ ज़रूरी ऐप्लिकेशन को काम करने देता है. इस सुविधा के चालू होने पर, वाइब्रेशन, जगह की जानकारी से जुड़ी सेवाओं और बैकग्राउंड डेटा का इस्तेमाल या तो बहुत कम हो जाता है या पूरी तरह से बंद हो जाता है. आपके डिवाइस पर ईमेल, मैसेज और ऐसे दूसरे ऐप्लिकेशन मौजूद होते हैं, जिनमें डेटा सिंक होता है. बैटरी सेवर चालू होने पर इन ऐप्लिकेशन में नए ईमेल, मैसेज और दूसरी जानकारी तब तक नहीं जुड़ेगी, जब तक आप इन्हें नहीं खोलेंगे.\n\nजब आपका डिवाइस चार्ज हो रहा होता है, तब बैटरी सेवर की सुविधा अपने आप बंद हो जाती है."</string>
<string name="data_saver_description" msgid="6015391409098303235">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप को बैकग्राउंड में डेटा भेजने या पाने से रोकता है. आप फ़िलहाल जिस एेप का इस्तेमाल कर रहे हैं वह डेटा तक पहुंच सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इसे समझिये कि तस्वीर तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करें"</string>
@@ -1743,22 +1769,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा म्यूट किया गया"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"आपके डिवाइस में कोई अंदरूनी समस्या है और यह तब तक ठीक नहीं होगी जब तक आप फ़ैक्टरी डेटा रीसेट नहीं करते."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"आपके डिवाइस के साथ कोई आंतरिक गड़बड़ी हुई. विवरणों के लिए अपने निर्माता से संपर्क करें."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"यूएसएसडी कोड चलाने के अनुरोध को सामान्य कॉल में बदला गया"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"यूएसएसडी कोड चलाने के अनुरोध को एसएस कोड चलाने के अनुरोध में बदला गया"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"यूएसएसडी कोड चलाने के नए अनुरोध में बदला गया"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"यूएसएसडी कोड चलाने के अनुरोध को वीडियो कॉल में बदला गया"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"एसएस कोड चलाने के अनुरोध को सामान्य कॉल में बदला गया"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"एसएस कोड चलाने के अनुरोध को वीडियो कॉल में बदला गया"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"एसएस कोड चलाने के अनुरोध को यूएसएसडी कोड चलाने के अनुरोध में बदला गया"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"एसएस कोड चलाने के नए अनुरोध में बदला गया"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफ़ाइल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तार करें"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"छोटा करें"</string>
@@ -1856,6 +1874,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"सिम से कॉल करने की इजाज़त नहीं है"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"सिम से कॉल करने की इजाज़त नहीं है"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"फ़ोन से कॉल करने की इजाज़त नहीं है"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ऐप्लिकेशन का वर्शन पुराना हो चुका है या यह इस शॉर्टकट के साथ काम नहीं करता"</string>
@@ -1876,8 +1902,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यह नई सुविधा है. बदलने के लिए टैप करें."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"परेशान न करें की सुविधा बदल गई है"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"टैप करके देखें कि किन चीज़ों पर रोक लगाई गई है."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"सिस्टम"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"सेटिंग"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 22affdb..e8cdfde 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -83,6 +83,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nema glasovnih usluga"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nema glasovne usluge ni hitnih poziva"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Privremeno isključio vaš mobilni operater"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Uslugu je privremeno isključio mobilni operater za SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilna mreža nije dostupna"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Pokušajte promijeniti preferiranu mrežu. Dodirnite da biste je promijenili."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hitni pozivi nisu dostupni"</string>
@@ -121,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Uključen je natpis roaminga"</string>
<string name="roamingText12" msgid="1189071119992726320">"Isključen je natpis roaminga"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pretraživanje usluge"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Postavljanje Wi‑Fi poziva nije uspjelo"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Da biste telefonirali i slali poruke putem Wi-Fi-ja, od mobilnog operatera morate tražiti da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u postavkama. (Kôd pogreške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Poteškoća s registracijom Wi‑Fi poziva kod mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi pozivanje"</item>
@@ -160,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"U obradi je previše zahtjeva. Pokušajte ponovo kasnije."</string>
<string name="notification_title" msgid="8967710025036163822">"Pogreška prijave za račun <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkronizacija"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sinkronizacija nije moguća"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pokušalo se izbrisati previše sadržaja (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Prostor za pohranu tabletnog računala pun je. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Prostor za pohranu na televizoru je pun. Izbrišite neke datoteke da biste oslobodili prostor."</string>
@@ -275,40 +275,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Prijeđite na radni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupati vašim kontaktima"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa vašim kontaktima?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupiti lokaciji ovog uređaja"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupati kalendaru"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"slati i pregledavati SMS poruke"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da šalje i pregledava SMS poruke?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za pohranu"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupiti fotografijama, medijima i datotekama na vašem uređaju"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa fotografijama, medijima i datotekama na vašem uređaju?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snimati zvuk"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da snima audiozapise?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparat"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"snimati fotografije i videozapise"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da snima fotografije i videozapise?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uspostavljati telefonske pozive i upravljati njima"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da upućuje telefonske pozive i upravlja njima?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Biometrijski senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa podacima senzora o vašim vitalnim znakovima?"</string>
<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>
@@ -495,6 +486,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka otisaka prstiju koji će se upotrijebiti."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"upotreba hardvera za čitanje otisaka prstiju"</string>
@@ -507,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznat"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentificirano otiskom prsta"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string>
@@ -1036,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje s tekstom"</string>
<string name="email" msgid="4560673117055050403">"E-pošta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Slanje e-poruke na odabranu adresu"</string>
<string name="dial" msgid="1253998302767701559">"Poziv"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Pozivanje odabranog telefonskog broja"</string>
<string name="map" msgid="6521159124535543457">"Lociraj"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Prikaz odabrane adrese na karti"</string>
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otvaranje odabranog URL-a"</string>
<string name="sms" msgid="4560537514610063430">"Poruka"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Slanje poruke na odabrani telefonski broj"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Dodavanje u kontakte"</string>
<string name="view_calendar" msgid="979609872939597838">"Prikaži"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Prikaz odabranog vremena u kalendaru"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Raspored"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Zakazivanje događaja za određeno vrijeme"</string>
<string name="view_flight" msgid="7691640491425680214">"Prati"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Praćenje odabranog leta"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ponestaje prostora za pohranu"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke sistemske funkcije možda neće raditi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno pohrane za sustav. Oslobodite 250 MB prostora i pokrenite uređaj ponovo."</string>
@@ -1137,8 +1140,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Izaberite radnju za tekst"</string>
@@ -1175,8 +1177,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povezivanje s otvorenom Wi‑Fi mrežom"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se s Wi‑Fi mrežom mobilnog operatera"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Povezivanje s Wi-Fi mrežom"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezano s Wi-Fi mrežom"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije uspjelo povezivanje s Wi-Fi mrežom"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string>
@@ -1292,33 +1293,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Apl. <xliff:g id="NAME">%s</xliff:g> zakriva druge aplikacije"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Isključi"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema uređaja <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Traženje pogrešaka"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Otkriven je novi uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Provjeravanje medija <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Pregled trenutačnog sadržaja"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novi medij <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Dodirnite za postavljanje"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prijenos fotografija i medija"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Oštećeni medij za pohranu <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ima pogrešku. Dodirnite da biste je ispravili."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Poteškoća s medijem <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Dodirnite za popravak"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Medij je oštećen (<xliff:g id="NAME">%s</xliff:g>). Odaberite da biste ispravili pogrešku."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodržani medij za pohranu <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Uređaj ne podržava ovaj medij (<xliff:g id="NAME">%s</xliff:g>). Dodirnite da biste ga postavili u podržanom formatu."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ovaj uređaj ne podržava taj medij (<xliff:g id="NAME">%s</xliff:g>). Odaberite da biste postavili u podržanom formatu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Uređaj <xliff:g id="NAME">%s</xliff:g> iznenada je uklonjen"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> prije uklanjanja da ne biste izgubili podatke"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uklonjen je uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Uklonjen je uređaj <xliff:g id="NAME">%s</xliff:g>; umetnite novi"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"I dalje se izbacuje <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne uklanjajte"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Izbacite medij prije uklanjanja kako ne biste izgubili sadržaj"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Medij <xliff:g id="NAME">%s</xliff:g> uklonjen je"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Neke funkcije možda neće pravilno raditi. Umetnite novi medij za pohranu."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Izbacivanje medija <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne uklanjajte"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Postavljanje"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Ponovo umetnite uređaj"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo umetnite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premještanje aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Premještanje podataka"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Premještanje dovršeno"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Podaci su premješteni u pohranu <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Podaci nisu premješteni"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Podaci su ostali na izvornoj lokaciji"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Dovršen je prijenos sadržaja"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Sadržaj je premješten na medij <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Sadržaj nije premješten"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Pokušajte ponovo premjestiti sadržaj"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Uklonjen"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Izbačen"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Provjeravanje…"</string>
@@ -1377,17 +1379,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje s uvijek uključenom VPN mrežom…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan s uvijek uključenom VPN mrežom"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Prekinuta je veza s uvijek uključenim VPN-om"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Povezivanje s uvijek uključenim VPN-om nije bilo moguće"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Promijenite mrežu ili postavke VPN-a"</string>
<string name="upload_file" msgid="2897957172366730416">"Odaberite datoteku"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nema odabranih datoteka"</string>
<string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string>
<string name="submit" msgid="1602335572089911941">"Pošalji"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Pokrenuta je aplikacija za vožnju"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Dodirnite za zatvaranje aplikacije za vožnju."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Ograničenje ili aktivan hotspot"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste postavili."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Modemsko je povezivanje onemogućeno"</string>
@@ -1882,6 +1881,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM nije omogućen za glasovne pozive"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM nije dopušten za glasovne pozive"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije dopušten za glasovne pozive"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dopušten"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije pružen"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dopušten"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nije dopušten"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Skočni prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikacija je vraćena na stariju verziju ili verzija nije kompatibilna s ovim prečacem"</string>
@@ -1902,8 +1905,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da biste ga promijenili."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Promijenjena je postavka Ne uznemiravaj"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da biste provjerili što je blokirano."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sustav"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Postavke"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 8c19e3f..b140c80 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hangszolgáltatás letiltva"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nincs hanghívás vagy segélyhívás"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"A szolgáltató ideiglenesen kikapcsolta"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"A mobilhálózat nem érhető el"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Próbálja meg módosítani a preferált hálózatot. Koppintson a módosításhoz."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Segélyhívás nem lehetséges"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Barangolást jelző szalaghirdetés bekapcsolva"</string>
<string name="roamingText12" msgid="1189071119992726320">"Barangolást jelző szalaghirdetés kikapcsolva"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Szolgáltatás keresése"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Nem sikerült a Wi‑Fi-hívás beállítása"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Ha Wi-Fi-hálózaton szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután kapcsolja be újra a Wi-Fi-hívást a Beállításokban. (Hibakód: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Hiba történt a Wi‑Fi-hívás szolgáltatónál való regisztrálása során: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-hívás"</item>
@@ -481,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Lehetővé teszi az alkalmazás számára a használni kívánt ujjlenyomatsablonok hozzáadására és törlésére szolgáló metódusok indítását."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ujjlenyomat-olvasó hardver használata"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nem sikerült felismerni"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Az ujjlenyomathoz szükséges hardver nem érhető el."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Beviteli mód"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Műveletek szöveggel"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Kiválasztott cím elküldése e-mailben"</string>
<string name="dial" msgid="1253998302767701559">"Hívás"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Kiválasztott telefonszám hívása"</string>
<string name="map" msgid="6521159124535543457">"Helymeghatározás"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Kiválasztott cím megkeresése a térképen"</string>
<string name="browse" msgid="1245903488306147205">"Megnyitás"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Kiválasztott URL megnyitása"</string>
<string name="sms" msgid="4560537514610063430">"Üzenet"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Üzenet küldése a kijelölt telefonszámra"</string>
<string name="add_contact" msgid="7867066569670597203">"Hozzáadás"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Hozzáadás a névjegyekhez"</string>
<string name="view_calendar" msgid="979609872939597838">"Megtekintés"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Kijelölt idő megtekintése a naptárban"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Ütemezés"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Esemény ütemezése a kiválasztott időpontra"</string>
<string name="view_flight" msgid="7691640491425680214">"Nyomon követés"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Kiválasztott járat nyomon követése"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Kevés a szabad terület"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Előfordulhat, hogy néhány rendszerfunkció nem működik."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nincs elegendő tárhely a rendszerhez. Győződjön meg arról, hogy rendelkezik 250 MB szabad területtel, majd kezdje elölről."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Nyílt Wi-Fi-hálózathoz kapcsolódhat"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Csatlakozás szolgáltatói Wi‑Fi-hálózatra"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Csatlakozás Wi-Fi hálózathoz…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Sikeres kapcsolódás a Wi-Fi-hálózathoz"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nem sikerült kapcsolódni a Wi‑Fi-hálózathoz"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> – a többi alkalmazás felett"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Kikapcsolás"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> előkészítése"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hibák keresése"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Új <xliff:g id="NAME">%s</xliff:g> észlelve"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotók és más tartalmak átviteléhez"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Sérült <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült. Koppintson rá a javításhoz."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült. Válassza ki a javításhoz."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nem támogatott <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ez az eszköz nem támogatja ezt a(z) <xliff:g id="NAME">%s</xliff:g> eszközt. Koppintson rá a támogatott formátumban való beállításhoz."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ez az eszköz nem támogatja a(z) <xliff:g id="NAME">%s</xliff:g> nevű alkalmazást. Válassza ki a támogatott formátumú beállításhoz."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"A(z) <xliff:g id="NAME">%s</xliff:g> váratlanul eltávolítva"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Az adatvesztés elkerülése érdekében kezdje a(z) <xliff:g id="NAME">%s</xliff:g> leválasztásával, mielőtt eltávolítaná azt"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> eltávolítva"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"A(z) <xliff:g id="NAME">%s</xliff:g> el lett távolítva; helyezzen be egy másikat"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"A(z) <xliff:g id="NAME">%s</xliff:g> kiadása még folyamatban van…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne távolítsa el"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Beállítás"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Kiadás"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Tallózás"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"A(z) <xliff:g id="NAME">%s</xliff:g> nem található"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Helyezze be újra az eszközt"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> áthelyezése"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Az áthelyezés folyamatban van"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Az áthelyezés befejeződött"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Adatok áthelyezve ide: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Sikertelen az adatok áthelyezése"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Maradtak adatok az eredeti helyen"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Eltávolítva"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Kiadva"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Ellenőrzés…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"A rendszergazda által telepítve"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"A rendszergazda által frissítve"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"A rendszergazda által törölve"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Az akkumulátor üzemidejének növelése érdekében az Akkumulátorkímélő mód csökkenti az eszköz teljesítményét, és korlátozza vagy kikapcsolja a rezgést, a helyszolgáltatásokat, valamint a háttéradatokat. Előfordulhat, hogy azok az e-mail-, üzenetküldő és egyéb alkalmazások, amelyek szinkronizálást használnak, csak akkor frissítenek, ha megnyitja őket.\n\nAz Akkumulátorkímélő mód automatikusan kikapcsol, ha az eszköz töltőn van."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által aktuálisan használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bekapcsolás"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> elnémította"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Belső probléma van az eszközzel, és instabil lehet, amíg vissza nem állítja a gyári adatokat."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Belső probléma van az eszközzel. A részletekért vegye fel a kapcsolatot a gyártóval."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Az USSD-kérés módosítva hagyományos hívásra"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Az USSD-kérés módosítva SS-kérésre"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Új USSD-kérésre módosítva"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Az USSD-kérés módosítva videohívásra"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Az SS-kérés módosítva hagyományos hívásra"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Az SS-kérés módosítva videohívásra"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Az SS-kérés módosítva USSD-kérésre"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Új SS-kérésre módosítva"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Munkaprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Kibontás"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Összecsukás"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"A SIM-kártya nem támogatott a hangnál"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"A SIM-kártya nem engedélyezett a hanghoz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"A telefon nem engedélyezett a hanghoz"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Előugró ablak"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Az alkalmazás alacsonyabb verziójú, vagy nem kompatibilis ezzel a parancsikonnal"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index b299ecf..b20b72f 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Զանգողի ID-ն լռելյայն չսահմանափակված է: Հաջորդ զանգը` չսահմանափակված"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Ծառայությունը չի տրամադրվում:"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Դուք չեք կարող փոխել զանգողի ID-ի կարգավորումները:"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Տվյալների ծառայությունն անհասանելի է"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Հնարավոր չէ կատարել շտապ կանչ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Բջջային ինտերնետի ծառայությունն արգելափակված է"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Շտապ կանչերը հասանելի չեն"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ձայնային ծառայությունն անհասանելի է"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ձայնային/արտակարգ իրավիճակների ծառայությունն անհասանելի է"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Ձեր գտնվելու վայրում ծառայությունը ժամանակավորապես չի տրամադրվում բջջային ցանցի կողմից"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ցանցն անհասանելի է"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Ազդանշանի ընդունման որակը լավացնելու համար փոխեք ցանցի տեսակը՝ անցնելով Կարգավորումներ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանցի նախընտրած տեսակը։"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi կանչերն ակտիվ են"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Շտապ կանչերի համար բջջային ցանց է անհրաժեշտ"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ձայնային ծառայությունն ու շտապ կանչերն արգելափակված են"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Ձեր օպերատորը ժամանակավորապես անջատել է"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Չհաջողվեց միանալ բջջային ցանցին"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Փորձեք այլ ցանցի միանալ: Հպեք՝ նախընտրած ցանցը փոխելու համար:"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Շտապ կանչերը հասանելի չեն"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Շտապ կանչերը հասանելի չեն Wi‑Fi-ի միջոցով"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ծանուցումներ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Զանգի վերահասցեավորում"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Շտապ հետկանչի ռեժիմ"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Ռոումինգի ազդերիզը միացված է"</string>
<string name="roamingText12" msgid="1189071119992726320">"Ռոումինգի ազդերիզն անջատված է"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Ծառայության որոնում..."</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Զանգեր Wi-Fi-ի միջոցով"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Չհաջողվեց կարգավորել Wi‑Fi-ի միջոցով արվող զանգերը"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ այս ծառայությունը կարգավորելու համար: Այնուհետև նորից միացրեք «Զանգեր Wi-Fi-ի միջոցով» ընտրանքը Կարգավորումներից: (Սխալի կոդ՝ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Գրանցվեք ձեր օպերատորի միջոցով (Սխալի կոդ` <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Wi‑Fi-ի միջոցով արվող զանգերը չհաջողվեց գրանցել ձեր օպերատորի մոտ՝ <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Չափից շատ հարցումներ են մշակվում: Փորձեք կրկին ավելի ուշ:"</string>
<string name="notification_title" msgid="8967710025036163822">"Մուտք գործելու սխալ` <xliff:g id="ACCOUNT">%1$s</xliff:g>-ի համար"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Համաժամեցնել"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Համաժամել"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Չափից շատ <xliff:g id="CONTENT_TYPE">%s</xliff:g> հեռացումներ:"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Չի հաջողվում համաժամեցնել"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Հետևյալ ծառայությունից չափազանց շատ տարրեր եք ջնջել՝ <xliff:g id="CONTENT_TYPE">%s</xliff:g>:"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Պլանշետի պահոցը լիքն է: Ջնջեք մի քանի ֆայլ` տարածք ազատելու համար:"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Ժամացույցի ֆայլերի պահեստը լիքն է: Ջնջեք որոշ ֆայլեր՝ տարածք ազատելու համար:"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Հեռուստացույցի պահեստը լիքն է: Ջնջեք որոշ ֆայլեր՝ տեղ ազատելու համար:"</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Ձեր աշխատանքային պրոֆիլի ադմինիստրատորի կողմից"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ի կողմից"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Աշխատանքային պրոֆիլը ջնջվել է"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Աշխատանքային պրոֆիլը ջնջվել է ադմինիստրատորի հավելվածի բացակայության պատճառով"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Աշխատանքային պրոֆիլի ադմինիստրատորի հավելվածը բացակայում է կամ վնասված է: Արդյունքում ձեր աշխատանքային պրոֆիլը և առնչվող տվյալները ջնջվել են: Օգնության համար դիմեք ձեր ադմինիստրատորին:"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Ձեր աշխատանքային պրոֆիլն այս սարքում այլևս հասանելի չէ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Գաղտնաբառը մուտքագրելու չափից շատ փորձեր են կատարվել"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Սարքը կառավարվում է"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ձեր կազմակերպությունը կառավարում է այս սարքը և կարող է վերահսկել ցանցի թրաֆիկը: Հպեք՝ մանրամասները դիտելու համար:"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Ձեր սարքը ջնջվելու է"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Հնարավոր չէ օգտագործել ադմինիստրատորի հավելվածը։ Ձեր սարքն այժմ կջնջվի։\n\nԵթե ունեք հարցեր, ապա դիմեք ձեր կազմակերպության ադմինիստրատորին։"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Հնարավոր չէ օգտագործել ադմինիստրատորի հավելվածը։ Ձեր սարքից բոլոր տվյալները կջնջվեն։\n\nՀարցեր ունենալու դեպքում դիմեք ձեր կազմակերպության ադմինիստրատորին։"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Տպումն անջատված է <xliff:g id="OWNER_APP">%s</xliff:g> հավելվածի կողմից։"</string>
<string name="me" msgid="6545696007631404292">"Իմ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Պլանշետի ընտրանքները"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Ինքնաթիռի ռեժիմ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ինքնաթիռի ռեժիմը միացված է"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ինքնաթիռի ռեժիմը անջատված է"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Մարտկոցի տնտեսում"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Անջատել"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Միացնել"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Կարգավորումներ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Օգնական"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ձայնային օգնութ"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Բացել աշխատանքային պրոֆիլը"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Կոնտակտներ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"օգտագործել ձեր կոնտակտները"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել ձեր կոնտակտները"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել ձեր կոնտակտները:"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Տեղորոշում"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"տեղորոշել այս սարքը"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել այս սարքի տեղադրության տվյալները"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել այս սարքի տեղադրության տվյալները:"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Օրացույց"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"օգտագործել օրացույցը"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել ձեր օրացույցը"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել ձեր օրացույցը:"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ուղարկել և դիտել SMS-ները"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին ուղարկել և դիտել SMS հաղորդագրություններ"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին ուղարկել և դիտել SMS հաղորդագրություններ:"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Տարածք"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել սարքում պահված լուսանկարները, մեդիան և ֆայլերը"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին օգտագործել սարքում պահված լուսանկարները, մեդիան և ֆայլերը:"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Խոսափող"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ձայնագրել"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին կատարել ձայնագրություն"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին կատարել ձայնագրություն:"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Տեսախցիկ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"լուսանկարել և տեսագրել"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին լուսա- և տեսանկարել"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին լուսանկարել և տեսանկարել:"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Հեռախոս"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"կատարել զանգեր և կառավարել զանգերը"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին կատարել հեռախոսազանգեր և կառավարել դրանք"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին կատարել հեռախոսազանգեր և կառավարել դրանք:"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Մարմնի սենսորներ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Թույլ տալ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին սենսորից ստանա ձեր կենսագործունեության հիմնական տվյալները"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Թույլ տա՞լ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> հավելվածին սենսորից ստանալ ձեր կենսագործունեության հիմնական տվյալները:"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Առբերել պատուհանի բովանդակությունը"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Վերլուծել գործող պատուհանի բովանդակությունը"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Միացնել Հպման միջոցով հետազոտումը"</string>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Կատարել ժեստեր"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Կարող է հպել, թերթել, պտղունցել և կատարել այլ ժեստեր:"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Մատնահետքերի սկաների ժեստեր"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Կարող է նկարահանել մատնահետքերի սկաների վրա կատարվող ժեստերը"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Կարող է արձանագրել մատնահետքերի սկաների վրա կատարվող ժեստերը"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"անջատել կամ փոփոխել կարգավիճակի գոտին"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Թույլ է տալիս հավելվածին անջատել կարգավիճակի գոտին կամ ավելացնել ու հեռացնել համակարգի պատկերակները:"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"լինել կարգավիճակի գոտի"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով պլանշետի աշխատանքը:"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Թույլ է տալիս հավելվածին պահել իր տարրերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածների համար հատկացված հիշողությունը և դանդաղեցնել հեռուստացույցի աշխատանքը:"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով հեռախոսի աշխատանքը:"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"աշխատեցնել ակտիվ ծառայությունները"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Թույլ է տալիս հավելվածին օգտագործել ակտիվ ծառայությունները:"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"չափել հավելվածի պահոցի տարածքը"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Թույլ է տալիս հավելվածին առբերել իր կոդը, տվյալները և քեշի չափերը"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"փոփոխել համակարգի կարգավորումները"</string>
@@ -478,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"կենսաչափական սարքի օգտագործում"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված կենսաչափական սարքը"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"կառավարել մատնահետքերի գրանցման սարքը"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Հավելվածին թույլ է տալիս կատարել այնպիսի գործառույթներ, որոնց միջոցով կարելի է օգտագործման համար ավելացնել և հեռացնել մատնահետքերի նմուշներ:"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"օգտագործել մատնահետքերի գրանցման սարքը"</string>
@@ -490,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Չճանաչվեց"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Մատնահետքի սարքն անհասանելի է:"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Հնարավոր չէ պահել մատնահետքը: Հեռացրեք առկա մատնահետքը:"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Մատնահետքի գրանցման ժամանակը սպառվել է: Փորձեք նորից:"</string>
@@ -802,6 +812,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Սխեմայով ապակողպում:"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Դեմքով ապակողպում:"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-ն ապակողպված է:"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM քարտի ապակողպում PIN կոդի միջոցով:"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM քարտի ապակողպում PUK կոդի միջոցով:"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Գաղտնաբառի ապակողպում:"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Սխեմայի տարածք:"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Սահեցման տարածք:"</string>
@@ -863,6 +875,12 @@
<string name="text_copied" msgid="4985729524670131385">"Տեքստը պատճենված է սեղմատախտակին:"</string>
<string name="more_item_label" msgid="4650918923083320495">"Ավելին"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Ցանկ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"բացակ"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"մուտք"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ջնջել"</string>
@@ -994,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Մուտքագրման եղանակը"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Տեքստի գործողությունները"</string>
<string name="email" msgid="4560673117055050403">"Էլփոստ"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Նամակ ուղարկել ընտրված հասցեին"</string>
<string name="dial" msgid="1253998302767701559">"Զանգել"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Զանգել ընտրված հեռախոսահամարին"</string>
<string name="map" msgid="6521159124535543457">"Գտնել քարտեզում"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Ցույց տալ ընտրված հասցեն քարտեզի վրա"</string>
<string name="browse" msgid="1245903488306147205">"Բացել"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Բացել ընտրված URL-ը"</string>
<string name="sms" msgid="4560537514610063430">"SMS գրել"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"SMS ուղարկել ընտրված հեռախոսահամարին"</string>
<string name="add_contact" msgid="7867066569670597203">"Ավելացնել"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Ավելացնել կոնտակտներում"</string>
<string name="view_calendar" msgid="979609872939597838">"Դիտել"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Դիտել ընտրված օրն օրացույցում"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Ժամանակացույց"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Ստեղծել միջոցառում նշված օրվա համար"</string>
<string name="view_flight" msgid="7691640491425680214">"Հետագծել"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Հետագծել ընտրված չվերթը"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Հիշողությունը սպառվում է"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Որոշ գործառույթներ կարող են չաշխատել"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Համակարգի համար բավարար հիշողություն չկա: Համոզվեք, որ ունեք 250ՄԲ ազատ տարածություն և վերագործարկեք:"</string>
@@ -1074,31 +1101,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Ստուգել նոր տարբերակի առկայությունը"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> ծրագիրը (գործընթաց <xliff:g id="PROCESS">%2$s</xliff:g>) խախտել է իր ինքնահարկադրված Խիստ ռեժիմ քաղաքականությունը:"</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> գործընթացը խախտել է իր ինքնահարկադրված Խիստ ռեժիմ քաղաքականությունը:"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android-ը նորացվում է..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android-ը մեկնարկում է…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Հեռախոսը թարմացվում է…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Պլանշետը թարմացվում է…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Սարքը թարմացվում է…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Հեռախոսը միանում է…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Պլանշետը միանում է…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Սարքը միանում է…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Պահեստի օպտիմալացում:"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-ի թարմացումն ավարտվում է…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Հնարավոր է՝ որոշ հավելվածներ մինչև նորացման ավարտը ճիշտ չաշխատեն"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Համակարգի թարմացումը շուտով կվերջանա…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածը նորացվում է…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Օպտիմալացվում է հավելված <xliff:g id="NUMBER_0">%1$d</xliff:g>-ը <xliff:g id="NUMBER_1">%2$d</xliff:g>-ից:"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը պատրաստվում է:"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Հավելվածները մեկնարկում են:"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Բեռնումն ավարտվում է:"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>-ն աշխատում է"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Հպեք՝ խաղին վերադառնալու համար"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Ընտրեք խաղ"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Անխափան աշխատանքի համար միաժամանակ կարող եք բացել միայն մեկ խաղ:"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Վերադառնալ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Օգտագործվող օբյեկտների վերաբերյալ տվյալները հավաքվել են: Հպեք՝ դրանք տրամադրելու համար"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Ընտրեք գործողություն տեքստի համար"</string>
@@ -1133,12 +1157,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Միացեք բաց Wi‑Fi ցանցին"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Միացեք օպերատորի Wi‑Fi ցանցին"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Միացում բաց Wi‑Fi ցանցին"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Միացում Wi‑Fi ցանցին"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Միացել է Wi‑Fi ցանցին"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Չհաջողվեց միանալ Wi‑Fi ցանցին"</string>
<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="1100098935861622985">"Բոլոր ցանցերը"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Բոլոր ցանցերը"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi-ն ավտոմատ կմիանա"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Լավ ազդանշանով պահված ցանցի տարածքում գտնվելիս"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Նորից չմիացնել"</string>
@@ -1204,6 +1228,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Վերագործարկել"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ակտիվացրեք բջջային ծառայությունը"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Նոր SIM քարտն ակտիվացնելու համար ներբեռնեք օպերատորի հավելվածը"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Նոր SIM քարտն ակտիվացնելու համար ներբեռնեք <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը:"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ներբեռնել հավելվածը"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Տեղադրվել է նոր SIM քարտ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Հպեք՝ կարգավորելու համար"</string>
@@ -1222,13 +1247,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP ռեժիմը USB-ի միջոցով միացավ"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB մոդեմի ռեժիմը միացավ"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI ռեժիմը USB-ի միջոցով միացավ"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB լրասարքի ռեժիմը միացավ"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Միացվել է USB լրասարք"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Հպեք՝ լրացուցիչ ընտրանքների համար:"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Միացված սարքի լիցքավորում: Հպեք՝ ավելի շատ ընտրանքների համար:"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Հայտնաբերված է անալոգային աուդիո լրասարք"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Միացված սարքը համատեղելի չէ այս հեռախոսի հետ: Հպեք` ավելին իմանալու համար:"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB վրիպազերծումը միացված է"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Հպեք՝ USB վրիպազերծումն անջատելու համար:"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Հպեք՝ USB-ի վրիպազերծումն անջատելու համար"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Ընտրել` USB կարգաբերումը կասեցնելու համար:"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Վրիպակի զեկույցի ստեղծում…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Տրամադրե՞լ վրիպակի զեկույցը:"</string>
@@ -1247,34 +1272,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ԱՆՋԱՏԵԼ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ի նախապատրաստում"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Սխալների ստուգում"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Հայտնաբերվել է նոր <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Անջատել"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Լուսանկարներ և մեդիա ֆայլեր տեղափոխելու համար"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է: Հպեք՝ շտկելու համար:"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է: Ընտրեք՝ շտկելու համար:"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Չապահովվող <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Այս սարքը չի աջակցում այս <xliff:g id="NAME">%s</xliff:g>-ը: Հպեք՝ աջակցվող ձևաչափով կարգավորելու համար:"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Այս սարքը չի աջակցում այս <xliff:g id="NAME">%s</xliff:g>-ը: Ընտրեք՝ աջակցվող ձևաչափով կարգավորելու համար:"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացվել է առանց անջատելու"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Տվյալները չկորցնելու համար անջատեք <xliff:g id="NAME">%s</xliff:g>-ը՝ մինչ հեռացնելը"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացված է"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացվել է, զետեղեք նորը"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ը դեռ անջատվում է…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Չհեռացնել"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g>-ը տեղադրված չէ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Նորից զետեղեք այս սարքը"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>-ի տեղափոխում"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Տվյալների տեղափոխում"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Տեղափոխումն ավարտվեց"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Տվյալները տեղափոխվեցին <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Չհաջողվեց տեղափոխել տվյալները"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Սկզբնական տեղադրությունում մնացած տվյալները"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Հեռացված է"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Անջատված է"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Ստուգում…"</string>
@@ -1333,14 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Միշտ-միացված VPN-ը կապվում է..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Միշտ-առցանց VPN-ը կապակցված է"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Անջատված է միշտ միացված VPN ցանցից"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN սխալը միշտ միացված"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Չհաջողվեց միանալ միշտ միացված VPN-ին"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Փոխել ցանցը կամ VPN-ի կարգավորումները"</string>
<string name="upload_file" msgid="2897957172366730416">"Ընտրել ֆայլը"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ոչ մի ֆայլ չի ընտրված"</string>
<string name="reset" msgid="2448168080964209908">"Վերակայել"</string>
<string name="submit" msgid="1602335572089911941">"Ուղարկել"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Մեքենայի ռեժիմը միացված է"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Հպեք` մեքենայի ռեժիմից դուրս գալու համար:"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Հավելվածն աշխատում է"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Հպեք՝ հավելվածը փակելու համար:"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Մոդեմի ռեժիմն անջատված է"</string>
@@ -1418,22 +1459,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB սարքավար <xliff:g id="MANUFACTURER">%s</xliff:g>-ից"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB կրիչ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Խմբագրել"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Տվյալների օգտագործման զգուշացում"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Հպեք՝ թրաֆիկն ու կարգավորումները տեսնելու համար"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G տվյալների սահմանաչափը սպառվել է"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G տվյալների սահմանաչափը սպառվել է"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Զգուշացում թրաֆիկի օգտագործման մասին"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Դուք օգտագործել եք <xliff:g id="APP">%s</xliff:g> թրաֆիկ"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Բջջային ինտերնետի սահմանաչափը լրացել է"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi տվյալների սահմանը սպառվել է"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Տվյալները ընդմիվել են ցիկլի հանգստի համար"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G տվյալների սահմանը գերազանցված է"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G տվյալների սահմանը գերազանցվել է"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Շարժական տվյալների սահմանը գերազանցվել է"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi տվյալների սահմանը գերազանցվել է"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g>-ը գերազանցում է նշված սահմանաչափը:"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Տվյալների փոխանցումը դադարեցվել է նախքան ցիկլի ավարտը"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Բջջային թրաֆիկը գերազանցվել է"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi թրաֆիկը գերազանցվել է"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Դուք գերազանցել եք ձեր սահմանաչափը <xliff:g id="SIZE">%s</xliff:g>-ով"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Հետնաշերտային տվյալները սահմանափակ են"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Հպեք և հանեք սահմանափակումը:"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Թրաֆիկի շատ օգտագործում"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Վերջին օրերին դուք սովորականից շատ թրաֆիկ եք օգտագործում։ Հպեք՝ օգտագործված թրաֆիկը և կարգավորումները դիտելու համար։"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Չափազանց շատ թրաֆիկի օգտագործում"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Ձեր հավելվածները սովորականից շատ թրաֆիկ են օգտագործել"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> հավելվածը սովորականից շատ թրաֆիկ է օգտագործել:"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Անվտանգության վկայական"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Այս վկայականը վավեր է:"</string>
<string name="issued_to" msgid="454239480274921032">"Թողարկվել է`"</string>
@@ -1669,7 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Տեղադրվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Մարտկոցի աշխատանքի ժամկետը երկարացնելու համար տնտեսման ռեժիմում սահմանափակվում են սարքի արտադրողականությունը, թրթռոցը, տեղորոշման ծառայություններն ու տվյալների ֆոնային փոխանցումը: Տվյալների համաժամեցումից կախված՝ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nՄարտկոցի տնտեսումն ավտոմատ անջատվում է սարքի լիցքավորման ժամանակ:"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Մարտկոցի աշխատաժամանակը երկարացնելու համար տնտեսման ռեժիմում սահմանափակվում են սարքի աշխատանքը, թրթռոցը, տեղորոշման ծառայություններն ու տվյալների ֆոնային փոխանցումը: Տվյալների համաժամեցումից կախված՝ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nՍարքի լիցքավորման ժամանակ մարտկոցի տնտեսումն ավտոմատ անջատվում է։"</string>
<string name="data_saver_description" msgid="6015391409098303235">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Միացնե՞լ թրաֆիկի խնայումը:"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Միացնել"</string>
@@ -1681,9 +1719,9 @@
<item quantity="one">%1$d րոպեով (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d րոպեով (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d ժամ (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d ժամ (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d ժամով (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">%1$d ժամով (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d ժամով (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1735,9 @@
<item quantity="one">%d րոպեով</item>
<item quantity="other">%d րոպեով</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d ժամ</item>
- <item quantity="other">%d ժամ</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d ժամով</item>
+ <item quantity="other">%d ժամով</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d ժամով</item>
@@ -1720,14 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Համրեցվել է <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ի կողմից"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Սարքում ներքին խնդիր է առաջացել և այն կարող է կրկնվել, մինչև չվերականգնեք գործարանային կարգավորումները:"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Սարքում ներքին խնդիր է առաջացել: Մանրամասների համար կապվեք արտադրողի հետ:"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD հարցումը փոխվել է DIAL հարցման:"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD հարցումը փոխվել է SS հարցման:"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD հարցումը փոխվել է նոր USSD հարցման:"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD հարցումը փոխվել է Video DIAL հարցման:"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS հարցումը փոխվել է DIAL հարցման:"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS հարցումը փոխվել է Video DIAL հարցման:"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS հարցումը փոխվել է USSD հարցման:"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS հարցումը փոխվել է նոր SS հարցման:"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD հարցումը փոխվել է սովորական զանգի"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD հարցումը փոխվել է SS հարցման"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Փոխվել է նոր USSD հարցման"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD հարցումը փոխվել է տեսազանգի"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS հարցումը փոխվել է սովորական զանգի"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS հարցումը փոխվել է տեսազանգի"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS հարցումը փոխվել է USSD հարցման"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Փոխվել է նոր SS հարցման"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Աշխատանքային պրոֆիլ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Ընդարձակել"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Կոծկել"</string>
@@ -1825,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Այս SIM քարտը նախապատրաստված չէ զանգելու համար"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Այս SIM քարտով չեք կարող զանգել"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Այս հեռախոսով չեք կարող զանգել"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Հայտնվող պատուհան"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Սա հավելվածի ավելի հին տարբերակն է կամ համատեղելի չէ այս դյուրանցման հետ"</string>
@@ -1837,7 +1883,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Հայտնաբերվել է վնասաբեր հավելված"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> հավելվածն ուզում է ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Փոփոխել"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Զանգերի և ծանուցումների համար թրթռոցը միացված է"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Զանգերի և ծանուցումների համար ձայնն անջատած է"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Համակարգի փոփոխություններ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Չանհանգստացնել"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«Չանհանգստացնել» ռեժիմում ծանուցումները կթաքցվեն: Դա կօգնի ձեզ կենտրոնանալ:"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Սա նոր կարգավորում է: Հպեք՝ փոխելու համար:"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Հպեք՝ կարգավորումները ստուգելու համար"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Հպեք՝ տեսնելու, թե ինչ է արգելափակվել:"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Համակարգ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Կարգավորումներ"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 8f4d7df..f9831a5 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tidak ada layanan panggilan suara"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Tidak ada layanan suara atau panggilan darurat"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Dinonaktifkan sementara oleh operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dinonaktifkan sementara oleh operator untuk SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Tidak dapat menjangkau jaringan seluler"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Coba ubah jaringan pilihan. Tap untuk mengubah."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Panggilan darurat tidak tersedia"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Spanduk Roaming Hidup"</string>
<string name="roamingText12" msgid="1189071119992726320">"Spanduk Roaming Mati"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Mencari layanan"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Tidak dapat menyiapkan panggilan Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Untuk menelepon dan mengirim pesan melalui Wi-Fi, tanyalah ke operator Anda terlebih dahulu untuk menyiapkan layanan ini. Kemudian, aktifkan kembali panggilan Wi-Fi dari Setelan. (Kode error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Terjadi masalah saat mendaftarkan panggilan Wi‑Fi dengan operator Anda: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Panggilan Wi-Fi"</item>
@@ -481,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Mengizinkan aplikasi memanggil metode untuk menambahkan dan menghapus template sidik jari untuk digunakan."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"gunakan hardware sidik jari"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tidak dikenali"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sidik jari diautentikasi"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware sidik jari tidak tersedia."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sidik jari tidak dapat disimpan. Hapus sidik jari yang ada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Waktu sidik jari habis. Coba lagi."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metode masukan"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Mengirimkan email ke alamat yang dipilih"</string>
<string name="dial" msgid="1253998302767701559">"Panggil"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Panggil nomor telepon yang dipilih"</string>
<string name="map" msgid="6521159124535543457">"Temukan"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Melokalkan alamat yang dipilih"</string>
<string name="browse" msgid="1245903488306147205">"Buka"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
<string name="sms" msgid="4560537514610063430">"Pesan"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Mengirimkan SMS ke nomor telepon yang dipilih"</string>
<string name="add_contact" msgid="7867066569670597203">"Tambahkan"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Menambahkan ke kontak"</string>
<string name="view_calendar" msgid="979609872939597838">"Lihat"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Melihat waktu yang dipilih di kalender"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Jadwal"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Menjadwalkan acara untuk waktu yang dipilih"</string>
<string name="view_flight" msgid="7691640491425680214">"Lacak"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Memantau penerbangan yang dipilih"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ruang penyimpanan hampir habis"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Beberapa fungsi sistem mungkin tidak dapat bekerja"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Penyimpanan tidak cukup untuk sistem. Pastikan Anda memiliki 250 MB ruang kosong, lalu mulai ulang."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Hubungkan ke jaringan Wi-Fi terbuka"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Hubungkan ke jaringan Wi-Fi operator"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Menghubungkan ke jaringan Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Terhubung ke jaringan Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menghubungkan ke jaringan Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Nonaktifkan"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyiapkan <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Memeriksa kesalahan"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baru terdeteksi"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Memeriksa <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Meninjau konten saat ini"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> baru"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap untuk menyiapkan"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk mentransfer foto dan media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> rusak"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> sudah rusak. Ketuk untuk memperbaiki."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Masalah pada <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap untuk memperbaiki"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> rusak. Pilih untuk memperbaikinya."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak didukung"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Perangkat tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Ketuk untuk menyiapkan dalam format yang didukung."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Perangkat ini tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Pilih untuk menyiapkan dalam format yang didukung."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tiba-tiba dicabut"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Lingsirkan <xliff:g id="NAME">%s</xliff:g> sebelum mencabut agar data tidak hilang"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dicabut"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> dicabut; colokkan yang baru"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Masih mengeluarkan <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Jangan cabut"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Keluarkan media sebelum mencabut agar konten tidak hilang"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> dicabut"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Beberapa fungsi mungkin tidak berjalan dengan baik. Masukkan penyimpanan baru."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Mengeluarkan <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Jangan cabut"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Siapkan"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Keluarkan"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Jelajahi"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Tidak ada <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Colokkan kembali perangkat ini"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Masukkan perangkat lagi"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Memindahkan <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Memindahkan data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Pemindahan selesai"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data dipindahkan ke <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Tidak dapat memindahkan data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data tertinggal di lokasi asal"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transfer konten selesai"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Konten dipindahkan ke <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Tidak dapat memindahkan konten"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Coba pindahkan konten lagi"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Dicabut"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Dikeluarkan"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Memeriksa…"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Diinstal oleh admin Anda"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Diupdate oleh admin Anda"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dihapus oleh admin Anda"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai mengurangi performa perangkat dan membatasi atau menonaktifkan getaran, layanan lokasi, dan data background. Email, messaging, dan aplikasi lain yang mengandalkan sinkronisasi mungkin tidak diupdate, kecuali jika dibuka.\n\nPenghemat Baterai nonaktif otomatis jika perangkat sedang diisi daya baterainya."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangi penggunaan data, Penghemat Kuota Internet mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah disentuh."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Aktifkan Penghemat Kuota Internet?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktifkan"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Dinonaktifkan oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Ada masalah dengan perangkat. Hal ini mungkin membuat perangkat jadi tidak stabil dan perlu dikembalikan ke setelan pabrik."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Ada masalah dengan perangkat. Hubungi produsen perangkat untuk informasi selengkapnya."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Permintaan USSD diubah ke panggilan reguler"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Permintaan USSD diubah ke permintaan SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Diubah ke permintaan USSD baru"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Permintaan USSD diubah ke video call"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Permintaan SS diubah ke panggilan reguler"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Permintaan SS diubah ke video call"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Permintaan SS diubah ke permintaan USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Diubah ke permintaan SS baru"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Luaskan"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ciutkan"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM tidak disediakan untuk suara"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM tidak diizinkan untuk suara"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ponsel tidak diizinkan untuk suara"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak diizinkan"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak tersedia"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak diizinkan"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak diizinkan"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Jendela Pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi aplikasi di-downgrade, atau tidak kompatibel dengan pintasan ini"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 2281a54..c17d58a 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Númerabirting er sjálfgefið án takmarkana. Næsta símtal: Án takmarkana"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Þjónustu ekki útdeilt."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Þú getur ekki breytt stillingu númerabirtingar."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Gagnasamband er ekki í boði"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Engin neyðarsímtöl"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Engin gagnaþjónusta fyrir farsíma"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Neyðarsímtöl eru ekki í boði"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Símtöl eru ekki í boði"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Símtöl/neyðarsímtöl eru ekki í boði"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Ekki í boði á farsímakerfinu á þínum stað eins og er"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ekki næst samband við símkerfi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Reyndu að breyta valinni gerð í Stillingar > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi-Fi símtöl eru virk"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Neyðarsímtöl krefjast farsímanets."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Engin raddþjónusta eða neyðarsímtöl"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Símafyrirtækið slökkti tímabundið á þessu"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ekki næst samband við farsímakerfi"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prófaðu að velja annað símkerfi. Ýttu til að breyta."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Neyðarsímtöl eru ekki í boði"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Ekki er hægt að hringja neyðarsímtöl með Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Tilkynningar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Símtalsflutningur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Stilling fyrir svarhringingu neyðarsímtala"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Kveikt á reikiborða"</string>
<string name="roamingText12" msgid="1189071119992726320">"Slökkt á reikiborða"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Leitar að þjónustu"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi símtöl"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Ekki tókst að setja upp Wi‑Fi símtöl"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum. (Villukóði: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Skráðu þig hjá símafyrirtækinu (Villukóði: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Vandamál kom upp við að skrá Wi‑Fi símtöl hjá símafyrirtækinu: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Of margir beiðnir eru í vinnslu. Reyndu aftur síðar."</string>
<string name="notification_title" msgid="8967710025036163822">"Innskráningarvilla fyrir <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Samstilla"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Samstilling"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Of oft eytt í <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ekki er hægt að samstilla"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Reynt var að eyða of mörgum <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Geymslurými spjaldtölvunnar er fullt. Eyddu einhverjum skrám til að losa um pláss."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Geymsla úrsins er full. Eyddu einhverjum skrám til að búa til pláss."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Geymslurými sjónvarpsins er fullt. Eyddu skrám til að losa um pláss."</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Af kerfisstjóra vinnusniðsins þíns"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Vinnusniði eytt"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Vinnusniði eytt vegna þess að stjórnunarforrit vantar"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Stjórnunarforrit vinnusniðsins vantar eða er skemmt. Vinnusniðinu og gögnum því tengdu hefur því verið eytt. Hafðu samband við kerfisstjórann til að fá frekari aðstoð."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Vinnusniðið þitt er ekki lengur í boði á þessu tæki"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Of margar tilraunir til að slá inn aðgangsorð"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Tækinu er stjórnað"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Fyrirtækið þitt stjórnar þessu tæki og kann að fylgjast með netnotkun. Ýttu hér til að fá upplýsingar."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Tækið verður hreinsað"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Ekki er hægt að nota stjórnunarforritið. Tækinu verður eytt.\n\nEf spurningar vakna skaltu hafa samband við kerfisstjóra fyrirtækisins."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Ekki er hægt að nota stjórnunarforritið. Tækinu verður eytt.\n\nEf spurningar vakna skaltu hafa samband við kerfisstjóra fyrirtækisins."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> lokaði á prentun."</string>
<string name="me" msgid="6545696007631404292">"Ég"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Valkostir spjaldtölvu"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugstilling"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"KVEIKT er á flugstillingu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"SLÖKKT er á flugstillingu"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Rafhlöðusparnaður"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Slökkt er á rafhlöðusparnaði"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Kveikt er á rafhlöðusparnaði"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Stillingar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Aðstoð"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Raddaðstoð"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Skipta yfir í vinnusnið"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Tengiliðir"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"fá aðgang að tengiliðunum þínum"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að tengiliðunum þínum"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að tengiliðunum þínum?"</string>
<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="8903573681261610809">"Veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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="permgrouplab_calendar" msgid="5863508437783683902">"Dagatal"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"fá aðgang að dagatalinu þínu"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"senda og skoða SMS-skilaboð"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að senda og skoða SMS-skilaboð"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Viltu leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að senda og skoða SMS-skilaboð?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Geymslurými"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"fá aðgang að myndum, efni og skrám í tækinu"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að myndum, efni og skrám í tækinu"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að myndum, efni og skrám í tækinu?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Hljóðnemi"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"taka upp hljóð"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að taka upp hljóð"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Viltu leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að taka upp hljóð?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Myndavél"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"taka myndir og taka upp myndskeið"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að taka myndir og myndskeið"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Viltu leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að taka myndir og myndskeið?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Sími"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hringja og stjórna símtölum"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að hringja og vinna með símtöl"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Viltu leyfa <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> að hringja og stjórna símtölum?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Líkamsskynjarar"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aðgangur að skynjaragögnum yfir lífsmörk þín"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að skynjaragögnum yfir lífsmörk þín"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að skynjaragögnum yfir lífsmörk þín?"</string>
<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>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Nota bendingar"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Getur ýtt, strokið, fært fingur saman og gert ýmsar aðrar bendingar."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingrafarabendingar"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Getur fangað bendingar sem eru gerðar á fingrafaraskynjara tækisins."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Getur fangað bendingar sem eru gerðar á fingrafaralesara tækisins."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"slökkva á eða breyta stöðustiku"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Leyfir forriti að slökkva á stöðustikunni eða bæta við og fjarlægja kerfistákn."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"vera stöðustikan"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Leyfir forriti að gera hluta sjálfs sín varanlega í minni. Þetta getur takmarkað það minni sem býðst öðrum forritum og þannig hægt á spjaldtölvunni."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Leyfir forriti að gera hluta sjálfs sín varanlega í minni. Þetta getur takmarkað það minni sem býðst öðrum forritum og þannig hægt á sjónvarpinu."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Leyfir forriti að gera hluta sjálfs sín varanlega í minni. Þetta getur takmarkað það minni sem býðst öðrum forritum og þannig hægt á símanum."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"keyra þjónustu í forgrunni"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Leyfir forritinu að nota þjónustu sem er í forgrunni."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mæla geymslurými forrits"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Leyfir forriti að sækja stærðir kóða, gagna og skyndiminnis síns."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"breyta kerfisstillingum"</string>
@@ -478,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Gerir forritinu kleift að beita aðferðum til að bæta við og eyða fingrafarasniðmátum til notkunar."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"nota fingrafarabúnað"</string>
@@ -490,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Þekktist ekki"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
@@ -802,6 +812,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Opnun með mynstri."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Opnun með andliti."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Opnun með PIN-númeri."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Taka PIN-númer SIM-korts úr lás."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Taka PUK-númer SIM-korts úr lás."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Opnun með aðgangsorði."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Svæði mynsturs."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Stroksvæði."</string>
@@ -863,6 +875,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texti afritaður á klippiborð."</string>
<string name="more_item_label" msgid="4650918923083320495">"Meira"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Valmynd+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Aðgerðarlykill+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"bil"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"eyða"</string>
@@ -994,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Innsláttaraðferð"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textaaðgerðir"</string>
<string name="email" msgid="4560673117055050403">"Tölvupóstur"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Senda á valið netfang"</string>
<string name="dial" msgid="1253998302767701559">"Símtal"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Hringja í valið símanúmer"</string>
<string name="map" msgid="6521159124535543457">"Staðsetja"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Opna valið heimilisfang"</string>
<string name="browse" msgid="1245903488306147205">"Opna"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Opna valda vefslóð"</string>
<string name="sms" msgid="4560537514610063430">"Skilaboð"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Senda skilaboð í valið símanúmer"</string>
<string name="add_contact" msgid="7867066569670597203">"Bæta við"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Bæta við tengiliði"</string>
<string name="view_calendar" msgid="979609872939597838">"Skoða"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Skoða valinn tíma í dagatali"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Setja á dagskrá"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Skipuleggja viðburð á völdum tíma"</string>
<string name="view_flight" msgid="7691640491425680214">"Rekja"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Fylgjast með völdu flugi"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Geymslurýmið er senn á þrotum"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Sumir kerfiseiginleikar kunna að vera óvirkir"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Ekki nægt geymslurými fyrir kerfið. Gakktu úr skugga um að 250 MB séu laus og endurræstu."</string>
@@ -1074,31 +1101,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Leita að uppfærslu"</string>
<string name="smv_application" msgid="3307209192155442829">"Forritið <xliff:g id="APPLICATION">%1$s</xliff:g> (ferli <xliff:g id="PROCESS">%2$s</xliff:g>) hefur brotið gegn eigin StrictMode-stefnu."</string>
<string name="smv_process" msgid="5120397012047462446">"Forritið <xliff:g id="PROCESS">%1$s</xliff:g> braut gegn eigin StrictMode-stefnu."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android er að uppfæra…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android er að ræsast…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Uppfærir síma…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Uppfærir spjaldtölvu…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Uppfærir tæki…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Síminn kveikir á sér…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Spjaldtölvan kveikir á sér…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Tækið kveikir á sér…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Fínstillir geymslu."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Lýkur við Android uppfærslu…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Hugsanlega virka sum forrit ekki fyrr en uppfærslunni lýkur"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Lýkur við kerfisuppfærslu…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> uppfærir…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Fínstillir forrit <xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Undirbýr <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ræsir forrit."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Lýkur ræsingu."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Ýttu til að fara aftur í leik"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Velja leik"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Til að auka afköstin getur aðeins einn af þessum leikjum verið opinn í einu."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Fara til baka í <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnisgögnum hefur verið safnað, ýttu til að deila"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Veldu aðgerð fyrir texta"</string>
@@ -1133,12 +1157,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Tengjast opnu Wi-Fi neti"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Tengjast við Wi‑Fi net símafyrirtækis"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Tengist opnu Wi‑Fi neti"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Tengist við Wi-Fi net"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Tengt við Wi‑Fi net"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ekki hægt að tengjast Wi-Fi neti"</string>
<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="1100098935861622985">"Öll netkerfi"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Öll netkerfi"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kveikt verður sjálfkrafa á Wi‑Fi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Þegar þú ert nálægt vistuðu hágæðaneti"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ekki kveikja aftur"</string>
@@ -1205,6 +1229,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Endurræsa"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Virkja farsímaþjónustu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Sæktu forrit símafyrirtækisins til að virkja nýja SIM-kortið þitt"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Sæktu forritið <xliff:g id="APP_NAME">%1$s</xliff:g> til að virkja nýja SIM-kortið"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Sækja forritið"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nýtt SIM-kort sett í"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ýttu til að setja það upp"</string>
@@ -1223,13 +1248,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Kveikt er á PTP yfir USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Kveikt er á USB-tjóðrun"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Kveikt er á MIDI yfir USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Kveikt á stillingu USB-aukabúnaðar"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-aukabúnaður tengdur"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ýttu til að sjá fleiri valkosti."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Hleður tengt tæki. Ýttu til að sjá fleiri valkosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Hliðrænn hljóðaukabúnaður greindist"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Tengda tækið er ekki samhæft við þennan síma. Ýttu til að fá frekari upplýsingar."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Ýttu til að slökkva á USB-villuleit."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Tekur við villutilkynningu…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Deila villutilkynningu?"</string>
@@ -1248,34 +1273,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÖKKVA"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Undirbýr <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Leitar að villum"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nýtt <xliff:g id="NAME">%s</xliff:g> fannst"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slökkva"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til að flytja myndir og aðrar skrár"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Skemmt <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er skemmt. Ýttu til að laga."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er skemmt. Veldu til að lagfæra."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Óstutt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Ýttu til að setja upp með studdu sniði."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Veldu til að setja upp með studdu sniði."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> fjarlægt án fyrirvara"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Aftengdu <xliff:g id="NAME">%s</xliff:g> áður en þú fjarlægir það til að koma í veg fyrir gagnatap"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> fjarlægt"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> fjarlægt; settu nýtt í"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Enn að fjarlægja <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ekki fjarlægja"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Setja upp"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Fjarlægja"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Kanna"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> vantar"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Settu þetta tæki aftur í"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytur <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Flytur gögn"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Flutningi lokið"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Gögn flutt á <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Ekki var hægt að færa gögnin"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Gögn eftir á upprunalega staðnum"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Fjarlægð"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Aftengd"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Athugar…"</string>
@@ -1334,14 +1375,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Sívirkt VPN tengist…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Sívirkt VPN tengt"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Aftengt frá sívirku VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Villa í sívirku VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ekki er hægt að tengjast sívirkri VPN-tengingu"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Breyta stillingum netkerfis eða VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Velja skrá"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Engin skrá valin"</string>
<string name="reset" msgid="2448168080964209908">"Endurstilla"</string>
<string name="submit" msgid="1602335572089911941">"Senda"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Bílastilling virk"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Ýttu til að fara úr bílastillingu."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Akstursforrit er í gangi"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Ýttu til að loka akstursforritinu."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Kveikt á tjóðrun eða aðgangsstað"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Ýttu til að setja upp."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Slökkt er á tjóðrun"</string>
@@ -1419,22 +1460,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-drif frá <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-geymsla"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Breyta"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Viðvörun um gagnanotkun"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Ýttu fyrir uppl. og stillingar"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Gagnahámarki 2G og 3G náð"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Gagnahámarki 4G náð"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Gagnaviðvörun"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Þú hefur notað <xliff:g id="APP">%s</xliff:g> af gögnum"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Farsímagagnamarki náð"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Gagnahámarki Wi-Fi náð"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Hlé gert á gagnasendingu við þessa notkun"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Gagnahámarki 2G og 3G náð"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Gagnahámarki 4G náð"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Hámarki farsímagagna náð"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Gagnahámarki Wi-Fi náð"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> yfir tilgreindum mörkum."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Gagnanotkun sett í bið það sem eftir er af tímabilinu"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Yfir hámarki farsímagagna"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Yfir gagnamörkum fyrir Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Þú hefur farið <xliff:g id="SIZE">%s</xliff:g> yfir stillt mörk"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Bakgrunnsgögn takmörkuð"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Ýttu til að eyða takmörkun."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Mikil gagnanotkun"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Gagnanotkun þín síðustu daga er meiri en venjulega. Ýttu til að skoða upplýsingar um notkun og stillingar."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Mikil notkun farsímagagna"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Forritin þín hafa notað meira af gögnum en venjulega"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> hefur notað meira af gögnum en venjulega"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Öryggisvottorð"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Þetta vottorð er gilt."</string>
<string name="issued_to" msgid="454239480274921032">"Gefið út fyrir:"</string>
@@ -1670,7 +1708,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Kerfisstjóri setti upp"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Kerfisstjóri uppfærði"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Kerfisstjóri eyddi"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Til að auka endingu rafhlöðunnar dregur rafhlöðusparnaður úr afköstum tækisins og takmarkar titring og flest bakgrunnsgögn. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu verði uppfærð fyrr en þú opnar þau.\n\nSjálfkrafa er slökkt á rafhlöðusparnaði þegar tækið er í hleðslu."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Til að auka endingu rafhlöðunnar mun orkusparnaður draga úr afköstum tækisins og takmarka eða slökkva á titringi, staðsetningarþjónustu og bakgrunnsgögnum. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu uppfærist nema þú opnir þau.\n\nSjálfkrafa er slökkt á orkusparnaði þegar tækið er í hleðslu."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan gæti verið, svo dæmi sé tekið, að myndir séu ekki birtar fyrr en þú ýtir á þær."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Kveikja á gagnasparnaði?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Kveikja"</string>
@@ -1682,7 +1720,7 @@
<item quantity="one">Í %1$d mín. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Í %1$d mín. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">Í %1$d klukkustund (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Í %1$d klukkustundir (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
@@ -1698,7 +1736,7 @@
<item quantity="one">Í %d mín.</item>
<item quantity="other">Í %d mín.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">Í %d klukkustund</item>
<item quantity="other">Í %d klukkustundir</item>
</plurals>
@@ -1721,14 +1759,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tók hljóðið af"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Innra vandamál kom upp í tækinu og það kann að vera óstöðugt þangað til þú núllstillir það."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Innra vandamál kom upp í tækinu. Hafðu samband við framleiðanda til að fá nánari upplýsingar."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-beiðni er breytt í DIAL-beiðni."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-beiðni er breytt í SS-beiðni."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-beiðni er breytt í nýja USSD-beiðni."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-beiðni var breytt í Video DIAL-beiðni."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-beiðni er breytt í DIAL-beiðni."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-beiðni var breytt í Video DIAL-beiðni."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-beiðni er breytt í USSD-beiðni."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-beiðni er breytt í nýja SS-beiðni."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"SS-beiðni breytt í venjulegt símtal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-beiðni breytt í SS-beiðni"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Breytt í nýja USSD-beiðni"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-beiðni breytt í myndsímtal"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-beiðni breytt í venjulegt símtal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-beiðni breytt í myndsímtal"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-beiðni breytt í USSD-beiðni"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Breytt í nýja SS-beiðni"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Vinnusnið"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Stækka"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Minnka"</string>
@@ -1826,6 +1864,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-korti er ekki úthlutað fyrir rödd"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort er ekki heimilað fyrir rödd"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Sími er ekki heimilaður fyrir rödd"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Sprettigluggi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Útgáfa forritsins er of gömul eða er ekki samhæf þessari flýtileið"</string>
@@ -1838,7 +1884,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Skaðlegt forrit fannst"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vill sýna sneiðar úr <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Breyta"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Titringur er virkur fyrir símtöl og tilkynningar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Slökkt verður á hljóði símtala og tilkynninga"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Breytingar á kerfi"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ónáðið ekki"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„Ónáðið ekki“ felur tilkynningar til að hjálpa þér að einbeita þér"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Þetta er ný hegðun. Ýttu til að breyta."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„Ónáðið ekki“ var breytt"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ýttu til að leita að truflunum í stillingum „Ónáðið ekki“"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Ýttu til að skoða hvað lokað hefur verið á."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Kerfi"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Stillingar"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 0da40a5..76d12d6 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nessun servizio di telefonia"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nessun servizio vocale o di chiamate di emergenza"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Servizio disattivato temporaneamente dall\'operatore"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossibile raggiungere la rete mobile"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova a cambiare la rete preferita. Tocca per cambiare."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chiamate di emergenza non disponibili"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roaming attivato"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roaming disattivato"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Ricerca servizio"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Impossibile impostare le chiamate Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Per effettuare chiamate e inviare messaggi tramite Wi-Fi, chiedi prima al tuo operatore di impostare questo servizio. Dopodiché, attiva di nuovo la funzione Chiamate Wi-Fi nelle impostazioni. (Codice di errore: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Si è verificato un problema con la registrazione delle chiamate Wi‑Fi con l\'operatore: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chiamata Wi-Fi %s"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"Utilizzo di hardware biometrico"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Consente all\'app di utilizzare hardware biometrico per eseguire l\'autenticazione"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestisci hardware per il riconoscimento delle impronte digitali"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Consente all\'app di richiamare metodi per aggiungere e rimuovere modelli di impronte digitali da utilizzare."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"utilizzo di hardware per il riconoscimento delle impronte digitali"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non riconosciuto"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware per l\'impronta digitale non disponibile."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metodo inserimento"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Azioni testo"</string>
<string name="email" msgid="4560673117055050403">"Invia una email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Invia un\'email all\'indirizzo selezionato"</string>
<string name="dial" msgid="1253998302767701559">"Chiama"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Chiama il numero di telefono selezionato"</string>
<string name="map" msgid="6521159124535543457">"Localizza"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localizza l\'indirizzo selezionato"</string>
<string name="browse" msgid="1245903488306147205">"Apri"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Apri l\'URL selezionato"</string>
<string name="sms" msgid="4560537514610063430">"Invia messaggio"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Invia un SMS al numero di telefono selezionato"</string>
<string name="add_contact" msgid="7867066569670597203">"Aggiungi"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Aggiungi ai contatti"</string>
<string name="view_calendar" msgid="979609872939597838">"Visualizza"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Visualizza la data selezionata nel calendario"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Pianifica"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Pianifica l\'evento nella data selezionata"</string>
<string name="view_flight" msgid="7691640491425680214">"Monitora"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Monitora il volo selezionato"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Spazio di archiviazione in esaurimento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Alcune funzioni di sistema potrebbero non funzionare"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Memoria insufficiente per il sistema. Assicurati di avere 250 MB di spazio libero e riavvia."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Stabilisci la connessione per aprire la rete Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Collegati alla rete Wi-Fi dell\'operatore"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Connessione alla rete Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connessione alla rete Wi-Fi stabilita"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossibile connettersi alla rete Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Disattiva"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparazione della <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ricerca errori"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuova <xliff:g id="NAME">%s</xliff:g> rilevata"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per trasferire foto e altri file"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danneggiata"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"L\'elemento <xliff:g id="NAME">%s</xliff:g> è danneggiato. Tocca per risolvere."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Il supporto esterno <xliff:g id="NAME">%s</xliff:g> è danneggiato. Seleziona per risolvere il problema."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non supportata"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Il dispositivo non supporta il seguente elemento: <xliff:g id="NAME">%s</xliff:g>. Tocca per configurare un formato supportato."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Il dispositivo non supporta questo tipo di <xliff:g id="NAME">%s</xliff:g>. Seleziona per eseguire la configurazione in un formato supportato."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Rimozione imprevista della <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Per evitare di perdere dati, smonta la <xliff:g id="NAME">%s</xliff:g> prima di rimuoverla"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> rimossa"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> rimossa; inseriscine un\'altra"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Espulsione <xliff:g id="NAME">%s</xliff:g> ancora in corso…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Non rimuovere"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Espelli"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Apri"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mancante"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinserisci il dispositivo"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Spostamento di <xliff:g id="NAME">%s</xliff:g> in corso"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Spostamento dei dati in corso"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Spostamento completato"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dati spostati sulla <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Impossibile spostare i dati"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dati lasciati nella posizione originaria"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Rimosso"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Espulso"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Verifica…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installato dall\'amministratore"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aggiornato dall\'amministratore"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminato dall\'amministratore"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Per prolungare la durata della batteria, la funzione Risparmio energetico riduce le prestazioni del dispositivo e limita o disattiva la vibrazione, i servizi di geolocalizzazione e i dati in background. Email, Messaggi e altre app basate sulla sincronizzazione potrebbero non essere aggiornate finché non le apri.\n\nLa funzione Risparmio energetico viene disattivata automaticamente quando il dispositivo è in carica."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Attivare Risparmio dati?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Attiva"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Audio disattivato da <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Richiesta USSD modificata in chiamata normale"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Richiesta USSD modificata in richiesta SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Modificata in nuova richiesta USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Richiesta USSD modificata in videochiamata"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Richiesta SS modificata in chiamata normale"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Richiesta SS modificata in videochiamata"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Richiesta SS modificata in richiesta USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Modificata in nuova richiesta SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profilo di lavoro"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Espandi"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Comprimi"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM non predisposta per la voce"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM non consentita per la voce"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefono non consentito per la voce"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Finestra popup"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"È stato eseguito il downgrade della versione dell\'app oppure la versione non è compatibile con questa scorciatoia"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 56cafa9..51df253 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -79,15 +79,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: לא מוגבלת"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"השירות לא הוקצה."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"אינך יכול לשנות את הגדרת זיהוי המתקשר."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"חבילת הגלישה לא זמינה"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"אין גישה לשיחות חירום"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"אין שירות של חבילת גלישה"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"שיחות חירום לא זמינות"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"אין אפשרות לבצע שיחות רגילות"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"אין אפשרות לבצע שיחות חירום ושיחות קוליות רגילות"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"הרשת הסלולרית במיקום הזה חסמה את השירות באופן זמני"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"לא ניתן להתחבר לרשת"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"כדי לשפר את הקליטה, כדאי לנסות לשנות את סוג הרשת בהגדרות > רשת ואינטרנט > רשתות סלולריות > סוג רשת מועדף."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"שיחות ה-Wi-Fi מופעלות"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"כדי לבצע שיחות חירום, יש להתחבר לרשת סלולרית."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"אין שירות קולי או שיחות חירום"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"הושבת באופן זמני על ידי הספק"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"לא ניתן להתחבר לרשת הסלולרית"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"יש לנסות לשנות את הרשת המועדפת. ניתן להקיש כדי לשנות."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"שיחות חירום לא זמינות"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"לא ניתן לבצע שיחות חירום דרך Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"התראות"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"העברת שיחות"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"מצב \'התקשרות חזרה בחירום\'"</string>
@@ -122,12 +124,12 @@
<string name="roamingText11" msgid="4154476854426920970">"מודעת באנר נודדת מופעלת"</string>
<string name="roamingText12" msgid="1189071119992726320">"מודעת באנר נודדת כבויה"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"מחפש שירות"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"שיחות ב-Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"לא ניתן היה להגדיר שיחות Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"יש להירשם אצל הספק (קוד שגיאה: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"אירעה בעיה ברישום שיחות Wi-Fi אצל הספק שלך: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +164,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"בקשות רבות מדי מעובדות. נסה שוב מאוחר יותר."</string>
<string name="notification_title" msgid="8967710025036163822">"שגיאת כניסה עבור <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"סנכרון"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"סנכרון"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"יש מחיקות רבות מדי של <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"לא ניתן לסנכרן"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"נעשה ניסיון למחוק יותר מדי <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"שטח האחסון של הטאבלט מלא. מחק קבצים כדי לפנות מקום."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"שטח האחסון של השעון מלא. מחק כמה קבצים כדי לפנות שטח."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"האחסון בטלוויזיה מלא. מחק חלק מהקבצים כדי לפנות שטח."</string>
@@ -178,14 +180,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"על ידי המנהל של פרופיל העבודה שלך"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"על ידי <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"פרופיל העבודה נמחק"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"פרופיל העבודה נמחק מפני שחסרה אפליקציית ניהול"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"אפליקציית הניהול של פרופיל העבודה חסרה או פגומה. כתוצאה מכך, פרופיל העבודה שלך נמחק, כולל כל הנתונים הקשורים אליו. לקבלת עזרה, פנה למנהל המערכת."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"פרופיל העבודה שלך אינו זמין עוד במכשיר הזה"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"בוצעו ניסיונות רבים מדי להזנת סיסמה"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"המכשיר מנוהל"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"הארגון שלך מנהל מכשיר זה ועשוי לנטר את התנועה ברשת. הקש לקבלת פרטים."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"תתבצע מחיקה של המכשיר"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"לא ניתן להשתמש באפליקציה של מנהל המערכת.\n\nאם יש לך שאלות, פנה למנהל המערכת של הארגון."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"לא ניתן להשתמש באפליקציה של מנהל המערכת.\n\nאם יש לך שאלות, יש ליצור קשר עם מנהל המערכת של הארגון."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ההדפסה הושבתה על ידי <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"אני"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"אפשרויות טאבלט"</string>
@@ -242,6 +243,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"מצב טיסה"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"מצב טיסה מופעל"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"חיסכון בסוללה"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"תכונת החיסכון בסוללה כבויה"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"תכונת החיסכון בסוללה פועלת"</string>
<string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string>
<string name="global_action_assist" msgid="3892832961594295030">"סיוע"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -275,31 +279,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"החלפה לפרופיל עבודה"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"אנשי קשר"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"גישה אל אנשי הקשר"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה לאנשי הקשר שלך"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה לאנשי הקשר שלך?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"מיקום"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"גישה אל מיקום המכשיר הזה"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה למיקום המכשיר"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה למיקום המכשיר?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"יומן"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"גישה אל היומן"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה ליומן"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה ליומן?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"שליחה והצגה של הודעות SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאה לשלוח הודעות SMS ולהציג אותן"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאה לשלוח הודעות SMS ולהציג אותן?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"אחסון"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"גישה אל תמונות, מדיה וקבצים במכשיר שלך"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה לתמונות, למדיה ולקבצים במכשיר"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה לתמונות, למדיה ולקבצים במכשיר?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"מיקרופון"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"הקלטת אודיו"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאה להקליט אודיו"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאה להקליט אודיו?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"מצלמה"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"צילום תמונות והקלטת וידאו"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאה לצלם תמונות וסרטונים"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאה לצלם תמונות וסרטונים?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"טלפון"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"התקשרות וניהול של שיחות טלפון"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאה להתקשרות ולניהול של שיחות טלפון"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאה להתקשרות ולניהול של שיחות טלפון?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"חיישני גוף"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה לנתוני חיישנים העוקבים אחר הסימנים החיוניים שלך"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה לנתוני חיישנים העוקבים אחר הסימנים החיוניים שלך?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזור תוכן של חלון"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string>
@@ -311,7 +315,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ביצוע תנועות"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"יכול להקיש, להחליק, לעשות תנועת צביטה ולבצע תנועות אחרות."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"תנועות"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"אפשרות לזהות תנועות בזמן נגיעה בחיישן טביעות האצבע של המכשיר"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"אפשרות לזהות תנועות בזמן נגיעה בחיישן טביעות האצבע של המכשיר."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"השבת או שנה את שורת המצב"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"מאפשר לאפליקציה להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"להיות שורת הסטטוס"</string>
@@ -362,6 +366,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטאבלט."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"מאפשרת לאפליקציה ליצור חלקים ממנה השמורים בזיכרון באופן עקבי. הדבר עלול להגביל את הזיכרון הזמין לאפליקציות אחרות וכתוצאה מכך להאט את פעולת הטלוויזיה."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטלפון."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"הרצת שירות קדמה"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"הרשאה זו מאפשרת לאפליקציה לעשות שימוש בשירותים בקדמה."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"מדידת נפח האחסון של אפליקציות"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי קובצי המטמון שלו"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"שינוי הגדרות מערכת"</string>
@@ -484,6 +490,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"מאפשר לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\'."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ביטול נעילת המסך שלך"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"מאפשר לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית את נעילת המקשים בעת קבלה של שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ניהול חומרה של טביעות אצבעות"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"מאפשר לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות טביעות אצבעות שבהן ייעשה שימוש."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"חומרה של טביעות אצבעות"</string>
@@ -496,6 +506,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"לא זוהתה"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"החומרה בשביל טביעת אצבע אינה זמינה."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string>
@@ -808,6 +820,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה על ידי שרטוט קו."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה באמצעות זיהוי פנים."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות קוד גישה."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ביטול נעילה של קוד הגישה ל-SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ביטול נעילה של PUK ל-SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה באמצעות סיסמה."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"אזור לשרטוט קו ביטול נעילה."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"אזור הסטה."</string>
@@ -869,6 +883,12 @@
<string name="text_copied" msgid="4985729524670131385">"הטקסט הועתק ללוח."</string>
<string name="more_item_label" msgid="4650918923083320495">"עוד"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"תפריט+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"רווח"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"מחיקה"</string>
@@ -1034,14 +1054,32 @@
<string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
<string name="email" msgid="4560673117055050403">"אימייל"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"שיחה"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"איתור"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"פתיחה"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"הודעה"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"הוספה"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"תצוגה"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"לוח זמנים"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"מעקב"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"שטח האחסון אוזל"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ייתכן שפונקציות מערכת מסוימות לא יפעלו"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"אין מספיק שטח אחסון עבור המערכת. ודא שיש לך שטח פנוי בגודל 250MB התחל שוב."</string>
@@ -1114,31 +1152,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"האם יש עדכון חדש?"</string>
<string name="smv_application" msgid="3307209192155442829">"האפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> (תהליך <xliff:g id="PROCESS">%2$s</xliff:g>) הפר את מדיניות StrictMode באכיפה עצמית שלו."</string>
<string name="smv_process" msgid="5120397012047462446">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הפר את מדיניות StrictMode באכיפה עצמית."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android מבצע שדרוג…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"הפעלת Android מתחילה…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"הטלפון מתעדכן…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"הטאבלט מתעדכן…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"הפעלת המכשיר מתחילה…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"הפעלת הטלפון מתחילה…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"הפעלת הטאבלט מתחילה…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"הפעלת המכשיר מתחילה…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"מתבצעת אופטימיזציה של האחסון."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"מסיים עדכון Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ייתכן שאפליקציות מסוימות לא יפעלו כראוי עד סיום השדרוג"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"עדכון המערכת לקראת סיום…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> מבצעת שדרוג…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"מבצע אופטימיזציה של אפליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"מכין את <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"מפעיל אפליקציות."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"מסיים אתחול."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"יש להקיש כדי לחזור למשחק"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"בחירת משחק"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"לקבלת ביצועים טובים יותר, רק אחד מבין המשחקים האלה יכול להיות פתוח בכל פעם."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"חזרה אל <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump של ערימה נאסף. הקש כדי לשתף"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"בחירת פעולה לביצוע עם טקסט"</string>
@@ -1177,12 +1212,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"התחברות לרשת Wi‑Fi פתוחה"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"התחברות לרשת Wi‑Fi של ספק"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"מתחבר לרשת Wi‑Fi פתוחה"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"התחברות לרשת Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"מחובר לרשת Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"לא ניתן היה להתחבר לרשת Wi-Fi"</string>
<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="1100098935861622985">"כל הרשתות"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"כל הרשתות"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ה-Wi-Fi יופעל אוטומטית"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"כשתימצאו בקרבת רשת באיכות גבוהה ששמרתם"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"אל תפעיל שוב"</string>
@@ -1248,6 +1283,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"הפעלה מחדש"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"הפעלה של השירות הסלולרי"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ניתן להוריד את האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> כדי להפעיל את כרטיס ה-SIM החדש"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"הורדת אפליקציה"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ה-SIM החדש הוכנס"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"הקש כדי להגדיר"</string>
@@ -1266,13 +1302,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP באמצעות USB מופעל"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"שיתוף אינטרנט בין מכשירים באמצעות USB מופעל"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI באמצעות USB מופעל"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"מצב אביזר USB מופעל"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"אביזר USB מחובר"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"הקש לקבלת אפשרויות נוספות."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"טעינת המכשיר המחובר. יש להקיש לאפשרויות נוספות."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"המכשיר זיהה התקן אודיו אנלוגי"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ההתקן שחיברת לא תואם לטלפון הזה. הקש למידע נוסף."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ניפוי באגים של USB מחובר"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"יש להקיש כדי להשבית ניפוי באגים של USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"יש להקיש כדי לכבות את ניפוי הבאגים ב-USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"בחר להשבית ניפוי באגים ב-USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"עיבוד דוח על באג..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"האם לשתף דוח על באג?"</string>
@@ -1291,34 +1327,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"תצוגה של <xliff:g id="NAME">%s</xliff:g> מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> מוצגת מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"אם אינך רוצה ש-<xliff:g id="NAME">%s</xliff:g> תשתמש בתכונה הזו, הקש כדי לפתוח את ההגדרות ולכבות אותה."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"כבה"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"הכנת <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"בודק אם יש שגיאות"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"זוהה <xliff:g id="NAME">%s</xliff:g> חדש"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"כיבוי"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"להעברת תמונות ומדיה"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> פגום"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> פגום. הקש כדי לתקן."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> פגום. בחר כדי לטפל בבעיה."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> לא נתמך"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"מכשיר זה אינו תומך ב-<xliff:g id="NAME">%s</xliff:g> זה. הקש כדי להגדיר בפורמט נתמך."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> לא נתמך במכשיר הזה. בחר כדי להגדיר בפורמט שנתמך."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> הוסר באופן בלתי צפוי"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"בטל טעינה של <xliff:g id="NAME">%s</xliff:g> לפני הסרתו כדי למנוע אובדן נתונים"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> הוסר"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> הוסר. הכנס מדיה חדשה"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"הוצאת <xliff:g id="NAME">%s</xliff:g> נמשכת..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"אל תסיר"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> חסר"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"הכנס שוב את ההתקן הזה"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"מעביר את <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"מעביר נתונים"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ההעברה הושלמה"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"הנתונים הועברו אל <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"לא ניתן היה להעביר את הנתונים"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"הנתונים נותרו במיקום המקורי"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"הוסר"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"הוצא"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"בודק…"</string>
@@ -1377,14 +1429,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ה-VPN שמופעל תמיד, מתחבר..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ה-VPN שפועל תמיד, מחובר"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"אין חיבור ל-VPN שפועל כל הזמן"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"שגיאת VPN שמופעל תמיד"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"לא ניתן להתחבר ל-VPN שפועל כל הזמן"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"רוצה לשנות את הגדרות הרשת או הגדרות ה-VPN?"</string>
<string name="upload_file" msgid="2897957172366730416">"בחירת קובץ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"לא נבחר קובץ"</string>
<string name="reset" msgid="2448168080964209908">"איפוס"</string>
<string name="submit" msgid="1602335572089911941">"שלח"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"מצב מכונית מופעל"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"הקש כדי לצאת ממצב מכונית."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"אפליקציית הנהיגה פועלת"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"יש להקיש כדי לצאת מאפליקציית הנהיגה."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"שיתוף אינטרנט פעיל"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"הקש כדי להגדיר."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"שיתוף האינטרנט בין ניידים מושבת"</string>
@@ -1464,22 +1516,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"כונן USB של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"אחסון USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"עריכה"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"התראה על שימוש בנתונים"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"הקש כדי להציג נתוני שימוש והגדרות."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"הגעת למגבלת הנתונים של 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"הגעת למגבלת הנתונים של 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"אזהרה לגבי שימוש בנתונים"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"השתמשת ב-<xliff:g id="APP">%s</xliff:g> נתונים"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"הגעת למגבלה של חבילת הגלישה"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"הגעת למגבלת נתוני Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"הנתונים הושהו למשך המחזור"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"אירעה חריגה ממגבלת הנתונים של 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"אירעה חריגה ממגבלת הנתונים של 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"אירעה חריגה ממגבלת הנתונים לנייד"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"אירעה חריגה ממגבלת הנתונים של Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> מעל למגבלה שצוינה."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"הנתונים הושהו להמשך המחזור"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"חריגה מהמגבלה של חבילת הגלישה"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"חריגה ממגבלת נתוני ה-Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"חרגת ב-<xliff:g id="SIZE">%s</xliff:g> מעבר למגבלה המוגדרת"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"נתוני הרקע מוגבלים"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"הקש כדי להסיר את ההגבלה."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"שימוש נרחב בחבילת הגלישה"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"נפח השימוש שלך בחבילת הגלישה במהלך הימים האחרונים גדול מהרגיל. יש להקיש כדי להציג נתוני שימוש והגדרות."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"שימוש מוגבר בחבילת הגלישה"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"האפליקציות שלך השתמשו בנתונים רבים יותר מהרגיל"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"האפליקציה <xliff:g id="APP">%s</xliff:g> השתמשה בנתונים רבים יותר מהרגיל"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"אישור אבטחה"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"אישור זה תקף."</string>
<string name="issued_to" msgid="454239480274921032">"הוקצה ל:"</string>
@@ -1719,7 +1768,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"הותקנה על ידי מנהל המערכת"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"עודכנה על ידי מנהל המערכת"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"נמחקה על ידי מנהל המערכת"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתחו אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"כדי להאריך את חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את ביצועי המכשיר ומגבילה רטט, שירותי מיקום ונתוני רקע, או מכבה אותם. הודעות אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתח/י אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string>
<string name="data_saver_description" msgid="6015391409098303235">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה אתה משתמש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. משמעות הדבר היא, למשל, שתמונות יוצגו רק לאחר שתקיש עליהן."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"האם להפעיל את חוסך הנתונים (Data Saver)?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"הפעל"</string>
@@ -1735,10 +1784,10 @@
<item quantity="other">למשך %1$d דקות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">למשך דקה אחת (עד <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="two">למשך %d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">למשך %d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">למשך %d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="two">למשך %1$d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="many">למשך %1$d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">למשך %1$d שעות (עד <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">למשך שעה אחת (עד <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
@@ -1759,7 +1808,7 @@
<item quantity="other">למשך %d דקות</item>
<item quantity="one">למשך דקה אחת</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="two">למשך %d שעות</item>
<item quantity="many">למשך %d שעות</item>
<item quantity="other">למשך %d שעות</item>
@@ -1786,14 +1835,14 @@
<string name="muted_by" msgid="6147073845094180001">"הושתק על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"קיימת בעיה פנימית במכשיר שלך, וייתכן שהתפקוד שלו לא יהיה יציב עד שתבצע איפוס לנתוני היצרן."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, צור קשר עם היצרן."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"בקשת USSD שונתה לבקשת DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"בקשת USSD שונתה לבקשת SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"בקשת USSD שונתה לבקשת USSD חדשה."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"בקשת USSD שונתה לבקשת Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"בקשת SS שונתה לבקשת DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"בקשת SS שונתה לבקשת Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"בקשת SS שונתה לבקשת USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"בקשת SS שונתה לבקשת SS חדשה."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"בקשת USSD שונתה לשיחה רגילה"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"בקשת USSD שונתה לבקשת SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"היה שינוי לבקשת USSD חדשה"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"בקשת USSD שונתה לשיחת וידאו"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"בקשת SS שונתה לשיחה רגילה"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"בקשת SS שונתה לשיחת וידאו"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"בקשת SS שונתה לבקשת USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"היה שינוי לבקשת SS חדשה"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"פרופיל עבודה"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"הרחב"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"כווץ"</string>
@@ -1895,6 +1944,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ניהול התצורה של כרטיס ה-SIM לא מתאים לזיהוי קולי"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"כרטיס ה-SIM לא מורשה לזיהוי קולי"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"הטלפון לא מורשה לזיהוי קולי"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"חלון קופץ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"גרסת האפליקציה שודרגה לאחור או שאינה תואמת לקיצור דרך זה"</string>
@@ -1907,7 +1964,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"אותרה אפליקציה מזיקה"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> רוצה להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"עריכה"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"שיחות והודעות ירטטו"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"שיחות והודעות יושתקו"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"שינויי מערכת"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"נא לא להפריע"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"מצב \'נא לא להפריע\' מסתיר הודעות כדי לעזור לך להתרכז"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"זו התנהגות חדשה. יש להקיש כדי לשנות."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ההגדרה \'נא לא להפריע\' השתנתה"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"יש להקיש כדי לבדוק את הגדרות הביצועים להפרעות"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"יש להקיש כדי לבדוק מה חסום."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"מערכת"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"הגדרות"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 16abaca..485793b 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"音声通話サービス停止"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"音声サービスと緊急通報のブロック"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"携帯通信会社によって一時的に OFF にされています"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"モバイル ネットワークにアクセスできません"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"タップして、優先ネットワークを変更してください。"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"緊急通報は利用できません"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ローミングバナーON"</string>
<string name="roamingText12" msgid="1189071119992726320">"ローミングバナーOFF"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"サービスを検索中"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi 通話をセットアップできませんでした"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 通話を再度 ON にしてください(エラーコード: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"携帯通信会社への Wi‑Fi 通話の登録中に問題が発生しました(<xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi通話(%s)"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"生体認証ハードウェアの使用"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"生体認証ハードウェアを認証に使用することをアプリに許可します"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"指紋ハードウェアの管理"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"使用する指紋テンプレートの追加や削除を行う方法の呼び出しをアプリに許可します。"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"指紋ハードウェアの使用"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"認識されませんでした"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋ハードウェアは使用できません。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋を保存できません。既存の指紋を削除してください。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"入力方法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"テキスト操作"</string>
<string name="email" msgid="4560673117055050403">"メール"</string>
+ <string name="email_desc" msgid="3638665569546416795">"選択したメールアドレスにメールを送信します"</string>
<string name="dial" msgid="1253998302767701559">"電話"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"選択した電話番号に電話をかけます"</string>
<string name="map" msgid="6521159124535543457">"探す"</string>
+ <string name="map_desc" msgid="9036645769910215302">"選択した住所を探します"</string>
<string name="browse" msgid="1245903488306147205">"開く"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"選択した URL を開きます"</string>
<string name="sms" msgid="4560537514610063430">"メッセージ"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"選択した電話番号に SMS を送信します"</string>
<string name="add_contact" msgid="7867066569670597203">"追加"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"連絡先に追加します"</string>
<string name="view_calendar" msgid="979609872939597838">"表示"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"カレンダーで選択した日時を表示します"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"スケジュール"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"選択した日時に予定を設定します"</string>
<string name="view_flight" msgid="7691640491425680214">"トラック"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"選択したフライトをチェックします"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"空き容量わずか"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"一部のシステム機能が動作しない可能性があります"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"システムに十分な容量がありません。250MBの空き容量を確保して再起動してください。"</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Wi-Fi オープン ネットワークに接続"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"携帯通信会社の Wi‑Fi ネットワークに接続"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi-Fi ネットワークに接続中"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ネットワークに接続しました"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ネットワークに接続できませんでした"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>が他のアプリの上に表示されています"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"OFF にする"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"新しい<xliff:g id="NAME">%s</xliff:g>が検出されました"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"写真などのメディア転送用"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>は破損しています"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>は破損しています。タップして修正してください。"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>が破損しています。修正するには選択してください。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"対応していない<xliff:g id="NAME">%s</xliff:g>です"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"この端末はこの <xliff:g id="NAME">%s</xliff:g>に対応していません。タップして、対応している形式でセットアップしてください。"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"この端末はこの <xliff:g id="NAME">%s</xliff:g>に対応していません。サポートされるフォーマットで設定するには選択してください。"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>が不適切に取り外されました"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"データの喪失を防ぐため<xliff:g id="NAME">%s</xliff:g>を取り外す前にマウントを解除してください。"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>が取り外されました"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>が取り外されました。新しいものを挿入してください。"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"まだ<xliff:g id="NAME">%s</xliff:g>を取り外し中です…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"取り外さないでください"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g>が見つかりません"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"このデバイスを再挿入してください"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>を移動しています"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"データを移動しています"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"移動が完了しました"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"データを<xliff:g id="NAME">%s</xliff:g>に移動しました"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"データを移動できませんでした"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"データは元の場所にあります"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"取り外しました"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"取り外しました"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"確認しています…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"管理者によりインストールされています"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"管理者により更新されています"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"管理者により削除されています"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"バッテリーを長持ちさせるため、バッテリー セーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、バックグラウンド データを制限したり、OFF にしたりします。同期を使用するメールやメッセージなどのアプリは起動しないと更新されない場合があります。\n\nバッテリー セーバーは端末の充電中は自動的に OFF になります。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータにアクセスすることはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ON にする"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>によりミュートになっています"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"端末で内部的な問題が発生しました。データが初期化されるまで不安定になる可能性があります。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"端末で内部的な問題が発生しました。詳しくはメーカーにお問い合わせください。"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD リクエストは通常の通話に変更されました"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD リクエストは SS リクエストに変更されました"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"新しい USSD リクエストに変更されました"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD リクエストはビデオ通話に変更されました"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS リクエストは通常の通話に変更されました"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS リクエストはビデオ通話に変更されました"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS リクエストは USSD リクエストに変更されました"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"新しい SS リクエストに変更されました"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"仕事用プロファイル"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"折りたたむ"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"音声に対応していない SIM です"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"音声を使用できない SIM です"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"音声を使用できないスマートフォンです"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"ポップアップ ウィンドウ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"他 <xliff:g id="NUMBER">%1$d</xliff:g> 件"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"アプリのバージョンがダウングレードされているか、このショートカットに対応していません"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 7bee201..0b5f1e1 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ხმოვანი ზარების სერვისი არ არის"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ხმოვანი სერვისები და გადაუდებელი ზარი მიუწვდომელია"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"დროებით გამორთულია თქვენი ოპერატორის მიერ"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"მობილურ ქსელთან დაკავშირება ვერ ხერხდება"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ცადეთ უპირატესი ქსელის შეცვლა. შეეხეთ შესაცვლელად."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"გადაუდებელი ზარი მიუწვდომელია"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner ჩართულია"</string>
<string name="roamingText12" msgid="1189071119992726320">"როუმინგის ბანერი გამორთულია"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"სერვისის ძიება"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi დარეკვის დაყენება ვერ მოხერხდა"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi-ს მეშვეობით ზარების განსახორციელებლად ან შეტყობინებების გასაგზავნად, პირველ რიგში, ამ სერვისის გააქტიურება თქვენს ოპერატორს უნდა თხოვოთ. შემდეგ კი ხელახლა ჩართეთ Wi-Fi დარეკვა პარამეტრებიდან. (შეცდომის კოდი: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Wi‑Fi დარეკვის თქვენს ოპერატორთან რეგისტრირებისას შეცდომა წარმოიქმნა: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s დარეკვა Wi-Fi-ს მეშვეობით"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"ბიომეტრიული აპარატის გამოყენება"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს ბიომეტრიული აპარატი"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"თითის ანაბეჭდის აპარატის მართვა"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"საშუალებას აძლევს აპლიკაციას დაამატოს ან ამოშალოს გამოსაყენებელი თითის ანაბეჭდის ნიმუშები,"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"თითის ანაბეჭდის აპარატის გამოყენება"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"არ არის ამოცნობილი"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"თითის ანაბეჭდის აპარატურა არ არის ხელმისაწვდომი."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"შეყვანის მეთოდი"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ქმედებები ტექსტზე"</string>
<string name="email" msgid="4560673117055050403">"ელფოსტა"</string>
+ <string name="email_desc" msgid="3638665569546416795">"არჩეულ მისამართზე ელფოსტის გაგზავნა"</string>
<string name="dial" msgid="1253998302767701559">"ზარი"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"არჩეულ ტელეფონის ნომერზე დარეკვა"</string>
<string name="map" msgid="6521159124535543457">"მიკვლევა"</string>
+ <string name="map_desc" msgid="9036645769910215302">"არჩეული მისამართის მდებარეობის დადგენა"</string>
<string name="browse" msgid="1245903488306147205">"გახსნა"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"არჩეული URL-ის გახსნა"</string>
<string name="sms" msgid="4560537514610063430">"შეტყობინება"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"არჩეული ტელეფონის ნომრისთვის შეტყობინების გაგზავნა"</string>
<string name="add_contact" msgid="7867066569670597203">"დამატება"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"დამატება"</string>
<string name="view_calendar" msgid="979609872939597838">"ნახვა"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"არჩეული დროის კალენდარში ნახვა"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"განრიგი"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"მოვლენის არჩეული დროისთვის დაგეგმვა"</string>
<string name="view_flight" msgid="7691640491425680214">"ჩანაწერი"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"არჩეული ფრენისთვის თვალის მიდევნება"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"თავისუფალი ადგილი იწურება"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"სისტემის ზოგიერთმა ფუნქციამ შესაძლოა არ იმუშავოს"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"სისტემისათვის საკმარისი საცავი არ არის. დარწმუნდით, რომ იქონიოთ სულ მცირე 250 მბაიტი თავისუფალი სივრცე და დაიწყეთ ხელახლა."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"დაუკავშირდით ღია Wi‑Fi ქსელს"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"დაუკავშირდით ოპერატორის Wi‑Fi-ქსელს"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"მიმდინარეობს Wi‑Fi ქსელთან დაკავშირება"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ქსელთან დაკავშირება წარმატებით მოხერხდა"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ქსელთან დაკავშირება ვერ მოხერხდა"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"თუ არ გსურთ <xliff:g id="NAME">%s</xliff:g>-ის მიერ ამ ფუნქციის გამოყენება, შეეხეთ პარამეტრების გასახსნელად და გამორთეთ."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"გამორთვა"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ის მომზადება"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"შეცდომების შემოწმება"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"აღმოჩენილია ახალი <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ფოტოებისა და მედიის გადასატანად"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"დაზიანებული <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია. შეეხეთ გასასწორებლად."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია. შეეხეთ გასასწორებლად."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"მხარდაუჭერელი <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ეს <xliff:g id="NAME">%s</xliff:g> მხარდაუჭერელია არ მოწყობილობაზე. შეეხეთ მხარდაჭერილ ფორმატში დასაყენებლად."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ეს <xliff:g id="NAME">%s</xliff:g> მხარდაუჭერელია ამ მოწყობილობაზე. შეეხეთ მხარდაჭერილ ფორმატში დასაყენებლად."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"მოულოდნელად მოხდა <xliff:g id="NAME">%s</xliff:g>-ის ამოღება"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"მონაცემთა დაკარგვის თავიდან ასაცილებლად, ფიზიკურად ამოღებამდე, სისტემურად მოხსენით <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ამოღებულია"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ამოღებულია; ჩასვით ახალი"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ის გამოღება არ დასრულებულა…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"არ ამოიღოთ"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> აკლია"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ხელახლა შეაერთეთ ეს მოწყობილობა"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"მიმდინარეობს <xliff:g id="NAME">%s</xliff:g>-ის გადატანა"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"მიმდინარეობს მონაცემთა გადატანა"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"გადატანა დასრულდა"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"მონაცემები გადატანილი იქნა <xliff:g id="NAME">%s</xliff:g>-ში"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"მონაცემების გადატანა ვერ მოხერხდა"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"მონაცემები დარჩა თავდაპირველ მდებარეობაში"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ამოღებულია"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ჩახსნილია სისტემიდან"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"შემოწმება..."</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"დაინსტალირებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ბატარეის მუშაობის გასახანგრძლივებლად, ბატარეის დამზოგი ამცირებს თქვენი მოწყობილობის ფუნქციონალობას და ზღუდავს ან თიშავს ვიბრაციას, მდებარეობის სერვისებს და ფონურ მონაცემებს. ელფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დამოკიდებული აპები მათ გახსნამდე არ განახლდება.\n\nბატარეის დამზოგი ავტომატურად გამოირთვება, როცა თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ჩართვა"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"დადუმებულია <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ის მიერ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ფიქსირდება თქვენი მ ოწყობილობის შიდა პრობლემა და შეიძლება არასტაბილური იყოს, სანამ ქარხნულ მონაცემების არ განაახლებთ."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ფიქსირდება თქვენი მოწყობილობის შიდა პრობლემა. დეტალებისათვის, მიმართეთ თქვენს მწარმოებელს."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD მოთხოვნა შეიცვალა ჩვეულებრივი ზარის მოთხოვნით"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD მოთხოვნა შეიცვალა SS მოთხოვნით"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"შეიცვალა ახალი USSD მოთხოვნით"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD მოთხოვნა შეიცვალა ვიდეოზარის მოთხოვნით"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS მოთხოვნა შეიცვალა ჩვეულებრივი ზარის მოთხოვნით"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS მოთხოვნა შეიცვალა ვიდეოზარის მოთხოვნით"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"შეიცვალა ახალი SS მოთხოვნით"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"სამსახურის პროფილი"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"გაშლა"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ჩაკეცვა"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM ბარათი ამ ხმისთვის უზრუნველყოფილი არაა"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM ბარათი ამ ხმისთვის დაუშვებელია"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ტელეფონი ამ ხმისთვის დაუშვებელია"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"ამომხტარი ფანჯარა"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"აპის ვერსია დაქვეითებულია ან არაა თავსებადი ამ მალსახმობთან"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 9a08420..d250640 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Дауыстық қоңыраулар қызметі жоқ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дауыс қызметі немесе жедел қызметке қоңырау шалу мүмкіндігі жоқ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Оператор уақытша өшірген"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобильдік желіге қосылу мүмкін емес"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Таңдаулы желіні өзгертіп көріңіз. Өзгерту үшін түртіңіз."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Жедел қызметке қоңырау шалу мүмкін емес"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Роуминг баннері қосулы"</string>
<string name="roamingText12" msgid="1189071119992726320">"Роуминг баннері өшірулі"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Қызметті іздеу"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi қоңырауы реттелмеді"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi арқылы қоңырау шалу немесе хабарлар жіберу үшін, алдымен операторыңыздан құрылғыны реттеуді сұраңыз. Содан кейін \"Параметрлер\" бөлімінен Wi-Fi қоңырауларын қайта қосыңыз. (Қате коды: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Оператордың Wi‑Fi қоңырауын тіркеу кезінде қате шықты: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi арқылы қоңырау шалу"</item>
@@ -282,7 +285,7 @@
<string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> қолданбасына SMS хабарларын жіберуге және көруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Жад"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"құрылғыдағы фотосуреттерге, мультимедиаға және файлдарға қол жеткізу"</string>
- <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> қолданбасына құрылғыдағы суреттерге, медиафайлдарға және файлдарға кіруге рұқсат берілсін бе?"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> қолданбасына құрылғыдағы суреттерге, медиафайлдарға және басқа файлдарға кіруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"аудио жазу"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> қолданбасына аудиомазмұн жазуға рұқсат берілсін бе?"</string>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"биометрикалық жабдықты пайдалану"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Аутентификациялау үшін қолданбаға биометрикалық жабдықты пайдалануға рұқсат береді"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"саусақ ізі жабдығын басқару"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Қолданбаға пайдаланатын саусақ ізі үлгілерін қосу және жою әдістерін шақыруға мүмкіндік береді."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"саусақ ізі жабдығын пайдалану"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Анықталмаған"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Саусақ ізі жабдығы қолжетімді емес."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Саусақ ізін сақтау мүмкін емес. Бар саусақ ізін жойыңыз."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Саусақ ізін күту уақыты бітті. Әрекетті қайталаңыз."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Енгізу әдісі"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Мәтін әрекеттері"</string>
<string name="email" msgid="4560673117055050403">"Электрондық пошта"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Таңдалған электрондық пошта мекенжайына хабар жіберу"</string>
<string name="dial" msgid="1253998302767701559">"Қоңырау шалу"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Таңдалған телефон нөміріне қоңырау шалу"</string>
<string name="map" msgid="6521159124535543457">"Орынды анықтау"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Таңдалған мекенжайдың орналасқан жерін анықтау"</string>
<string name="browse" msgid="1245903488306147205">"Ашу"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Таңдалған URL мекенжайын ашу"</string>
<string name="sms" msgid="4560537514610063430">"Хабар"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Таңдалған телефон нөміріне хабар жіберу"</string>
<string name="add_contact" msgid="7867066569670597203">"Енгізу"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Контактілер тізіміне енгізу"</string>
<string name="view_calendar" msgid="979609872939597838">"Көру"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Күнтізбеде таңдалған уақытты көру"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Кесте"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Таңдалған уақытқа іс-шараны жоспарлау"</string>
<string name="view_flight" msgid="7691640491425680214">"Бақылау"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Таңдалған ұшу рейсін қадағалау"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Жадта орын азайып барады"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Жүйенің кейбір функциялары жұмыс істемеуі мүмкін"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Жүйе үшін жад жеткіліксіз. 250 МБ бос орын бар екенін тексеріп, қайта іске қосыңыз."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ашық Wi‑Fi желісіне қосылу"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператордың Wi‑Fi желісіне қосылу"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi желісіне қосылуда"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi желісіне қосылды"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi желісіне қосылмады"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Барлық желілерді көру үшін түртіңіз"</string>
@@ -1259,33 +1274,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл функцияны пайдалануына жол бермеу үшін параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Өшіру"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> дайындалуда"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Қателер тексерілуде"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңа <xliff:g id="NAME">%s</xliff:g> анықталды"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Фотосуреттер мен медиа файлдарын тасымалдау үшін"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Бүлінген <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> бұзылды. Түзету үшін түртіңіз."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> бүлінген. Түзету үшін оны түртіңіз."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Қолданылмайтын <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бұл құрылғы <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетеді. Қолдау көрсетілетін пішімде орнату үшін түртіңіз."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Бұл құрылғыда <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетілмейді. Қолдау көрсетілетін форматта реттеуді таңдаңыз."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> кенеттен шығарылды"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Деректер жоғалып қалмауы үшін <xliff:g id="NAME">%s</xliff:g> құрылғысын ажыратып барып, шығару керек"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> шығарылды; жаңасын салыңыз"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> әлі шығарылуда…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Шығармаңыз"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Бұл құрылғыны қайта салыңыз"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> тасымалдануда"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Деректер тасымалдануда"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Тасымалданып болды"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Деректер <xliff:g id="NAME">%s</xliff:g> ішіне тасымалданды"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Деректерді тасымалдау мүмкін емес"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Деректер бастапқы орнында қалды"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Алынды"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ажыратылды"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Тексерілуде…"</string>
@@ -1677,8 +1708,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Әкімші орнатқан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Әкімші жаңартқан"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Әкімші жойған"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver құрылғының жұмыс өнімділігін төмендетеді және діріл функциясын, орынды анықтау қызметтерін, фондық деректі өшіреді. Синхрондауға негізделген электрондық пошта, хабар алмасу және басқа қолданбалар ашылмайынша жаңартылмайды.\n\nҚұрылғы зарядталып жатқанда, Battery Saver автоматты түрде өшеді."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Деректердің пайдаланылуын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге немесе қабылдауға жол бермейді. Қазір қолданылып жатқан қолданба деректерді пайдалануы мүмкін, бірақ жиі емес. Мысалы, кескіндер оларды түрткенге дейін көрсетілмейді."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Data Saver функциясын қосу керек пе?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Қосу"</string>
@@ -1729,22 +1759,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> үнін өшірген"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD сұрауы кәдімгі қоңырауға өзгертілді"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD сұрауы SS сұрауына өзгертілді"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Жаңа USSD сұрауына өзгертілді"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD сұрауы бейне қоңырауға өзгертілді"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS сұрауы кәдімгі қоңырауға өзгертілді"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS сұрауы бейне қоңырауға өзгертілді"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS сұрауы USSD сұрауына өзгертілді"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Жаңа SS сұрауына өзгертілді"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жұмыс профилі"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жаю"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жию"</string>
@@ -1842,6 +1864,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM картасы дауысқа пайдалануға арналмаған"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM картасын дауысқа пайдалануға тыйым салынған"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефонды дауысқа пайдалануға тыйым салынған"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Қалқымалы терезе"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Қолданбаның нұсқасы ескі немесе бұл таңбашамен үйлеспейді"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 0754b2f..25c9394 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"គ្មានសេវាកម្មជាសំឡេងទេ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"គ្មានសេវាកម្មសំឡេង ឬការហៅបន្ទាន់ទេ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"បិទដោយក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកជាបណ្តោះអាសន្ន"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"បិទដោយក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកជាបណ្តោះអាសន្ន សម្រាប់ស៊ីមទី <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"មិនអាចភ្ជាប់បណ្ដាញទូរសព្ទចល័តបានទេ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"សាកល្បងប្ដូរទៅបណ្ដាញដែលចង់ប្រើ។ សូមចុចដើម្បីផ្លាស់ប្ដូរ។"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"មិនអាចប្រើការហៅបន្ទាន់បានទេ"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"បើកបដារ៉ូមីង"</string>
<string name="roamingText12" msgid="1189071119992726320">"បិទបដារ៉ូមីង"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ស្វែងរកសេវាកម្ម"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"មិនអាចរៀបចំការហៅតាម Wi‑Fi បានទេ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ដើម្បីហៅទូរសព្ទ និងផ្ញើសារតាម Wi-Fi អ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកដំឡើងសេវាកម្មនេះជាមុនសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតនៅក្នុងការកំណត់។ (លេខកូដបញ្ហា៖ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"មានបញ្ហាក្នុងការចុះឈ្មោះការហៅតាម Wi‑Fi ជាមួយក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក៖ <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"ការហៅតាមរយៈ Wi-Fi %s"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"កំពុងដំណើរការសំណើច្រើនពេក។ ព្យាយាមម្ដងទៀតពេលក្រោយ។"</string>
<string name="notification_title" msgid="8967710025036163822">"កំហុសក្នុងការចូលសម្រាប់ <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ធ្វើសមកាលកម្ម"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"មិនអាចធ្វើសមកាលកម្មបានទេ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"បានព្យាយាមលុប <xliff:g id="CONTENT_TYPE">%s</xliff:g> ច្រើនដងពេក។"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ឧបករណ៍ផ្ទុកនៃកុំព្យូទ័របន្ទះពេញ។ លុបឯកសារមួយចំនួន។"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ឧបករណ៍របស់នាឡិកាពេញ។ លុបឯកសារមួយចំនួន។"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ឧបករណ៍ផ្ទុកទិន្នន័យទូរទស្សន៍ពេញហើយ។ លុបឯកសារមួយចំនួនដើម្បីឲ្យមានចន្លោះទំនេរ។"</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ប្តូរទៅកម្រងព័ត៌មានការងារ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ទំនាក់ទំនង"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ចូលប្រើទំនាក់ទំនងរបស់អ្នក"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើទំនាក់ទំនងរបស់អ្នក?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ទីតាំង"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ចូលដំណើរការទីតាំងរបស់ឧបករណ៍នេះ"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើទីតាំងរបស់ឧបករណ៍នេះ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ប្រតិទិន"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ចូលប្រើប្រិតិទិនរបស់អ្នក"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើប្រតិទិនរបស់អ្នក?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"សារ SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ផ្ញើ និងមើលសារ SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ផ្ញើ និងមើលសារ SMS ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ការផ្ទុក"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ចូលដំណើការរូបភាព មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើរូបថត មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"មីក្រូហ្វូន"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ថតសំឡេង"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ថតសំឡេង?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"កាមេរ៉ា"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ថតរូប និងថតវីដេអូ"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ថតរូប និងថតវីដេអូ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរសព្ទ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> គ្រប់គ្រង និងធ្វើការហៅទូរសព្ទ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ឧបករណ៍ចាប់សញ្ញារាងកាយ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយកមាតិកាវិនដូ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យមាតិកាវិនដូដែលអ្នកកំពុងទាក់ទងជាមួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើកការរកមើលដោយប៉ះ"</string>
@@ -492,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"ប្រើឧបករណ៍ស្កេនស្នាមម្រាមដៃ"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"អនុញ្ញាតឱ្យកម្មវិធីប្រើឧបករណ៍ស្កេនស្នាមម្រាមដៃសម្រាប់ការផ្ទៀងផ្ទាត់"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"គ្រប់គ្រងផ្នែករឹងស្នាមម្រាមដៃ"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"អនុញ្ញាតឲ្យកម្មវិធីប្រើវិធីសាស្ត្របន្ថែម និងលុបពុម្ពម្រាមដៃសម្រាប់ប្រើប្រាស់។"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ប្រើផ្នែករឹងស្នាមម្រាមដៃ"</string>
@@ -504,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"មិនអាចសម្គាល់បានទេ"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"បានផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃ"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ផ្នែករឹងស្នាមម្រាមដៃមិនមានទេ។"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"មិនអាចផ្ទុកស្នាមម្រាមដៃទេ។ សូមយកស្នាមម្រាមដៃដែលមានស្រាប់ចេញ។"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ការផ្តិតម្រាមដៃបានអស់ពេល។ សូមព្យាយាមម្តងទៀត។"</string>
@@ -1016,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"វិធីសាស្ត្របញ្ចូល"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"សកម្មភាពអត្ថបទ"</string>
<string name="email" msgid="4560673117055050403">"អ៊ីមែល"</string>
+ <string name="email_desc" msgid="3638665569546416795">"ផ្ញើអ៊ីមែលទៅអាសយដ្ឋានដែលបានជ្រើសរើស"</string>
<string name="dial" msgid="1253998302767701559">"ហៅទូរសព្ទ"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"ហៅទូរសព្ទទៅលេខដែលបានជ្រើសរើស"</string>
<string name="map" msgid="6521159124535543457">"កំណត់ទីតាំង"</string>
+ <string name="map_desc" msgid="9036645769910215302">"កំណត់ទីតាំងអាសយដ្ឋានដែលបានជ្រើសរើស"</string>
<string name="browse" msgid="1245903488306147205">"បើក"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"បើក URL ដែលបានជ្រើសរើស"</string>
<string name="sms" msgid="4560537514610063430">"សារ"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"ផ្ញើសារទៅលេខទូរសព្ទដែលបានជ្រើសរើស"</string>
<string name="add_contact" msgid="7867066569670597203">"បញ្ចូល"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"បញ្ចូលទៅក្នុងទំនាក់ទំនង"</string>
<string name="view_calendar" msgid="979609872939597838">"មើល"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"មើលពេលវេលាដែលបានជ្រើសរើសនៅក្នុងប្រតិទិន"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"កាលវិភាគ"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"កំណត់កាលវិភាគព្រឹត្តិការណ៍សម្រាប់ពេលវេលាដែលបានជ្រើសរើស"</string>
<string name="view_flight" msgid="7691640491425680214">"តាមដាន"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"តាមដានជើងហោះហើរដែលបានជ្រើសរើស"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"អស់ទំហំផ្ទុក"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"មុខងារប្រព័ន្ធមួយចំនួនអាចមិនដំណើរការ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"មិនមានទំហំផ្ទុកគ្រប់គ្រាន់សម្រាប់ប្រព័ន្ធ។ សូមប្រាកដថាអ្នកមានទំហំទំនេរ 250MB ហើយចាប់ផ្ដើមឡើងវិញ។"</string>
@@ -1119,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"ជ្រើសសកម្មភាពសម្រាប់អត្ថបទ"</string>
@@ -1155,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ភ្ជាប់បណ្តាញ Wi‑Fi របស់ក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"កំពុងភ្ជាប់ទៅបណ្តាញ Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"បានភ្ជាប់ទៅបណ្តាញ Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"មិនអាចភ្ជាប់ទៅបណ្តាញ Wi‑Fi បានទេ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string>
@@ -1272,33 +1273,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះទេ សូមចុចដើម្បីបើកការកំណត់ រួចបិទវា។"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"បិទ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"កំពុងរៀបចំ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"កំពុងពិនិត្យរកកំហុស"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"បានរកឃើញ <xliff:g id="NAME">%s</xliff:g> ថ្មី"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"កំពុងពិនិត្យ <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"កំពុងពិនិត្យមើលខ្លឹមសារបច្ចុប្បន្ន"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> ថ្មី"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ចុចដើម្បីរៀបចំ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"សម្រាប់ផ្ទេររូបភាព និងមេឌៀ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ខូច"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> បានខូចហើយ សូមប៉ះដើម្បីជួសជុល។"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"មានបញ្ហាជាមួយ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ចុចដើម្បីកែបញ្ហា"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ខូចហើយ។ សូមជ្រើសរើសដើម្បីជួសជុល។"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> មិនគាំទ្រ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ឧបករណ៍នេះមិនគាំទ្រ <xliff:g id="NAME">%s</xliff:g> នេះទេ។ ប៉ះដើម្បីកំណត់ទម្រង់ដែលគាំទ្រ។"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ឧបករណ៍នេះមិនស្គាល់ <xliff:g id="NAME">%s</xliff:g> នេះទេ។ សូមជ្រើសរើសដើម្បីរៀបចំក្នុងទម្រង់ដែលស្គាល់។"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញដោយមិនបានរំពឹងទុក"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ផ្តាច់ <xliff:g id="NAME">%s</xliff:g> មុនពេលដកចេញដើម្បីជៀងវាងការបាត់បង់ទិន្នន័យ"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញ សូមដោតចូលថ្មីមួយទៀត"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"នៅកំពុងដក <xliff:g id="NAME">%s</xliff:g> ចេញ…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"កុំដកចេញ"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ដកមេឌៀមុនពេលយកវាចេញ ដើម្បីជៀសវាងការបាត់បង់ខ្លឹមសារ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"បានយក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"មុខងារមួយចំនួនអាចនឹងដំណើរការមិនប្រក្រតី។ សូមបញ្ចូលទំហំផ្ទុកថ្មី។"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"កំពុងដក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"កុំយកចេញ"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"បាត់ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"បញ្ចូលឧបករណ៍នេះឡើងវិញ"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"កំពុងផ្លាស់ទីទិន្នន័យ…"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ផ្លាស់ទីទាំងស្រុង"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ទិន្នន័យបានផ្លាស់ទីទៅ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"មិនអាចផ្លាស់ទីទិន្នន័យបានទេ"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ទិន្នន័យនៅក្នុងទីតាំងដើមដដែល"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"បានផ្ទេរខ្លឹមសាររួចហើយ"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ខ្លឹមសារបានផ្លាស់ទីទៅ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"មិនអាចផ្លាស់ទីខ្លឹមសារបានទេ"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"សាកល្បងផ្លាស់ទីខ្លឹមសារម្តងទៀត"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"បានយកចេញ"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"បានដកចេញ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"កំពុងពិនិត្យមើល..."</string>
@@ -1357,17 +1359,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"បើកការតភ្ជាប់ VPN ជានិច្ច..។"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ភ្ជាប់ VPN ជានិច្ច"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"បានផ្ដាច់ពី VPN បើកជានិច្ច"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"មិនអាចភ្ជាប់ជាមួយ VPN បើកជានិច្ចបានទេ"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ប្ដូរការកំណត់បណ្ដាញ ឬការកំណត់ VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"ជ្រើសឯកសារ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"គ្មានឯកសារបានជ្រើស"</string>
<string name="reset" msgid="2448168080964209908">"កំណត់ឡើងវិញ"</string>
<string name="submit" msgid="1602335572089911941">"ដាក់ស្នើ"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"កម្មវិធីបើកបរកំពុងដំណើរការ"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ចុចដើម្បីចាកចេញពីកម្មវិធីបើកបរ។"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ភ្ជាប់ ឬហតស្ពតសកម្ម"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ប៉ះដើម្បីកំណត់"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ការភ្ជាប់ត្រូវបានបិទ"</string>
@@ -1693,8 +1692,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ដំឡើងដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"លុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ដើម្បីជួយឱ្យកម្រិតថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិត ឬបិទការញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយ។ អ៊ីមែល ការផ្ញើសារ និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនដំឡើងជំនាន់ទេ ប្រសិនបើអ្នកមិនបើកពួកវា។\n\nកម្មវិធីសន្សំថ្មបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"បើក"</string>
@@ -1745,22 +1743,14 @@
<string name="muted_by" msgid="6147073845094180001">"បានបិទសំឡេងដោយ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ហើយវាអ្នកមិនមានស្ថេរភាព រហូតទាល់តែអ្នកកំណត់ដូចដើមវិញទាំងស្រុង។"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ទំនាក់ទំនងក្រុមហ៊ុនផលិតឧបករណ៍របស់អ្នកសម្រាប់ព័ត៌មានបន្ថែម។"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"សំណើ USSD ត្រូវបានប្ដូរទៅការហៅធម្មតា"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"សំណើ USSD ត្រូវបានប្ដូរទៅសំណើ SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"បានប្ដូរទៅសំណើ USSD ថ្មី"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"សំណើ USSD ត្រូវបានប្ដូរទៅការហៅជាវីដេអូ"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"សំណើ SS ត្រូវបានប្ដូរទៅការហៅធម្មតា"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"សំណើ SS ត្រូវបានប្ដូរទៅការហៅជាវីដេអូ"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"សំណើ SS ត្រូវបានប្ដូរទៅសំណើ USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"បានប្ដូរទៅសំណើ SS ថ្មី"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ប្រវត្តិរូបការងារ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ពង្រីក"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"លាក់"</string>
@@ -1858,6 +1848,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ស៊ីមកាតមិនមែនផ្តល់ជូនសម្រាប់ការហៅទូរសព្ទទេ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ស៊ីមកាតមិនអនុញ្ញាតសម្រាប់ការហៅទូរសព្ទទេ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ទូរសព្ទមិនអនុញ្ញាតសម្រាប់ការហៅទូរសព្ទទេ"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"មិនអនុញ្ញាតស៊ីមទី <xliff:g id="SIMNUMBER">%d</xliff:g> ទេ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"មិនបានផ្តល់ស៊ីមទី <xliff:g id="SIMNUMBER">%d</xliff:g> ទេ"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"មិនអនុញ្ញាតស៊ីមទី <xliff:g id="SIMNUMBER">%d</xliff:g> ទេ"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"មិនអនុញ្ញាតស៊ីមទី <xliff:g id="SIMNUMBER">%d</xliff:g> ទេ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"វិនដូលេចឡើង"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"កំណែកម្មវិធីត្រូវបានបន្ទាបជំនាន់ ឬមិនត្រូវគ្នាជាមួយផ្លូវកាត់នេះ"</string>
@@ -1878,8 +1872,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"នេះគឺជាសកម្មភាពថ្មី។ សូមចុចដើម្បីផ្លាស់ប្ដូរ។"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"មុខងារកុំរំខានត្រូវបានប្ដូរ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"សូមចុចដើម្បីមើលថាបានទប់ស្កាត់អ្វីខ្លះ។"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ប្រព័ន្ធ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ការកំណត់"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index e5fde53..7dc5cd3 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ಧ್ವನಿ ಸೇವೆಯಿಲ್ಲ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ಯಾವುದೇ ಧ್ವನಿ ಸೇವೆ ಅಥವಾ ತುರ್ತು ಕರೆಗಳಿಲ್ಲ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ನಿಮ್ಮ ವಾಹಕದ ಮೂಲಕ ತಾತ್ಕಾಲಿಕವಾಗಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ಸಿಮ್ <xliff:g id="SIMNUMBER">%d</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ವಾಹಕದ ಮೂಲಕ ತಾತ್ಕಾಲಿಕವಾಗಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ಆದ್ಯತೆಗೊಳಿಸಿದ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಲಭ್ಯವಿಲ್ಲ"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ರೋಮಿಂಗ್ ಬ್ಯಾನರ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ರೋಮಿಂಗ್ ಬ್ಯಾನರ್ ಆಫ್ ಆಗಿದೆ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ಸೇವೆ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆಯನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ವೈ-ಫೈ ಮೂಲಕ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಈ ಸೇವೆಯನ್ನು ಹೊಂದಿಸಲು ಮೊದಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ಆ ನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ವೈ-ಫೈ ಕರೆಮಾಡುವಿಕೆಯನ್ನು ಅನ್ನು ಆನ್ ಮಾಡಿ. (ದೋಷ ಕೋಡ್: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"ನಿಮ್ಮ ವಾಹಕದೊಂದಿಗೆ ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ ಸಮಸ್ಯೆ ನೋಂದಾಯಿಸುವಿಕೆ: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ಹಲವಾರು ವಿನಂತಿಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್ ಇನ್ ದೋಷವಿದೆ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ಸಿಂಕ್ ಮಾಡು"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ಅತೀ ಹೆಚ್ಚು <xliff:g id="CONTENT_TYPE">%s</xliff:g> ಅನ್ನು ಅಳಿಸಲು ಪ್ರಯತ್ನಿಸಲಾಗಿದೆ."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ಟ್ಯಾಬ್ಲೆಟ್ ಸಂಗ್ರಹಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ವಾಚ್ ಸಂಗ್ರಹಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ಟಿವಿ ಸಂಗ್ರಹಣೆ ತುಂಬಿದೆ. ಸ್ಥಳವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಬದಲಿಸಿ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ಸಂಪರ್ಕಗಳು"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ಸ್ಥಳ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ಕ್ಯಾಲೆಂಡರ್"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ವೀಕ್ಷಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ಸಂಗ್ರಹಣೆ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ಸಾಧನದಲ್ಲಿ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ಮೈಕ್ರೋಫೋನ್"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ಕ್ಯಾಮರಾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಲು, ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"ಚಿತ್ರಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲು ಮತ್ತು ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ದೇಹ ಸೆನ್ಸರ್ಗಳು"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶ-ಎಕ್ಸ್ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ"</string>
@@ -492,6 +483,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್ಗಳು, ಕಾರ್ಡ್ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ಕೀಲಾಕ್ ಮತ್ತು ಯಾವುದೇ ಸಂಬಂಧಿತ ಭದ್ರತಾ ಪಾಸ್ವರ್ಡ್ ಭದ್ರತೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ವೀಕರಿಸುವಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಫೋನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ನಂತರ ಕರೆಯು ಅಂತ್ಯಗೊಂಡಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಮರು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ಬೆರಳಚ್ಚು ಹಾರ್ಡ್ವೇರ್ ನಿರ್ವಹಿಸಿ"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ಬಳಕೆಗೆ ಬೆರಳಚ್ಚು ಟೆಂಪ್ಲೇಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ಬೆರಳಚ್ಚು ಹಾರ್ಡ್ವೇರ್ ಬಳಸಿ"</string>
@@ -504,6 +499,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಮಾಣೀಕರಣ ಮಾಡಲಾಗಿದೆ"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ಬೆರಳಚ್ಚು ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ಬೆರಳಚ್ಚು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬೆರಳಚ್ಚು ತೆಗೆದುಹಾಕಿ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಬೆರಳಚ್ಚು ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -1016,14 +1012,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
<string name="email" msgid="4560673117055050403">"ಇಮೇಲ್"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"ಕರೆ"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"ಗುರುತಿಸಿ"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"ತೆರೆ"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"ಸಂದೇಶ"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"ಸೇರಿಸಿ"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"ವೀಕ್ಷಿಸಿ"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"ಅವಧಿ"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ಟ್ರ್ಯಾಕ್"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"ಸಂಗ್ರಹಣೆ ಸ್ಥಳವು ತುಂಬಿದೆ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ಕೆಲವು ಸಿಸ್ಟಂ ಕಾರ್ಯವಿಧಾನಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ಸಿಸ್ಟಂನಲ್ಲಿ ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ. ನೀವು 250MB ನಷ್ಟು ಖಾಲಿ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
@@ -1117,8 +1131,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"ಪಠ್ಯಕ್ಕೆ ಕ್ರಿಯೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -1153,8 +1166,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ವಾಹಕ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -1271,33 +1283,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ಇತರವುಗಳ ಮೇಲೆ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ಆಫ್ ಮಾಡಿ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ಹೊಸ <xliff:g id="NAME">%s</xliff:g> ಪತ್ತೆಯಾಗಿದೆ"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ಪ್ರಸ್ತುತ ವಿಷಯವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"ಹೊಸ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ಫೋಟೋಗಳು ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ವರ್ಗಾಯಿಸಲು"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ. ಸರಿಪಡಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> ನೊಂದಿಗೆ ಸಮಸ್ಯೆ"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ಸರಿಪಡಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ. ಸರಿಪಡಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ಬೆಂಬಲಿಸದಿರುವ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ಈ ಸಾಧನವು <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ಈ ಸಾಧನವು ಈ <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ಅನಿರೀಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ಡೇಟಾ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ <xliff:g id="NAME">%s</xliff:g> ಅಳವಡಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ; ಹೊಸದನ್ನು ಸೇರಿಸಿ"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ಇನ್ನೂ ಇಜೆಕ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ತೆಗೆದುಹಾಕಬೇಡಿ"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ವಿಷಯ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ ಮಾಧ್ಯಮವನ್ನು ಎಜೆಕ್ಟ್ ಮಾಡಿ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ಅವರನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ಕೆಲವು ಕಾರ್ಯಚಟುವಟಿಕೆಗಳು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು. ಹೊಸ ಸಂಗ್ರಹಣೆ ಸೇರಿಸಿ."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ಎಜೆಕ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ತೆಗೆದುಹಾಕಬೇಡಿ"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ಕಾಣೆಯಾಗಿದೆ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ಈ ಸಾಧನವನ್ನು ಮರುಸೇರಿಸಿ"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"ಡೇಟಾ ಸರಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ಸರಿಸುವಿಕೆ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g> ಗೆ ಡೇಟಾ ಸರಿಸಲಾಗಿದೆ"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ಡೇಟಾ ಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ಮೂಲ ಸ್ಥಳದಲ್ಲಿ ಡೇಟಾ ಉಳಿದಿದೆ"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"ವಿಷಯ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ವಿಷಯವನ್ನು <xliff:g id="NAME">%s</xliff:g> ಗೆ ಸರಿಸಲಾಗಿದೆ"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ವಿಷಯವನ್ನು ಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ವಿಷಯವನ್ನು ಪುನಃ ಸರಿಸಲು ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ಇಜೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -1356,17 +1369,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿದೆ…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವ VPN ನಿಂದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವ VPN ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ನೆಟ್ವರ್ಕ್ ಅಥವಾ VPN ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
<string name="upload_file" msgid="2897957172366730416">"ಫೈಲ್ ಆಯ್ಕೆಮಾಡು"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string>
<string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
<string name="submit" msgid="1602335572089911941">"ಸಲ್ಲಿಸು"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ಡ್ರೈವಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ಡ್ರೈವಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -1692,8 +1702,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ಕಂಪನ, ಸ್ಥಳದ ಸೇವೆಗಳು ಹಾಗೂ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಅವಲಂಬಿಸಿರುವಂತಹ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನೀವು ಅದನ್ನು ತೆರೆಯದ ಹೊರತು ಅಪ್ಡೇಟ್ ಆಗುವುದಿಲ್ಲ.\n\nಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಫ್ ಆಗುತ್ತದೆ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ಆನ್ ಮಾಡಿ"</string>
@@ -1744,22 +1753,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಅವರಿಂದ ಮ್ಯೂಟ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ ಹಾಗೂ ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾವನ್ನು ಮರುಹೊಂದಿಸುವರೆಗೂ ಅದು ಅಸ್ಥಿರವಾಗಬಹುದು."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ. ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD ವಿನಂತಿಯನ್ನು ಸಾಮಾನ್ಯ ಕರೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD ವಿನಂತಿಯನ್ನು SS ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"ಹೊಸ USSD ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD ವಿನಂತಿಯನ್ನು ವೀಡಿಯೊ ಕರೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS ವಿನಂತಿಯನ್ನು ಸಾಮಾನ್ಯ ಕರೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS ವಿನಂತಿಯನ್ನು ವೀಡಿಯೊ ಕರೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"ಹೊಸ SS ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ಕುಗ್ಗಿಸಿ"</string>
@@ -1857,6 +1858,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ಧ್ವನಿಗಾಗಿ ಸಿಮ್ ಸಿದ್ಧವಾಗಿಲ್ಲ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ಧ್ವನಿಗಾಗಿ ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ಧ್ವನಿಗಾಗಿ ಫೋನ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಒದಗಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> ಸಿಮ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ಪಾಪ್ಅಪ್ ವಿಂಡೋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್ಗ್ರೇಡ್ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್ಕಟ್ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string>
@@ -1877,8 +1882,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ಇದು ವೈಶಿಷ್ಟ್ಯದ ಹೊಸ ಬದಲಾವಣೆಯ ಸೆಟ್ಟಿಂಗ್ ಆಗಿದೆ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ಏನನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ಸಿಸ್ಟಂ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index d378c67..9fd88ab 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"음성 서비스를 이용할 수 없음"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"음성 서비스 및 긴급 전화가 차단됨"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"이동통신사에서 서비스를 일시적으로 사용 중지했습니다."</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"모바일 네트워크에 연결할 수 없습니다."</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"기본 네트워크를 변경해 보세요. 탭하여 변경할 수 있습니다."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"긴급 전화를 사용할 수 없습니다."</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"로밍 배너 사용"</string>
<string name="roamingText12" msgid="1189071119992726320">"로밍 배너 사용 안함"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"서비스 검색 중"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi 통화를 설정할 수 없음"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 서비스를 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다. (오류 코드: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"이동통신사를 통해 Wi‑Fi 통화를 등록하는 중에 문제가 발생했습니다. 오류 코드: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 통화"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"생체 인식 하드웨어 사용"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"앱에서 생체 인식 하드웨어를 인증에 사용하도록 허용합니다."</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"지문 하드웨어 관리"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"사용할 지문 템플릿의 추가 및 삭제 메소드를 앱에서 실행하도록 허용합니다."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"지문 하드웨어 사용"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"인식할 수 없습니다."</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"지문 인식 하드웨어를 사용할 수 없습니다."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"지문을 저장할 수 없습니다. 기존 지문을 삭제하세요."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"텍스트 작업"</string>
<string name="email" msgid="4560673117055050403">"이메일"</string>
+ <string name="email_desc" msgid="3638665569546416795">"선택한 주소로 이메일 보내기"</string>
<string name="dial" msgid="1253998302767701559">"전화"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"선택한 전화번호로 전화 걸기"</string>
<string name="map" msgid="6521159124535543457">"위치 확인"</string>
+ <string name="map_desc" msgid="9036645769910215302">"선택한 주소 위치 확인"</string>
<string name="browse" msgid="1245903488306147205">"열기"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"선택한 URL 열기"</string>
<string name="sms" msgid="4560537514610063430">"메시지"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"선택한 전화번호로 메시지 전송"</string>
<string name="add_contact" msgid="7867066569670597203">"추가"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"연락처에 추가"</string>
<string name="view_calendar" msgid="979609872939597838">"보기"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"캘린더에서 선택한 시간 보기"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"일정"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"선택한 시간의 일정 예약"</string>
<string name="view_flight" msgid="7691640491425680214">"추적"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"선택한 항공편 추적"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"저장 공간이 부족함"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"일부 시스템 기능이 작동하지 않을 수 있습니다."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"시스템의 저장 공간이 부족합니다. 250MB의 여유 공간이 확보한 후 다시 시작하세요."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"공개 Wi‑Fi 네트워크에 연결"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"이동통신사 Wi‑Fi 네트워크에 연결"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi-Fi 네트워크에 연결 중"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi 네트워크에 연결됨"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi 네트워크에 연결할 수 없음"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"사용 중지"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> 준비 중"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"오류 확인 중"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"새로운 <xliff:g id="NAME">%s</xliff:g> 감지됨"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"사진 및 미디어를 전송하는 데 사용합니다."</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"손상된 <xliff:g id="NAME">%s</xliff:g>입니다."</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>이(가) 손상되었습니다. 해결하려면 탭하세요."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>이(가) 손상되었습니다. 선택하여 문제를 해결하세요."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"지원되지 않는 <xliff:g id="NAME">%s</xliff:g>입니다."</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"이 기기는 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 지원하는 형식으로 설정하려면 탭하세요."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"이 기기는 이 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 선택하여 지원되는 형식으로 설정하세요."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>이(가) 예기치 않게 삭제됨"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"데이터 손실을 피하려면 <xliff:g id="NAME">%s</xliff:g>을(를) 마운트 해제한 다음 삭제하세요."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> 삭제됨"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>이(가) 삭제되었습니다. 새로 삽입하세요."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"아직 <xliff:g id="NAME">%s</xliff:g> 꺼내는 중…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"삭제하지 마세요."</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> 없음"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"기기 다시 삽입"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> 이동 중"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"데이터 이동 중"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"이동 완료"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"데이터를 <xliff:g id="NAME">%s</xliff:g>(으)로 이동했습니다."</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"데이터를 이동할 수 없음"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"원래 위치에 데이터 남아 있음"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"제거됨"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"꺼냄"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"확인 중…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"관리자에 의해 설치되었습니다."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"관리자에 의해 업데이트되었습니다."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"관리자에 의해 삭제되었습니다."</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"배터리 세이버는 배터리 수명 연장을 위해 기기 성능을 줄이며 진동, 위치 서비스 및 백그라운드 데이터를 제한하거나 사용 중지합니다. 이메일, 메시지 및 동기화가 필요한 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n기기가 충전 중일 때는 자동으로 배터리 세이버가 사용 중지됩니다."</string>
<string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"데이터 절약 모드를 사용할까요?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"사용 설정"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>에서 알림음 음소거"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD 요청이 일반 통화로 변경됨"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD 요청이 SS 요청으로 변경됨"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"새 USSD 요청으로 변경됨"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD 요청이 화상 통화로 변경됨"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS 요청이 일반 통화로 변경됨"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS 요청이 화상 통화로 변경됨"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS 요청이 USSD 요청으로 변경됨"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"새 SS 요청으로 변경됨"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"직장 프로필"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"펼치기"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"접기"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM이 음성으로 프로비저닝되지 않음"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM에서 음성이 허용되지 않음"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"휴대전화에서 음성이 허용되지 않음"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"팝업 창"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g>개 더보기"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"앱 버전이 다운그레이드되었거나 이 단축키와 호환되지 않습니다."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 7c8029e..bf365eb 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Аудио чалуу кызматы бөгөттөлгөн"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Чалуу жана шашылыш чалуу кызматы бөгөттөлгөн"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Байланыш оператору убактылуу бөгөттөп койгон"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобилдик тармакка туташпай жатат"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Тандалган тармакты өзгөртүп көрүңүз. Өзгөртүү үчүн таптаңыз."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Шашылыш чалуу жеткиликсиз"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Роуминг баннери күйгүзүлгөн"</string>
<string name="roamingText12" msgid="1189071119992726320">"Роуминг баннери өчүрүлгөн"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Кызмат изделүүдө"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi-Fi аркылуу чалуу функциясы жөндөлгөн жок"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде байланыш операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз. (Ката коду: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Байланыш операторуңуз менен Wi-Fi аркылуу чалууну каттоодо ката кетти: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Чалуу"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Өтө көп талаптар иштетилүүдө. Кайта аракеттениңиз."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> менен кирүүдө ката кетти"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Шайкештирүү"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Шайкештирилбей жатат"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Өтө көп <xliff:g id="CONTENT_TYPE">%s</xliff:g> мазмунун өчүрүү аракети орун алды."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Планшеттин сактагычы толуп калды. Орун бошотуш үчүн кээ бир файлдарды өчүрүңүз."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Саат сактагычы толуп калды. Орун бошотуу үчүн айрым файлдарды жок кылыңыз."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Сыналгынын сактагычы толуп калды. Айрым файлдарды жок кылып орун бошотуңуз."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Жумуш профилине которулуу"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Байланыштар"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"байланыштарыңызды көрүүгө"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна байланыштарыңызды пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Жайгашкан жер"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жерин аныктоого"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна бул түзмөктүн жайгашкан жерин пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Жылнаама"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"жылнаамаңызды пайдалануу"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна жылнаамаңызды пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS билдирүүлөрдү жиберүү жана көрсөтүү"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна SMS билдирүүлөрдү жөнөтүүгө жана окууга уруксат берилсинби?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Сактагыч"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"түзмөгүңүздөгү сүрөттөрдү жана башка мультимедиа файлдарын пайдаланууга"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна түзмөгүңүздөгү сүрөттөрдү жана башка мультимедиа файлдарын пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"аудио жаздыруу"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна аудио файлдарды жаздырууга уруксат берилсинби?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"сүрөт жана видео тартууга"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна сүрөттөрдү тартып, видеолорду жаздырууга уруксат берилсинби?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна телефон чалууга жана чалууларды башкарууга уруксат берилсинби?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене сенсорлору"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна организмдин абалына көз салган сенсордун дайындарын пайдаланууга уруксат берилсинби?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
@@ -492,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"биометрикалык аппаратты колдонуу"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Колдонмого аныктыгын текшерүү үчүн биометрикалык аппаратты пайдалануу мүмкүндүгүн берет"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"манжа изинин аппараттык камсыздоосун башкаруу"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Колдонмого пайдалануу үчүн манжа изинин үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"манжа изинин аппараттык камсыздоосун колдонуу"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Таанылган жок"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Манжа изинин аппараттык камсыздоосу жеткиликтүү эмес."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Манжа изин сактоо мүмкүн эмес. Учурдагы манжа изин алып салыңыз."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Манжа изин күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Киргизүү ыкмасы"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Текст боюнча иштер"</string>
<string name="email" msgid="4560673117055050403">"Электрондук почта"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Тандалган дарекке электрондук кат жөнөтүү"</string>
<string name="dial" msgid="1253998302767701559">"Чалуу"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Тандалган телефон номерине чалуу"</string>
<string name="map" msgid="6521159124535543457">"Жайгашкан жер"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Тандалган даректи картада табуу"</string>
<string name="browse" msgid="1245903488306147205">"Ачуу"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Тандалган URL\'ди ачуу"</string>
<string name="sms" msgid="4560537514610063430">"Билдирүү"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Тандалган телефон номерине билдирүү жөнөтүү"</string>
<string name="add_contact" msgid="7867066569670597203">"Кошуу"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Байланыштарга кошуу"</string>
<string name="view_calendar" msgid="979609872939597838">"Көрүү"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Тандалган убакытты жылнаамада көрүү"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Графикке киргизүү"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Иш-чараны тандалган убакытка графикке киргизүү"</string>
<string name="view_flight" msgid="7691640491425680214">"Көз салуу"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Тандалган аба каттамына көз салуу"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сактагычта орун калбай баратат"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Системанын кээ бир функциялары иштебеши мүмкүн"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Тутумда сактагыч жетишсиз. 250МБ бош орун бар экенин текшерип туруп, өчүрүп күйгүзүңүз."</string>
@@ -1117,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Текст үчүн аракет тандаңыз"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ачык Wi‑Fi тармагына туташуу"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Байланыш операторунун Wi‑Fi тармагына туташуу"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi тармагына туташууда"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ачык Wi‑Fi тармагына туташты"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi тармагына туташпай калды"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string>
@@ -1272,33 +1275,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: башка колдонмолордун үстүнөн"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Өчүрүү"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> даярдалууда"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Каталар текшерилүүдө"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңы <xliff:g id="NAME">%s</xliff:g> аныкталды"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Сүрөттөрдү жана медиа өткөрүү үчүн"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> бузулган"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> - бузук. Оңдоо үчүн таптап коюңуз."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> – бузук. Оңдоо үчүн тандаңыз."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> колдоого алынбайт"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн таптап коюңуз."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн тандаңыз."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> күтүүсүздөн алынып салынды"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Дайындарды жоготуунун алдын алуу үчүн чыгаруудан мурун <xliff:g id="NAME">%s</xliff:g> түзмөгүн бошотуңуз"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> алынды"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> алынды; жаңысын салыңыз"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> дагы эле чыгарылууда…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Чыгарба"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> табылбай жатат"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Түзмөктү кайра сайыңыз"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулууда"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Дайындар ооштурулууда…"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ооштуруу аяктады"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Дайындар <xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулду"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Дайындар ооштурулбай калды"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Дайындар баштапкы ордунда калды"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Өчүрүлдү"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Чыгарылган"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Текшерилүүдө…"</string>
@@ -1357,17 +1376,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Дайым иштеген VPN туташууда…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Дайым иштеген VPN туташтырылды"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Ар дайым иштеген VPN\'ден ажыратуу"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ар дайым күйүк VPN\'ге туташпай калды"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Тармакты же VPN жөндөөлөрүн өзгөртүү"</string>
<string name="upload_file" msgid="2897957172366730416">"Файл тандоо"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Эч файл тандалган жок"</string>
<string name="reset" msgid="2448168080964209908">"Баштапкы абалга келтирүү"</string>
<string name="submit" msgid="1602335572089911941">"Тапшыруу"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Унаа айдоо колдонмосу иштеп жатат"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Унаа айдоо колдонмосунан чыгуу үчүн таптаңыз."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Жалгаштыруу же хотспот жандырылган"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Жөндөө үчүн таптап коюңуз."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Жалгаштыруу функциясы өчүрүлгөн"</string>
@@ -1693,8 +1709,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Администраторуңуз орнотуп койгон"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Администраторуңуз жаңыртып койгон"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Администраторуңуз жок кылып салган"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Батареянын кубатынын мөөнөтүн узартуу үчүн Батареяны үнөмдөгүч режиминде түзмөгүңүздүн ишинин майнаптуулугу азайып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгү чектелип же өчүрүлөт. Электрондук почта, жазышуу жана башка шайкештирилүүчү колдонмолор ачылмайынча, жаңыртылбашы мүмкүн.\n\nБатареяны үнөмдөгүч режими түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Трафикти үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Дайындарды үнөмдөгүч күйсүнбү?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Күйгүзүү"</string>
@@ -1745,22 +1760,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> тарабынан үнсүздөлдү"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Түзмөгүңүздө ички көйгөй бар жана ал баштапкы абалга кайтарылмайынча туруктуу иштебей коюшу мүмкүн."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Түзмөгүңүздө ички көйгөй бар. Анын чоо-жайын билүү үчүн өндүрүүчүңүзгө кайрылыңыз."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD сурамы демейки чалууга өзгөртүлдү"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD сурамы SS сурамына өзгөртүлдү"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Жаңы USSD сурамына өзгөртүлдү"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD сурамы видео чалууга өзгөртүлдү"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS сурамы демейки чалууга өзгөртүлдү"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS сурамы видео чалууга өзгөртүлдү"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS сурамы USSD сурамына өзгөртүлдү"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Жаңы SS сурамына өзгөртүлдү"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жумуш профили"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жайып көрсөтүү"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жыйыштыруу"</string>
@@ -1858,6 +1865,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-карта сүйлөшүү үчүн таанылган жок"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефонду сүйлөшүү үчүн колдонууга тыюу салынган"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Калкып чыкма терезе"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Колдонмонун мурунку версиясын иштетип жатасыз же ал бул шилтемеге шайкеш эмес"</string>
@@ -1878,8 +1893,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Бул жаңы тартип. Өзгөртүү үчүн таптаңыз."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Тынчымды алба\" режими өзгөрдү"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Бөгөттөлгөн нерселерди көрүү үчүн таптаңыз."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Тутум"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Жөндөөлөр"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 08ab0cc..164b278 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ບໍ່ມີບໍລິການໂທສຽງ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ບໍ່ມີບໍລິການສຽງ ຫຼື ການໂທສຸກເສີນ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ຖືກປິດໄວ້ຊົ່ວຄາວໂດຍຜູ້ໃຫ້ບໍລິການຂອງທ່ານ"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ບໍ່ສາມາດຕິດຕໍ່ເຄືອຂ່າຍມືຖືໄດ້"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ໃຫ້ລອງປ່ຽນເຄືອຂ່າຍທີ່ຕ້ອງການ. ແຕະເພື່ອປ່ຽນ."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ບໍ່ສາມາດໃຊ້ການໂທສຸກເສີນໄດ້"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ເປີດໂຣມມິງແບນເນີ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ປິດໂຣມມິງແບນເນີ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ຊອກຫາບໍລິການ"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ບໍ່ສາມາດຕັ້ງຄ່າການໂທ Wi‑Fi ໄດ້"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ເພື່ອໂທ ແລະ ສົ່ງຂໍ້ຄວາມຜ່ານ Wi-Fi, ໃຫ້ແຈ້ງໃຫ້ຜູ້ໃຫ້ບໍລິການຂອງທ່ານຕັ້ງບໍລິການນີ້. ຈາກນັ້ນເປີດໃຊ້ການໂທ Wi-Fi ອີກຄັ້ງຈາກການຕັ້ງຄ່າ. (ລະຫັດຂໍ້ຜິດພາດ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"ເກີດບັນຫາໃນການລົງທະບຽນການໂທ Wi‑Fi ກັບຜູ້ໃຫ້ບໍລິການຂອງທ່ານ: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"ການໂທ %s Wi-Fi"</item>
@@ -481,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ອະນຸຍາດໃຫ້ແອັບຯຕິດຕໍ່ສື່ສານກັບປ້າຍກຳກັບ, ບັດ ແລະໂຕອ່ານຂອງການສື່ສານໄລຍະສັ້ນ (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ປິດການລັອກໜ້າຈໍ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງປຸ່ມລັອກ ແລະລະບົບຄວາມປອດໄພຂອງລະຫັດຜ່ານທີ່ເຊື່ອມໂຍງກັນ. ໂຕຢ່າງ: ໂທລະສັບຈະປິດການເຮັດວຽກຂອງປຸ່ມລັອກເມື່ອມີສາຍໂທເຂົ້າ ຈາກນັ້ນຈຶ່ງເປີດໃຊ້ໄດ້ອີກເມື່ອວາງສາຍແລ້ວ."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ຈັດການຮາດແວລາຍນີ້ວມື"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ອະນຸຍາດໃຫ້ແອັບເຮັດໃຫ້ວິທີການຕ່າງໆເພີ່ມ ແລະລຶບແມ່ແບບລາຍນີ້ວມືສຳລັບການໃຊ້."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ໃຊ້ຮາດແວລາຍນີ້ວມື"</string>
@@ -493,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ບໍ່ຈົດຈຳໄດ້"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ບໍ່ມີຮາດແວລາຍນີ້ວມືໃຫ້ຢູ່."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ບໍ່ສາມາດເກັບຮັກສາລາຍນີ້ວມືໄວ້ໄດ້. ກະລຸນາເອົາລາຍນີ້ວມືທີ່ມີຢູ່ອອກໄປ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string>
@@ -1005,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
<string name="email" msgid="4560673117055050403">"ອີເມວ"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"ໂທ"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"ລະບຸບ່ອນຢູ່"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"ເປີດ"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"ຂໍ້ຄວາມ"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"ເພີ່ມ"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"ເບິ່ງ"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"ຕັ້ງເວລາ"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ແທຣັກ"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນກຳລັງຈະເຕັມ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ການເຮັດວຽກບາງຢ່າງຂອງລະບົບບາງອາດຈະໃຊ້ບໍ່ໄດ້"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ບໍ່ມີບ່ອນເກັບຂໍ້ມູນພຽງພໍສຳລັບລະບົບ. ກວດສອບໃຫ້ແນ່ໃຈວ່າທ່ານມີພື້ນທີ່ຫວ່າງຢ່າງໜ້ອຍ 250MB ແລ້ວລອງໃໝ່."</string>
@@ -1141,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແບບເປີດ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ຜູ້ໃຫ້ບໍລິການ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ກຳລັງເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແລ້ວ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ໄດ້"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string>
@@ -1258,33 +1284,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ປິດ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"ກຳລັງກຽມ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ກຳລັງກວດຫາຂໍ້ຜິດພາດ"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ກວດພົບ <xliff:g id="NAME">%s</xliff:g> ໃໝ່ແລ້ວ"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ສຳລັບການໂອນຮູບຖ່າຍ ແລະມີເດຍ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ເສຍຫາຍແລ້ວ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ເສຍຫາຍ. ແຕະເພື່ອສ້ອມແປງ."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ເສຍຫາຍ. ແຕະເພື່ອສ້ອມແປງ."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ບໍ່ຮອງຮັບ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບ <xliff:g id="NAME">%s</xliff:g> ນີ້. ແຕະເພື່ອຕັ້ງຄ່າໃນຮູບແບບທີ່ຮອງຮັບ."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບ <xliff:g id="NAME">%s</xliff:g> ນີ້. ແຕະເພື່ອຕັ້ງຄ່າໃນຮູບແບບທີ່ຮອງຮັບ."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ຖືກຖອດອອກໄປແບບບໍ່ຄາດຄິດ"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ຖອດເຊື່ອມຕໍ່ <xliff:g id="NAME">%s</xliff:g> ກ່ອນເອົາອອກໄປ ເພື່ອຫຼີກເວັ້ນການເສຍຂໍ້ມູນ"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ເອົາ <xliff:g id="NAME">%s</xliff:g> ອອກໄປແລ້ວ"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ຖືກຖອດອອກແລ້ວ. ກະລຸນາໃສ່ອັນໃໝ່"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ຍັງກຳລັງເອົາອອກ <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ຢ່າເອົາອອກ"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ຂາດໄປ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ໃສ່ອຸປະກອນນີ້ເຂົ້າໃໝ່"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"ກຳລັງຍ້າຍ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ກຳລັງຍ້າຍຂໍ້ມູນ"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ການຍ້າຍສຳເລັດ"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ຍ້າຍຂໍ້ມູນໃສ່ <xliff:g id="NAME">%s</xliff:g> ແລ້ວ"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ບໍ່ສາມາດຍ້າຍຂໍ້ມູນໄດ້"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ຂໍ້ມູນເຫຼືອໄວ້ຢູ່ໃນທີ່ຕັ້ງເດີມ"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ເອົາອອກ"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ເອົາອອກແລ້ວ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ກຳລັງກວດສອບ..."</string>
@@ -1676,8 +1718,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ຖືກຕິດຕັ້ງໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ຖືກອັບໂຫລດໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ຖືກລຶບອອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດແບັດເຕີຣີຈະຫຼຸດປະສິດທິພາບອຸປະກອນຂອງທ່ານ ແລະ ຈຳກັດ ຫຼື ປິດການສັ່ນເຕືອນ, ບໍລິການສະຖານທີ່ ແລະ ຂໍ້ມູນພື້ນຫຼັງໄວ້. ອີເມວ, ຂໍ້ຄວາມ ແລະ ແອັບອື່ນໆທີ່ອີງອາໃສການຊິ້ງຂໍ້ມູນອາດຈະບໍ່ອັບເດດເວັ້ນເສຍແຕ່ທ່ານຈະເປີດພວກມັນ.\n\nຕົວປະຢັດບັດເຕີຣີຈະປິດອັດຕະໂນມັດເມື່ອສາກໄຟອຸປະກອນຂອງທ່ານ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ເປີດໃຊ້ຕົວປະຢັດຂໍ້ມູນບໍ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ເປີດໃຊ້"</string>
@@ -1728,22 +1769,14 @@
<string name="muted_by" msgid="6147073845094180001">"ຖືກປິດສຽງໂດຍ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ, ແລະມັນອາດຈະບໍ່ສະຖຽນຈົນກວ່າທ່ານຕັ້ງເປັນຂໍ້ມູນໂຮງງານຄືນແລ້ວ."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ. ຕິດຕໍ່ຜູ້ຜະລິດຂອງທ່ານສຳລັບລາຍລະອຽດຕ່າງໆ."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"ປ່ຽນການຮ້ອງຂໍ USSD ເປັນການໂທທຳມະດາແລ້ວ"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"ປ່ຽນຄຳຂໍ SS ເປັນຄຳຂໍ USSD ແລ້ວ"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"ປ່ຽນຄຳຂໍ USSD ໃໝ່ແລ້ວ"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"ປ່ຽນການຮ້ອງຂໍ USSD ເປັນການໂທວິດີໂອແລ້ວ"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"ປ່ຽນການຮ້ອງຂໍ SS ເປັນການໂທທຳມະດາແລ້ວ"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"ປ່ຽນການຮ້ອງຂໍ SS ເປັນການໂທວິດີໂອແລ້ວ"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"ປ່ຽນຄຳຂໍ SS ເປັນຄຳຂໍ USSD ແລ້ວ"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"ປ່ຽນຄຳຂໍ SS ໃໝ່ແລ້ວ"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ຂະຫຍາຍ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ຫຍໍ້ເຂົ້າ"</string>
@@ -1841,6 +1874,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ບໍ່ໄດ້ຈັດກຽມຊິມໄວ້ສຳລັບການໂທສຽງ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ຊິມສຳລັບການໂທສຽງ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບສຳລັບການໂທສຽງ"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"ໜ້າຈໍປັອບອັບ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ດາວເກຣດເວີຊັນແອັບແລ້ວ ຫຼື ບໍ່ສາມາດໃຊ້ຮ່ວມກັບທາງລັດນີ້ໄດ້"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index d419a2d..de0fe71 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Skambintojo ID pagal numatytuosius nustatymus yra neapribotas. Kitas skambutis: neapribotas"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Paslauga neteikiama."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Negalima pakeisti skambinančiojo ID nustatymo."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Duomenų paslauga neteikiama"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nėra skambučių pagalbos numeriu paslaugos"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Duomenų paslaugos mobiliesiems nėra"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Skambučių pagalbos numeriu paslaugos nėra"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Balso skambučių paslauga neteikiama"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balso skambučių / skambučių pagalbos numeriais paslauga neteikiama"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Laikinai nesiūloma mobiliojo ryšio tinkle jūsų vietovėje"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepavyko pasiekti tinklo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"„Wi-Fi“ skambinimas aktyvus"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Kad būtų galima skambinti pagalbos numeriais, būtina naudoti mobiliojo ryšio tinklą."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Balso skambučių arba skambučių pagalbos numeriu paslaugos nėra"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Laikinai išjungė operatorius"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM kortelėje <xliff:g id="SIMNUMBER">%d</xliff:g> laikinai išjungė operatorius"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nepavyko pasiekti mobiliojo ryšio tinklo"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Pabandykite pakeisti pageidaujamą tinklą. Palieskite, kad pakeistumėte."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Skambučių pagalbos numeriu paslauga nepasiekiama"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Negalima skambinti pagalbos numeriu naudojant „Wi‑Fi“"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Įspėjimai"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Skambučio peradresavimas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Atskambinimo pagalbos numeriu režimas"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Tarptinklinio ryšio reklamjuostė įjungta"</string>
<string name="roamingText12" msgid="1189071119992726320">"Tarptinklinio ryšio reklamjuostė išjungta"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Ieškoma paslaugos"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"„Wi-Fi“ skambinimas"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"„Wi‑Fi“ skambinimo nustatyti nepavyko"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Jei norite skambinti ir siųsti pranešimus naudodami „Wi-Fi“, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite „Wi-Fi“ skambinimą skiltyje „Nustatymai“. (Klaidos kodas: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Užregistruokite pas operatorių (klaidos kodas: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Kilo problema registruojant „Wi‑Fi“ skambinimą pas operatorių: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Apdorojama per daug užklausų. Vėliau bandykite dar kartą."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> prisijungimo klaida"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinchronizuoti"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinchronizuoti"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Per daug <xliff:g id="CONTENT_TYPE">%s</xliff:g> trynimo."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sinchronizuoti nepavyko"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Bandoma ištrinti per daug turinio (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Planšetinio kompiuterio atmintis pilna. Kad atlaisvintumėte vietos, ištrinkite kelis failus."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Laikrodžio saugykla pilna. Ištrinkite kelis failus, kad atlaisvintumėte vietos."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV saugykla pilna. Ištrinkite kai kuriuos failus, kad atlaisvintumėte vietos."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Darbo profilio administratorius"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Darbo profilis ištrintas"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Darbo profilis ištrintas dėl trūkstamos administratoriaus programos"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Trūksta darbo profilio administratoriaus programos arba ji sugadinta. Todėl darbo profilis ir susiję duomenys buvo ištrinti. Jei reikia pagalbos, susisiekite su administratoriumi."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Darbo profilis nebepasiekiamas šiame įrenginyje"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Per daug slaptažodžio bandymų"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Įrenginys yra tvarkomas"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Šį įrenginį tvarko organizacija ir gali stebėti tinklo srautą. Palieskite, kad gautumėte daugiau informacijos."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Įrenginys bus ištrintas"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administratoriaus programos negalima naudoti. Dabar įrenginys bus ištrintas.\n\nJei kyla klausimų, susisiekite su organizacijos administratoriumi."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administratoriaus programos negalima naudoti. Dabar įrenginio duomenys bus ištrinti.\n\nJei turite klausimų, susisiekite su organizacijos administratoriumi."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Neleidžiama spausdinti (<xliff:g id="OWNER_APP">%s</xliff:g>)."</string>
<string name="me" msgid="6545696007631404292">"Aš"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planšetinio kompiuterio parinktys"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lėktuvo režimas"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ĮJUNGTAS lėktuvo režimas"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"lėktuvo režimas IŠJUNGTAS"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akumuliatoriaus tausojimo priemonė"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akumuliatoriaus tausojimo priemonė IŠJUNGTA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akumuliatoriaus tausojimo priemonė ĮJUNGTA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pagalba"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Perjungti į darbo profilį"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktai"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pasiekti kontaktus"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie kontaktų"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti kontaktus?"</string>
<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="8903573681261610809">"Suteikti prieigą <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prie įrenginio vietovės"</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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendorius"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pasiekti kalendorių"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie kalendoriaus"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti kalendorių?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"siųsti ir peržiūrėti SMS pranešimus"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> siųsti ir peržiūrėti SMS pranešimus"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> siųsti ir peržiūrėti SMS pranešimus?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Saugykla"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pasiekti nuotraukas, mediją ir failus įrenginyje"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie įrenginio nuotraukų, medijos ir failų"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti įrenginio nuotraukas, mediją ir failus?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofonas"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"įrašyti garso įrašą"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> įrašyti garsą"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> įrašyti garsą?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparatas"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografuoti ir filmuoti"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> fotografuoti nuotraukas ir įrašyti vaizdo įrašus"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> fotografuoti ir įrašyti vaizdo įrašus?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonas"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"skambinti ir tvarkyti telefonų skambučius"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> atlikti ir tvarkyti skambučius"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Leisti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> skambinti ir tvarkyti telefono skambučius?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kūno jutikliai"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pasiekti jutiklių duomenis apie gyvybinius ženklus"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie jutiklių duomenų apie gyvybinius ženklus"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti jutiklių duomenis apie gyvybinius ženklus?"</string>
<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>
@@ -311,7 +314,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Veiksmai gestais"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Galima paliesti, perbraukti, suimti ir atlikti kitus veiksmus gestais."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Kontrolinio kodo gestai"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Gali užfiksuoti gestus, atliktus naudojant įrenginio kontrolinio kodo jutiklį."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Gali užfiksuoti gestus, atliktus naudojant įrenginio kontrolinio kodo jutiklį."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"išjungti ar keisti būsenos juostą"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Leidžiama programai neleisti būsenos juostos arba pridėti ir pašalinti sistemos piktogramas."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"būti būsenos juosta"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Leidžiama programai savo dalis įrašyti į atmintį. Dėl to gali būti apribota kitomis programomis pasiekiama atmintis ir sulėtėti planšetinio kompiuterio veikimas."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Programai leidžiama nustatyti, kad tam tikros jos dalys nuolat išliktų atmintyje. Dėl to gali sumažėti kitoms programoms pasiekiamos atminties ir sulėtėti TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Leidžiama programai savo dalis įrašyti į atmintį. Dėl to gali būti apribota kitomis programomis pasiekiama atmintis ir sulėtėti telefono veikimas."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"vykdyti priekiniame plane veikiančią paslaugą"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Programai leidžiama naudoti priekiniame plane veikiančias paslaugas."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"matuoti programos atmintinės vietą"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Leidžiama programai nuskaityti kodą, duomenis ir talpykloje saugoti dydžius"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"keisti sistemos nustatymus"</string>
@@ -484,6 +489,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>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"tvarkyti kontrolinio kodo aparatinę įrangą"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Leidžiama programai aktyvinti metodus, norint pridėti ir ištrinti naudojamus kontrolinių kodų šablonus."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"naudoti kontrolinio kodo aparatinę įrangą"</string>
@@ -496,6 +505,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Neatpažintas"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Kontrolinis kodas autentifikuotas"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Kontrolinio kodo aparatinė įranga nepasiekiama."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string>
@@ -808,6 +818,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Atrakinimas pagal piešinį."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Atrakinimas pagal veidą."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Atrakinimas įvedus PIN kodą."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM kortelės PIN kodo atrakinimas."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM kortelės PUK kodo atrakinimas."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Atrakinimas įvedus slaptažodį."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Atrakinimo pagal piešinį sritis."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slydimo sritis."</string>
@@ -869,6 +881,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekstas nukopijuotas į iškarpinę."</string>
<string name="more_item_label" msgid="4650918923083320495">"Daugiau"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Meniu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"„Meta“ +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"„Ctrl“ +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"„Alt“ +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"„Shift“ +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"„Sym“ +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"„Function“ +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"tarpas"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"„Enter“ klavišas"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ištrinti"</string>
@@ -1034,14 +1052,32 @@
<string name="inputMethod" msgid="1653630062304567879">"Įvesties būdas"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string>
<string name="email" msgid="4560673117055050403">"Siųsti el. laišką"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"Skambinti"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"Rasti"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"Atidaryti"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"Pranešimas"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"Pridėti"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"Peržiūrėti"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"Tvarkaraštis"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"Stebėti"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Mažėja laisvos saugyklos vietos"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Kai kurios sistemos funkcijos gali neveikti"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistemos saugykloje nepakanka vietos. Įsitikinkite, kad yra 250 MB laisvos vietos, ir paleiskite iš naujo."</string>
@@ -1114,31 +1150,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Tikrinti, ar yra naujinių"</string>
<string name="smv_application" msgid="3307209192155442829">"Programa „<xliff:g id="APPLICATION">%1$s</xliff:g>“ (procesas „<xliff:g id="PROCESS">%2$s</xliff:g>“) pažeidė savo vykdomą „StrictMode“ politiką."</string>
<string name="smv_process" msgid="5120397012047462446">"„<xliff:g id="PROCESS">%1$s</xliff:g>“ procesas pažeidė savo vykdomą „StrictMode“ politiką."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"„Android“ naujovinama..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Paleidžiama „Android“…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefonas atnaujinamas…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Planšetinis kompiuteris atnaujinamas…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Įrenginys atnaujinamas…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefonas paleidžiamas…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Planšetinis kompiuteris paleidžiamas…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Įrenginys paleidžiamas…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizuojama saugykla."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Baigiamas „Android“ atnauj. procesas…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kai kurios programos gali tinkamai neveikti, kol naujovinimo procesas nebus baigtas"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Baigiama atnaujinti sistemą…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"„<xliff:g id="APPLICATION">%1$s</xliff:g>“ naujovinama..."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizuojama <xliff:g id="NUMBER_0">%1$d</xliff:g> progr. iš <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Ruošiama „<xliff:g id="APPNAME">%1$s</xliff:g>“."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Paleidžiamos programos."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Užbaigiamas paleidimas."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Palieskite, kad grįžtumėte į žaidimą"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Pasirinkite žaidimą"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Kad programa geriau veiktų, vienu metu galima atidaryti tik vieną iš šių žaidimų."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Grįžti į „<xliff:g id="OLD_APP">%1$s</xliff:g>“"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Atminties išklotinės duomenys surinkti; palieskite, kad bendrintumėte"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Pasirinkite teksto veiksmą"</string>
@@ -1177,12 +1210,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Prisijunkite prie atviro „Wi‑Fi“ tinklo"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Prisijungimas prie operatoriaus „Wi‑Fi“ tinklo"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Prisijungiama prie atviro „Wi‑Fi“ tinklo"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Jungiamasi prie „Wi-Fi“ tinklo"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Prisijungta prie „Wi-Fi“ tinklo"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nepavyko prisijungti prie „Wi‑Fi“ tinklo"</string>
<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="1100098935861622985">"Visi tinklai"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tinklai"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"„Wi‑Fi“ bus įjungtas automatiškai"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kai būsite netoli išsaugoto aukštos kokybės tinklo"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Neįjunkite vėl"</string>
@@ -1248,6 +1281,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Paleisti iš naujo"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Suaktyvinti mobiliojo ryšio paslaugą"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Atsisiųskite operatoriaus programą, kad suaktyvintumėte naują SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Atsisiųskite programą „<xliff:g id="APP_NAME">%1$s</xliff:g>“, kad suaktyvintumėte naują SIM kortelę"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Atsisiųsti programą"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Įdėta nauja SIM kortelė"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Jei norite tai nustatyti, palieskite"</string>
@@ -1266,13 +1300,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP režimas naudojant USB įjungtas"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB įrenginio kaip modemo naudojimas įjungtas"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI režimas naudojant USB įjungtas"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB priedo režimas įjungtas"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Prijungtas USB priedas"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Palieskite, kad būtų rodoma daugiau parinkčių."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Įkraunamas prijungtas įrenginys. Palieskite, jei reikia daugiau parinkčių."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aptiktas analoginis garso priedas"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Prijungtas įrenginys nesuderinamas su šiuo telefonu. Palieskite, kad sužinotumėte daugiau."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Palieskite, kad išjungtumėte USB derinimą."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Pateikiamas pranešimas apie riktą…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bendrinti pranešimą apie riktą?"</string>
@@ -1291,34 +1325,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jei nenorite, kad <xliff:g id="NAME">%s</xliff:g> naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IŠJUNGTI"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ruošiama <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tikrinama, ar nėra klaidų"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Aptikta nauja <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Išjungti"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Tikrinama išorinė laikmena (<xliff:g id="NAME">%s</xliff:g>)…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Peržiūrimas dabartinis turinys"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nauja laikmena (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Palieskite, kad nustatytumėte"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Norint perkelti nuotraukas ir mediją"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Saugykla (<xliff:g id="NAME">%s</xliff:g>) sugadinta"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> sugadinta. Palieskite, kad ištaisytumėte."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Kilo problema dėl laikmenos (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Palieskite ir ištaisykite tai"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> sugadinta. Pasirinkite, kad pataisytumėte."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepalaikoma saugykla (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Šis įrenginys nepalaiko šios <xliff:g id="NAME">%s</xliff:g>. Palieskite, kad nustatytumėte palaikomu formatu."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Šis įrenginys nepalaiko šios <xliff:g id="NAME">%s</xliff:g>. Pasirinkite ir nustatykite palaikomu formatu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> netikėtai pašalinta"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Išmontuokite <xliff:g id="NAME">%s</xliff:g> prieš pašalindami, kad neprarastumėte duomenų."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Pašalinta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> pašalinta; įdėkite naują"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Vis dar šalinama <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nepašalinti"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Prieš šalindami išimkite laikmeną, kad neprarastumėte turinio"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Laikmena (<xliff:g id="NAME">%s</xliff:g>) atjungta"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Kai kurios funkcijos gali neveikti tinkamai. Įdėkite naują saugyklą."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Pašalinama laikmena (<xliff:g id="NAME">%s</xliff:g>)…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Neatjunkite"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Nustatyti"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Pašalinti"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Naršyti"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Trūksta <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Iš naujo įdėkite šį įrenginį"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Įdėkite įrenginį dar kartą"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Perkeliama programa „<xliff:g id="NAME">%s</xliff:g>“"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Perkeliami duomenys"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Perkėlimo veiksmas užbaigtas"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Duomenys perkelti į <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Nepavyko perkelti duomenų"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Duomenys palikti pradinėje vietoje"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Turinio perkėlimas baigtas"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Turinys perkeltas į saugyklą (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Turinio perkelti nepavyko"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Bandykite perkelti turinį dar kartą"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Pašalinta"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Pašalinta"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Tikrinama…"</string>
@@ -1377,14 +1412,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Prisijungiama prie visada įjungto VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Prisijungta prie visada įjungto VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Atsijungta nuo visada įjungto VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Visada įjungto VPN klaida"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Prisijungti prie visada įjungto VPN nepavyko"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Keiskite tinklo arba VPN nustatymus"</string>
<string name="upload_file" msgid="2897957172366730416">"Pasirinkti failą"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nepasirinktas joks failas"</string>
<string name="reset" msgid="2448168080964209908">"Atstatyti"</string>
<string name="submit" msgid="1602335572089911941">"Pateikti"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Įgalintas automobilio režimas"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Palieskite, kad išeitumėte iš automobilio režimo."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Veikia vairavimo programa"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Palieskite, kad išeitumėte iš vairavimo programos."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Susietas ar aktyvus"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Palieskite, kad nustatytumėte."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Įrenginio kaip modemo naudojimas išjungtas"</string>
@@ -1464,22 +1499,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"„<xliff:g id="MANUFACTURER">%s</xliff:g>“ atmintukas"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB atmintis"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redaguoti"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Duomenų naudojimo įspėjimas"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Pal. ir perž. naud. i. bei nust."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Pasiektas 2G–3G duomenų apribojimas"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Pasiektas 4G duomenų apribojimas"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Duomenų įspėjimas"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Sunaudojote duomenų: <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Pasiek. mob. ryšio duom. limitas"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Pasiektas „Wi-Fi“ duomenų apribojimas"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Pristabdyti likusio ciklo duomenys"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Viršyta 2G–3G duomenų riba"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Viršyta 4G duomenų riba"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Viršyta mobiliųjų duomenų riba"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Viršytas „Wi-Fi“ duomenų aprib."</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> viršyta nurodyta riba."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Duomenų naudojimas pristabdytas iki jūsų ciklo pabaigos"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Viršijote mob. r. duom. aprib."</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Viršijote „Wi-Fi“ duom. aprib."</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Viršijote nustatytą apribojimą (<xliff:g id="SIZE">%s</xliff:g>)"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Apriboti foniniai duomenys"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Palieskite ir pašal. apribojimą."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Naudojama daug duomenų"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Pastarąsias kelias dienas naudojate daugiau duomenų nei įprastai. Palietę peržiūrėkite naudojimą ir nustatymus."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Didelis mob. ryšio duom. naud."</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Programos sunaudojo daugiau duomenų nei įprastai"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Programa „<xliff:g id="APP">%s</xliff:g>“ sunaudojo daugiau duomenų nei įprastai"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Saugos sertifikatas"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Šis sertifikatas galioja."</string>
<string name="issued_to" msgid="454239480274921032">"Išduota:"</string>
@@ -1719,7 +1751,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Įdiegė administratorius"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atnaujino administratorius"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Ištrynė administratorius"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Kad pailgintų akumuliatoriaus naudojimo laiką, Akumuliatoriaus tausojimo priemonė sumažina įrenginio veikimą ir apriboja vibravimą, vietovės paslaugas bei daugumą foninių duomenų. El. pašto, susirašinėjimo ir kitos programos, kurios veikia sinchronizavimo pagrindu, gali būti neatnaujintos, nebent jas atidarysite.\n\nAkumuliatoriaus tausojimo priemonė automatiškai išjungiama, kai įrenginys įkraunamas."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Kad akumuliatorius veiktų ilgiau, akumuliatoriaus tausojimo priemonė sumažina įrenginio našumą ir apriboja arba išjungia vibravimą, vietovės paslaugas bei foninius duomenis. El. pašto, susirašinėjimo ir kitos programos, kurios veikia sinchronizavimo pagrindu, gali būti neatnaujintos, kol jų neatidarysite.\n\nAkumuliatoriaus tausojimo priemonė automatiškai išjungiama, kai įrenginys įkraunamas."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Įj. Duomenų taupymo priemonę?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Įjungti"</string>
@@ -1735,7 +1767,7 @@
<item quantity="many">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d valandą (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">%1$d valandas (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">%1$d valandos (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,7 +1791,7 @@
<item quantity="many">%d min.</item>
<item quantity="other">%d min.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d valandą</item>
<item quantity="few">%d valandas</item>
<item quantity="many">%d valandos</item>
@@ -1786,14 +1818,14 @@
<string name="muted_by" msgid="6147073845094180001">"Nutildė <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Iškilo vidinė su jūsų įrenginiu susijusi problema, todėl įrenginys gali veikti nestabiliai, kol neatkursite gamyklinių duomenų."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Iškilo vidinė su jūsų įrenginiu susijusi problema. Jei reikia išsamios informacijos, susisiekite su gamintoju."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD užklausa pakeista į DIAL užklausą."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD užklausa pakeista į SS užklausą."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD užklausa pakeista į naują USSD užklausą."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD užklausa pakeista į „Video DIAL“ užklausą."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS užklausa pakeista į DIAL užklausą."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS užklausa pakeista į „Video DIAL“ užklausą."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS užklausa pakeista į USSD užklausą."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS užklausa pakeista į naują SS užklausą."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD užklausa pakeista į įprastą skambutį"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD užklausa pakeista į SS užklausą"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Pakeista į naują USSD užklausą"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD užklausa pakeista į vaizdo skambutį"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS užklausa pakeista į įprastą skambutį"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS užklausa pakeista į vaizdo skambutį"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS užklausa pakeista į USSD užklausą"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Pakeista į naują SS užklausą"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Darbo profilis"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Išskleisti"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sutraukti"</string>
@@ -1895,6 +1927,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM kortelė neteikiama naudojant balso paslaugas"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM kortelė neleidžiama naudojant balso paslaugas"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonas neleidžiamas naudojant balso paslaugas"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM kortelė <xliff:g id="SIMNUMBER">%d</xliff:g> neleidžiama"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM kortelė <xliff:g id="SIMNUMBER">%d</xliff:g> neteikiama"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM kortelė <xliff:g id="SIMNUMBER">%d</xliff:g> neleidžiama"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM kortelė <xliff:g id="SIMNUMBER">%d</xliff:g> neleidžiama"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iššokantysis langas"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Dar <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Grąžinta ankstesnė programos versija arba versija nesuderinama su šiuo sparčiuoju klavišu"</string>
@@ -1907,7 +1943,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aptikta žalinga programa"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"„<xliff:g id="APP_0">%1$s</xliff:g>“ nori rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redaguoti"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Skambučiai ir pranešimai vibruos"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Skambučiai ir pranešimai bus nutildyti"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemos pakeitimai"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Netrukdymo režimas"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Netrukdymo režimu slepiami pranešimai, kad galėtumėte susikaupti"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Tai naujas veiksmas. Palieskite, kad pakeistumėte."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Netrukdymo režimas pakeistas"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Palieskite, kad patikrintumėte pertraukčių elgsenos nustatymus"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Palieskite, kad patikrintumėte, kas blokuojama."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Nustatymai"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 696fce6..51d32e5 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -78,15 +78,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Zvanītāja ID noklusējumi ir iestatīti uz Nav ierobežots. Nākamais zvans: nav ierobežots"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Pakalpojums netiek nodrošināts."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Zvanītāja ID iestatījumu nevar mainīt."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Nav datu pakalpojuma"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nav ārkārtas izsaukumu"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nav pieejams neviens datu pakalpojums mobilajām ierīcēm"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Nav pieejami ārkārtas izsaukumi"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Balss izsaukumu pakalpojums nedarbojas"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balss un ārkārtas izsaukumu pakalpojums nedarbojas"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Pagaidām netiek piedāvāts mobilajā tīklā jūsu atrašanās vietā"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nevar sasniegt tīklu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Iestatījumi > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi zvani ir aktīvi"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Lai veiktu ārkārtas zvanus, ir nepieciešams mobilais tīkls."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Balss izsaukumu pakalpojums vai ārkārtas izsaukumi nedarbojas"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Jūsu mobilo sakaru operators īslaicīgi izslēdza pakalpojumu."</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Jūsu mobilo sakaru operators īslaicīgi izslēdza pakalpojumu šai SIM kartei: <xliff:g id="SIMNUMBER">%d</xliff:g>."</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nevar sasniegt mobilo tīklu"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Mēģiniet nomainīt vēlamo tīklu. Pieskarieties, lai to mainītu."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Nav pieejami ārkārtas izsaukumi"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Izmantojot Wi-Fi, nevar veikt ārkārtas izsaukumus"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Brīdinājumi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zvanu pāradresācija"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Ārkārtas atzvana režīms"</string>
@@ -121,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Viesabonēšanas reklāmkarogs ir ieslēgts."</string>
<string name="roamingText12" msgid="1189071119992726320">"Viesabonēšanas reklāmkarogs ir izslēgts."</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pakalpojuma meklēšana"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi zvani"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Neizdevās iestatīt Wi-Fi zvanus"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoram iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus. (Kļūdas kods: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Reģistrējieties pie sava mobilo sakaru operatora (kļūdas kods: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Reģistrējot Wi-Fi zvanus pie mobilo sakaru operatora, radās problēma: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -161,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Tiek apstrādāts pārāk liels pieprasījumu skaits. Vēlāk mēģiniet vēlreiz."</string>
<string name="notification_title" msgid="8967710025036163822">"Pierakstīšanās kļūda kontā <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizācija"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizācija"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Pārāk daudz <xliff:g id="CONTENT_TYPE">%s</xliff:g> dzēsto vienumu."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nevar sinhronizēt"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pārāk apjomīgs satura <xliff:g id="CONTENT_TYPE">%s</xliff:g> dzēšanas mēģinājums"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Planšetdatora atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Pulksteņa atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Televizora krātuve ir pilna. Izdzēsiet dažus failus, lai atbrīvotu vietu."</string>
@@ -176,14 +177,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Jūsu darba profila administrators"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Domēns <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Darba profils izdzēsts"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Darba profils tika dzēsts, jo trūkst administratora lietotnes."</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Trūkst darba profila administratora lietotnes, vai šī lietotne ir bojāta. Šī iemesla dēļ jūsu darba profils un saistītie dati tika dzēsti. Lai saņemtu palīdzību, sazinieties ar administratoru."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Jūsu darba profils šai ierīcē vairs nav pieejams."</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Veikts pārāk daudz paroles ievadīšanas mēģinājumu."</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Ierīce tiek pārvaldīta"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Jūsu organizācija pārvalda šo ierīci un var uzraudzīt tīkla datplūsmu. Pieskarieties, lai saņemtu detalizētu informāciju."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Jūsu ierīces dati tiks dzēsti"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administratora lietotni nevar izmantot. Ierīcē saglabātie dati tiks dzēsti. \n\nJa jums ir kādi jautājumi, sazinieties ar savas organizācijas administratoru."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administratora lietotni nevar izmantot. Ierīcē saglabātie dati tiks dzēsti.\n\nJa jums ir kādi jautājumi, sazinieties ar savas organizācijas administratoru."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Drukāšanu atspējoja <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Man"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planšetdatora opcijas"</string>
@@ -239,6 +239,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lidojuma režīms"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lidojuma režīms ir IESLĒGTS."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lidojuma režīms ir IZSLĒGTS."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akumulatora jaudas taupīšanas režīms"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akumulatora jaudas taupīšanas režīms ir IZSLĒGTS"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akumulatora jaudas taupīšanas režīms ir IESLĒGTS"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Palīdzība"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string>
@@ -272,31 +275,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Pārslēgties uz darba profilu"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersonas"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"piekļūt jūsu kontaktpersonu datiem"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu kontaktpersonām"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu kontaktpersonām?"</string>
<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="8903573681261610809">"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="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="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="6704529828699071445">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"Īsziņas"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sūtīt un skatīt īsziņas"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> sūtīt un skatīt īsziņas"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> sūtīt un skatīt īsziņas?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Krātuve"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"piekļūt fotoattēliem, multividei un failiem jūsu ierīcē"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt fotoattēliem, multivides saturam un failiem jūsu ierīcē"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt fotoattēliem, multivides saturam un failiem jūsu ierīcē?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofons"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ierakstīt audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ierakstīt audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ierakstīt audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"uzņemt attēlus un ierakstīt videoklipus"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uzņemt fotoattēlus un videoklipus"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uzņemt fotoattēlus un ierakstīt videoklipus?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Tālrunis"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"veikt un pārvaldīt tālruņa zvanus"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> veikt un pārvaldīt tālruņa zvanus"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> veikt un pārvaldīt tālruņa zvanus?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Ķermeņa sensori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"piekļūt sensoru datiem par jūsu veselības rādījumiem"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt sensoru uztvertajiem veselības datiem"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt sensoru uztvertajiem veselības rādījumiem?"</string>
<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>
@@ -308,7 +311,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Žestu izpilde"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Atbalsta pieskaršanos, vilkšanu, savilkšanu un citus žestus."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Pirksta nospieduma žesti"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Var uztvert žestus ierīces pirksta nospieduma sensorā."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Var uztvert žestus ierīces pirksta nospieduma sensorā."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"atspējot vai pārveidot statusa joslu"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ļauj lietotnei atspējot statusa joslu vai pievienot un noņemt sistēmas ikonas."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"Būt par statusa joslu"</string>
@@ -359,6 +362,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ļauj lietotnei nodrošināt atsevišķu tās daļu nepārtrauktu atrašanos atmiņā. Tas var ierobežot pieejamo atmiņas daudzumu citām lietotnēm, tādējādi palēninot planšetdatora darbību."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ļauj lietotnei nodrošināt atsevišķu tās daļu nepārtrauktu atrašanos atmiņā. Tas var ierobežot pieejamo atmiņas daudzumu citām lietotnēm, tādējādi palēninot televizora darbību."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ļauj lietotnei nodrošināt atsevišķu tās daļu nepārtrauktu atrašanos atmiņā. Tas var ierobežot pieejamo atmiņas daudzumu citām lietotnēm, tādējādi palēninot tālruņa darbību."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"Aktivizēt priekšplāna pakalpojumu"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Ļauj lietotnei izmantot priekšplāna pakalpojumus."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"noteikt vietas apjomu lietotnes atmiņā"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ļauj lietotnei izgūt tās koda datus un kešatmiņas izmēru."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"mainīt sistēmas iestatījumus"</string>
@@ -481,6 +486,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Atļauj lietotnei izsaukt metodes izmantojamo pirkstu nospiedumu veidņu pievienošanai un dzēšanai."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"lietot pirkstu nospiedumu aparatūru"</string>
@@ -493,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nav atpazīts"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pirksta nospiedums tika autentificēts."</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Nospieduma aparatūra nav pieejama."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string>
@@ -805,6 +813,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Autorizācija ar kombināciju."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Autorizācija pēc sejas."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Autorizācija ar PIN kodu."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM kartes atbloķēšanas PIN"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM kartes atbloķēšanas PUK"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Autorizācija ar paroli."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kombinācijas ievades apgabals."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Apgabals, kur vilkt ar pirkstu."</string>
@@ -866,6 +876,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teksts ir kopēts uz starpliktuvi."</string>
<string name="more_item_label" msgid="4650918923083320495">"Vairāk"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Izvēlne+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta taustiņš +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Vadīšanas taustiņš +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alternēšanas taustiņš +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Pārslēgšanas taustiņš +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Simbolu taustiņš +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funkcijas taustiņš +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"atstarpe"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ievade"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"dzēst"</string>
@@ -1014,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Ievades metode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksta darbības"</string>
<string name="email" msgid="4560673117055050403">"E-pasts"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Nosūtīt e-pasta ziņojumu uz atlasīto adresi"</string>
<string name="dial" msgid="1253998302767701559">"Zvanīt"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Zvanīt uz atlasīto tālruņa numuru"</string>
<string name="map" msgid="6521159124535543457">"Atrast"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Atrast atlasīto adresi"</string>
<string name="browse" msgid="1245903488306147205">"Atvērt"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Atvērt atlasīto URL"</string>
<string name="sms" msgid="4560537514610063430">"Īsziņa"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Nosūtīt īsziņu uz atlasīto tālruņa numuru"</string>
<string name="add_contact" msgid="7867066569670597203">"Pievienot"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Pievienot kontaktpersonām"</string>
<string name="view_calendar" msgid="979609872939597838">"Skatīt"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Skatīt atlasīto laiku kalendārā"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Grafiks"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Ieplānot pasākumu konkrētā laikā"</string>
<string name="view_flight" msgid="7691640491425680214">"Izsekot"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Izsekot atlasīto lidojumu"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Paliek maz brīvas vietas"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Dažas sistēmas funkcijas var nedarboties."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistēmai pietrūkst vietas. Atbrīvojiet vismaz 250 MB vietas un restartējiet ierīci."</string>
@@ -1094,31 +1119,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Pārbaudīt, vai ir pieejams atjauninājums"</string>
<string name="smv_application" msgid="3307209192155442829">"Lietotne <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) ir pārkāpusi savu pašieviesto StrictMode politiku."</string>
<string name="smv_process" msgid="5120397012047462446">"Process <xliff:g id="PROCESS">%1$s</xliff:g> ir pārkāpis savu pašieviesto StrictMode politiku."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Notiek Android jaunināšana..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Notiek Android palaišana…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Notiek tālruņa atjaunināšana…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Notiek planšetdatora atjaunināšana…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Notiek ierīces atjaunināšana…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Notiek tālruņa palaišana…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Notiek planšetdatora palaišana…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Notiek ierīces palaišana…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Notiek krātuves optimizēšana."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Tiek pabeigta Android atjaunināšana…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kamēr jaunināšana nebūs pabeigta, dažas lietotnes, iespējams, nedarbosies pareizi."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Notiek sistēmas atjauninājuma pabeigšana"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Notiek lietotnes <xliff:g id="APPLICATION">%1$s</xliff:g> jaunināšana…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Tiek optimizēta <xliff:g id="NUMBER_0">%1$d</xliff:g>. lietotne no <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Notiek lietotnes <xliff:g id="APPNAME">%1$s</xliff:g> sagatavošana."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Notiek lietotņu palaišana."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Tiek pabeigta sāknēšana."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Pieskarieties, lai atgrieztos spēlē"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Spēles izvēlēšanās"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Lai uzlabotu veiktspēju, vienlaikus var atvērt tikai vienu no šīm spēlēm."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Atgriezties lietotnē <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tika apkopots kaudzes izraksts. Pieskarieties, lai to kopīgotu."</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Izvēlieties darbību tekstam"</string>
@@ -1155,12 +1177,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Savienojuma izveide ar atvērtu Wi-Fi tīklu"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Savienojuma izveide ar mobilo sakaru operatora Wi‑Fi tīklu"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Notiek savienojuma izveide ar atvērtu Wi-Fi tīklu"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Savienojuma izveide ar Wi-Fi tīklu"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ir izveidots savienojums ar Wi-Fi tīklu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nevarēja izveidot savienojumu ar Wi‑Fi tīklu"</string>
<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="1100098935861622985">"Visi tīkli"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tīkli"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi tiks automātiski ieslēgts"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kad atrodaties saglabāta augstas kvalitātes tīkla tuvumā"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Neieslēgt atkārtoti"</string>
@@ -1226,6 +1248,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restartēt"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizējiet mobilo ierīci."</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Lejupielādējiet mobilo sakaru operatora lietotni, lai aktivizētu jauno SIM karti."</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Lejupielādējiet lietotni <xliff:g id="APP_NAME">%1$s</xliff:g>, lai aktivizētu jauno SIM karti."</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Lejupielādēt lietotni"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Ievietota jauna SIM karte"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Pieskarieties, lai to iestatītu."</string>
@@ -1244,13 +1267,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Ieslēgts PTP režīms, izmantojot USB savienojumu"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Ieslēgta USB piesaiste"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Ieslēgts MIDI režīms, izmantojot USB savienojumu"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Ieslēgts USB piederumu režīms"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB piederums ir pievienots"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Pieskarieties, lai skatītu citas iespējas."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Pievienotā ierīce tiek uzlādēta. Pieskarieties, lai skatītu citas opcijas."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Konstatēts analogs audio piederums"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pievienotā ierīce nav saderīga ar šo tālruni. Pieskarieties, lai uzzinātu vairāk."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Pieskarieties, lai atspējotu USB atkļūdošanu."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Notiek kļūdas pārskata izveide…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vai kopīgot kļūdas pārskatu?"</string>
@@ -1269,34 +1292,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Lietotne <xliff:g id="NAME">%s</xliff:g> tiek rādīta pāri citām lietotnēm"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Lietotne <xliff:g id="NAME">%s</xliff:g> pāri citām lietotnēm"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un to izslēgtu."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZSLĒGT"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Notiek <xliff:g id="NAME">%s</xliff:g> sagatavošana"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tiek meklētas kļūdas"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tika atrasta jauna <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Izslēgt"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Notiek ierīces <xliff:g id="NAME">%s</xliff:g> pārbaude…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Notiek pašreizējā satura pārskatīšana."</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Jauna ierīce: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Pieskarieties, lai iestatītu."</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoattēlu un satura pārsūtīšanai."</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Bojāts datu nesējs (<xliff:g id="NAME">%s</xliff:g>)"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Datu nesējs <xliff:g id="NAME">%s</xliff:g> ir bojāts. Pieskarieties, lai labotu."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problēma saistībā ar <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Pieskarieties, lai novērstu problēmu."</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ir bojāta. Atlasiet, lai labotu."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Neatbalstīts datu nesējs (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Šī ierīce neatbalsta datu nesēju <xliff:g id="NAME">%s</xliff:g>. Pieskarieties, lai iestatītu to atbalstītā formātā."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Šajā ierīcē netiek atbalstīta šī <xliff:g id="NAME">%s</xliff:g>. Atlasiet, lai iestatītu atbalstītu formātu."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tika negaidīti izņemta"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Pirms izņemšanas atvienojiet <xliff:g id="NAME">%s</xliff:g>, lai nezaudētu datus."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> tika izņemta"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ir izņemta. Ievietojiet citu datu nesēju."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> joprojām tiek atvienota…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neizņemiet to."</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Lai nezaudētu saturu, pirms izņemšanas izstumiet datu nesēju."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Ierīce <xliff:g id="NAME">%s</xliff:g> izņemta"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Dažas funkcijas var darboties neatbilstoši. Ievietojiet jaunu atmiņas ierīci."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Notiek ierīces <xliff:g id="NAME">%s</xliff:g> atvienošana"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Neizņemiet to."</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Iestatīt"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izstumt"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Izpētīt"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Nav ierīces <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Vēlreiz ievietojiet ierīci."</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Vēlreiz pievienojiet ierīci."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Notiek lietotnes <xliff:g id="NAME">%s</xliff:g> pārvietošana"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Notiek datu pārvietošana"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Pārvietošana ir pabeigta"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dati ir pārvietoti uz ierīci <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Nevarēja pārvietot datus"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dati tika atstāti sākotnējā atrašanās vietā"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Satura pārsūtīšana pabeigta"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Saturs tika pārvietots ierīcē <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Saturu neizdevās pārvietot"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Vēlreiz mēģiniet pārvietot saturu"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Noņemts"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Noņemts"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Notiek pārbaude..."</string>
@@ -1355,14 +1379,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Notiek savienojuma izveide ar vienmēr ieslēgtu VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Izveidots savienojums ar vienmēr ieslēgtu VPN."</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Pārtraukts savienojums ar vienmēr ieslēgtu VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kļūda saistībā ar vienmēr ieslēgtu VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nevarēja izveidot savienojumu ar vienmēr ieslēgtu VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Mainiet tīkla vai VPN iestatījumus"</string>
<string name="upload_file" msgid="2897957172366730416">"Izvēlēties failu"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Neviens fails nav izvēlēts"</string>
<string name="reset" msgid="2448168080964209908">"Atiestatīt"</string>
<string name="submit" msgid="1602335572089911941">"Iesniegt"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automobiļa režīms ir iespējots."</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Pieskarieties, lai izietu no automašīnas režīma."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Autovadīšanas lietotne darbojas"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Pieskarieties, lai izietu no autovadīšanas lietotnes"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Piesaiste vai tīklājs ir aktīvs."</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Pieskarieties, lai iestatītu."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Piesaiste ir atspējota"</string>
@@ -1441,22 +1465,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB disks"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB atmiņa"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Rediģēt"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Brīdinājums par datu lietojumu"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Piesk., lai sk. lietoj. un iest."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Sasniegts 2G-3G datu ierobež."</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Sasniegts 4G datu ierobežojums"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datu brīdinājums"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Izmantotie dati: <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Sasniegts mobilo datu ierobežoj."</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Sasniegts Wi-Fi datu ierobež."</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datu lietošana ciklā pārtraukta."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G datu ierobež. pārsniegts"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G datu limits pārsniegts"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Pārsniegts mobilo datu ierobežoj."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi datu ierobež. pārsniegts"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> virs norādītā ierobežojuma."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Datu lietošana atlikušajā ciklā ir pārtraukta."</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Pārsniegts datu ierobežojums"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Pārsniegts Wi-Fi datu ierobežojums"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Jūs esat pārsniedzis iestatīto ierobežojumu par <xliff:g id="SIZE">%s</xliff:g>."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Fona dati ir ierobežoti."</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Pieskar., lai noņemtu ierobežoj."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Liels datu lietojums"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Datu lietojums dažās pēdējās dienās ir lielāks nekā parasti. Pieskarieties, lai skatītu lietojumu un iestatījumus."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Augsts mobilo datu lietojums"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Jūsu lietotnēs ir izmantots vairāk datu nekā parasti."</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Lietotnē <xliff:g id="APP">%s</xliff:g> ir izmantots vairāk datu nekā parasti."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Drošības sertifikāts"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Sertifikāts ir derīgs."</string>
<string name="issued_to" msgid="454239480274921032">"Izdots:"</string>
@@ -1694,7 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalēja administrators"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atjaunināja administrators"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dzēsa administrators"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek samazināta ierīces veiktspēja un tiek ierobežota vibrācija, atrašanās vietu pakalpojumi un lielākā daļa fona datu. E-pasta, ziņojumapmaiņas un citas lietotnes, kurām ir nepieciešama sinhronizācija, var netikt atjauninātas, ja tās neatverat.\n\nTiklīdz tiek sākta ierīces uzlāde, akumulatora jaudas taupīšanas režīms tiek automātiski izslēgts."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek samazināta ierīces veiktspēja un ierobežota vai izslēgta vibrācija, atrašanās vietu pakalpojumi un fona dati. E-pasta, ziņojumapmaiņas un citas lietotnes, kurām ir nepieciešama sinhronizācija, var netikt atjauninātas, ja tās neatverat.\n\nTiklīdz tiek sākta ierīces uzlāde, akumulatora jaudas taupīšanas režīms tiek automātiski izslēgts."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vai ieslēgt datu lietojuma samazinātāju?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ieslēgt"</string>
@@ -1708,10 +1729,10 @@
<item quantity="one">%1$d min (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d min (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="zero">%1$d stundas (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">%1$d stundu (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d stundas (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="zero">%1$d stundas (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">%1$d stundu (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">%1$d stundas (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="zero">%1$d h (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1728,7 +1749,7 @@
<item quantity="one">%d min</item>
<item quantity="other">%d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="zero">%d stundas</item>
<item quantity="one">%d stundu</item>
<item quantity="other">%d stundas</item>
@@ -1753,14 +1774,14 @@
<string name="muted_by" msgid="6147073845094180001">"Skaņu izslēdza <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Jūsu ierīcē ir radusies iekšēja problēma, un ierīce var darboties nestabili. Lai to labotu, veiciet rūpnīcas datu atiestatīšanu."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Jūsu ierīcē ir radusies iekšēja problēma. Lai iegūtu plašāku informāciju, lūdzu, sazinieties ar ražotāju."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD pieprasījums ir mainīts uz DIAL pieprasījumu."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD pieprasījums ir mainīts uz SS pieprasījumu."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD pieprasījums ir mainīts uz jaunu USSD pieprasījumu."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD pieprasījums ir mainīts uz Video DIAL pieprasījumu."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS pieprasījums ir mainīts uz DIAL pieprasījumu."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS pieprasījums ir mainīts uz Video DIAL pieprasījumu."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS pieprasījums ir mainīts uz USSD pieprasījumu."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS pieprasījums ir mainīts uz jaunu SS pieprasījumu."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD pieprasījums mainīts uz parastu zvanu"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD pieprasījums mainīts uz SS pieprasījumu"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Mainīts uz jaunu USSD pieprasījumu"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD pieprasījums mainīts uz videozvanu"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS pieprasījums mainīts uz parastu zvanu"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS pieprasījums mainīts uz videozvanu"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS pieprasījums mainīts uz USSD pieprasījumu"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Mainīts uz jaunu SS pieprasījumu"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Darba profils"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Izvērst"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sakļaut"</string>
@@ -1860,6 +1881,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM kartē netiek nodrošināti balss zvani"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM karti nav atļauts izmantot balss zvaniem"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Tālruni nav atļauts izmantot balss zvaniem"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM karti <xliff:g id="SIMNUMBER">%d</xliff:g> nav atļauts izmantot"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM karte <xliff:g id="SIMNUMBER">%d</xliff:g> netiek nodrošināta"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM karti <xliff:g id="SIMNUMBER">%d</xliff:g> nav atļauts izmantot"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM karti <xliff:g id="SIMNUMBER">%d</xliff:g> nav atļauts izmantot"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Uznirstošais logs"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Vēl <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ir notikusi atkāpšanās uz vecāku lietotnes versiju, vai lietotne nav saderīga ar šo saīsni."</string>
@@ -1872,7 +1897,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Konstatēta kaitīga lietotne"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Lietotne <xliff:g id="APP_0">%1$s</xliff:g> vēlas rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Rediģēt"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Zvaniem un paziņojumiem tiks aktivizēta vibrācija."</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvanu un paziņojumu signāla skaņa būs izslēgta."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistēmas izmaiņas"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Netraucēt"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režīmā “Netraucēt” paziņojumi tiek paslēpti, lai palīdzētu jums koncentrēties"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Šāda darbība ir jauna. Pieskarieties, lai mainītu iestatījumus."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režīms “Netraucēt” ir mainīts"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Pieskarieties, lai pārbaudītu rīcības iestatījumu paziņojumus"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Pieskarieties, lai uzzinātu, kas tiek bloķēts."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistēma"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Iestatījumi"</string>
</resources>
diff --git a/core/res/res/values-mcc001-mnc01-or/strings.xml b/core/res/res/values-mcc001-mnc01-or/strings.xml
new file mode 100644
index 0000000..8404eba
--- /dev/null
+++ b/core/res/res/values-mcc001-mnc01-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="2238090225563073546">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc370-or/strings.xml b/core/res/res/values-mcc302-mnc370-or/strings.xml
new file mode 100644
index 0000000..a727216
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc370-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="wfcSpnFormats">
+ <item msgid="5022384999749536798">"%s"</item>
+ <item msgid="8117276330682171665">"%s ୱାଇ-ଫାଇ"</item>
+ </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc720-or/strings.xml b/core/res/res/values-mcc302-mnc720-or/strings.xml
new file mode 100644
index 0000000..2b09b9d
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc720-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="wfcSpnFormats">
+ <item msgid="2776657861851140021">"%s"</item>
+ <item msgid="5094669985484060934">"%s ୱାଇ-ଫାଇ"</item>
+ </string-array>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc030-or/strings.xml b/core/res/res/values-mcc310-mnc030-or/strings.xml
new file mode 100644
index 0000000..bfee279c
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc030-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="6575159319460304530">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="1930079814544869756">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="2995576894416087107">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc150-or/strings.xml b/core/res/res/values-mcc310-mnc150-or/strings.xml
new file mode 100644
index 0000000..25d1511
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc150-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="5207603948149789531">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc170-or/strings.xml b/core/res/res/values-mcc310-mnc170-or/strings.xml
new file mode 100644
index 0000000..3689d94
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc170-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="210168420192421012">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="1130721094178658338">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="3173546391131606065">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc280-or/strings.xml b/core/res/res/values-mcc310-mnc280-or/strings.xml
new file mode 100644
index 0000000..05eeac1
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc280-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="6638755728961013003">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="5562215652599183258">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="822496463303720579">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc380-or/strings.xml b/core/res/res/values-mcc310-mnc380-or/strings.xml
new file mode 100644
index 0000000..e633374
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc380-or/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="6933439408719203102">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="6367773216941648568">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc410-or/strings.xml b/core/res/res/values-mcc310-mnc410-or/strings.xml
new file mode 100644
index 0000000..91988ed
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc410-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="376893116792604964">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="1593063035884873292">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="4477688981805467729">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc560-or/strings.xml b/core/res/res/values-mcc310-mnc560-or/strings.xml
new file mode 100644
index 0000000..0db9d40
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc560-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="2976453378311251765">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="2519618694918727742">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="7030488670186895244">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc950-or/strings.xml b/core/res/res/values-mcc310-mnc950-or/strings.xml
new file mode 100644
index 0000000..d5c4b94
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc950-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="94675382531896663">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="2418195136279399212">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="8920048244573695129">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-or/strings.xml b/core/res/res/values-mcc311-mnc180-or/strings.xml
new file mode 100644
index 0000000..05c9f9a
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="531930017979728896">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+ <string name="mmcc_illegal_ms" msgid="97745044956236881">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+ <string name="mmcc_illegal_me" msgid="5766888847785331904">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc312-mnc670-or/strings.xml b/core/res/res/values-mcc312-mnc670-or/strings.xml
new file mode 100644
index 0000000..4cd8fba
--- /dev/null
+++ b/core/res/res/values-mcc312-mnc670-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="3649306773478362802">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-or/strings.xml b/core/res/res/values-mcc313-mnc100-or/strings.xml
new file mode 100644
index 0000000..a64ee94
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ଫୋନ୍ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index d91c7d3..c5e0a44 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Нема услуга за говорни повици"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Нема говорна услуга или итни повици"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Вашиот оператор ја исклучил привремено"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Привремено исклучена од вашиот оператор за SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобилната мрежа е недостапна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Сменете ја претпочитаната мрежа. Допрете за промена."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Итните повици се недостапни"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Банерот со роаминг е вклучен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банерот со роаминг е исклучен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Пребарување за услуга"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Не може да се постави функцијата „Повици преку Wi-Fi“"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"За да воспоставувате повици и да испраќате пораки преку Wi-Fi, прво побарајте од операторот да ја постави услугава. Потоа, вклучете ја повторно „Повикување преку Wi-Fi“ во „Поставки“. (Код за грешка: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Проблем при регистрирањето на функцијата „Повици преку Wi‑Fi“ со операторот: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Повикување преку Wi-Fi"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Се обработуваат премногу барања. Обидете се повторно подоцна."</string>
<string name="notification_title" msgid="8967710025036163822">"Грешка при пријавување за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхронизирај"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Не може да се синхронизира"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Се обидовте да избришете премногу <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Меморијата на таблетот е полна. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Складот за гледање е полн. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Складот на телевизорот е полн. Избришете некои датотеки за да ослободите простор."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Префрли се на работен профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"пристапува до контактите"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до контактите?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"пристапува до локацијата на овој уред"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до локацијата на уредот?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"пристапува до календарот"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до календарот?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"испраќа и прикажува SMS-пораки"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да испраќа и прегледува SMS-пораки?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Капацитет"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"пристапува до фотографии, аудио-видео и датотеки на уредот"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до фотографиите, аудио-визуелните содржини и датотеките на уредот?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"снима аудио"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да снима аудио?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"фотографира и снима видео"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да фотографира и да снима видео?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упатува и управува со телефонски повици"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да повикува и да управува со телефонските повици?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"пристапува до податоците од сензорите за виталните знаци"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до податоците на сензорот за витални знаци?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
@@ -492,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"користи биометриски хардвер"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Дозволува апликацијата да користи биометриски хардвер за проверка"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управувај хардвер за отпечатоци"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Дозволува апликацијата да повика начини за додавање и бришење шаблони на отпечатоци за користење."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"користи хардвер за отпечатоци"</string>
@@ -504,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не е препознаено"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатокот е проверен"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отпечаток од прст не е достапен."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатокот не може да се складира. Отстранете го постоечкиот отпечаток."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Се достигна времето на истекување на отпечатокот. Обидете се повторно."</string>
@@ -1016,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод на внес"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дејства со текст"</string>
<string name="email" msgid="4560673117055050403">"E-пошта"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Испраќа е-порака на избраната адреса"</string>
<string name="dial" msgid="1253998302767701559">"Повикај"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Го повикува избраниот телефонски број"</string>
<string name="map" msgid="6521159124535543457">"Лоцирај"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Ја лоцира избраната адреса"</string>
<string name="browse" msgid="1245903488306147205">"Отвори"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Ја отвора избраната URL"</string>
<string name="sms" msgid="4560537514610063430">"Порака"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Испраќа порака на избраниот телефонски број"</string>
<string name="add_contact" msgid="7867066569670597203">"Додај"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Додава во контакти"</string>
<string name="view_calendar" msgid="979609872939597838">"Прикажи"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Го гледа избраното време во календарот"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Распоред"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Закажува настан за избраното време"</string>
<string name="view_flight" msgid="7691640491425680214">"Песна"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Следи избран лет"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Капацитетот е речиси полн"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некои системски функции може да не работат"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема доволно меморија во системот. Проверете дали има слободен простор од 250 МБ и рестартирајте."</string>
@@ -1117,8 +1120,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Избери дејство за текст"</string>
@@ -1153,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Поврзете се на отворена Wi‑Fi-мрежа"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Поврзете се на Wi‑Fi-мрежа на оператор"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Поврзување со Wi-Fi мрежа"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Се поврзавте на Wi‑Fi-мрежа"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можеше да се поврзе на Wi‑Fi-мрежа"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string>
@@ -1271,33 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз апликации"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и исклучете ја."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Исклучи"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Се подготвува <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Се проверува за грешки"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Откриена е нова <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Проверка на <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Се прегледуваат тековните содржини"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Нова <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Допрете за поставување"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренесување фотографии и медиуми"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Оштетена <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> е оштетена. Допрете за поправање."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Проблем со <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Допрете за да го поправите ова"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> е оштетена. Изберете за поправање."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Неподдржана <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Уредот не ја поддржува оваа <xliff:g id="NAME">%s</xliff:g>. Допрете за поставување во поддржан формат."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Уредов не ја поддржува оваа <xliff:g id="NAME">%s</xliff:g>. Изберете за поставување во поддржан формат."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> неочекувано е отстранета"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Откачете ја <xliff:g id="NAME">%s</xliff:g> пред да ја отстраните за да избегнете губење на податоците"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Отстранета <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> е отстранета; вметнете нова"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Сѐ уште се вади <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не отстранувај"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Откачете ја надворешната меморија пред да ја отстраните за да избегнете губење содржини"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> е отстранета"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Некои функции можеби нема да работат правилно. Вметнете нова надворешна меморија."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Се откачува <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не отстранувајте"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> недостасува"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Повторно вметнете го овој уред"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Се преместуваат податоци"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Преместувањето е завршено"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Податоците се преместени во <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Не може да се прем. податоците"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Податоците се оставени на провобитната локација"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Преносот на содржини заврши"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Содржините се преместени во <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Не може да се преместат содржини"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Повторен обид за преместување содржини"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Отстрането"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Исфрлено"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Се проверува..."</string>
@@ -1356,17 +1358,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Поврзување со секогаш вклучена VPN..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Поврзани со секогаш вклучена VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Исклучено од секогаш вклучената VPN"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Не можеше да се поврзе на секогаш вклучената VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Променете ја мрежата или поставките за VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Избери датотека"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Не е избрана датотека"</string>
<string name="reset" msgid="2448168080964209908">"Ресетирај"</string>
<string name="submit" msgid="1602335572089911941">"Поднеси"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Апликацијата за возење работи"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Допрете за да излезете од апликацијата за возење."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Поврзувањето или точката на пристап се активни"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Допрете за поставување."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Врзувањето е оневозможено"</string>
@@ -1694,8 +1693,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано од администраторот"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ажурирано од администраторот"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Избришано од администраторот"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"За да се продолжи трајноста на батеријата, штедачот на батерија ги намалува перформансите на вашиот уред и ги ограничува или исклучува вибрациите, услугите за локација и податоците од заднина. Е-поштата, пораките и другите апликации што се потпираат на синхронизирањето може да не се ажурираат освен ако не ги отворите.\n\nШтедачот на батерија се исклучува автоматски кога уредот се полни."</string>
<string name="data_saver_description" msgid="6015391409098303235">"За да се намали користењето интернет, Штедачот на интернет спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Вклучете Штедач на интернет?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Вклучи"</string>
@@ -1746,22 +1744,14 @@
<string name="muted_by" msgid="6147073845094180001">"Звукот го исклучи <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Настана внатрешен проблем со уредот и може да биде нестабилен сè додека не ресетирате на фабричките податоци."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Настана внатрешен проблем со уредот. Контактирајте го производителот за детали."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Барањето USSD е изменето во обичен повик"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Барањето USSD е изменето во барање SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Променето на ново барање USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Барањето USSD е изменето во видео повик"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Барањето SS е изменето во обичен повик"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Барањето SS е изменето во видео повик"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Барањето SS е изменето во барање USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Променето на ново барање SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Работен профил"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Прошири"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Собери"</string>
@@ -1859,6 +1849,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Не е обезбедена SIM-картичка за глас"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Не е дозволена SIM-картичка за глас"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Не е дозволен телефон за глас"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> не е дозволена"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> не е подготвена"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> не е дозволена"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> не е дозволена"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Појавен прозорец"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Верзијата на апликацијата е постара или не е компатибилна со кратенкава"</string>
@@ -1879,8 +1873,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ова е ново однесување. Допрете за промена."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Поставките за „Не вознемирувај“ се изменија"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Допрете за да проверите што е блокирано."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Поставки"</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index ca175d8..662bbad 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"വോയ്സ് സേവനമില്ല"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ശബ്ദ സേവനമോ എമർജൻസി കോളിംഗോ ഇല്ല"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"നിങ്ങളുടെ കാരിയർ താൽക്കാലികമായി ഓഫാക്കി"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"നിങ്ങളുടെ കാരിയർ, സിം <xliff:g id="SIMNUMBER">%d</xliff:g> താൽക്കാലികമായി ഓഫാക്കി"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"മൊബൈൽ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് മാറ്റുന്നത് പരീക്ഷിക്കുക. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"എമർജൻസി കോളിംഗ് ലഭ്യമല്ല"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"റോമിംഗ് ബാനർ ഓണാക്കുക"</string>
<string name="roamingText12" msgid="1189071119992726320">"റോമിംഗ് ബാനർ ഓഫാക്കുക"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"സേവനത്തിനായി തിരയുന്നു"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"വൈഫൈ കോളിംഗ് സജ്ജീകരിക്കാനായില്ല"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"വൈഫൈ വഴി കോളുകൾ ചെയ്യാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക. (പിശക് കോഡ്: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"നിങ്ങളുടെ കാരിയർ ഉപയോഗിച്ച് വൈഫൈ കോളിംഗ് രജിസ്റ്റർ ചെയ്യുന്നതിൽ പ്രശ്നം: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s വൈഫൈ കോളിംഗ്"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"നിരവധി അഭ്യർത്ഥനകൾ പ്രോസസ്സ് ചെയ്യുന്നു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> എന്നതിൽ സൈൻ ഇൻ ചെയ്യുന്നതിൽ പിശക്"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"സമന്വയിപ്പിക്കുക"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"സമന്വയിപ്പിക്കാനാവില്ല"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ഒരുപാട് <xliff:g id="CONTENT_TYPE">%s</xliff:g> ഇല്ലാതാക്കാൻ ശ്രമിച്ചു."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ടാബ്ലെറ്റ് സ്റ്റോറേജ് കഴിഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ ചില ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"വാച്ചിലെ സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ടിവി സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാറുക"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റുകൾ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്സസ്സ് ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"നിങ്ങളുടെ കോണ്ടാക്റ്റുകള് ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ലൊക്കേഷൻ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"കലണ്ടർ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ്സ് ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS സന്ദേശങ്ങൾ അയയ്ക്കുകയും കാണുകയും ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"SMS സന്ദേശങ്ങൾ അയയ്ക്കാനും കാണാനും <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"സ്റ്റോറേജ്"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്സസ് ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"മൈക്രോഫോണ്"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ഓഡിയോ റെക്കോർഡ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ക്യാമറ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ചിത്രങ്ങളെടുത്ത് വീഡിയോ റെക്കോർഡുചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"ചിത്രം എടുക്കാനും വീഡിയോ റെക്കോർഡ് ചെയ്യാനും <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"ഫോൺ കോളുകൾ ചെയ്യാനും അവ നിയന്ത്രിക്കാനും <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ബോഡി സെൻസറുകൾ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"നിങ്ങളുടെ ജീവധാരണ ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ ഡാറ്റ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക ഓൺ ചെയ്യുക"</string>
@@ -492,6 +483,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"നിയർ ഫീൽഡ് കമ്മ്യൂണിക്കേഷൻ (NFC) ടാഗുകളുമായും കാർഡുകളുമായും റീഡറുകളുമായുള്ള ആശയവിനിമയത്തിന് അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"കീലോക്കും ഏതെങ്കിലും അനുബന്ധ പാസ്വേഡ് സുരക്ഷയും പ്രവർത്തനരഹിതമാക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ഒരു ഇൻകമിംഗ് കോൾ സ്വീകരിക്കുമ്പോൾ ഫോൺ കീലോക്ക് പ്രവർത്തനരഹിതമാക്കുന്നു, കോൾ അവസാനിക്കുമ്പോൾ കീലോക്ക് വീണ്ടും പ്രവർത്തനക്ഷമമാകുന്നു."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ നിയന്ത്രിക്കുക"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ഉപയോഗിക്കാനായി വിരലടയാള ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string>
@@ -504,6 +499,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"തിരിച്ചറിഞ്ഞില്ല"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിച്ചു"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ ലഭ്യമല്ല."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"വിരലടയാളം സംഭരിക്കാനാവില്ല. നിലവിലുള്ള വിരലടയാളം നീക്കംചെയ്യുക."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
@@ -1016,14 +1012,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ടൈപ്പുചെയ്യൽ രീതി"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ടെക്സ്റ്റ് പ്രവർത്തനങ്ങൾ"</string>
<string name="email" msgid="4560673117055050403">"ഇമെയിൽ"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"വിളിക്കുക"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"കണ്ടെത്തുക"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"തുറക്കുക"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"സന്ദേശം"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"ചേർക്കുക"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"കാണുക"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"ഷെഡ്യൂള്"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ട്രാക്ക്"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"സംഭരണയിടം കഴിഞ്ഞു"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ചില സിസ്റ്റം പ്രവർത്തനങ്ങൾ പ്രവർത്തിക്കണമെന്നില്ല."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"സിസ്റ്റത്തിനായി മതിയായ സംഭരണമില്ല. 250MB സൗജന്യ സംഭരണമുണ്ടെന്ന് ഉറപ്പുവരുത്തി പുനരാരംഭിക്കുക."</string>
@@ -1117,8 +1131,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"</string>
@@ -1153,8 +1166,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"കാരിയർ വൈഫൈ നെറ്റ്വര്ക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുന്നു"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്തു"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"വൈ-ഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string>
@@ -1271,33 +1283,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ഓഫാക്കുക"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> തയ്യാറാകുന്നു"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"പുതിയ <xliff:g id="NAME">%s</xliff:g> എന്നതിനെ തിരിച്ചറിഞ്ഞു"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> പരിശോധിക്കുന്നു…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"നിലവിലെ ഉള്ളടക്കം അവലോകനം ചെയ്യുന്നു"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"പുതിയ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"സജ്ജമാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ഫോട്ടോകളും മീഡിയയും ട്രാൻസ്ഫർ ചെയ്യാൻ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"കേടായ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> കേടായിരിക്കുന്നു. പരിഹരിക്കാൻ ടാപ്പുചെയ്യുക."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>-ൽ പ്രശ്നം"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"പരിഹരിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> കേടായി. പരിഹരിക്കാൻ തിരഞ്ഞെടുക്കുക."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"പിന്തുണയില്ലാത്ത <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ഈ ഉപകരണം <xliff:g id="NAME">%s</xliff:g> പിന്തുണയ്ക്കുന്നതല്ല. പിന്തുണയുള്ള ഫോർമാറ്റിൽ സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> ഈ ഉപകരണത്തിന് അനുയോജ്യമല്ല. അനുയോജ്യമായ ഒരു ഫോർമാറ്റിൽ സജ്ജമാക്കുന്നതിന് തിരഞ്ഞെടുക്കുക."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> അപ്രതീക്ഷിതമായി നീക്കംചെയ്തു"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"വിവരങ്ങൾ നഷ്ടപ്പെടുന്നത് ഒഴിവാക്കാൻ നീക്കംചെയ്യുന്നതിനുമുമ്പ് <xliff:g id="NAME">%s</xliff:g> അൺമൗണ്ടുചെയ്യുക"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> നീക്കംചെയ്തു"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> നീക്കംചെയ്തു; പുതിയതൊന്ന് ചേർക്കുക"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ഇപ്പോഴും <xliff:g id="NAME">%s</xliff:g> ഒഴിവാക്കപ്പെടുന്നു…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"നീക്കംചെയ്യരുത്"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ഉള്ളടക്കം നഷ്ടമാകുന്നത് തടയാൻ, നീക്കം ചെയ്യുന്നതിന് മുൻപ് മീഡിയ ഒഴിവാക്കുക"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> നീക്കം ചെയ്തു"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ചില പ്രവർത്തനങ്ങൾ ശരിയായി നടക്കണമെന്നില്ല. പുതിയ സ്റ്റോറേജ് ചേർക്കുക."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ഒഴിവാക്കുന്നു"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"നീക്കം ചെയ്യരുത്"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> കാണുന്നില്ല"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ഈ ഉപകരണം വീണ്ടും നൽകുക"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"വിവരം നീക്കുന്നു"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"നീക്കുന്ന പ്രവർത്തനം പൂർത്തിയായി"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g> എന്നതിലേക്ക് വിവരം നീക്കി"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"വിവരം നീക്കാനായില്ല"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"യഥാർത്ഥ ലൊക്കേഷനിൽ വിവരം ശേഷിക്കുന്നു"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"ഉള്ളടക്ക കൈമാറ്റം പൂർത്തിയായി"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ഉള്ളടക്കം <xliff:g id="NAME">%s</xliff:g>-ലേക്ക് നീക്കി"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ഉള്ളടക്കം നീക്കാനായില്ല"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ഉള്ളടക്കം നീക്കുന്നതിന് വീണ്ടും ശ്രമിക്കുക"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"നീക്കംചെയ്തു"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ഇജക്റ്റുചെയ്തു"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"പരിശോധിക്കുന്നു…"</string>
@@ -1356,17 +1369,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്യുന്നു…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്തു"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"എപ്പോഴും ഓണായിരിക്കുന്ന VPN-ൽ നിന്ന് വിച്ഛേദിച്ചു"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"എപ്പോഴും ഓണായിരിക്കുന്ന VPN-ലേക്ക് കണക്റ്റ് ചെയ്യാനായില്ല"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"നെറ്റ്വര്ക്ക് അല്ലെങ്കിൽ VPN ക്രമീകരണം മാറ്റുക"</string>
<string name="upload_file" msgid="2897957172366730416">"ഫയല് തിരഞ്ഞെടുക്കുക"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ഫയലൊന്നും തിരഞ്ഞെടുത്തില്ല"</string>
<string name="reset" msgid="2448168080964209908">"പുനഃസജ്ജമാക്കുക"</string>
<string name="submit" msgid="1602335572089911941">"സമർപ്പിക്കുക"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ഡ്രൈവിംഗ് ആപ്പ് റൺ ചെയ്യുകയാണ്"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ഡ്രൈവിംഗ് ആപ്പിൽ നിന്ന് പുറത്തുകടക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്പോട്ട് സജീവമാണ്"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
@@ -1692,8 +1702,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"നിങ്ങളുടെ അഡ്മിൻ ഇൻസ്റ്റാൾ ചെയ്യുന്നത്"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"നിങ്ങളുടെ അഡ്മിൻ അപ്ഡേറ്റ് ചെയ്യുന്നത്"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"നിങ്ങളുടെ അഡ്മിൻ ഇല്ലാതാക്കുന്നത്"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ബാറ്ററി ലൈഫ് വർദ്ധിപ്പിക്കാൻ, \'ബാറ്ററി സംരക്ഷിക്കൽ\' നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനം കുറയ്ക്കുകയും വൈബ്രേഷൻ, ലൊക്കേഷൻ സേവനങ്ങൾ, പശ്ചാത്തല ഡാറ്റ, എന്നിവ പരിമിതപ്പെടുത്തുകയോ ഒാഫാക്കുകയോ ചെയ്യുന്നു. ഇമെയിൽ, സന്ദേശമയയ്ക്കൽ, സമന്വയിപ്പിക്കലിനെ ആശ്രയിച്ചുള്ള മറ്റ് ആപ്പുകൾ എന്നിവ നിങ്ങൾ തുറക്കുന്നതുവരെ അപ്ഡേറ്റ് ചെയ്യാനിടയില്ല.\n\nനിങ്ങളുടെ ഉപകരണം ചാർജ് ചെയ്യുമ്പോൾ \'ബാറ്ററി സംരക്ഷിക്കൽ\' സ്വമേധയാ ഓഫാകും."</string>
<string name="data_saver_description" msgid="6015391409098303235">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിന്, പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്സിനെ ഡാറ്റ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്സസ്സ് ചെയ്യാൻ കഴിയും, എന്നാൽ കുറഞ്ഞ ആവൃത്തിയിലാണിത് നടക്കുക. ഇതിനർത്ഥം, നിങ്ങൾ ടാപ്പുചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ കാണിക്കുകയില്ല എന്നാണ്."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ഓണാക്കുക"</string>
@@ -1744,22 +1753,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>, മ്യൂട്ടുചെയ്തു"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്, ഫാക്ടറി വിവര പുനഃസജ്ജീകരണം ചെയ്യുന്നതുവരെ ഇതു അസ്ഥിരമായിരിക്കാനിടയുണ്ട്."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്. വിശദാംശങ്ങൾക്കായി നിർമ്മാതാവിനെ ബന്ധപ്പെടുക."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD അഭ്യർത്ഥന, സാധാരണ കോളിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD അഭ്യർത്ഥന, SS അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"പുതിയ USSD അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD അഭ്യർത്ഥന, വീഡിയോ കോളിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS അഭ്യർത്ഥന, സാധാരണ കോളിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS അഭ്യർത്ഥന, വീഡിയോ കോളിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS അഭ്യർത്ഥന, USSD അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"പുതിയ SS അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"വികസിപ്പിക്കുക"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ചുരുക്കുക"</string>
@@ -1857,6 +1858,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"സിം വോയ്സിന് പ്രൊവിഷൻ ചെയ്തിട്ടില്ല"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"സിം വോയ്സിന് അനുവദനീയമല്ല"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ഫോൺ വോയ്സിന് അനുവദനീയമല്ല"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> സിം അനുവദനീയമല്ല"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"സിം <xliff:g id="SIMNUMBER">%d</xliff:g> പ്രൊവിഷൻ ചെയ്തിട്ടില്ല"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> സിം അനുവദനീയമല്ല"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> സിം അനുവദനീയമല്ല"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"പോപ്പ് അപ്പ് വിൻഡോ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ആപ്പ് പതിപ്പ് തരംതാഴ്ത്തി, അല്ലെങ്കിൽ ഈ കുറുക്കുവഴിക്ക് അനുയോജ്യമല്ല"</string>
@@ -1877,8 +1882,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ഇത് പുതിയ പ്രവർത്തനരീതിയാണ്. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"എന്തിനെയാണ് ബ്ലോക്ക് ചെയ്തതെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"സിസ്റ്റം"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ക്രമീകരണം"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 158595f..c539d44 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Дуу хоолойны үйлчилгээ алга"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дуут үйлчилгээ эсвэл яаралтай дуудлага алга"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Үйлчилгээг таны оператор компани түр хугацаанд унтраасан"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобайл сүлжээнд холбогдох боломжгүй байна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Сонгосон сүлжээг өөрчлөхөөр оролдоно уу. Өөрчлөхийн тулд товшино уу."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Яаралтай дуудлага хийх боломжгүй"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Рүүминг Баннер Асаалттай"</string>
<string name="roamingText12" msgid="1189071119992726320">"Баннергүй рүүминг"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Үйлчилгээг хайж байна…"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi дуудлагыг тохируулж чадсангүй"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi-аар дуудлага хийх, мессеж илгээх бол эхлээд оператор компаниасаа энэ үйлчилгээг тохируулж өгөхийг хүснэ үү. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаана уу. (Алдааны код: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Таны оператор компанийн Wi‑Fi дуудлагыг бүртгэхэд асуудал гарлаа: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Дуудлага"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"биометрийн техник хангамжийг ашиглах"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Aппад биометрийн техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"хурууны хээний програм хангамжийг удирдах"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Хурууны хээний загварыг нэмэх эсвэл усгтах үйлдлийг хийх зөвшөөрлийг програмд олгодог."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"хурууны хээний програм хангамжийг ашиглах"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Танигдахгүй байна"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хурууны хээний тоног төхөөрөмж бэлэн бус байна."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Оруулах арга"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Текст үйлдэл"</string>
<string name="email" msgid="4560673117055050403">"Имэйл"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Сонгосон хаяг руу имэйл илгээх"</string>
<string name="dial" msgid="1253998302767701559">"Залгах"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Сонгосон утасны дугаар руу залгах"</string>
<string name="map" msgid="6521159124535543457">"Байрших"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Сонгосон хаягийн байршлыг тогтоох"</string>
<string name="browse" msgid="1245903488306147205">"Нээх"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Сонгосон URL-г нээх"</string>
<string name="sms" msgid="4560537514610063430">"Зурвас"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Сонгосон утасны дугаар руу мессеж илгээх"</string>
<string name="add_contact" msgid="7867066569670597203">"Нэмэх"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Харилцагчид нэмэх"</string>
<string name="view_calendar" msgid="979609872939597838">"Үзэх"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Календариас сонгосон огноог харах"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Хуваарь"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Aрга хэмжээг сонгосон цагт хуваарилах"</string>
<string name="view_flight" msgid="7691640491425680214">"Бичлэг"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Сонгосон нислэгийг хянах"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сангийн хэмжээ дутагдаж байна"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Зарим систем функц ажиллахгүй байна"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Системд хангалттай сан байхгүй байна. 250MБ чөлөөтэй зай байгаа эсэхийг шалгаад дахин эхлүүлнэ үү."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Нээлттэй Wi‑Fi сүлжээнд холбогдох"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператор Wi‑Fi сүлжээнд холбогдох"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi сүлжээнд холбогдож байна"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi сүлжээнд холбогдлоо"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi сүлжээнд холбогдож чадсангүй"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>-г бусад апп дээр харуулж байна"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглахыг хүсэхгүй байгаа бол тохиргоог нээгээд, унтраана уу."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Унтраах"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ыг бэлдэж байна"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Алдааг шалгаж байна"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Шинэ <xliff:g id="NAME">%s</xliff:g> илэрлээ"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Зураг, медиа шилжүүлэхэд зориулсан"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> гэмтсэн"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> эвдэрсэн байна. Засахын тулд товшино уу."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> эвдэрсэн байна. Засахын тулд сонгоно уу."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Дэмжээгүй <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Энэ төхөөрөмж нь <xliff:g id="NAME">%s</xliff:g>-г дэмждэггүй. Дэмжигдсэн хэлбэршүүлэлтэд тохируулахын тулд товшино уу."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Энэ төхөөрөмж <xliff:g id="NAME">%s</xliff:g>-г дэмждэггүй. Дэмжсэн хэлбэршүүлэлтэд тохируулахын тулд сонгоно уу."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ыг гэнэт гаргасан байна"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Өгөгдөл алдагдахаас сэргийлж <xliff:g id="NAME">%s</xliff:g>-ыг гаргахаас өмнө салга"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргасан"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргасан; шинийг оруулах"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргаж байна..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Гаргаж болохгүй"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> байхгүй байна"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Энэ төхөөрөмжийг дахин оруул"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>-ыг зөөж байна"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Өгөгдөл зөөвөрлөж байна..."</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Бүрэн бүтнээр шилжүүлэх"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Өгөгдөл <xliff:g id="NAME">%s</xliff:g>-д зөөгдсөн"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Өгөгдлийг зөөх боломжгүй байна"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Анхны байршилд өгөгдөл үлдсэн байна"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Хассан"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Салгасан"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Шалгаж байна..."</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Таны админ суулгасан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Таны админ шинэчилсэн"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Таны админ устгасан"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Батерейны амийг уртасгахын тулд Батерей хэмнэгч таны төхөөрөмжийн гүйцэтгэлийг багасгаж, чичиргээ, байршлын үйлчилгээ болон цаана өгөгдлийг хязгаарлах буюу эсвэл унтраадаг. Синкээр ажилладаг имэйл, зурвас болон бусад аппыг нээхээс нааш шинэчлэх боломжгүй. \n\nТаны төхөөрөмжийг цэнэглэж байх үед Батерей хэмнэгч автоматаар унтарна."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь зарим апп-г өгөгдлийг дэвсгэрт илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч цөөн үйлдэл хийнэ. Жишээлбэл зураг харахын тулд та товших шаардлагатай болно."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Өгөгдөл хамгаалагчийг асаах уу?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Асаах"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-с хаасан"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Таны төхөөрөмжид дотоод алдаа байна.Та төхөөрөмжөө үйлдвэрээс гарсан төлөвт шилжүүлэх хүртэл таны төхөөрөмж чинь тогтворгүй байж болох юм."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Таны төхөөрөмжид дотоод алдаа байна. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл үйлдвэрлэгчтэйгээ холбоо барина уу."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD хүсэлтийг энгийн дуудлага болгон өөрчилсөн"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD хүсэлтийг SS хүсэлт болгон өөрчилсөн"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Шинэ USSD хүсэлт болгон өөрчилсөн"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD хүсэлтийг видео дуудлага болгон өөрчилсөн"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS хүсэлтийг энгийн дуудлага болгон өөрчилсөн"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS хүсэлтийг видео дуудлага болгон өөрчилсөн"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS хүсэлтийг USSD хүсэлт болгон өөрчилсөн"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Шинэ SS хүсэлт болгон өөрчилсөн"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ажлын профайл"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Дэлгэх"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Буулгах"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-г дуу хоолойд идэвхжүүлдэггүй"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-г дуу хоолойд зөвшөөрдөггүй"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Утсыг дуу хоолойд зөвшөөрдөггүй"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"гэнэт гарч ирэх цонх"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Аппын хувилбарыг бууруулсан эсвэл энэ товчлолтой тохирохгүй байна"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 92b0778..bc60761 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"व्हॉइस सेवा नाही"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"व्हॉइस सेवा किंवा आणीबाणी कॉलिंग नाही"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"तुमच्या वाहकाने तात्पुरते बंद केले आहे"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"प्राधान्य दिलेले नेटवर्क बदलण्याचा प्रयत्न करा. बदलण्यासाठी टॅप करा."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आणीबाणी कॉलिंग अनुपलब्ध"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिंग बॅनर चालू"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिंग बॅनर बंद"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"सेवा शोधत आहे"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"वाय-फाय कॉलिंग सेट करता आले नाही"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठवण्यासाठी आधी तुमच्या कॅरियरला ही सेवा सेट अप करण्यास सांगा. नंतर सेटिंग्जमधून वाय-फाय वापरून कॉल करणे पुन्हा चालू करा. (एरर कोड <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"तुमच्या या वाहकासह वाय-फाय कॉलिंग नोंदणी करताना समस्या आली आहे:<xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s वाय-फाय कॉलिंग"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"बर्याच विनंत्यांवर प्रक्रिया होत आहे. नंतर पुन्हा प्रयत्न करा."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> साठी साइन इन एरर"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"संकालन करा"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"सिंक करू शकत नाही"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"खूप जास्त <xliff:g id="CONTENT_TYPE">%s</xliff:g> हटवण्याचा प्रयत्न केला."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"टॅबलेट संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फाईल हटवा."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"पाहण्याचे संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फायली हटवा."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"टीव्ही संचयन भरले आहे. स्थान मोकळे करण्यासाठी काही फायली हटवा."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलवर स्विच करा"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"आपल्या संपर्कांवर प्रवेश"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमचे संपर्क अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"या डिव्हाइसच्या स्थानावर प्रवेश"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला या डिव्हाइसचे स्थान अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कॅलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"आपल्या कॅलेंडरवर प्रवेश"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमचे कॅलेंडर अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS संदेश पाठवणे आणि पाहणे हे"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला एसएमएस पाठवू आणि पाहू द्यायचे?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"संचयन"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"तुमच्या डिव्हाइस वरील फोटो, मीडिया आणि फायलींमध्ये अॅक्सेस"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमच्या डिव्हाइसवरील फोटो, मीडिया आणि फायली अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"मायक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडिओ रेकॉर्ड"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला ऑडिओ रेकॉर्ड करू द्यायचे?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"कॅमेरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्रे घेण्याची आणि व्हिडिओ रेकॉर्ड"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्यायचे?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कॉल आणि व्यवस्थापित"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोन कॉल करू आणि ते व्यवस्थापित करू द्यायचे?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर सेन्सर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"आपल्या महत्त्वाच्या मापनांविषयी सेंसर डेटा अॅक्सेस करा"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमच्या महत्त्वाच्या लक्षणांविषयीचा सेन्सर डेटा अॅक्सेस करू द्यायचे?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री पुनर्प्राप्त करा"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"आपण परस्परसंवाद करीत असलेल्या विंडोची सामग्री तपासा."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श करून अन्वेषण चालू करा"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"फील्ड जवळील कम्युनिकेशन (NFC) टॅग, कार्डे आणि वाचक यांच्यासह संवाद करण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"आपले स्क्रीन लॉक अक्षम करा"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"कीलॉक आणि कोणतीही संबद्ध पासवर्ड सुरक्षितता अक्षम करण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, येणारा फोन कॉल प्राप्त करताना फोन कीलॉक अक्षम करतो, नंतर जेव्हा कॉल समाप्त होतो तेव्हा तो कीलॉक पुन्हा-सक्षम करतो."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"फिंगरप्रिंट हार्डवेअर व्यवस्थापित करा"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"वापर करण्याकरिता फिंगरप्रिंट टेम्पलेट जोडण्यासाठी आणि हटविण्यासाठी पद्धती रद्द करण्यास अॅपला अनुमती देते."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"फिंगरप्रिंट हार्डवेअर वापरा"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ओळखले नाही"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फिंगरप्रिंट हार्डवेअर उपलब्ध नाही."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट स्टोअर केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट टाइमआउट झाले. पुन्हा प्रयत्न करा."</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"इनपुट पद्धत"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"मजकूर क्रिया"</string>
<string name="email" msgid="4560673117055050403">"ईमेल"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"कॉल करा"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"शोधा"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"उघडा"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"संदेश"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"जोडा"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"पहा"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"शेड्यूल"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ट्रॅक"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"संचयन स्थान संपत आहे"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"काही सिस्टम कार्ये कार्य करू शकत नाहीत"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टीमसाठी पुरेसे संचयन नाही. आपल्याकडे 250MB मोकळे स्थान असल्याचे सुनिश्चित करा आणि रीस्टार्ट करा."</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"मजकुरासाठी क्रिया निवडा"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करा"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"वाहक वाय-फाय नेटवर्कशी कनेक्ट करा"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"वाय-फाय नेटवर्कशी कनेक्ट करत आहे"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"वाय-फाय नेटवर्कशी कनेक्ट केले"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाय-फाय नेटवर्कशी कनेक्ट करू शकत नाही"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सर्व नेटवर्क पाहण्यासाठी टॅप करा"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अॅप्सवर प्रदर्शित करत आहे"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपण इच्छित असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करा"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> तयार करत आहे"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटींसाठी तपासत आहे"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नवीन <xliff:g id="NAME">%s</xliff:g> आढळले"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फोटो आणि मीडिया स्थानांतरित करण्यासाठी"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> दूषित झालेले"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> दूषित आहे. निराकरण करण्यासाठी टॅप करा."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> दूषित आहे. निश्चित करण्यासाठी निवडा."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> असमर्थित"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी टॅप करा."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी निवडा."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अनपेक्षितरित्या काढले"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा गमावणे टाळण्यासाठी काढण्यापूर्वी <xliff:g id="NAME">%s</xliff:g> अनमाउंट करा"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> काढले"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> काढले; एक नवीन घाला"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"अद्याप <xliff:g id="NAME">%s</xliff:g> ला बाहेर काढत आहे…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"काढू नका"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गहाळ आहे"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"हे डिव्हाइस पुन्हा घाला"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> हलवित आहे"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"डेटा हलवित आहे"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"हलविणे पूर्ण"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g> वर डेटा हलविला"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"डेटा हलविणे शक्य झाले नाही"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"मूळ स्थानावर डेटा सोडला"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"काढले"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"बाहेर काढले"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"तपासत आहे..."</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN कनेक्ट करणे नेहमी-चालू…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN कनेक्ट केलेले नेहमी-चालू"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"कायम चालू असलेल्या VPN मधून डिस्कनेक्ट केले"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"कायम चालू असलेल्या VPN शी कनेक्ट करता आले नाही"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क किंवा VPN सेटिंग्ज बदला"</string>
<string name="upload_file" msgid="2897957172366730416">"फाईल निवडा"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"फाईल निवडली नाही"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करा"</string>
<string name="submit" msgid="1602335572089911941">"सबमिट करा"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ड्रायव्हिंग अॅप चालू आहे"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ड्रायव्हिंग अॅपमधून बाहेर पाडण्यासाठी टॅप करा."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग किंवा हॉटस्पॉट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेट करण्यासाठी टॅप करा."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग बंद आहे"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपल्या प्रशासकाने इंस्टॉल केले"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपल्या प्रशासकाने अपडेट केले"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपल्या प्रशासकाने हटवले"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"बॅटरीचे आयुष्य वाढवण्यासाठी, बॅटरी बचतकर्ता तुमच्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अॅप्स तुम्ही उघडल्याशिवाय अपडेट होऊ शकत नाहीत.\n\nतुमचे डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string>
<string name="data_saver_description" msgid="6015391409098303235">"डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा प्राप्त करण्यास प्रतिबंधित करतो. आपण सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, आपण इमेज टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचतकर्ता चालू करायचा?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करा"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारे नि:शब्द केले"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे आणि आपला फॅक्टरी डेटा रीसेट होईपर्यंत ती अस्थिर असू शकते."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे. तपशीलांसाठी आपल्या निर्मात्याशी संपर्क साधा."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD विनंती नियमित कॉलवर बदलली"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD विनंती SS विनंतीवर बदलली"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"नवीन USSD विनंतीवर बदलली"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD विनंती व्हिडिओ कॉलवर बदलली"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS विनंती नियमित कॉलवर बदलली"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS विनंती व्हिडिओ कॉलवर बदलली"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS विनंती USSD विनंतीवर बदलली"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"नवीन SS विनंतीवर बदलली"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाईल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत करा"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संकुचित करा"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"सिममध्ये व्हॉइसची तरतूद नाही"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"व्हॉइसची सिमला अनुमती नाही"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"व्हॉइसची फोनला अनुमती नाही"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"अॅपची आवृत्ती डाउनग्रेड केली, किंवा ती या शॉर्टकटशी कंपॅटिबल नाही"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"हे नवीन वर्तन आहे. बदलण्यासाठी टॅप करा."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"व्यत्यय आणू नका बदलले आहे"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"काय ब्लॉक केले आहे हे तपासण्यासाठी टॅप करा."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"सिस्टम"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"सेटिंग्ज"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 5108c91..3710b77 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID pemanggil secara lalainya ditetapkan kepada tidak dihadkan. Panggilan seterusnya: Tidak terhad"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Perkhidmatan yang tidak diuntukkan."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Anda tidak boleh mengubah tetapan ID pemanggil."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Tiada perkhidmatan data"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Tiada panggilan kecemasan"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Tiada perkhidmatan data mudah alih"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Panggilan kecemasan tidak tersedia"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tiada perkhidmatan suara"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tiada perkhidmatan suara/kecemasan"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Tidak ditawarkan oleh rangkaian mudah alih di lokasi anda untuk sementara waktu"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat mencapai rangkaian"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Tetapan > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Panggilan Wi-Fi aktif"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Rangkaian mudah alih diperlukan untuk membuat panggilan kecemasan."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Tiada perkhidmatan suara atau panggilan kecemasan"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dimatikan untuk sementara waktu oleh pembawa anda"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Tidak dapat mencapai rangkaian mudah alih"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Cuba tukar rangkaian pilihan. Ketik untuk menukar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Panggilan kecemasan tidak tersedia"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Tidak boleh membuat panggilan kecemasan melalui Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Makluman"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pemajuan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod paggil balik kecemasan"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Sepanduk Perayauan Dihidupkan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Sepanduk Perayauan Dimatikan"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Mencari Perkhidmatan"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Panggilan Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Tidak dapat menyediakan panggilan Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, minta pembawa anda menyediakan perkhidmatan ini terlebih dahulu. Kemudian, hidupkan panggilan Wi-Fi sekali lagi daripada Tetapan. (Kod ralat: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Daftar dengan pembawa anda (Kod ralat: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Terdapat masalah semasa mendaftarkan panggilan Wi-Fi dengan pembawa anda: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Terlalu banyak permintaan sedang diproses. Cuba sebentar lagi."</string>
<string name="notification_title" msgid="8967710025036163822">"Ralat log masuk untuk <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Penyegerakan"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Penyegerakan"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Terlalu banyak pemadaman <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Tidak dapat menyegerak"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Cuba memadamkan terlalu banyak <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Storan tablet penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Storan tontonan penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Storan TV penuh. Padam beberapa fail untuk mengosongkan ruang."</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Oleh pentadbir profil kerja anda"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil kerja dipadam"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil kerja dipadamkan kerana ketiadaan apl pentadbir"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Apl pentadbir profil kerja tiada atau rosak. Akibatnya, profil kerja anda dan data yang berkaitan telah dipadamkan. Hubungi pentadbir anda untuk mendapatkan bantuan."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profil kerja anda tidak lagi tersedia pada peranti ini"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Terlalu banyak percubaan kata laluan"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Peranti ini diurus"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organisasi anda mengurus peranti ini dan mungkin memantau trafik rangkaian. Ketik untuk mendapatkan butiran."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Peranti anda akan dipadam"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Apl pentadbir tidak dapat digunakan. Peranti anda akan dipadamkan sekarang.\n\nJika anda ingin mengemukakan soalan, hubungi pentadbir organisasi anda."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Apl pentadbir tidak dapat digunakan. Peranti anda akan dipadamkan sekarang.\n\nJika anda ingin mengemukakan soalan, hubungi pentadbir organisasi anda."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Pencetakan dilumpuhkan oleh <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Saya"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Pilihan tablet"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mod pesawat"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mod Pesawat DIHIDUPKAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mod Pesawat DIMATIKAN"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Penjimat bateri"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Penjimat bateri DIMATIKAN"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Penjimat Bateri DIHIDUPKAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Beralih ke profil kerja"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kenalan"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"mengakses kenalan anda"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kenalan anda"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kenalan anda?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi peranti ini"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalendar"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kalendar anda"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kalendar anda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"menghantar dan melihat mesej SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> menghantar dan melihat mesej SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> menghantar dan melihat mesej SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storan"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"mengakses foto, media dan fail pada peranti anda"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses foto, media dan fail pada peranti anda"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses foto, media dan fail pada peranti anda?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"rakam audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> merakam audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> merakam audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ambil gambar dan rakam video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengambil gambar dan merakam video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengambil gambar dan merakam video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"membuat dan mengurus panggilan telefon"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> membuat dan mengurus panggilan telefon"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> membuat dan mengurus panggilan telefon?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Penderia Badan"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"akses data penderia tentang tanda vital anda"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses data penderia tentang tanda vital anda"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses data penderia tentang tanda vital anda?"</string>
<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>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Lakukan gerak isyarat"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Boleh ketik, leret, cubit dan laksanakan gerak isyarat lain."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gerak isyarat cap jari"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Boleh menangkap gerak isyarat yang dilakukan pada penderia cap jari peranti."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Boleh menangkap gerak isyarat yang dilakukan pada penderia cap jari peranti."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"lumpuhkan atau ubah suai bar status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Membenarkan apl melumpuhkan bar status atau menambah dan mengalih keluar ikon sistem."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"jadi bar status"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Membenarkan apl untuk membuat sebahagian dirinya berterusan dalam memori. Ini boleh mengehadkan memori yang tersedia kepada apl lain dan menjadikan tablet perlahan."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Membenarkan apl menjadikan sebahagian daripada apl kekal dalam memori. Ini boleh mengehadkan memori yang tersedia kepada apl lain dan menjadikan TV perlahan."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Membenarkan apl untuk membuat sebahagian dari dirinya berterusan dalam memori. Ini boleh mengehadkan memori yang tersedia kepada apl lain dan menjadikan telefon perlahan."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"jalankan perkhidmatan latar depan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Membenarkan apl menggunakan perkhidmatan latar depan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ukur ruang storan apl"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Membenarkan apl mendapatkan semula kodnya, datanya dan saiz cachenya"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ubah suai tetapan sistem"</string>
@@ -478,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat cap jari untuk digunakan."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"gunakan perkakasan cap jari"</string>
@@ -490,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tidak dicam"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perkakasan cap jari tidak tersedia."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string>
@@ -802,6 +812,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Wajah Buka Kunci"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Buka kunci Pin Sim."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Buka kunci Puk Sim."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci kata laluan."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kawasan corak."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kawasan luncur."</string>
@@ -863,6 +875,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teks disalin ke papan keratan"</string>
<string name="more_item_label" msgid="4650918923083320495">"Lagi"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fungsi+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ruang"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"padam"</string>
@@ -994,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Kaedah input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
<string name="email" msgid="4560673117055050403">"E-mel"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Hantar e-mel ke alamat yang dipilih"</string>
<string name="dial" msgid="1253998302767701559">"Panggil"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Panggil nombor telefon yang dipilih"</string>
<string name="map" msgid="6521159124535543457">"Cari"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Cari alamat yang dipilih"</string>
<string name="browse" msgid="1245903488306147205">"Buka"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
<string name="sms" msgid="4560537514610063430">"Mesej"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Hantar mesej kepada nombor telefon yang dipilih"</string>
<string name="add_contact" msgid="7867066569670597203">"Tambah"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Tambah pada kenalan"</string>
<string name="view_calendar" msgid="979609872939597838">"Lihat"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Lihat masa yang dipilih dalam kalendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Jadual"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Jadualkan acara untuk masa yang dipilih"</string>
<string name="view_flight" msgid="7691640491425680214">"Pantau"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Jejak penerbangan yang dipilih"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ruang storan semakin berkurangan"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Beberapa fungsi sistem mungkin tidak berfungsi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tidak cukup storan untuk sistem. Pastikan anda mempunyai 250MB ruang kosong dan mulakan semula."</string>
@@ -1074,31 +1101,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Semak kemas kini"</string>
<string name="smv_application" msgid="3307209192155442829">"Apl <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar dasar Mod Tegasnya sendiri."</string>
<string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar dasar Mod Tegasnya sendiri."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android sedang menaik taraf..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android sedang dimulakan…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon sedang mengemas kini…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet sedang mengemas kini…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Peranti sedang mengemas kini…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon sedang dimulakan…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet sedang dimulakan…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Peranti sedang dimulakan…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Mengoptimumkan storan."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Menyelesaikan kemas kini Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sesetengah apl mungkin tidak berfungsi dengan betul sehingga peningkatan selesai"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Menyelesaikan kemas kini sistem…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> sedang ditingkatkan…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimumkan apl <xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Menyediakan <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulakan apl."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"But akhir."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Ketik untuk kembali ke permainan"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Pilih permainan"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Untuk mendapatkan prestasi yang lebih baik, hanya satu daripada permainan ini boleh dibuka pada satu-satu masa."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Kembali ke <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Longgokan timbunan telah dikumpulkan; ketik untuk berkongsi"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Pilih tindakan untuk teks"</string>
@@ -1133,12 +1157,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Sambung ke rangkaian Wi-Fi terbuka"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Sambung ke rangkaian Wi-Fi pembawa"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menyambung ke rangkaian Wi‑Fi terbuka"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Menyambung ke rangkaian Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Disambungkan ke rangkaian Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menyambung ke rangkaian Wi-Fi"</string>
<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="1100098935861622985">"Semua Rangkaian"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua rangkaian"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan dihidupkan secara automatik"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Apabila anda berada berdekatan dengan rangkaian disimpan yang berkualiti tinggi"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Jangan hidupkan kembali"</string>
@@ -1204,6 +1228,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Mulakan semula"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktifkan perkhidmatan mudah alih"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Muat turun apl pembawa untuk mengaktifkan SIM baharu"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Muat turun apl <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengaktifkan SIM baharu anda"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Muat turun apl"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baharu dimasukkan"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketik untuk menyediakannya"</string>
@@ -1222,13 +1247,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP melalui USB dihidupkan"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Penambatan USB dihidupkan"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI melalui USB dihidupkan"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mod aksesori USB dihidupkan"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Aksesori USB disambungkan"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ketik untuk mendapatkan lagi pilihan."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Mengecas peranti tersambung. Ketik untuk mendapatkan lagi pilihan."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog dikesan"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Peranti yang disambungkan tidak serasi dengan telefon ini. Ketik untuk mengetahui lebih lanjut."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Ketik untuk melumpuhkan penyahpepijatan USB."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan pepijat…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Kongsi laporan pepijat?"</string>
@@ -1247,34 +1272,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikannya."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"MATIKAN"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyediakan <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Menyemak untuk mengesan ralat"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baharu dikesan"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Matikan"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk memindahkan foto dan media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> rosak"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> rosak. Ketik untuk membetulkannya."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> rosak. Pilih untuk baiki."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak disokong"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Peranti ini tidak menyokong <xliff:g id="NAME">%s</xliff:g> ini. Ketik untuk menyediakannya dalam format yang disokong."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Peranti ini tidak menyokong <xliff:g id="NAME">%s</xliff:g> ini. Pilih untuk menyediakan media dalam format yang disokong."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan tanpa dijangka"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Nyahlekap <xliff:g id="NAME">%s</xliff:g> sebelum menanggalkannya untuk mengelakkan kehilangan data"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dialih keluar"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan; masukkan yang baharu"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Masih menanggalkan <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Jangan tanggalkan"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> tiada"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sisipkan semula peranti ini"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Mengalihkan <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Mengalihkan data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Pengalihan selesai"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data dipindahkan ke <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Tidak dapat memindahkan data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data dibiarkan di lokasi asal"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Dialih keluar"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Dikeluarkan"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Menyemak…"</string>
@@ -1333,14 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sentiasa hidup sedang disambungkan..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sentiasa hidup telah disambungkan"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Diputuskan sambungan daripada VPN sentiasa hidup"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ralat VPN sentiasa hidup"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Tidak dapat menyambung ke VPN sentiasa hidup"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Tukar tetapan rangkaian atau VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Pilih fail"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Tiada fail dipilih"</string>
<string name="reset" msgid="2448168080964209908">"Tetapkan semula"</string>
<string name="submit" msgid="1602335572089911941">"Serah"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mod kereta didayakan"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Ketik untuk keluar daripada mod kereta."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Apl memandu sedang berjalan"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Ketik untuk keluar daripada apl memandu."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Penambatan atau titik panas aktif"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Ketik untuk membuat persediaan."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Penambatan dilumpuhkan"</string>
@@ -1418,22 +1459,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Pemacu USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Storan USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Makluman penggunaan data"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Ketik utk lihat p\'gunaan & ttpn."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Mencapai had data 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Mencapai had data 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Amaran data"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Anda telah menggunakan <xliff:g id="APP">%s</xliff:g> data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Had data mudah alih dicapai"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Mencapai had data Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data dijeda untuk baki kitaran"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Melebihi had data 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Melebihi had data 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Melebihi had data mudah alih"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Melebihi had data Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> melebihi had yang ditentukan."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data dijeda untuk baki kitaran anda"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Melebihi had data mudah alih"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Melebihi had data Wi-Fi anda"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Anda telah menggunakan <xliff:g id="SIZE">%s</xliff:g> lebih daripada had yang ditetapkan"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Data latar belakang terhad"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Ketik untuk alih keluar sekatan."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Penggunaan data yang banyak"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Penggunaan data anda sepanjang beberapa hari yang lalu adalah lebih banyak daripada biasa. Ketik untuk melihat penggunaan dan tetapan."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Penggunaan data mudah alih yang tinggi"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Apl anda telah menggunakan lebih banyak data berbanding biasa"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> telah menggunakan lebih banyak data berbanding biasa"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sijil keselamatan"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Sijil ini sah."</string>
<string name="issued_to" msgid="454239480274921032">"Dikeluarkan kepada:"</string>
@@ -1669,7 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Dipasang oleh pentadbir anda"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Dikemas kini oleh pentadbir anda"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dipadamkan oleh pentadbir anda"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Untuk mempertingkatkan hayat bateri, Penjimat Bateri mengurangkan prestasi peranti anda dan mengehadkan getaran, perkhidmatan lokasi dan kebanyakan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung pada penyegerakan mungkin tidak dikemas kini, melainkan anda membuka apl itu.\n\nPenjimat Bateri dimatikan secara automatik apabila peranti anda sedang dicas."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Untuk melanjutkan hayat bateri, Penjimat Bateri mengurangkan prestasi peranti anda dan mengehadkan atau mematikan getaran, perkhidmatan lokasi dan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung pada penyegerakan mungkin tidak dikemas kini, melainkan anda membuka apl itu.\n\nPenjimat Bateri dimatikan secara automatik apabila peranti anda sedang dicas."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Hidupkan Penjimat Data?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Hidupkan"</string>
@@ -1681,9 +1719,9 @@
<item quantity="other">Selama %1$d min (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Selama 1 min (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Selama %1$d jam (sehingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Selama satu jam (sehingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Selama 1 jam (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1735,9 @@
<item quantity="other">Selama %d min</item>
<item quantity="one">Selama 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama satu jam</item>
+ <item quantity="one">Selama 1 jam</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Selama %d jam</item>
@@ -1720,14 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Diredam oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Terdapat masalah dalaman dengan peranti anda. Peranti mungkin tidak stabil sehingga anda membuat tetapan semula data kilang."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Terdapat masalah dalaman dengan peranti anda. Hubungi pengilang untuk mengetahui butirannya."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Permintaan USSD diubah kepada permintaan DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Permintaan USSD diubah kepada permintaan SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Permintaan USSD diubah kepada permintaan USSD baharu."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Permintaan USSD diubah suai kepada permintaan DAIL Video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Permintaan SS diubah kepada permintaan DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Permintaan SS diubah suai kepada permintaan DAIL Video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah kepada permintaan USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah kepada permintaan SS baharu."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Permintaan USSD ditukar kepada panggilan biasa"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Permintaan USSD ditukar kepada permintaan SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Bertukar kepada permintaan USSD baharu"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Permintaan USSD ditukar kepada panggilan video"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Permintaan SS ditukar kepada panggilan biasa"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Permintaan SS ditukar kepada panggilan video"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Permintaan SS ditukar kepada permintaan USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Bertukar kepada permintaan SS baharu"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Kembangkan"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Runtuhkan"</string>
@@ -1825,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM tidak diperuntukkan untuk suara"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM tidak dibenarkan untuk suara"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tidak dibenarkan untuk suara"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Tetingkap Timbul"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi apl diturunkan taraf atau tidak serasi dengan pintasan ini"</string>
@@ -1837,7 +1883,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Apl berbahaya dikesan"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> mahu menunjukkan <xliff:g id="APP_2">%2$s</xliff:g> hirisan"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Panggilan dan pemberitahuan akan bergetar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Panggilan dan pemberitahuan akan diredamkan"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Jangan Ganggu"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Jangan Ganggu menyembunyikan pemberitahuan untuk membantu anda menumpukan perhatian"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ini merupakan gelagat baharu. Ketik untuk menukar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ketik untuk menyemak tetapan gelagat anda bagi gangguan"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Ketik untuk menyemak item yang disekat."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Tetapan"</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index a29ffbb..adb29f3 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ဖုန်းဝန်ဆောင်မှု မရှိပါ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ဖုန်းခေါ်ဆိုခြင်း ဝန်ဆောင်မှု သို့မဟုတ် အရေးပေါ်ခေါ်ဆိုခြင်း မရနိုင်ပါ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"သင်၏ ဝန်ဆောင်မှုပေးသူက ယာယီပိတ်ထားသည်"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ဆင်းမ် <xliff:g id="SIMNUMBER">%d</xliff:g> အတွက် သင်၏ ဝန်ဆောင်မှုပေးသူက ယာယီပိတ်ထားပါသည်"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"မိုဘိုင်းကွန်ရက် လိုင်းမရပါ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ဦးစားပေးကွန်ရက်သို့ ပြောင်းကြည့်ပါ။ ပြောင်းရန် တို့ပါ။"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"အရေးပေါ်ခေါ်ဆိုမှု မရနိုင်ပါ"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ရုန်းမင်းစာတမ်းဖွင့်ရန်"</string>
<string name="roamingText12" msgid="1189071119992726320">"ရုန်းမင်းစာတမ်းပိတ်ထားရန်"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ဆားဗစ်အားရှာဖွေနေသည်"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi ခေါ်ဆိုမှုကို စနစ်ထည့်သွင်း၍မရပါ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi အသုံးပြု၍ ဖုန်းခေါ်ရန်နှင့် မက်ဆေ့ဂျ်ပို့ရန်အတွက် သင့်ဝန်ဆောင်မှုပေးသူကို ဤဝန်ဆောင်မှုအား သတ်မှတ်ပေးရန် ဦးစွာတောင်းဆိုပါ။ ထို့နောက် ဆက်တင်ထဲသို့ သွား၍ Wi-Fi ဖြင့် ဖုန်းခေါ်ခြင်းကို ဖွင့်ရပါမည်။ (အမှားကုဒ်- <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"သင်၏ ဝန်ဆောင်မှုပေးသူဖြင့် Wi‑Fi ခေါ်ဆိုမှုကို မှတ်ပုံတင်ရာတွင် ပြဿနာရှိနေသည်− <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi ခေါ်ဆိုမှု"</item>
@@ -294,7 +296,7 @@
<string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ခန္ဓာကိုယ် အာရုံခံကိရိယာများ"</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="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ အရေးကြီးသောလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -481,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"ဇီဝဗေဒဆိုင်ရာ သတင်းအချက်အလက်များသုံးသည့် ကွန်ပျူတာဆိုင်ရာ စက်ပစ္စည်းကို အသုံးပြုရန်"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"အထောက်အထားစိစစ်ခြင်းအတွက် ဇီဝဗေဒဆိုင်ရာ သတင်းအချက်အလက်များသုံးသည့် ကွန်ပျူတာဆိုင်ရာ စက်ပစ္စည်းကို အသုံးပြုရန် အက်ပ်ကို ခွင့်ပြုသည်"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"လက်ဗွေရာပစ္စည်းကို စီမံမည်"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"အသုံးပြုရန်အတွက် လက်ဗွေရာပုံစံများကို ပေါင်းထည့်ရန် သို့မဟုတ် ဖျက်ရန်နည်းလမ်းများကို အပ်ဖ်အား အသုံးပြုခွင့်ပြုသည်။"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"လက်ဗွေရာပစ္စည်းကို အသုံးပြုမည်"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"အသိအမှတ်မပြုပါ"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"လက်ဗွေကို အထောက်အထားစိစစ်ပြီးပါပြီ"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လက်ဗွေရာ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"လက်ဗွေရာ သိုလှောင်၍မရပါ။ ကျေးဇူးပြု၍ ရှိပြီးလက်ဗွေရာအား ဖယ်ရှားပါ။"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"စာတို လုပ်ဆောင်ချက်"</string>
<string name="email" msgid="4560673117055050403">"အီးမေးလ်"</string>
+ <string name="email_desc" msgid="3638665569546416795">"ရွေးထားသည့် လိပ်စာသို့ အီးမေးလ်ပို့ရန်"</string>
<string name="dial" msgid="1253998302767701559">"ခေါ်ဆိုရန်"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"ရွေးထားသည့် ဖုန်းနံပါတ်ကို ခေါ်ရန်"</string>
<string name="map" msgid="6521159124535543457">"တည်နေရာ"</string>
+ <string name="map_desc" msgid="9036645769910215302">"ရွေးထားသည့် လိပ်စာကို ရှာဖွေရန်"</string>
<string name="browse" msgid="1245903488306147205">"ဖွင့်ရန်"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"ရွေးထားသည့် URL ကို ဖွင့်ရန်"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"ရွေးထားသည့် ဖုန်းနံပါတ်ကို မက်ဆေ့ဂျ်ပို့ရန်"</string>
<string name="add_contact" msgid="7867066569670597203">"ထည့်ရန်"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"အဆက်အသွယ်များသို့ ထည့်ရန်"</string>
<string name="view_calendar" msgid="979609872939597838">"ကြည့်ရန်"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"ရွေးထားသည့် အချိန်ကို ပြက္ခဒိန်တွင် ကြည့်ရန်"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"အချိန်ဇယား"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"ရွေးထားသည့်အချိန်အတွက် အစီအစဉ်ပြုလုပ်ရန်"</string>
<string name="view_flight" msgid="7691640491425680214">"ရှာရန်"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"ရွေးထားသည့် လေယာဉ်ခရီးစဉ်ကို ရှာဖွေရန်"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"တချို့ စနစ်လုပ်ငန်းများ အလုပ် မလုပ်ခြင်း ဖြစ်နိုင်ပါသည်"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ဝန်ဆောင်မှုပေးသူ Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်နေသည်"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပြီးပါပြီ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်၍ မရပါ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string>
@@ -1259,33 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ကို အခြားအက်ပ်များပေါ်တွင် မြင်နေရပါသည်။"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ကို ဤဝန်ဆောင်မှုအား အသုံးမပြုစေလိုလျှင် ဆက်တင်ကို တို့၍ ဖွင့်ပြီး ၎င်းကို ပိတ်လိုက်ပါ။"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ပိတ်ရန်"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ပြင်ဆင်နေသည်"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"အမှားအယွင်းများ စစ်ဆေးနေသည်"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> အသစ်တွေ့ရှိပါသည်"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ကို စစ်နေသည်…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"လက်ရှိ အကြောင်းအရာကို ပြန်လည်သုံးသပ်နေသည်"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> အသစ်"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"စနစ်ထည့်သွင်းရန် တို့ပါ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ဓာတ်ပုံနှင့် မီဒီယာများ လွှဲပြောင်းရန်အတွက်"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ပျက်စီးနေသော <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ပျက်နေပါသည်။ ပြင်ရန် တို့ပါ။"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> တွင် ပြဿနာရှိနေသည်"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ပြင်ဆင်ရန်အတွက် ထိလိုက်ပါ"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ပျက်နေပါသည်။ ပြင်ရန် ရွေးချယ်ပါ။"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ပံ့ပိုးထားခြင်း မရှိသော <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ဤစက်ပစ္စည်းတွင် <xliff:g id="NAME">%s</xliff:g> ကိုအသုံးပြု၍မရပါ။ အသုံးပြု၍ရသော စနစ်ပုံစံသို့သတ်မှတ်ရန် တို့ပါ။"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ဤစက်ပစ္စည်းတွင် <xliff:g id="NAME">%s</xliff:g> ကို ပံ့ပိုးမထားပါ။ ပံ့ပိုးသည့်ပုံစံတစ်ခုအဖြစ် စနစ်ထည့်သွင်းရန် ရွေးချယ်ပါ။"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> မမျှော်လင့်ဘဲ ဖယ်ရှားခဲ့သည်"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ဒေတာဆုံးရှုံးခြင်းမှ ကာကွယ်ရန် မဖယ်ရှားမှီ <xliff:g id="NAME">%s</xliff:g> ကိုဖြုတ်ပါ။"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပြီ"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပါပြီ; အသစ်တစ်ခု ထည့်သွင်းပါ"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ထုတ်နေဆဲ…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"အဖယ်ရှားပါနှင့်"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"အကြောင်းအရာ မဆုံးရှုံးစေရန် မီဒီယာကို မဖယ်ရှားမီ ဦးစွာထုတ်လိုက်ပါ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပါပြီ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"အချို့လုပ်ဆောင်ချက်များ ကောင်းစွာ အလုပ်မလုပ်နိုင်ပါ။ သိုလှောင်ခန်းအသစ် ထည့်သွင်းပါ။"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ကို ထုတ်နေသည်"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"မဖယ်ရှားပါနှင့်"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ပျောက်နေသည်"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ဤစက်ပစ္စည်းအား ပြန်ထည့်ရန်"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"ဒေတာများ ရွှေ့နေစဉ်"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ရွှေ့ပြီး၏"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g> သို့ ဒေတာ ရွှေ့ခဲ့၏"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ဒေတာမရွှေ့နိုင်ပါ"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"မူရင်းနေရာတွင် ဒေတာ ကျန်ခဲ့၏"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"အကြောင်းအရာ လွှဲပြောင်းပြီးပါပြီ"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"အကြောင်းအရာကို <xliff:g id="NAME">%s</xliff:g> သို့ ရွှေ့ထားသည်"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"အကြောင်းအရာကို ရွှေ့၍မရပါ"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"အကြောင်းအရာကို ထပ်ဖယ်ကြည့်ပါ"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ဖယ်ရှာပြီး"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ဖယ်ထုတ်ပြီး၏"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"စစ်ဆေးနေပါသည်…"</string>
@@ -1677,8 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"သင်၏ စီမံခန့်ခွဲသူက ထည့်သွင်းထားသည်"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ဘက်ထရီသက်တမ်း တိုးရန် \'ဘက်ထရီအားထိန်း\' သည် သင့်စက်ပစ္စည်း၏ စွမ်းဆောင်ရည်ကို လျှော့ချပေးပြီး တုန်ခါမှု၊ တည်နေရာ ဝန်ဆောင်မှုများနှင့် နောက်ခံဒေတာများကို ကန့်သတ်ခြင်း သို့မဟုတ် ပိတ်ခြင်းများ ပြုလုပ်ပေးပါသည်။ စင့်ခ်လုပ်ခြင်းအပေါ် အားထားနေရသည့် အီးမေးလ်၊ မက်ဆေ့ဂျ်ပို့ခြင်းနှင့် အခြားအက်ပ်များကို သင်မဖွင့်လျှင် အပ်ဒိတ်ဖြစ်တော့မည် မဟုတ်ပါ။\n\nသင့်စက်ပစ္စည်းကို အားသွင်းနေသည့်အခါ \'ဘက်ထရီအားထိန်း\' ကို အလိုအလျောက် ပိတ်သွားပါမည်။"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ဒေတာအသုံးလျှော့ချနိုင်ရန် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမရှိစေရန် ဒေတာချွေတာမှုစနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင် မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ဖွင့်ပါ"</string>
@@ -1729,22 +1742,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေပြီး၊ မူလစက်ရုံထုတ်အခြေအနေအဖြစ် ပြန်လည်ရယူနိုင်သည်အထိ အခြေအနေမတည်ငြိမ်နိုင်ပါ။"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေ၏။ အသေးစိတ်သိရန်အတွက် ပစ္စည်းထုတ်လုပ်သူအား ဆက်သွယ်ပါ။"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD တောင်းဆိုမှုကို ပုံမှန်ခေါ်ဆိုမှုသို့ ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD တောင်းဆိုမှုကို SS တောင်းဆိုမှုအဖြစ် ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"USSD တောင်းဆိုမှုအသစ်သို့ ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD တောင်းဆိုမှုကို ဗီဒီယိုခေါ်ဆိုမှုသို့ ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS တောင်းဆိုမှုကို ပုံမှန်ခေါ်ဆိုမှုသို့ ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS တောင်းဆိုမှုကို ဗီဒီယိုခေါ်ဆိုမှုသို့ ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS တောင်းဆိုမှုကို USSD တောင်းဆိုမှုအဖြစ် ပြောင်းထားသည်"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"SS တောင်းဆိုမှုအသစ်သို့ ပြောင်းထားသည်"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"အလုပ်ကိုယ်ရေးအချက်အလက်"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ချဲ့ရန်"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ခေါက်သိမ်းရန်"</string>
@@ -1842,6 +1847,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"စကားသံအတွက် ဆင်းမ်ကို ထောက်ပံ့မထားပါ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"စကားသံအတွက် ဆင်းမ်ကို ခွင့်မပြုပါ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"စကားသံအတွက် ဖုန်းကို ခွင့်မပြုပါ"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"ဆင်းမ် <xliff:g id="SIMNUMBER">%d</xliff:g> ကို ခွင့်မပြုပါ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ဆင်းမ် <xliff:g id="SIMNUMBER">%d</xliff:g> ကို ပေးမထားပါ"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"ဆင်းမ် <xliff:g id="SIMNUMBER">%d</xliff:g> ကို ခွင့်မပြုပါ"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"ဆင်းမ် <xliff:g id="SIMNUMBER">%d</xliff:g> ကို ခွင့်မပြုပါ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ပေါ့ပ်အပ် ဝင်းဒိုး"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"အက်ပ်ဗားရှင်းကို အဆင့်နှိမ့်ထားသည် သို့မဟုတ် ဤဖြတ်လမ်းလင့်ခ်နှင့် သဟဇာတမဖြစ်ပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 9e94f92..d76cd8f 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ingen taletjeneste"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ingen taletjeneste eller nødanrop"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Midlertidig deaktivert av operatøren din"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Får ikke kontakt med mobilnettverket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv å endre foretrukket nettverk. Trykk for å endre."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Nødanrop er utilgjengelig"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-banner på"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-banner av"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Leter etter tjeneste"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Kunne ikke konfigurere Wi-Fi-anrop"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"For å ringe og sende meldinger over Wi-Fi, må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på Wi-Fi-anrop igjen fra Innstillinger. (Feilkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Problem med å registrere Wi-Fi-anrop med operatøren din: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-anrop"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"For mange forespørsler blir behandlet. Prøv igjen senere."</string>
<string name="notification_title" msgid="8967710025036163822">"Påloggingsfeil for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkronisering"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Kan ikke synkronisere"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Forsøkte å slette for mange <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Nettbrettlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Klokkens lagringsplass er full. Slett filer for å frigjøre plass."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV-ens lagringsplass er full. Slett noen filer for å frigjøre mer plass."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Bytt til jobbprofil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"se kontaktene dine"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til kontaktene dine?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Posisjon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få tilgang til enhetens plassering"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"åpne kalenderen din"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sende og lese SMS-meldinger"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vil du la <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> sende og se SMS-meldinger?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"åpne bilder, medieinnhold og filer på enheten din"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til bilder, medier og filer på enheten din?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ta opp lyd"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vil du la <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ta opp lyd?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ta bilder og ta opp video"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vil du la <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ta bilder og spille inn video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ring og administrer anrop"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vil du la <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ringe og administrere telefonsamtaler?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få tilgang til sensordata om de vitale tegnene dine"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til sensordata om de vitale tegnene dine?"</string>
<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>
@@ -492,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Lar appen fremkalle metoder for å legge til og slette fingeravtrykkmaler for bruk."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"bruke fingeravtrykkmaskinvare"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke gjenkjent"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maskinvare for fingeravtrykk er ikke tilgjengelig."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="email" msgid="4560673117055050403">"E-post"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Send e-post til den valgte adressen"</string>
<string name="dial" msgid="1253998302767701559">"Ring"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ring det valgte telefonnummeret"</string>
<string name="map" msgid="6521159124535543457">"Finn"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Finn den valgte adressen"</string>
<string name="browse" msgid="1245903488306147205">"Åpne"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Åpne den valgte nettadressen"</string>
<string name="sms" msgid="4560537514610063430">"Melding"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Send melding til det valgte telefonnummeret"</string>
<string name="add_contact" msgid="7867066569670597203">"Legg til"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Legg til i kontakter"</string>
<string name="view_calendar" msgid="979609872939597838">"Se"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Se det valgte klokkeslettet i kalenderen"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Oversikt"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planlegg aktivitet for valgt klokkeslett"</string>
<string name="view_flight" msgid="7691640491425680214">"Spor"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Spor den valgte flyvningen"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Lite ledig lagringsplass"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Enkelte systemfunksjoner fungerer muligens ikke slik de skal"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Det er ikke nok lagringsplass for systemet. Kontrollér at du har 250 MB ledig plass, og start på nytt."</string>
@@ -1117,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Velg handling for tekst"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Koble til et åpent Wi‑Fi-nettverk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koble til operatørens Wi-Fi-nettverk"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Kobler til Wi-Fi-nettverket"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Koblet til Wi-Fi-nettverk"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kunne ikke koble til Wi-Fi-nettverket"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slå av"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sjekker for feil"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> ble oppdaget"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For overføring av bilder og medier"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Skadet <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er skadet. Trykk for å løse problemet."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er skadet. Velg for å fikse."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> som ikke støttes"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enheten støtter ikke <xliff:g id="NAME">%s</xliff:g>. Trykk for å konfigurere i et støttet format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Denne enheten støtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Velg for å konfigurere i et støttet format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ble uventet fjernet"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Løs ut <xliff:g id="NAME">%s</xliff:g> før du fjerner den for å unngå tap av data"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ble fjernet."</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ble fjernet – sett inn et nytt et"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Løser ut <xliff:g id="NAME">%s</xliff:g> fremdeles …"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ikke fjern"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Løs ut"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Utforsk"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mangler"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sett inn enheten på nytt"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Flytter dataene"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Flyttingen er fullført"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dataene er flyttet til <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Kunne ikke flytte dataene"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dataene er fremdeles på det opprinnelige stedet"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Fjernet"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Løst ut"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerer …"</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Alltid-på VPN kobler til ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Alltid-på VPN er tilkoblet"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Koble fra alltid på-VPN"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Kunne ikke koble til alltid på-VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Endre nettverks- eller VPN-innstillingene"</string>
<string name="upload_file" msgid="2897957172366730416">"Velg fil"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string>
<string name="reset" msgid="2448168080964209908">"Tilbakestill"</string>
<string name="submit" msgid="1602335572089911941">"Send inn"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Kjøreappen kjører"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Trykk for å lukke kjøreappen."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Internettdeling eller trådløs sone er aktiv"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Trykk for å konfigurere."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Internettdeling er slått av"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installert av administratoren din"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Oppdatert av administratoren din"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet av administratoren din"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Med Batterisparing reduseres enhetens ytelse, og vibrering, posisjonstjenester og bakgrunnsdata begrenses eller slås av. Apper for e-post, meldinger og andre funksjoner som er avhengige av synkronisering, oppdateres kanskje ikke med mindre du åpner dem.\n\nBatterisparing slås av automatisk når enheten lades."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Datasparing hindrer at apper kan sende og motta data i bakgrunnen. Apper du bruker i øyeblikket, bruker ikke data i like stor grad – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå på"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har kuttet lyden"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Det har oppstått et internt problem på enheten din, og den kan være ustabil til du tilbakestiller den til fabrikkdata."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Det har oppstått et internt problem på enheten din. Ta kontakt med produsenten for mer informasjon."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-forespørsel endret til vanlig anrop"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-forespørsel endret til SS-forespørsel"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Endret til ny USSD-forespørsel"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-forespørsel endret til videoanrop"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-forespørsel endret til vanlig anrop"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-forespørsel endret til videoanrop"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-forespørsel endret til USSD-forespørsel"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Endret til ny SS-forespørsel"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeidsprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vis"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skjul"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kortet er ikke klargjort for tale"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kortet har ikke tillatelse til tale"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonen har ikke tillatelse til tale"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Forgrunnsvindu"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Appversjonen er nedgradert eller ikke kompatibel med denne snarveien"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dette er ny atferd. Trykk for å endre."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ikke forstyrr er endret"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Trykk for å sjekke hva som er blokkert."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Innstillinger"</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 976d493..1ab74ef 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कुनै पनि भ्वाइस सेवा उपलब्ध छैन"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"कुनै पनि भ्वाइस वा आपातकालीन कल सेवा उपलब्ध छैन"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"तपाईंको सेवा प्रदायकले अस्थायी रूपमा निष्क्रिय पार्नुभएको"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> का लागि तपाईंको सेवा प्रदायकले अस्थायी रूपमा निष्क्रिय पार्नुभएको"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्कमाथि पहुँच राख्न सकिएन"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"रुचाइएको नेटवर्क परिवर्तन गरी हेर्नुहोस्। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आपतकालीन कल सेवा अनुपलब्ध छ"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिङ ध्वजा चालु छ"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिङ ब्यानर बन्द छ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"सेवाको खोजी गर्दै…"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi-Fi कलिङ सेटअप गर्न सकिएन"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi मार्फत कलहरू गर्न र सन्देशहरू पठाउन सबभन्दा पहिला आफ्नो सेवा प्रदायकलाई यो सेवा सेट गर्न भन्नुहोस्। त्यसपछि सेटिङहरूबाट Wi-Fi कलिङलाई सक्रिय पार्नुहोस्। (त्रुटिसम्बन्धी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"तपाईंको सेवा प्रदायकमार्फत Wi-Fi कलिङ सुविधा दर्ता गर्ने क्रममा देखिएको समस्या: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi कलिङ"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"धेरै नै अनुरोधहरू प्रक्रियामा छन्। पछि फेरि प्रयास गर्नुहोस्।"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>को लागि साइन इन त्रुटि"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"सिङक गर्नुहोस्"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"सिंक गर्न सकिँदैन"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"अति धेरै <xliff:g id="CONTENT_TYPE">%s</xliff:g> मेटाउने प्रयास गरियो।"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ट्याब्लेट भण्डारण खाली छैन! ठाउँ खाली गर्नको लागि केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"भण्डारण भरिएको छ हेर्नुहोस्। ठाउँ खाली गर्न केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV भण्डारण पूर्ण छ। ठाउँ खाली गर्नको लागि केही फाइलहरू मेट्नुहोस्।"</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलमा बदल्नुहोस्"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई तपाईंका सम्पर्क ठेगानाहरूमाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई आफ्नो पात्रोमाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> SMS सन्देशहरू पठाउन र हेर्न दिने हो?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"भण्डारण"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईंको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई आफ्नो यन्त्रमा रहेका तस्बिर, मिडिया र फाइलहरूमाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"अडियो रेकर्ड गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई अडियो रेकर्ड गर्न दिने हो?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"क्यामेरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"तस्बिर खिच्नुका साथै भिडियो रेकर्ड गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई तस्बिरहरू खिच्न र भिडियो रेकर्ड गर्न दिने हो?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई फोन कलहरू गर्न र तिनीहरूको व्यवस्थापन गर्न दिने हो?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई आफ्ना महत्त्वपूर्ण लक्षणहरूसम्बन्धी सेन्सर डेटामाथि पहुँच राख्न दिने हो?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -492,6 +483,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"अनुप्रयोगलाई नयाँ क्षेत्र संचार (NFC) ट्यागहरू, कार्डहरू र पाठकहरूसँग अन्तर्क्रिया गर्न अनुमति दिन्छ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"स्क्रिन लक असक्षम पार्नुहोस्"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"कुनै सम्बन्धित पासवर्ड सुरक्षा र किलकलाई असक्षम पार्न अनुप्रयोगलाई अनुमति दिन्छ। उदाहरणको लागि, अन्तर्गमन फोन कल प्राप्त गर्दा फोनले किलकलाई असक्षम पार्छ, त्यसपछि कल सकिएको बेला किलक पुनःसक्षम पार्छ।"</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"औठाछाप हार्डवेयर व्यवस्थापन गर्नुहोस्"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"अनुप्रयोगलाई प्रयोगको लागि औठाछाप टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"औठाछाप हार्डवेयर प्रयोग गर्नुहोस्"</string>
@@ -504,6 +499,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"चिनिएको छैन"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिन्ट प्रमाणीकरण गरियो"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"औँठाछाप हार्डवेयर उपलब्ध छैन।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"औँठाछाप भण्डारण गर्न सकिँदैन। कृपया अवस्थित औठाछाप हटाउनुहोस्।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string>
@@ -1016,14 +1012,32 @@
<string name="inputMethod" msgid="1653630062304567879">"निवेश विधि"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"पाठ कार्यहरू"</string>
<string name="email" msgid="4560673117055050403">"इमेल"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"कल"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"पत्ता लगाउनुहोस्"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"खोल्नुहोस्"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"सन्देश"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"थप्नुहोस्"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"हेर्नुहोस्"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"समयतालिका"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ट्र्याक गर्नुहोस्"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"भण्डारण ठाउँ सकिँदै छ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"सायद केही प्रणाली कार्यक्रमहरूले काम गर्दैनन्"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"प्रणालीको लागि पर्याप्त भण्डारण छैन। तपाईँसँग २५० मेगा बाइट ठाउँ खाली भएको निश्चित गर्नुहोस् र फेरि सुरु गर्नुहोस्।"</string>
@@ -1123,8 +1137,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"पाठको लागि एउटा प्रकार्य छान्नुहोस्"</string>
@@ -1159,8 +1172,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुला Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"सेवा प्रदायकको Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi नेटवर्कमा जडान गर्दै"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi नेटवर्कमा जडान गरियो"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi नेटवर्कमा जडान गर्न सकिएन"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string>
@@ -1276,33 +1288,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो विशेषता प्रयोग नगरेको चाहनुहुन्न भने सेटिङहरू खोली यसलाई निष्क्रिय पार्न ट्याप गर्नुहोस्।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"निष्क्रिय पार्नुहोस्"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"तयारी गर्दै <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नयाँ <xliff:g id="NAME">%s</xliff:g> भेटियो"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"जाँच गर्दै <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"हालको सामग्री समीक्षा गर्दै"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"नयाँ <xliff:g id="NAME">%s</xliff:g> पत्ता लाग्यो"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"सेटअप गर्न ट्याप गर्नुहोस्"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"तस्बिरहरू र मिडिया स्थानान्तरणका लागि"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"बिग्रेको <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> त्रुटिपूर्ण छ। समाधान गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> मा समस्या देखियो"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"समस्या समाधान गर्न ट्याप गर्नुहोस्"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> बिग्रेको छ। समाधान गर्न चयन गर्नुहोस्।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"यस यन्त्रले यस <xliff:g id="NAME">%s</xliff:g> लाई समर्थन गर्दैन। एक समर्थित ढाँचामा सेटअप गर्न ट्याप गर्नुहोस्।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"यो यन्त्रले यस <xliff:g id="NAME">%s</xliff:g> लाई समर्थन गर्दैन। एक समर्थित ढाँचामा सेटअप गर्न चयन गर्नुहोस्।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूपमा निकालियो"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा हराउनबाट जोगाउन निकाल्नु अघि <xliff:g id="NAME">%s</xliff:g> अनमाउन्ट गर्नुहोस्"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"निकालियो <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> निकालियो; नयाँ हाल्नुहोस्"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"अझै निकाल्दै <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"नहटाउनुहोस्"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"सामग्री गुम्न नदिनका लागि मिडिया हटाउनुअघि त्यसलाई इजेक्ट गर्नुहोस्"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> हटाइयो"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"केही कार्यहरूले राम्ररी काम नगर्न सक्छन्। नयाँ भण्डारण यन्त्र घुसाउनुहोस्।"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> इजेक्ट गर्दै"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"नहटाउनुहोस्"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> हराइरहेको"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"यो यन्त्र पुनःसम्मिलित गर्नुहोस्"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"डेटा सार्दै..."</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"सार्ने कार्य सकियो"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"डेटा <xliff:g id="NAME">%s</xliff:g> मा सारियो"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"डेटा सार्न सकिएन"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा मूल स्थानबाट छाडियो"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"सामग्री स्थानान्तरण गरियो"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"सामग्री <xliff:g id="NAME">%s</xliff:g> मा सारियो"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"सामग्री सार्न सकिएन"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"सामग्री फेरि सारेर हेर्नुहोस्"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"हटाइयो"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"निकालिएको"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"जाँच गर्दै..."</string>
@@ -1361,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN जडान सधै जोड्दै…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"सधैँ खुल्ला हुने VPN जोडिएको"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"सधैँ-सक्रिय रहने VPN सेवाबाट विच्छेद गरियो"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"सधैँ सक्रिय रहने VPN सेवामा जडान गर्न सकिएन"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क वा VPN सम्बन्धी सेटिङहरू परिवर्तन गर्नुहोस्"</string>
<string name="upload_file" msgid="2897957172366730416">"फाइल छान्नुहोस्"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"कुनै फाइल छानिएको छैन"</string>
<string name="reset" msgid="2448168080964209908">"रिसेट गर्नुहोस्"</string>
<string name="submit" msgid="1602335572089911941">"पेस गर्नुहोस्"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ड्राइभिङ अनुप्रयोग चलिरहेको छ"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ड्राइभिङ अनुप्रयोगबाट बाहिर निस्कन ट्याप गर्नुहोस्।"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गर्ने वा हटस्पट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिङलाई असक्षम पारिएको छ"</string>
@@ -1697,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"तपाईंका प्रशासकले स्थापना गर्नुभएको"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"तपाईंका प्रशासकले मेट्नुभएको"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ब्याट्री सेभरले ब्याट्रीको आयु लम्ब्याउनका लागि तपाईंको यन्त्रको कार्यसम्पादन घटाउनुका साथै कम्पन, स्थानसम्बन्धी सेवा र पृष्ठभूमिको डेटालाई सीमित वा निष्क्रिय पार्छ। इमेल, सन्देश प्रवाह तथा सिंक प्रक्रियामा निर्भर अन्य अनुप्रयोगहरू तपाईंले खोल्नुभएको अवस्थामाबाहेक स्वतः अद्यावधिक नहुन सक्छन्।\n\nतपाईंको यन्त्र चार्ज हुन थालेपछि ब्याट्री सेभर स्वतः निष्क्रिय हुन्छ।"</string>
<string name="data_saver_description" msgid="6015391409098303235">"डेटाको प्रयोगलाई कम गर्नमा मद्दतका लागि डेटा सर्भरले केही अनुप्रयोगहरूलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्नबाट रोक्दछ। तपाईँले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटामाथि पहुँच राख्न सक्छ, तर त्यसले यो काम थोरै पटक गर्न सक्छ। उदाहरणका लागि यसको मतलब यो हुन सक्छ: तपाईँले छविहरूलाई ट्याप नगरेसम्म ती प्रदर्शन हुँदैनन्।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा सेभरलाई सक्रिय गर्ने हो?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"सक्रिय गर्नुहोस्"</string>
@@ -1749,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा मौन गरिएको"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ। विवरणहरूको लागि आफ्नो निर्मातासँग सम्पर्क गर्नुहोस्।"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD अनुरोधलाई नियमित कलमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD अनुरोधलाई SS अनुरोधमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"नयाँ USSD अनुरोधमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD अनुरोधलाई भिडियो कलमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS अनुरोधलाई नियमित कलमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS अनुरोधलाई भिडियो कलमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS अनुरोधलाई USSD अनुरोधमा परिवर्तन गरियो"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"नयाँ SS अनुरोधमा परिवर्तन गरियो"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाइल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत गर्नुहोस्"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संक्षिप्त गर्नुहोस्"</string>
@@ -1862,6 +1863,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM मार्फत भ्वाइस कल गर्ने प्रावधान छैन"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM मार्फत भ्वाइस कल गर्न मिल्दैन"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"फोनमार्फत भ्वाइस कल गर्न मिल्दैन"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> लाई अनुमति छैन"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> को पूर्वप्रबन्ध गरिएको छैन"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> लाई अनुमति छैन"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> लाई अनुमति छैन"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पपअप विन्डो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"या त अनुप्रयोगको संस्करण स्तरह्रास गरियो वा यो यस सर्टकटसँग मिल्दो छैन"</string>
@@ -1882,8 +1887,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यो नयाँ व्यवहार हो। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"बाधा नपुर्याउनुहोस् मोड परिवर्तन भएको छ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"रोक लगाइएका कुराहरू जाँच गर्न ट्याप गर्नुहोस्।"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"प्रणाली"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"सेटिङहरू"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 11d0ee9..1c4f243 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen service voor spraakoproepen"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen spraakservice of noodoproepen"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Tijdelijk uitgeschakeld door je provider"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Kan mobiel netwerk niet bereiken"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probeer een ander voorkeursnetwerk. Tik om te wijzigen."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Noodoproepen niet beschikbaar"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Roamingbanner aan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roamingbanner uit"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Service zoeken"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Bellen via wifi kan niet worden ingesteld"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen. (Foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Probleem bij registratie van Bellen via wifi bij je provider: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Bellen via wifi van %s"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Er worden te veel aanvragen verwerkt. Probeer het later opnieuw."</string>
<string name="notification_title" msgid="8967710025036163822">"Fout bij aanmelding voor \'<xliff:g id="ACCOUNT">%1$s</xliff:g>\'"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniseren"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Kan niet synchroniseren"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Geprobeerd om te veel instanties van <xliff:g id="CONTENT_TYPE">%s</xliff:g> te verwijderen."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletgeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Horlogegeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Tv-opslag is vol. Verwijder een aantal bestanden om ruimte vrij te maken."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Schakelen naar werkprofiel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacten"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"toegang krijgen tot je contacten"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot je contacten?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Locatie"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"de locatie van dit apparaat openen"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"toegang krijgen tot je agenda"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot je agenda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sms\'jes verzenden en bekijken"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om sms\'jes te verzenden en te bekijken?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Opslagruimte"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"toegang krijgen tot foto\'s, media en bestanden op je apparaat"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot foto\'s, media en bestanden op je apparaat?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfoon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"audio opnemen"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om audio op te nemen?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s maken en video opnemen"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om foto\'s te maken en video op te nemen?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefoneren en oproepen beheren"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om telefoongesprekken te starten en te beheren?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Lichaamssensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang krijgen tot sensorgegevens over je vitale functies"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot sensorgegevens over je vitale functies?"</string>
<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>
@@ -492,6 +484,8 @@
<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 er een oproep binnenkomt en de toetsenblokkering weer inschakelen als de oproep is beëindigd."</string>
+ <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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Hiermee kan de app methoden aanroepen om vingerafdruksjablonen toe te voegen en te verwijderen voor gebruik."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Vingerafdrukhardware gebruiken"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Niet herkend"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware voor vingerafdruk niet beschikbaar."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstacties"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"E-mail sturen aan geselecteerd e-mailadres"</string>
<string name="dial" msgid="1253998302767701559">"Bellen"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Geselecteerd telefoonnummer bellen"</string>
<string name="map" msgid="6521159124535543457">"Zoeken"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Geselecteerd adres tonen op kaart"</string>
<string name="browse" msgid="1245903488306147205">"Openen"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Geselecteerde URL openen"</string>
<string name="sms" msgid="4560537514610063430">"Bericht"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Sms sturen aan geselecteerd telefoonnummer"</string>
<string name="add_contact" msgid="7867066569670597203">"Toevoegen"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Toevoegen aan contacten"</string>
<string name="view_calendar" msgid="979609872939597838">"Weergeven"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Geselecteerde tijd weergeven op de kalender"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Plannen"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Evenement plannen voor geselecteerde tijd"</string>
<string name="view_flight" msgid="7691640491425680214">"Volgen"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Geselecteerde vlucht tonen"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Opslagruimte is bijna vol"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bepaalde systeemfuncties werken mogelijk niet"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Onvoldoende opslagruimte voor het systeem. Zorg ervoor dat je 250 MB vrije ruimte hebt en start opnieuw."</string>
@@ -1117,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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 persoonlijke gegevens bevatten waartoe de app toegang heeft."</string>
<string name="sendText" msgid="5209874571959469142">"Een actie voor tekst selecteren"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Verbinding maken met een open wifi-netwerk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Verbinden met wifi-netwerk van provider"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Verbinden met wifi-netwerk"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Verbonden met een wifi-netwerk"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kan geen verbinding maken met het wifi-netwerk"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string>
@@ -1270,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Uitschakelen"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> voorbereiden"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Controleren op fouten"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nieuwe <xliff:g id="NAME">%s</xliff:g> gedetecteerd"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Voor overzetten van foto\'s en media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> beschadigd"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is beschadigd. Tik om te verhelpen."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is beschadigd. Selecteer om te herstellen."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> niet ondersteund"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dit apparaat biedt geen ondersteuning voor deze <xliff:g id="NAME">%s</xliff:g>. Tik om te configureren in een ondersteunde indeling."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Dit apparaat biedt geen ondersteuning voor deze <xliff:g id="NAME">%s</xliff:g>. Selecteer om in te stellen in een ondersteunde indeling."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwacht verwijderd"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ontkoppel <xliff:g id="NAME">%s</xliff:g> voordat u deze verwijdert om gegevensverlies te voorkomen"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> verwijderd"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> verwijderd. Plaats een nieuwe."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Bezig met uitwerpen van <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Niet verwijderen"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Configureren"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Uitwerpen"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Verkennen"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ontbreekt"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Plaats dit apparaat opnieuw"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> verplaatsen"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Gegevens verplaatsen"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Verplaatsen voltooid"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Gegevens verplaatst naar <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Kan gegevens niet verplaatsen"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Gegevens staan nog op originele locatie"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Verwijderd"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Uitgeworpen"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Controleren…"</string>
@@ -1355,17 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN-verbinding maken…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN-verbinding"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Verbinding met Always-on VPN verbroken"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Kan geen verbinding maken met Always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Netwerk- of VPN-instellingen wijzigen"</string>
<string name="upload_file" msgid="2897957172366730416">"Bestand kiezen"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Geen bestand geselecteerd"</string>
<string name="reset" msgid="2448168080964209908">"Resetten"</string>
<string name="submit" msgid="1602335572089911941">"Verzenden"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Auto-app wordt uitgevoerd"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tik om de auto-app te sluiten."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering of hotspot actief"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tik om in te stellen."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is uitgeschakeld"</string>
@@ -1691,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleerd door je beheerder"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Geüpdatet door je beheerder"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Verwijderd door je beheerder"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Batterijbesparing verlengt de batterijduur door de prestaties van je apparaat te verlagen en de trilfunctie, locatieservices en achtergrondgegevens te beperken of uit te schakelen. E-mail, berichten en andere apps die afhankelijk zijn van synchronisatie, worden niet geüpdatet (tenzij je ze opent).\n\nBatterijbesparing wordt automatisch uitgeschakeld wanneer je apparaat wordt opgeladen."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Databesparing inschakelen?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Inschakelen"</string>
@@ -1743,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Gedempt door <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-verzoek gewijzigd in normale oproep"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-verzoek gewijzigd in SS-verzoek"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Gewijzigd in nieuw USSD-verzoek"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-verzoek gewijzigd in videogesprek"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-verzoek gewijzigd in normale oproep"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-verzoek gewijzigd in videogesprek"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-verzoek gewijzigd in USSD-verzoek"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Gewijzigd in nieuw SS-verzoek"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Uitvouwen"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Samenvouwen"</string>
@@ -1856,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Sim niet geregistreerd voor spraak"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Simkaart niet toegestaan voor spraak"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoon niet toegestaan voor spraak"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-upvenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App-versie gedowngraded of niet geschikt voor deze snelkoppeling"</string>
@@ -1876,8 +1891,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dit is nieuw gedrag. Tik om te wijzigen."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'Niet storen\' is gewijzigd"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tik om te controleren wat er is geblokkeerd."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Systeem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Instellingen"</string>
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index ccfc523..3460628 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -77,39 +77,25 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"କଲର୍ ଆଇଡି ଡିଫଲ୍ଟ ଭାବରେ ପ୍ରତିବନ୍ଧିତ ନୁହେଁ। ପରବର୍ତ୍ତୀ କଲ୍: ପ୍ରତିବନ୍ଧିତ ନୁହେଁ"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ସେବାର ସୁବିଧା ନାହିଁ।"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"ଆପଣ କଲର୍ ID ସେଟିଙ୍ଗ ବଦଳାଇପାରିବେ ନାହିଁ।"</string>
- <!-- no translation found for RestrictedOnDataTitle (1322504692764166532) -->
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"କୌଣସି ମୋବାଇଲ୍ ଡାଟା ସେବା ନାହିଁ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"କୌଣସି ଭଏସ୍ ସେବା ନାହିଁ"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"କୌଣସି ଭଏସ୍ ସେବା କିମ୍ବା ଜରୁରୀକାଳୀନ କଲିଙ୍ଗ ନାହିଁ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ଆପଣଙ୍କ କେରିଅର୍ଙ୍କ ଦ୍ୱାରା ଅସ୍ଥାୟୀ ରୂପେ ବନ୍ଦ କରାଯାଇଛି"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
<skip />
- <!-- no translation found for RestrictedOnEmergencyTitle (3646729271176394091) -->
- <skip />
- <!-- no translation found for RestrictedOnNormalTitle (3179574012752700984) -->
- <skip />
- <!-- no translation found for RestrictedOnAllVoiceTitle (158800171499150681) -->
- <skip />
- <!-- no translation found for RestrictedStateContent (4278821484643362350) -->
- <skip />
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ନେଟ୍ୱର୍କ ପର୍ଯ୍ୟନ୍ତ ପହଞ୍ଚିପାରୁ ନାହିଁ"</string>
- <!-- no translation found for NetworkPreferenceSwitchSummary (7056776609127756440) -->
- <skip />
- <!-- no translation found for EmergencyCallWarningTitle (4790413876281901612) -->
- <skip />
- <!-- no translation found for EmergencyCallWarningSummary (8973232888021643293) -->
- <skip />
- <!-- no translation found for notification_channel_network_alert (4427736684338074967) -->
- <skip />
- <!-- no translation found for notification_channel_call_forward (2419697808481833249) -->
- <skip />
- <!-- no translation found for notification_channel_emergency_callback (6686166232265733921) -->
- <skip />
- <!-- no translation found for notification_channel_mobile_data_status (4575131690860945836) -->
- <skip />
- <!-- no translation found for notification_channel_sms (3441746047346135073) -->
- <skip />
- <!-- no translation found for notification_channel_voice_mail (3954099424160511919) -->
- <skip />
- <!-- no translation found for notification_channel_wfc (2130802501654254801) -->
- <skip />
- <!-- no translation found for notification_channel_sim (4052095493875188564) -->
- <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ମିଳୁନାହିଁ"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ନିଜ ପସନ୍ଦର ନେଟ୍ୱର୍କକୁ ଯିବାପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ୱାଇ-ଫାଇ ସାହାଯ୍ୟରେ ଜରୁରୀକାଳୀନ କଲ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ଅଲର୍ଟ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"କଲ୍ ଫରୱାର୍ଡିଙ୍ଗ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡ୍"</string>
+ <string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"ମୋବାଇଲ୍ ଡାଟା ଷ୍ଟାଟସ୍"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS ମେସେଜ୍"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ଭଏସମେଲ୍ ମେସେଜ୍"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ସିମ୍ ଷ୍ଟାଟସ୍"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ପୀଆର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ FULL ଅଟେ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ HCO ଅଟେ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ VCO ଅଟେ"</string>
@@ -136,15 +122,20 @@
<string name="roamingText11" msgid="4154476854426920970">"ରୋମିଙ୍ଗ ବ୍ୟାନର୍ ଅନ୍ ଅଛି"</string>
<string name="roamingText12" msgid="1189071119992726320">"ରୋମିଙ୍ଗ ବ୍ୟାନର୍ ଅଫ୍ ଅଛି"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ସେବା ଖୋଜାଯାଉଛି"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string>
- <!-- no translation found for wfcOperatorErrorAlertMessages:0 (3910386316304772394) -->
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7472393097168811593) -->
- <!-- no translation found for wfcSpnFormats:0 (6830082633573257149) -->
- <!-- no translation found for wfcSpnFormats:1 (4397097370387921767) -->
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ ସେଟ୍ ଅପ୍ ହେବନାହିଁ"</string>
+ <string-array name="wfcOperatorErrorAlertMessages">
+ <item msgid="3910386316304772394">"ୱାଇ-ଫାଇରେ କଲ୍ କରିବାକୁ ଏବଂ ମେସେଜ୍ ପଠାଇବା ପାଇଁ, ଏହି ସେବା ସେଟଅପ୍ କରିବାକୁ ପ୍ରଥମେ ଆପଣଙ୍କ କେରିଅର୍କୁ କୁହନ୍ତୁ। ତା’ପରେ ସେଟିଙ୍ଗରେ ୱାଇ-ଫାଇ କଲିଙ୍ଗ ଅନ୍ କରନ୍ତୁ। (ତ୍ରୁଟି କୋଡ୍ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ </string-array>
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"ଆପଣଙ୍କ କେରିଅର୍ ସହିତ ୱାଇ-ଫାଇ କଲ୍ କରିବା ପାଇଁ ପଞ୍ଜୀକରଣ କରିବାରେ ସମସ୍ୟା: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
+ <string-array name="wfcSpnFormats">
+ <item msgid="6830082633573257149">"%s"</item>
+ <item msgid="4397097370387921767">"%s ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</item>
+ </string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ଅଫ୍"</string>
<string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ପସନ୍ଦ କରାଯାଇଥିବା ୱାଇ-ଫାଇ"</string>
- <!-- no translation found for wfc_mode_cellular_preferred_summary (1988279625335345908) -->
- <skip />
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ପସନ୍ଦର ମୋବାଇଲ୍"</string>
<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>
@@ -171,35 +162,30 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ଅନେକ ଅନୁରୋଧ ଉପରେ କାମ ଚାଲୁଛି। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>ରେ ସାଇନ୍-ଇନ୍ ତ୍ରୁଟି"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ସିଙ୍କ୍"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ସିଙ୍କ୍"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ଅତ୍ୟଧିକ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ଡିଲିଟ୍ କରିଦିଏ।"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ସିଙ୍କ ହୋଇପାରିବନାହିଁ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ବହୁତ <xliff:g id="CONTENT_TYPE">%s</xliff:g>କୁ ଡିଲିଟ୍ କରିବା ପାଇଁ ଚେଷ୍ଟା କରାଯାଇଛି"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ଟାବଲେଟ୍ ଷ୍ଟୋରେଜ୍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ଥାନ ଖାଲି କରିବା ପାଇଁ କିଛି ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ୱାଚ୍ ଷ୍ଟୋରେଜ୍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ଥାନ ଖାଲି କରିବାକୁ କିଛି ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ଟିଭିର ଷ୍ଟୋରେଜ୍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ପେସ୍ ଖାଲି କରିବାକୁ କିଛି ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।"</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"ଫୋନ୍ ଷ୍ଟୋରେଜ୍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ଥାନ ଖାଲି କରିବା ପାଇଁ କିଛି ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for ssl_ca_cert_warning (5106721205300213569) -->
+ <plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
+ <item quantity="other">ସର୍ଟିଫିକେଟ୍ ଅଥରିଟିଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍ ହେଲା</item>
+ <item quantity="one">ସର୍ଟିଫିକେଟ୍ ଅଥରିଟୀ ଇନଷ୍ଟଲ୍ ହେଲା</item>
+ </plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ଅଜଣା ତୃତୀୟ ପକ୍ଷ ଅନୁଯାୟୀ"</string>
- <!-- no translation found for ssl_ca_cert_noti_by_administrator (3541729986326153557) -->
- <skip />
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ ଆଡମିନଙ୍କ ଦ୍ୱାରା"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ଅନୁଯାୟୀ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଡିଲିଟ୍ ହେଲା"</string>
<!-- no translation found for work_profile_deleted_description (1100529432509639864) -->
<skip />
- <!-- no translation found for work_profile_deleted_details (6307630639269092360) -->
- <skip />
- <!-- no translation found for work_profile_deleted_description_dpm_wipe (8823792115612348820) -->
- <skip />
- <!-- no translation found for work_profile_deleted_reason_maximum_password_failure (8986903510053359694) -->
- <skip />
- <!-- no translation found for network_logging_notification_title (6399790108123704477) -->
- <skip />
- <!-- no translation found for network_logging_notification_text (7930089249949354026) -->
- <skip />
+ <string name="work_profile_deleted_details" msgid="6307630639269092360">"ଆଡମିନ୍ ଆପ୍ ନାହିଁ କିମ୍ବା ଭୁଲ ଅଛି। ଫଳସ୍ୱରୂପ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ସମ୍ବନ୍ଧୀୟ ଡାଟା ଡିଲିଟ୍ କରାଯାଇଛି। ସହାୟତା ପାଇଁ ଆପଣଙ୍କ ଆଡମିନଙ୍କୁ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ଏହି ଡିଭାଇସରେ ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ବହୁତ ଥର ଭୁଲ ପାସ୍ୱର୍ଡ ଲେଖିଛନ୍ତି"</string>
+ <string name="network_logging_notification_title" msgid="6399790108123704477">"ଡିଭାଇସକୁ ପରିଚାଳନା କରାଯାଉଛି"</string>
+ <string name="network_logging_notification_text" msgid="7930089249949354026">"ଆପଣଙ୍କ ସଂସ୍ଥା ଏହି ଡିଭାଇସକୁ ପରିଚାଳନା କରନ୍ତି ଏବଂ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରନ୍ତି। ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ବର୍ତ୍ତମାନ ଲିଭାଯିବ"</string>
- <!-- no translation found for factory_reset_message (9024647691106150160) -->
- <skip />
- <!-- no translation found for printing_disabled_by (8936832919072486965) -->
- <skip />
+ <string name="factory_reset_message" msgid="9024647691106150160">"ଆଡମିନ୍ ଆପ୍ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ। ଆପଣଙ୍କ ଡିଭାଇସ୍ର ସମସ୍ତ ଡାଟାକୁ ବର୍ତ୍ତମାନ ଲିଭାଇଦିଆଯିବ। \n\nଯଦି ଆପଣଙ୍କର କୌଣସି ପ୍ରଶ୍ନ ରହିଥାଏ, ଆପଣଙ୍କ ସଂସ୍ଥାର ଆଡମିନ୍ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ଦ୍ଵାରା ପ୍ରିଣ୍ଟିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="me" msgid="6545696007631404292">"ମୁଁ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ଟାବଲେଟ୍ର ବିକଳ୍ପ"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"ଟିଭି ବିକଳ୍ପଗୁଡ଼ିକ"</string>
@@ -235,10 +221,8 @@
<string name="global_action_power_off" msgid="4471879440839879722">"ପାୱାର୍ ଅଫ୍"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"ଜରୁରୀକାଳୀନ"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"ବଗ୍ ରିପୋର୍ଟ"</string>
- <!-- no translation found for global_action_logout (935179188218826050) -->
- <skip />
- <!-- no translation found for global_action_screenshot (8329831278085426283) -->
- <skip />
+ <string name="global_action_logout" msgid="935179188218826050">"ସେସନ୍ ଶେଷ କରନ୍ତୁ"</string>
+ <string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ବଗ୍ ରିପୋର୍ଟ ନିଅନ୍ତୁ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ଇ-ମେଲ୍ ମେସେଜ୍ ଭାବରେ ପଠାଇବାକୁ, ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଡିଭାଇସ୍ ବିଷୟରେ ଏହା ସୂଚନା ସଂଗ୍ରହ କରିବ। ବଗ୍ ରିପୋର୍ଟ ଆରମ୍ଭ ହେବାପରଠାରୁ ଏହାକୁ ପଠାଇବା ପାଇଁ କିଛି ସମୟ ଲାଗିବ, ଦୟାକରି ଧୈର୍ଯ୍ୟ ରଖନ୍ତୁ।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ଇଣ୍ଟରାକ୍ଟିଭ୍ ରିପୋର୍ଟ"</string>
@@ -255,104 +239,67 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅଫ୍ ଅଛି"</string>
- <!-- no translation found for global_action_toggle_battery_saver (708515500418994208) -->
- <skip />
- <!-- no translation found for global_action_battery_saver_on_status (484059130698197787) -->
- <skip />
- <!-- no translation found for global_action_battery_saver_off_status (75550964969478405) -->
- <skip />
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ବ୍ୟାଟେରୀ ସେଭର୍"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅଫ୍ ଅଛି"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ଅଛି"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ସେଟିଙ୍ଗ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ସହାୟକ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ଭଏସ୍ ସହାୟକ"</string>
- <!-- no translation found for global_action_lockdown (1099326950891078929) -->
- <skip />
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ଲକ୍ କରନ୍ତୁ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
- <!-- no translation found for notification_hidden_text (6351207030447943784) -->
- <skip />
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
- <!-- no translation found for notification_channel_security (7345516133431326347) -->
- <skip />
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
- <!-- no translation found for notification_channel_alerts (4496839309318519037) -->
- <skip />
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
- <!-- no translation found for notification_channel_heavy_weight_app (6218742927792852607) -->
- <skip />
- <!-- no translation found for notification_channel_foreground_service (3931987440602669158) -->
- <skip />
- <!-- no translation found for foreground_service_app_in_background (1060198778219731292) -->
- <skip />
- <!-- no translation found for foreground_service_apps_in_background (7175032677643332242) -->
- <skip />
- <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
- <skip />
- <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
- <skip />
+ <string name="notification_hidden_text" msgid="6351207030447943784">"ନୂଆ ବିଜ୍ଞପ୍ତି"</string>
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ଭର୍ଚୁଆଲ୍ କୀ\'ବୋର୍ଡ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ଫିଜିକଲ୍ କୀ’ବୋର୍ଡ"</string>
+ <string name="notification_channel_security" msgid="7345516133431326347">"ସୁରକ୍ଷା"</string>
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"କାର୍ ମୋଡ୍"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ଆକାଉଣ୍ଟର ସ୍ଥିତି"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ଡେଭଲପରଙ୍କ ମେସେଜ୍"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"ଅପଡେଟ୍"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ନେଟୱର୍କ ସ୍ଥିତି"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ନେଟୱର୍କ ଅଲର୍ଟ"</string>
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ଅଛି"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN ସ୍ଥିତି"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ଡିଭାଇସ୍ ଆଡମିନିଷ୍ଟ୍ରେସନ୍"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"ଆଲର୍ଟ"</string>
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"ରିଟେଲ୍ ଡେମୋ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB ସଂଯୋଗ"</string>
+ <string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"ଆପ୍ ଚାଲୁଛି"</string>
+ <string name="notification_channel_foreground_service" msgid="3931987440602669158">"ଆପ୍ଗୁଡ଼ିକ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରିଥା\'ନ୍ତି"</string>
+ <string name="foreground_service_app_in_background" msgid="1060198778219731292">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରୁଛି"</string>
+ <string name="foreground_service_apps_in_background" msgid="7175032677643332242">"<xliff:g id="NUMBER">%1$d</xliff:g>ଟି ଆପ୍ ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
+ <string name="foreground_service_tap_for_details" msgid="372046743534354644">"ବ୍ୟାଟେରୀ ଏବଂ ଡାଟା ବ୍ୟବହାର ଉପରେ ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"ସୁରକ୍ଷିତ ମୋଡ୍"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ସିଷ୍ଟମ୍"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲ୍କୁ ଫେରିଆସନ୍ତୁ"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍କୁ ଯାଆନ୍ତୁ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ଯୋଗାଯୋଗ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ଆପଣଙ୍କ ଯୋଗାଯୋଗ ଆକ୍ସେସ୍ କରେ"</string>
- <!-- no translation found for permgrouprequest_contacts (1601591667800538208) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଆପଣଙ୍କ ଯୋଗାଯୋଗଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ଲୋକେଶନ୍"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ଏହି ଡିଭାଇସ୍ର ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରେ"</string>
- <!-- no translation found for permgrouprequest_location (8903573681261610809) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଏହି ଡିଭାଇସ୍ର ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"କ୍ୟାଲେଣ୍ଡର୍"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍ ଆକ୍ସେସ୍ କରେ"</string>
- <!-- no translation found for permgrouprequest_calendar (6704529828699071445) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍କୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ମେସେଜ୍ ପଠାନ୍ତୁ ଓ ଦେଖନ୍ତୁ"</string>
- <!-- no translation found for permgrouprequest_sms (605618939583628306) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ SMS ମେସେଜ୍ ପଠାଇବା ଓ ଦେଖିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ଷ୍ଟୋରେଜ୍"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଥିବା ଫଟୋ, ମିଡିଆ ଓ ଫାଇଲ୍ ଆକ୍ସେସ୍ କରେ"</string>
- <!-- no translation found for permgrouprequest_storage (7429669910547860218) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଆପଣଙ୍କ ଡିଭାଇସରେ ଥିବା ଫଟୋ, ମିଡିଆ ଓ ଫାଇଲ୍ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ମାଇକ୍ରୋଫୋନ୍"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ଅଡିଓ ରେକର୍ଡ କରେ"</string>
- <!-- no translation found for permgrouprequest_microphone (8065941268709600606) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଅଡିଓ ରେକର୍ଡ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"କ୍ୟାମେରା"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ଫଟୋ ନିଏ ଓ ଭିଡିଓ ରେକର୍ଡ କରେ"</string>
- <!-- no translation found for permgrouprequest_camera (810824326507258410) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଫଟୋ ଉଠାଇବାକୁ ଏବଂ ଭିଡିଓ ରେକର୍ଡ କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ଫୋନ୍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ଫୋନ୍ କଲ୍ କରେ ଏବଂ ପରିଚାଳନା କରେ"</string>
- <!-- no translation found for permgrouprequest_phone (7084161459732093690) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଫୋନ୍ କଲ୍ କରିବାକୁ ତଥା ପରିଚାଳନା କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ବଡୀ ସେନ୍ସର୍"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ଆପଣଙ୍କ ଗୁରୁତପୂର୍ଣ୍ଣ ସଂକେତଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍ ଡାଟା ଆକ୍ସେସ୍ କରେ"</string>
- <!-- no translation found for permgrouprequest_sensors (8631146669524259656) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଆପଣଙ୍କ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଲକ୍ଷଣଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍ ଡାଟା ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ୱିଣ୍ଡୋ କଣ୍ଟେଣ୍ଟ ହାସଲ କରନ୍ତୁ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ଆପଣ କାମ କରୁଥିବା ୱିଣ୍ଡୋର କଣ୍ଟେଣ୍ଟକୁ ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ସ୍ପର୍ଶ ଦ୍ୱାରା ଏକ୍ସପ୍ଲୋର୍ ଅନ୍ କରନ୍ତୁ"</string>
@@ -363,10 +310,8 @@
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"ଡିସପ୍ଲେର ଜୁମ୍ ସ୍ତର ଓ ପୋଜିସନିଙ୍ଗ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ଜେଶ୍ଚର୍ କରନ୍ତୁ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ଟାପ୍, ସ୍ୱାଇପ୍, ପିଞ୍ଚ ଓ ଅନ୍ୟାନ୍ୟ ଜେଶ୍ଚର୍ ସମ୍ପାଦନ କରିପାରିବ।"</string>
- <!-- no translation found for capability_title_canCaptureFingerprintGestures (6309568287512278670) -->
- <skip />
- <!-- no translation found for capability_desc_canCaptureFingerprintGestures (4386487962402228670) -->
- <skip />
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଜେଶ୍ଚର"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ଡିଭାଇସ୍ର ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍ ଉପରେ ଜେଶ୍ଚର୍ କ୍ୟାପଚର୍ କାର୍ଯ୍ୟ କରାଯାଇପାରିବ।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ଷ୍ଟାଟସ୍ ବାର୍କୁ ଅକ୍ଷମ କିମ୍ୱା ସଂଶୋଧନ କରନ୍ତୁ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ଆପ୍କୁ, ସ୍ଥିତି ବାର୍ ଅକ୍ଷମ କରିବାକୁ କିମ୍ବା ସିଷ୍ଟମ୍ ଆଇକନ୍ ଯୋଡ଼ିବା କିମ୍ବା ବାହାର କରିବାକୁ ଦେଇଥାଏ।"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ଷ୍ଟାଟସ୍ ବାର୍ ରହିବାକୁ ଦିଅନ୍ତୁ"</string>
@@ -379,10 +324,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ୟୁଜର୍ଙ୍କ ବିନା ବାଧାରେ ହୋମ୍ସ୍କ୍ରୀନ୍ର ଶର୍ଟକଟ୍ ବାହାର କରିବା ପାଇଁ ଗୋଟିଏ ଆପ୍ଲିକେଶନ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍କୁ ଅନ୍ୟ ରୁଟ୍ ଦିଅନ୍ତୁ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ଭିନ୍ନ ନମ୍ବରକୁ କଲ୍ ରିଡାଇରେକ୍ଟ କରିବା କିମ୍ବା ଏକାଠି କଲ୍ ଖାରଜ କରିବା ବିକଳ୍ପ ସହ ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ କରିବାବେଳେ ଡାୟଲ୍ କରାଯାଉଥିବା ନମ୍ବର ଦେଖିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ଫୋନ୍ କଲଗୁଡ଼ିକର ଉତ୍ତର ଦିଅନ୍ତୁ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ଇନକମିଙ୍ଗ ଫୋନ୍ କଲର ଉତ୍ତର ଦେବାକୁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ଟେକ୍ସଟ୍ ମେସେଜ୍ (SMS) ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS ମେସେଜ୍ ପ୍ରାପ୍ତ କରିବାକୁ ତଥା ପ୍ରକ୍ରିୟା କରାଇବାକୁ ଆପ୍ଟିକୁ ଅନୁମତି ଦିଏ। ଏହାର ଅର୍ଥ ହେଉଛି, ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ପଠାଯାଇଥିବା ମେସେଜ୍ ଆପଣଙ୍କୁ ନଦେଖାଇ ଆପ୍ଟି ମନିଟର୍ କିମ୍ବା ଡିଲିଟ୍ କରିପାରେ।"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ଟେକ୍ସଟ୍ ମେସେଜ୍ (MMS) ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
@@ -394,10 +337,8 @@
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS ମେସେଜ୍ ପଠାନ୍ତୁ ଓ ଦେଖନ୍ତୁ"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"ଆପ୍କୁ SMS ମେସେଜ୍ ପଠେଇବାକୁ ଅନୁମତି ଦେଇଥାଏ। ଏହାଦ୍ୱାରା ଅପ୍ରତ୍ୟାଶିତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ। ହାନୀକାରକ ଆପ୍ ଆପଣଙ୍କ ବିନା ସ୍ୱୀକୃତିରେ ମେସେଜ୍ ପଠାଇ, ଆପଣଙ୍କ ପଇସା ଖର୍ଚ୍ଚ କରାଇପାରେ।"</string>
<string name="permlab_readSms" msgid="8745086572213270480">"ଆପଣଙ୍କ ଟେକ୍ସଟ୍ ମେସେଜ୍ (SMS କିମ୍ବା MMS) ପଢ଼ନ୍ତୁ"</string>
- <!-- no translation found for permdesc_readSms (4741697454888074891) -->
- <skip />
- <!-- no translation found for permdesc_readSms (5796670395641116592) -->
- <skip />
+ <string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ SMS (ଟେକ୍ସଟ୍) ମେସେଜ୍ ଏହି ଆପ୍ ପଢ଼ିପାରେ।"</string>
+ <string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"ଆପଣଙ୍କ ଟିଭିରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ SMS (ଟେକ୍ସଟ୍) ମେସେଜ୍ ଏହି ଆପ୍ ପଢ଼ିପାରେ।"</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"ଆପଣଙ୍କ ଫୋନ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ SMS (ଟେକ୍ସଟ୍) ମେସେଜ୍ ଏହି ଆପ୍ ପଢ଼ିପାରେ।"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ଟେକ୍ସଟ୍ ମେସେଜ୍ (WAP) ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"ଆପ୍କୁ WAP ମେସେଜିଙ୍ଗକୁ ପ୍ରାପ୍ତ ଓ ବିକାଶ କରିବାକୁ ଦେଇଥାଏ। ଏହି ଅନୁମତିରେ ଆପଣ ସେମାନଙ୍କୁ ଦେଖାଯାଇଥିବା ମେସେଜ୍ ଉପରେ ନଜର ରଖିବା ଏବଂ ଡିଲିଟ୍ କରିବାର କ୍ଷମତା ସାମିଲ୍ ଅଛି।"</string>
@@ -411,26 +352,18 @@
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"କାର୍ ମୋଡ୍ ବଦଳାଇବାକୁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"ଅନ୍ୟ ଆପ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ଆପ୍କୁ ଅନ୍ୟ ଆପ୍ର ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଟ ପ୍ରକ୍ରିୟାକୁ ସମାପ୍ତ କରିବାକୁ ଦେଇଥାଏ। ଏହି କାରଣରୁ ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ ଚାଲିବା ବନ୍ଦ ହୋଇଯାଇପାରେ।"</string>
- <!-- no translation found for permlab_systemAlertWindow (7238805243128138690) -->
- <skip />
- <!-- no translation found for permdesc_systemAlertWindow (2393776099672266188) -->
- <skip />
- <!-- no translation found for permlab_runInBackground (7365290743781858803) -->
- <skip />
- <!-- no translation found for permdesc_runInBackground (7370142232209999824) -->
- <skip />
- <!-- no translation found for permlab_useDataInBackground (8694951340794341809) -->
- <skip />
- <!-- no translation found for permdesc_useDataInBackground (6049514223791806027) -->
- <skip />
+ <string name="permlab_systemAlertWindow" msgid="7238805243128138690">"ଏହି ଆପ୍ ଅନ୍ୟ ଆପ୍ର ଉପରେ ଦେଖାଯାଇପାରେ"</string>
+ <string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"ଏହି ଆପ୍ ଅନ୍ୟ ଆପ୍ର ଶୀର୍ଷରେ କିମ୍ବା ସ୍କ୍ରୀନର ଅନ୍ୟ ଅଂଶରେ ଦେଖାଯାଇପାରେ। ଏହା ସାମାନ୍ୟ ଆପ୍ ବ୍ୟବହାରରେ ବାଧା ପହଞ୍ଚାଇପାରେ ଏବଂ ଅନ୍ୟ ଆପ୍କୁ ଅଲଗା ରୂପେ ଦେଖାଇପାରେ।"</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡରେ ଚଲାନ୍ତୁ"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"ଏହି ଆପ୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଚାଲିପାରିବ। ଏହା ଦ୍ୱାରା ବ୍ୟାଟେରୀ ଦ୍ରୁତ ଭାବେ ଖର୍ଚ୍ଚ ହୋଇପାରେ।"</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡରେ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"ଏହି ଆପ୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ବ୍ୟବହାର କରିପାରିବ। ଏହା ଦ୍ୱାରା ଅଧିକ ବ୍ୟାଟେରୀ ହୋଇପାରେ।"</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"ଆପ୍କୁ, ସର୍ବଦା ଚାଲୁଥିବା କରନ୍ତୁ"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ଆପ୍ଟି ନିଜକୁ ମେମୋରୀରେ ଭାଗ କରିବାକୁ ଦେଇଥାଏ। ଏହାଦ୍ୱାରା ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ ମେମୋରୀ ଉପଲବ୍ଧକୁ କମ୍ କରିବା ସହ ଟାବ୍ଲେଟ୍ଟିକୁ ମନ୍ଥର କରିବ।"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ମେମୋରୀରେ ଆପ୍ଟି ନିଜକୁ ଭାଗ କରିବାକୁ ଦେଇଥାଏ। ଏହା ଟିଭିକୁ ଧୀର କରି ଅନ୍ୟ ଆପ୍ ପାଇଁ ଉପଲବ୍ଧ ମେମୋରୀକୁ ସୀମିତ କରିପାରେ।"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ଆପ୍ଟି ନିଜକୁ ମେମୋରୀରେ ଭାଗ କରିବାକୁ ଦେଇଥାଏ। ଏହାଦ୍ୱାରା ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ ମେମୋରୀ ଉପଲବ୍ଧକୁ କମ୍ କରିବା ସହ ଫୋନ୍ଟିକୁ ମନ୍ଥର କରିବ।"</string>
- <!-- no translation found for permlab_foregroundService (3310786367649133115) -->
- <skip />
- <!-- no translation found for permdesc_foregroundService (6471634326171344622) -->
- <skip />
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ଫୋର୍ଗ୍ରାଉଣ୍ଡ ସେବାକୁ ଚଲାନ୍ତୁ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ଫୋର୍ଗ୍ରାଉଣ୍ଡ ସେବାଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ଆପ୍ ଷ୍ଟୋରେଜ୍ ସ୍ଥାନର ମାପ କରନ୍ତୁ"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ଆପ୍ର କୋଡ୍, ଡାଟା ଓ କ୍ୟାଶ୍ ଆକାର ହାସଲ କରିବା ପାଇଁ ଏହାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ ବଦଳାନ୍ତୁ"</string>
@@ -459,30 +392,26 @@
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ଇନ୍କମିଙ୍ଗ ତଥା ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ ଡାଟା ସହ ଆପଣଙ୍କ ଫୋନ୍ର କଲ୍ ଲଗ୍ ବଦଳାଇବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଏ। ହାନୀକାରକ ଆପ୍ ଆପଣଙ୍କ କଲ୍ ଲଗ୍ ଲିଭାଇବାକୁ କିମ୍ବା ବଦଳାଇବାକୁ ଏହା ବ୍ୟବହାର କରିପାରନ୍ତି।"</string>
<string name="permlab_bodySensors" msgid="4683341291818520277">"ବଡୀ ସେନ୍ସର୍ ଆକ୍ସେସ୍ କରେ (ଯେପରିକି ହୃଦ୍ ହାର ମନିଟର୍)"</string>
<string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ଆପ୍କୁ ସେନ୍ସର୍ ଡେଟା ପର୍ଯ୍ୟନ୍ତ ପହଞ୍ଚିବାକୁ ଦେଇଥାଏ, ଯାହା ଆପଣଙ୍କ ଶାରୀରିକ ସ୍ଥିତିର ନିରୀକ୍ଷଣ କରିଥାଏ, ଯେପରିକି ଆପଣଙ୍କ ହୃଦୟ ସ୍ତର।"</string>
- <!-- no translation found for permlab_readCalendar (6716116972752441641) -->
- <skip />
- <!-- no translation found for permdesc_readCalendar (4993979255403945892) -->
- <skip />
- <!-- no translation found for permdesc_readCalendar (8837931557573064315) -->
- <skip />
- <!-- no translation found for permdesc_readCalendar (4373978642145196715) -->
- <skip />
+ <string name="permlab_readCalendar" msgid="6716116972752441641">"କ୍ୟାଲେଣ୍ଡର୍ ଇଭେଣ୍ଟ ଏବଂ ବିବରଣୀ ପଢ଼େ"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଏହି ଆପ୍ ପଢ଼ିପାରେ ଏବଂ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର ଡାଟା ଶେୟାର୍ କରିପାରେ କିମ୍ବା ସେଭ୍ କରିପାରେ।"</string>
+ <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"ଆପଣଙ୍କ ଟିଭିରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଏହି ଆପ୍ ପଢ଼ିପାରେ ଏବଂ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର ଡାଟା ଶେୟାର୍ କରିପାରେ କିମ୍ବା ସେଭ୍ କରିପାରେ।"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"ଆପଣଙ୍କ ଫୋନ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଏହି ଆପ୍ ପଢ଼ିପାରେ ଏବଂ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର ଡାଟା ଶେୟାର୍ କରିପାରେ କିମ୍ବା ସେଭ୍ କରିପାରେ।"</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟରେ ଯୋଡ଼ନ୍ତୁ କିମ୍ବା ସଂଶୋଧନ କରନ୍ତୁ ଏବଂ ମାଲିକଙ୍କ ଅଜାଣତରେ ଅତିଥିମାନଙ୍କୁ ଇମେଲ୍ ପଠାନ୍ତୁ।"</string>
- <!-- no translation found for permdesc_writeCalendar (1675270619903625982) -->
- <skip />
- <!-- no translation found for permdesc_writeCalendar (9017809326268135866) -->
- <skip />
+ <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"ଏହି ଆପ୍ ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଯୋଡ଼ିପାରେ, ବାହାର କରିପାରେ କିମ୍ବା ବଦଳାଇପାରେ। ଏହି ଆପ୍ ଏପରି ମେସେଜ୍ ପଠାଇପାରେ, ଯାହା କ୍ୟାଲେଣ୍ଡର ମାଲିକଙ୍କଠାରୁ ଆସିଥିବା ପରି ଜଣାପଡ଼େ କିମ୍ବା ମାଲିକଙ୍କୁ ନଜଣାଇ ଇଭେଣ୍ଟରେ ପରିବର୍ତ୍ତନ କରିପାରେ।"</string>
+ <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"ଏହି ଆପ୍ ଆପଣଙ୍କ ଟିଭିରେ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଯୋଡ଼ିପାରେ, ବାହାର କରିପାରେ କିମ୍ବା ବଦଳାଇପାରେ। ଏହି ଆପ୍ ଏପରି ମେସେଜ୍ ପଠାଇପାରେ, ଯାହା କ୍ୟାଲେଣ୍ଡର ମାଲିକଙ୍କଠାରୁ ଆସିଥିବା ପରି ଜଣାପଡ଼େ କିମ୍ବା ମାଲିକଙ୍କୁ ନଜଣାଇ ଇଭେଣ୍ଟରେ ପରିବର୍ତ୍ତନ କରିପାରେ।"</string>
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ଏହି ଆପ୍, ଆପଣଙ୍କ ଫୋନ୍ରେ କ୍ୟାଲେଣ୍ଡର୍ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଯୋଡ଼ିପାରେ, ବାହାର କରିପାରେ କିମ୍ବା ବଦଳାଇପାରେ। କ୍ୟାଲେଣ୍ଡର୍ ମାଲିକଙ୍କ ପାଖରୁ ଆସିଥିବା ପରି ଜଣାପଡ଼ିବା ମେସେଜ୍କୁ ଏହି ଆପ୍ ପଠାଇପାରେ କିମ୍ବା ମାଲିକଙ୍କୁ ନଜଣାଇ ଇଭେଣ୍ଟ ବଦଳାଇପାରେ।"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ଅତିରିକ୍ତ ଲୋକେଶନ୍ ପ୍ରଦାନକାରୀ କମାଣ୍ଡକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ଅତିରିକ୍ତ ଲୋକେଶନ୍ ପ୍ରଦାନକାରୀ କମାଣ୍ଡ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଏ। GPS କିମ୍ବା ଅନ୍ୟ ଲୋକେଶନ୍ ସୋର୍ସଗୁଡିକରେ ଆପ୍ଟି ପ୍ରଭାବ ପକାଇପାରେ।"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"ନିର୍ଦ୍ଦିଷ୍ଟ ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରେ (GPS ଏବଂ ନେଟ୍ୱର୍କ-ଆଧାରିତ)"</string>
<string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ଏହି ଆପ୍, GPS କିମ୍ୱା ନେଟ୍ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍ ଟାୱାର୍ ଓ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ। ଏହି ଲୋକେଶନ୍ ସେବା, ଆପଣଙ୍କ ଫୋନ୍ରେ ଅନ୍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ। ଏହାଦ୍ୱାରା ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ ବଢ଼ିପାରେ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ପାଖାପାଖି ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରେ (ନେଟ୍ୱର୍କ-ଆଧାରିତ)"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ଏହି ଆପ୍, ନେଟ୍ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍ ଟାୱାର୍ ଓ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ। ଏହି ଲୋକେଶନ୍ ସେବା, ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ ଅନ୍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ଏହି ଆପ୍, ନେଟ୍ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍ ଟାୱାର୍ ଓ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ। ଏହି ଲୋକେଶନ୍ ସେବା, ଆପଣଙ୍କ ଟିଭିରେ ଅନ୍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ସେଲ୍ ଟାୱାର ଓ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ପରି ସୋର୍ସକୁ ଆଧାର କରି ଏହି ଆପ୍ ଆପଣଙ୍କ ଲୋକେଶନ୍ ପ୍ରାପ୍ତ କରିପାରିବ। ଏହି ଲୋକେଶନ୍ ସେବାଗୁଡ଼ିକର ବ୍ୟବହାର କରିବାକୁ ସେଗୁଡ଼ିକ ଅନ୍ କରାଯିବା ଏବଂ ଆପଣଙ୍କ ଫୋନ୍ରେ ଉପଲବ୍ଧ ଥିବା ଜରୁରୀ"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ଆପଣଙ୍କ ଅଡିଓ ସେଟିଙ୍ଗକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ଆପ୍କୁ ଗ୍ଲୋବାଲ୍ ଅଡିଓ ସେଟିଙ୍ଗ, ଯେପରିକି ଭଲ୍ୟୁମ୍କୁ ସଂଶୋଧିତ କରିବାକୁ ଏବଂ ଆଉଟପୁଟ୍ ପାଇଁ ସ୍ପିକର୍ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ"</string>
- <!-- no translation found for permdesc_recordAudio (4245930455135321433) -->
- <skip />
+ <string name="permdesc_recordAudio" msgid="4245930455135321433">"ଏହି ଆପ୍ ଯେକୌଣସି ସମୟରେ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରି ଅଡିଓ ରେକର୍ଡ କରିପାରିବ।"</string>
<string name="permlab_sim_communication" msgid="2935852302216852065">"SIMକୁ କମାଣ୍ଡ ପଠାନ୍ତୁ"</string>
<string name="permdesc_sim_communication" msgid="5725159654279639498">"SIMକୁ କମାଣ୍ଡ ପଠାଇବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ। ଏହା ବହୁତ ବିପଦପୂର୍ଣ୍ଣ।"</string>
<string name="permlab_camera" msgid="3616391919559751192">"ଫଟୋ ଓ ଭିଡିଓଗୁଡ଼ିକୁ ନିଅନ୍ତୁ"</string>
@@ -495,18 +424,12 @@
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"ଆପଣଙ୍କ ହସ୍ତକ୍ଷେପ ବିନା କଲ୍ କରିପାରିବା ପାଇଁ ଆପ୍କୁ IMS ସେବା ବ୍ୟବହାର କରିବାକୁ ଦିଏ।"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"ଫୋନ୍ ସ୍ଥିତି ଓ ପରିଚୟ ପଢ଼ନ୍ତୁ"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"ଆପ୍କୁ ଡିଭାଇସ୍ର ଫୋନ୍ ବୈଶିଷ୍ଟ୍ୟ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ। ଏହି ଅନୁମତି ଆପ୍କୁ ଫୋନ୍ ନମ୍ବର୍ ଓ ଡିଭାଇସ୍ IDଗୁଡ଼ିକୁ ନିର୍ଦ୍ଧାରଣ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ, କଲ୍ ସକ୍ରିୟ ଥିଲେ ବି ଏବଂ କଲ୍ ଦ୍ୱାରା ସଂଯୋଗ ଥିବା ରିମୋଟ୍ ନମ୍ବର୍କୁ ମଧ୍ୟ।"</string>
- <!-- no translation found for permlab_manageOwnCalls (1503034913274622244) -->
- <skip />
- <!-- no translation found for permdesc_manageOwnCalls (6552974537554717418) -->
- <skip />
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
- <!-- no translation found for permlab_readPhoneNumbers (6108163940932852440) -->
- <skip />
- <!-- no translation found for permdesc_readPhoneNumbers (8559488833662272354) -->
- <skip />
+ <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ସିଷ୍ଟମ୍ ଜରିଆରେ କଲ୍ର ମାର୍ଗ ବଦଳାଇପାରେ"</string>
+ <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"କଲ୍ କରିବାର ଅନୁଭୂତି ବଢ଼ାଇବାକୁ ସିଷ୍ଟମ୍ ଜରିଆରେ ଆପର କଲ୍ଗୁଡ଼ିକୁ ରୁଟ୍ କରିବାକୁ ଏହାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"ଅନ୍ୟ ଏକ ଆପ୍ରୁ କଲ୍କୁ ଜାରି ରଖନ୍ତୁ"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ଅନ୍ୟ ଆପ୍ରେ ଆରମ୍ଭ ହୋଇଥିବା ଗୋଟିଏ କଲ୍କୁ ଜାରି ରଖିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
+ <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ଫୋନ୍ ନମ୍ବର ପଢ଼େ"</string>
+ <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ଏହି ଡିଭାଇସର ଫୋନ୍ ନମ୍ବର ଆକ୍ସେସ୍ କରିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ଟାବଲେଟ୍କୁ ସ୍ଲୀପିଙ୍ଗ ମୋଡ୍କୁ ଯିବାକୁ ରୋକନ୍ତୁ"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"ଟିଭିକୁ ସ୍ଲୀପିଙ୍ଗ ମୋଡ୍ରୁ ଯିବାକୁ ରୋକନ୍ତୁ।"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ଫୋନକୁ ସ୍ଲୀପିଙ୍ଗ ମୋଡ୍କୁ ଯିବାକୁ ରୋକନ୍ତୁ"</string>
@@ -563,6 +486,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେସନ୍ନ (NFC) ଟାଗ୍, କାର୍ଡ ଓ ରିଡରଗୁଡ଼ିକ ସହ ଯୋଗାଯୋଗ କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ଆପ୍କୁ କୀ\'ଲକ୍ କିମ୍ବା ସେଥିରେ ଥିବା କୌଣସି ପାସ୍ୱର୍ଡ ସୁରକ୍ଷାକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଅନୁମତି ଦିଏ, ଉଦାହରଣସ୍ୱରୂପ, ଇନ୍କମିଙ୍ଗ ଫୋନ୍ କଲ୍ ପ୍ରାପ୍ତ କରିବା ସମୟରେ ଫୋନ୍ଟି କୀ\'ଲକ୍କୁ ଅକ୍ଷମ କରିଦିଏ, ତା’ପରେ କଲ୍ ସମାପ୍ତ ହେବାପରେ ପୁଣି କୀ\'ଲକ୍କୁ ସକ୍ଷମ କରିଥାଏ।"</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ବ୍ୟବହାର କରିବା ପାଇଁ ଆଙ୍ଗୁଠି ଚିହ୍ନ ଯୋଡ଼ିବାକୁ ଓ ଡିଲିଟ୍ କରିବାକୁ ଆପକୁ ବିଧି ଆରମ୍ଭ କରିବାକୁ ଦେଇଥାଏ।"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -575,20 +502,18 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ଚିହ୍ନଟ ହେଲା ନାହିଁ"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି ପୂର୍ବରୁ ଥିବା ଆଙ୍ଗୁଠି ଚିହ୍ନକୁ ବାହାର କରିଦିଅନ୍ତୁ।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ଆଙ୍ଗୁଠି ଚିହ୍ନର ସମୟ ଶେଷ ହେଲା । ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ଆଙ୍ଗୁଠି ଚିହ୍ନ କାର୍ଯ୍ୟ କ୍ୟାନ୍ସଲ୍ କରାଗଲା।"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ୟୁଜର୍ଙ୍କ ଦ୍ଵାରା ଆଙ୍ଗୁଠି ଚିହ୍ନ ନେବା କାମକୁ କ୍ୟାନ୍ସଲ୍ କରିଦିଆଯାଇଛି।"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ବହୁତ ପ୍ରୟାସ କରାଗଲା। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ବହୁତ ଥର ଭୁଲ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନ୍ସର୍ ଅକ୍ଷମ କରାଗଲା।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"କୌଣସି ଆଙ୍ଗୁଠି ଚିହ୍ନ ପଞ୍ଜୀକୃତ ହୋଇନାହିଁ।"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ଏହି ଡିଭାଇସ୍ରେ ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍ ନାହିଁ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ଆଙ୍ଗୁଠି <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -655,8 +580,7 @@
<string name="permdesc_access_notification_policy" msgid="3296832375218749580">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" କନଫିଗରେଶନ୍ ପଢ଼ିବା ତଥା ଲେଖିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"ପାସ୍ୱର୍ଡ ନିୟମାବଳୀ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"ଲକ୍ ସ୍କ୍ରୀନ୍ ପାସ୍ୱର୍ଡ ଓ PINରେ ଅନୁମୋଦିତ ଦୀର୍ଘତା ଓ ବର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string>
- <!-- no translation found for policylab_watchLogin (5091404125971980158) -->
- <skip />
+ <string name="policylab_watchLogin" msgid="5091404125971980158">"ସ୍କ୍ରୀନ୍-ଅନଲକ୍ କରିବା ଉଦ୍ୟମ ନୀରିକ୍ଷଣ କରନ୍ତୁ"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ସ୍କ୍ରୀନ୍ ଅନଲକ୍ କରିବାବେଳେ ଟାଇପ୍ କରିଥିବା ଭୁଲ ପାସୱର୍ଡର ସଂଖ୍ୟାକୁ ନୀରିକ୍ଷଣ କରେ ଏବଂ ଟାବଲେଟ୍କୁ ଲକ୍ କରିଦିଏ କିମ୍ବା ଯଦି ଅନେକ ଭୁଲ ପାସୱର୍ଡ ଟାଇପ୍ କରାଯାଇଥାଏ, ତେବେ ଟାବଲେଟ୍ର ସମସ୍ତ ଡାଟା ଲିଭାଇଦିଏ।"</string>
<string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"ସ୍କ୍ରିନକୁ ଅନଲକ୍ କରିବା ସମୟରେ ଟାଇପ୍ କରିଥିବା ଭୁଲ ପାସ୍ୱର୍ଡ ସଂଖ୍ୟା ଉପରେ ନୀରିକ୍ଷଣ ରଖନ୍ତୁ ଏବଂ ଟିଭି ଲକ୍ କରନ୍ତୁ ଓ ଯଦି ଅନେକ ଭୁଲ ପାସ୍ୱର୍ଡ ଟାଇପ୍ କରାଯାଇଛି, ତେବେ ସମସ୍ତ ଟିଭି ଡାଟାକୁ ହଟାଇଦିଅନ୍ତୁ।"</string>
<string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ସ୍କ୍ରୀନ୍ ଅନଲକ୍ କରିବାବେଳେ ଟାଇପ୍ କରିଥିବା ଭୁଲ ପାସୱର୍ଡର ସଂଖ୍ୟାକୁ ନୀରିକ୍ଷଣ କରେ ଏବଂ ଫୋନ୍କୁ ଲକ୍ କରିଦିଏ କିମ୍ବା ଯଦି ଅନେକ ଭୁଲ ପାସୱର୍ଡ ଟାଇପ୍ କରାଯାଇଥାଏ, ତେବେ ଫୋନ୍ର ସମସ୍ତ ଡାଟା ଲିଭାଇଦିଏ।"</string>
@@ -892,10 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ପାଟର୍ନ ଅନଲକ୍।"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ଫେସ୍ ଅନଲକ୍।"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ଅନଲକ୍।"</string>
- <!-- no translation found for keyguard_accessibility_sim_pin_unlock (9149698847116962307) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_unlock (9106899279724723341) -->
- <skip />
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"PIN ଦ୍ଵାରା SIMକୁ ଅନଲକ୍ କରନ୍ତୁ।"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"PUK ଦ୍ଵାରା SIMକୁ ଅନଲକ୍ କରନ୍ତୁ।"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ପାସ୍ୱର୍ଡ ଅନଲକ୍।"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ପାଟର୍ନ କ୍ଷେତ୍ର।"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ସ୍ଲାଇଡ୍ କ୍ଷେତ୍ର।"</string>
@@ -920,8 +842,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ଧ୍ୟାନଦିଅନ୍ତୁ: ଜୁମ୍ ଇନ୍ ଓ ଆଉଟ୍ କରିବା ପାଇଁ ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ସ୍ୱତଃପୂରଣ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ଅଟୋଫିଲ୍ ସେଟ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for autofill_window_title (921006636895825007) -->
- <skip />
+ <string name="autofill_window_title" msgid="921006636895825007">"ଅଟୋଫିଲ୍"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -958,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ଟେକ୍ସଟ୍ କ୍ଲିପବୋର୍ଡକୁ କପୀ ହୋଇଯାଇଛି"</string>
<string name="more_item_label" msgid="4650918923083320495">"ଅଧିକ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ମେନୁ"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ସ୍ପେସ୍"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ଏଣ୍ଟର୍"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ଡିଲିଟ୍"</string>
@@ -1073,8 +1000,7 @@
<string name="selectAll" msgid="6876518925844129331">"ସବୁ ଚୟନ କରନ୍ତୁ"</string>
<string name="cut" msgid="3092569408438626261">"କଟ୍"</string>
<string name="copy" msgid="2681946229533511987">"କପୀ"</string>
- <!-- no translation found for failed_to_copy_to_clipboard (1833662432489814471) -->
- <skip />
+ <string name="failed_to_copy_to_clipboard" msgid="1833662432489814471">"କ୍ଲିପ୍ବୋର୍ଡକୁ କପୀ କରିହେଲା ନାହିଁ"</string>
<string name="paste" msgid="5629880836805036433">"ପେଷ୍ଟ କରନ୍ତୁ"</string>
<string name="paste_as_plain_text" msgid="5427792741908010675">"ସାଦା ଟେକ୍ସଟ୍ ଭାବରେ ପେଷ୍ଟ କରନ୍ତୁ"</string>
<string name="replace" msgid="5781686059063148930">"ବଦଳାନ୍ତୁ…"</string>
@@ -1083,30 +1009,38 @@
<string name="selectTextMode" msgid="1018691815143165326">"ଟେକ୍ସଟ୍ ଚୟନ କରନ୍ତୁ"</string>
<string name="undo" msgid="7905788502491742328">"ପୂର୍ବ ପରି କରନ୍ତୁ"</string>
<string name="redo" msgid="7759464876566803888">"ପୁଣି କରନ୍ତୁ"</string>
- <!-- no translation found for autofill (3035779615680565188) -->
- <skip />
+ <string name="autofill" msgid="3035779615680565188">"ଅଟୋଫିଲ୍"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"ଟେକ୍ସଟ୍ ଚୟନ"</string>
<string name="addToDictionary" msgid="4352161534510057874">"ଶବ୍ଦକୋଷରେ ଯୋଡ଼ନ୍ତୁ"</string>
<string name="deleteText" msgid="6979668428458199034">"ଡିଲିଟ୍ କରନ୍ତୁ"</string>
<string name="inputMethod" msgid="1653630062304567879">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ଟେକ୍ସଟ୍ କାର୍ଯ୍ୟ"</string>
- <!-- no translation found for email (4560673117055050403) -->
+ <string name="email" msgid="4560673117055050403">"ଇମେଲ୍"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
<skip />
- <!-- no translation found for dial (1253998302767701559) -->
+ <string name="dial" msgid="1253998302767701559">"କଲ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
<skip />
- <!-- no translation found for map (6521159124535543457) -->
+ <string name="map" msgid="6521159124535543457">"ଠାବ କରନ୍ତୁ"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
<skip />
- <!-- no translation found for browse (1245903488306147205) -->
+ <string name="browse" msgid="1245903488306147205">"ଖୋଲନ୍ତୁ"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
<skip />
- <!-- no translation found for sms (4560537514610063430) -->
+ <string name="sms" msgid="4560537514610063430">"ମେସେଜ୍"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
<skip />
- <!-- no translation found for add_contact (7867066569670597203) -->
+ <string name="add_contact" msgid="7867066569670597203">"ଯୋଡ଼ନ୍ତୁ"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
<skip />
- <!-- no translation found for view_calendar (979609872939597838) -->
+ <string name="view_calendar" msgid="979609872939597838">"ଦେଖନ୍ତୁ"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
<skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
+ <string name="add_calendar_event" msgid="1953664627192056206">"ନିର୍ଦ୍ଧାରିତ କରନ୍ତୁ"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
<skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
+ <string name="view_flight" msgid="7691640491425680214">"ଟ୍ରାକ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
<skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"ଷ୍ଟୋରେଜ୍ ସ୍ପେସ୍ ଶେଷ ହେବାରେ ଲାଗିଛି"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"କିଛି ସିଷ୍ଟମ ଫଙ୍କଶନ୍ କାମ କରିନପାରେ"</string>
@@ -1123,36 +1057,25 @@
<string name="capital_off" msgid="6815870386972805832">"ଅଫ୍"</string>
<string name="whichApplication" msgid="4533185947064773386">"ବ୍ୟବହାର କରି କାର୍ଯ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
<string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ବ୍ୟବହାର କରି କାର୍ଯ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
- <!-- no translation found for whichApplicationLabel (7425855495383818784) -->
- <skip />
+ <string name="whichApplicationLabel" msgid="7425855495383818784">"କାର୍ଯ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
<string name="whichViewApplication" msgid="3272778576700572102">"ସହିତ ଖୋଲନ୍ତୁ"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ସହିତ ଖୋଲନ୍ତୁ"</string>
- <!-- no translation found for whichViewApplicationLabel (2666774233008808473) -->
- <skip />
+ <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ଖୋଲନ୍ତୁ"</string>
<string name="whichEditApplication" msgid="144727838241402655">"ସହିତ ଏଡିଟ୍ କରନ୍ତୁ"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sରେ ସଂଶୋଧନ କରନ୍ତୁ"</string>
- <!-- no translation found for whichEditApplicationLabel (7183524181625290300) -->
- <skip />
+ <string name="whichEditApplicationLabel" msgid="7183524181625290300">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"ଏହାଙ୍କ ସହ ଶେୟାର୍ କରନ୍ତୁ"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s ସହିତ ଶେୟାର୍ କରନ୍ତୁ"</string>
- <!-- no translation found for whichSendApplicationLabel (4579076294675975354) -->
- <skip />
- <!-- no translation found for whichSendToApplication (8272422260066642057) -->
- <skip />
- <!-- no translation found for whichSendToApplicationNamed (7768387871529295325) -->
- <skip />
- <!-- no translation found for whichSendToApplicationLabel (8878962419005813500) -->
- <skip />
+ <string name="whichSendApplicationLabel" msgid="4579076294675975354">"ଶେୟାର୍ କରନ୍ତୁ"</string>
+ <string name="whichSendToApplication" msgid="8272422260066642057">"ଏହା ଜରିଆରେ ପଠାନ୍ତୁ"</string>
+ <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"%1$s ଜରିଆରେ ପଠାନ୍ତୁ"</string>
+ <string name="whichSendToApplicationLabel" msgid="8878962419005813500">"ପଠାନ୍ତୁ"</string>
<string name="whichHomeApplication" msgid="4307587691506919691">"ହୋମ୍ ଆପ୍ ଚୟନ କରନ୍ତୁ"</string>
<string name="whichHomeApplicationNamed" msgid="4493438593214760979">"ହୋମ୍ ରୂପରେ %1$s ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <!-- no translation found for whichHomeApplicationLabel (809529747002918649) -->
- <skip />
- <!-- no translation found for whichImageCaptureApplication (3680261417470652882) -->
- <skip />
- <!-- no translation found for whichImageCaptureApplicationNamed (8619384150737825003) -->
- <skip />
- <!-- no translation found for whichImageCaptureApplicationLabel (6390303445371527066) -->
- <skip />
+ <string name="whichHomeApplicationLabel" msgid="809529747002918649">"ଇମେଜ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
+ <string name="whichImageCaptureApplication" msgid="3680261417470652882">"ଏହା ସହ ଇମେଜ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
+ <string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"%1$s ସହ ଇମେଜ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
+ <string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"ଇମେଜ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
<string name="alwaysUse" msgid="4583018368000610438">"ଏହି କାର୍ଯ୍ୟ ପାଇଁ ଡିଫଲ୍ଟ ଭାବେ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"ଏକ ଭିନ୍ନ ଆପ୍ର ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"\"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ > ଆପ୍ > ଡାଉନଲୋଡ୍ କରାଯାଇଛି\"ରେ ଡିଫଲ୍ଟ ଖାଲି କରନ୍ତୁ।"</string>
@@ -1161,28 +1084,19 @@
<string name="noApplications" msgid="2991814273936504689">"କୌଣସି ଆପ୍ ଏହି କାର୍ଯ୍ୟ କରିପାରିବ ନାହିଁ।"</string>
<string name="aerr_application" msgid="250320989337856518">"<xliff:g id="APPLICATION">%1$s</xliff:g> ବନ୍ଦ ହୋଇଯାଇଛି"</string>
<string name="aerr_process" msgid="6201597323218674729">"<xliff:g id="PROCESS">%1$s</xliff:g> ବନ୍ଦ ହୋଇଯାଇଛି"</string>
- <!-- no translation found for aerr_application_repeated (3146328699537439573) -->
- <skip />
- <!-- no translation found for aerr_process_repeated (6235302956890402259) -->
- <skip />
+ <string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> ବାରମ୍ବାର ବନ୍ଦ ହେଉଛି"</string>
+ <string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> ବାରମ୍ବାର ବନ୍ଦ ହେଉଛି"</string>
<string name="aerr_restart" msgid="7581308074153624475">"ଆପ୍କୁ ପୁଣି ଖୋଲନ୍ତୁ"</string>
<string name="aerr_report" msgid="5371800241488400617">"ମତାମତ ପଠାନ୍ତୁ"</string>
<string name="aerr_close" msgid="2991640326563991340">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <!-- no translation found for aerr_mute (1974781923723235953) -->
- <skip />
- <!-- no translation found for aerr_wait (3199956902437040261) -->
- <skip />
- <!-- no translation found for aerr_close_app (3269334853724920302) -->
- <skip />
+ <string name="aerr_mute" msgid="1974781923723235953">"ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ ନହେବା ପର୍ଯ୍ୟନ୍ତ ମ୍ୟୁଟ୍ ରଖନ୍ତୁ"</string>
+ <string name="aerr_wait" msgid="3199956902437040261">"ଅପେକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="aerr_close_app" msgid="3269334853724920302">"ଆପ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="anr_title" msgid="4351948481459135709"></string>
- <!-- no translation found for anr_activity_application (8493290105678066167) -->
- <skip />
- <!-- no translation found for anr_activity_process (1622382268908620314) -->
- <skip />
- <!-- no translation found for anr_application_process (6417199034861140083) -->
- <skip />
- <!-- no translation found for anr_process (6156880875555921105) -->
- <skip />
+ <string name="anr_activity_application" msgid="8493290105678066167">"<xliff:g id="APPLICATION">%2$s</xliff:g> କାମ କରୁନାହିଁ"</string>
+ <string name="anr_activity_process" msgid="1622382268908620314">"<xliff:g id="ACTIVITY">%1$s</xliff:g> କାମ କରୁନାହିଁ"</string>
+ <string name="anr_application_process" msgid="6417199034861140083">"<xliff:g id="APPLICATION">%1$s</xliff:g> କାମ କରୁନାହିଁ"</string>
+ <string name="anr_process" msgid="6156880875555921105">"<xliff:g id="PROCESS">%1$s</xliff:g> ପ୍ରୋସେସ୍ କାମ କରୁନାହିଁ"</string>
<string name="force_close" msgid="8346072094521265605">"ଠିକ୍ ଅଛି"</string>
<string name="report" msgid="4060218260984795706">"ରିପୋର୍ଟ"</string>
<string name="wait" msgid="7147118217226317732">"ଅପେକ୍ଷା କରନ୍ତୁ"</string>
@@ -1195,49 +1109,33 @@
<string name="screen_compat_mode_hint" msgid="1064524084543304459">"\"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ > ଆପ୍ > ଡାଉନଲୋଡ୍ କରାଯାଇଛି\"ରେ ଏହାକୁ ପୁନଃ-ସକ୍ଷମ କରନ୍ତୁ।"</string>
<string name="unsupported_display_size_message" msgid="6545327290756295232">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବର୍ତ୍ତମାନର ଡିସ୍ପ୍ଲେ ଆକାର ସେଟିଙ୍ଗ ସପୋର୍ଟ କରେନାହିଁ ଏବଂ ଅପ୍ରତ୍ୟାଶିତ କାର୍ଯ୍ୟ କରିପାରେ।"</string>
<string name="unsupported_display_size_show" msgid="7969129195360353041">"ସର୍ବଦା ଦେଖାନ୍ତୁ"</string>
- <!-- no translation found for unsupported_compile_sdk_message (4253168368781441759) -->
- <skip />
- <!-- no translation found for unsupported_compile_sdk_show (2681877855260970231) -->
- <skip />
- <!-- no translation found for unsupported_compile_sdk_check_update (3312723623323216101) -->
- <skip />
+ <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଏକ କମ୍ପାଟିବଲ୍ ନଥିବା Android OSରେ ତିଆରି ହୋଇଛି ଏବଂ ଆକସ୍ମିକ ଗତିବିଧି ଦେଖାଦେଇପାରେ। ଆପ୍ର ଏକ ଅପଡେଟ୍ ଭର୍ସନ୍ ଉପଲବ୍ଧ ରହିପାରେ।"</string>
+ <string name="unsupported_compile_sdk_show" msgid="2681877855260970231">"ସର୍ବଦା ଦେଖାନ୍ତୁ"</string>
+ <string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"କୌଣସି ଅପଡେଟ୍ ଅଛି କି ନାହିଁ ଦେଖନ୍ତୁ"</string>
<string name="smv_application" msgid="3307209192155442829">"ଆପ୍ <xliff:g id="APPLICATION">%1$s</xliff:g> (ପ୍ରକ୍ରିୟା <xliff:g id="PROCESS">%2$s</xliff:g>) ଏହାର ସ୍ୱ-ଲାଗୁ କରାଯାଇଥିବା ଷ୍ଟ୍ରିକ୍ଟ-ମୋଡ୍ ପଲିସୀ ଉଲ୍ଲଂଘନ କରିଛି।"</string>
<string name="smv_process" msgid="5120397012047462446">"ଏହି {0/PROCESS<xliff:g id="PROCESS">%1$s</xliff:g> ନିଜ ଦ୍ୱାରା ଲାଗୁ କରାଯାଇଥିବା ଷ୍ଟ୍ରିକ୍ଟମୋଡ୍ ପଲିସୀକୁ ଉଲ୍ଲଂଘନ କରିଛି।"</string>
- <!-- no translation found for android_upgrading_title (7513829952443484438) -->
- <skip />
- <!-- no translation found for android_upgrading_title (4503169817302593560) -->
- <skip />
- <!-- no translation found for android_upgrading_title (7009520271220804517) -->
- <skip />
- <!-- no translation found for android_start_title (4536778526365907780) -->
- <skip />
- <!-- no translation found for android_start_title (4929837533850340472) -->
- <skip />
- <!-- no translation found for android_start_title (7467484093260449437) -->
- <skip />
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ଫୋନ୍ ଅପଡେଟ୍ ହେଉଛି…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ଟାବଲେଟ୍ ଅପଡେଟ୍ ହେଉଛି…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ଡିଭାଇସ୍ ଅପଡେଟ୍ ହେଉଛି…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ଫୋନ୍ ଆରମ୍ଭ ହେଉଛି…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ଟାବଲେଟ୍ ଆରମ୍ଭ ହେଉଛି…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ଡିଭାଇସ୍ ଆରମ୍ଭ ହେଉଛି…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ଷ୍ଟୋରେଜ୍ ବଢ଼ାଯାଉଛି"</string>
- <!-- no translation found for android_upgrading_notification_title (1511552415039349062) -->
- <skip />
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"ସିଷ୍ଟମ୍ ଅପଡେଟ୍ ସମାପ୍ତ ହେଉଛି…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>କୁ ଅପଗ୍ରେଡ୍ କରାଯାଉଛି…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>ରୁ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଆପ୍ ଅନୁକୂଳନ କରୁଛି।"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> ପ୍ରସ୍ତୁତ କରାଯାଉଛି।"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ଆପ୍ ଆରମ୍ଭ କରାଯାଉଛି।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ବୁଟ୍ ସମାପ୍ତ କରୁଛି।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ଚାଲୁଛି"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ଗେମ୍କୁ ଫେରିଆସିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ଗେମ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ଆପ୍ଲିକେଶନ୍ ଭଲ ଭାବେ କାମ କରିବା ପାଇଁ ଗୋଟିଏ ସମୟରେ ଏହି ଗେମ୍ଗୁଡ଼ିକ ମଧ୍ୟରୁ କେବଳ ଗୋଟିଏକୁ ହିଁ ଚଲାଇପାରିବେ।"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>କୁ ଫେରିଆସନ୍ତୁ"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ହିପ୍ ଡମ୍ପ ସଂଗ୍ରହ କରାଯାଇଛି; ଶେୟାର୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"ଟେକ୍ସଟ୍ ପାଇଁ ଏକ କାର୍ଯ୍ୟ ବାଛନ୍ତୁ"</string>
@@ -1270,44 +1168,35 @@
<item quantity="other">ମୁକ୍ତ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କଗୁଡ଼ିକ ଉପଲବ୍ଧ</item>
<item quantity="one">ମୁକ୍ତ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ</item>
</plurals>
- <!-- no translation found for wifi_available_title (3817100557900599505) -->
- <skip />
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
- <!-- no translation found for wifi_available_title_connecting (1557292688310330032) -->
- <skip />
- <!-- no translation found for wifi_available_title_connected (7542672851522241548) -->
- <skip />
- <!-- no translation found for wifi_available_title_failed_to_connect (6861772233582618132) -->
- <skip />
- <!-- no translation found for wifi_available_content_failed_to_connect (3377406637062802645) -->
- <skip />
- <!-- no translation found for wifi_available_action_connect (2635699628459488788) -->
- <skip />
- <!-- no translation found for wifi_available_action_all_networks (4368435796357931006) -->
- <skip />
- <!-- no translation found for wifi_wakeup_onboarding_title (228772560195634292) -->
- <skip />
- <!-- no translation found for wifi_wakeup_onboarding_subtext (3989697580301186973) -->
- <skip />
- <!-- no translation found for wifi_wakeup_onboarding_action_disable (838648204200836028) -->
- <skip />
- <!-- no translation found for wifi_wakeup_enabled_title (6534603733173085309) -->
- <skip />
- <!-- no translation found for wifi_wakeup_enabled_content (189330154407990583) -->
- <skip />
+ <string name="wifi_available_title" msgid="3817100557900599505">"ୱାଇ‑ଫାଇ ନେଟୱର୍କ ଖୋଲିବାକୁ କନେକ୍ଟ କରନ୍ତୁ"</string>
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"କେରିଅର୍ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ସହିତ କନେକ୍ଟ କରନ୍ତୁ"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ସହିତ କନେକ୍ଟ ହେଉଛି"</string>
+ <string name="wifi_available_title_connected" msgid="7542672851522241548">"ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କରେ କନେକ୍ଟ ହୋଇଛି"</string>
+ <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କରେ କନେକ୍ଟ କରିହେଲା ନାହିଁ"</string>
+ <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_wakeup_onboarding_title" msgid="228772560195634292">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ"</string>
+ <string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ଆପଣ ଏକ ଉଚ୍ଚ-କ୍ୱାଲିଟୀ ବିଶିଷ୍ଟ ସେଭ୍ କରାଯାଇଥିବା ନେଟ୍ୱର୍କ ପାଖରେ ଥିବା ସମୟରେ"</string>
+ <string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ପୁଣି ଅନ୍ କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="wifi_wakeup_enabled_title" msgid="6534603733173085309">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେଲା"</string>
+ <string name="wifi_wakeup_enabled_content" msgid="189330154407990583">"ସେଭ୍ ହୋଇଥିବା ନେଟ୍ୱର୍କ ନିକଟରେ ଆପଣ ଅଛନ୍ତି: <xliff:g id="NETWORK_SSID">%1$s</xliff:g>"</string>
<string name="wifi_available_sign_in" msgid="9157196203958866662">"ୱାଇ-ଫାଇ ନେଟୱର୍କରେ ସାଇନ୍-ଇନ୍ କରନ୍ତୁ"</string>
<string name="network_available_sign_in" msgid="1848877297365446605">"ନେଟ୍ୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <!-- no translation found for wifi_no_internet (8938267198124654938) -->
- <skip />
+ <string name="wifi_no_internet" msgid="8938267198124654938">"ୱାଇ-ଫାଇର କୌଣସି ଇଣ୍ଟରନେଟ୍ ଆକ୍ସେସ୍ ନାହିଁ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>କୁ ବଦଳାଗଲା"</string>
- <!-- no translation found for network_switch_metered_detail (775163331794506615) -->
- <skip />
+ <string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>ର ଇଣ୍ଟରନେଟ୍ ଆକ୍ସେସ୍ ନଥିବାବେଳେ ଡିଭାଇସ୍ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ବ୍ୟବହାର କରିଥାଏ। ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ।"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ରୁ <xliff:g id="NEW_NETWORK">%2$s</xliff:g>କୁ ବଦଳାଗଲା"</string>
- <!-- no translation found for network_switch_type_name:0 (3979506840912951943) -->
+ <string-array name="network_switch_type_name">
+ <item msgid="3979506840912951943">"ମୋବାଇଲ୍ ଡାଟା"</item>
+ <item msgid="75483255295529161">"ୱାଇ-ଫାଇ"</item>
+ <item msgid="6862614801537202646">"ବ୍ଲୁ-ଟୁଥ୍"</item>
+ <item msgid="5447331121797802871">"ଇଥରନେଟ୍"</item>
+ <item msgid="8257233890381651999">"VPN"</item>
+ </string-array>
<string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ଏକ ଅଜଣା ନେଟ୍ୱର୍କ ପ୍ରକାର"</string>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ୱାଇ-ଫାଇ ସହ ସଂଯୋଗ ହୋଇପାରିଲା ନାହିଁ"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" ଏହାର ଦୁର୍ବଳ ଇଣ୍ଟରନେଟ୍ ସଂଯୋଗ ରହିଛି।"</string>
@@ -1350,18 +1239,12 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM କାର୍ଡ ଯୋଡ଼ାଯାଇଛି"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
- <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_text_app_name (1196505084835248137) -->
- <skip />
- <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) -->
- <skip />
- <!-- no translation found for carrier_app_notification_title (8921767385872554621) -->
- <skip />
- <!-- no translation found for carrier_app_notification_text (1132487343346050225) -->
- <skip />
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ମୋବାଇଲ୍ ସେବା ସକ୍ରିୟ କରନ୍ତୁ"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ଆପଣଙ୍କର ନୂତନ SIMକୁ ସକ୍ରିୟ କରିବା ପାଇଁ କ୍ୟାରିଅର୍ ଆପ୍କୁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ଆପଣଙ୍କର ନୂତନ SIMକୁ ସକ୍ରିୟ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପ୍କୁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ଆପ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ"</string>
+ <string name="carrier_app_notification_title" msgid="8921767385872554621">"ନୂଆ SIM କାର୍ଡ ଭର୍ତ୍ତି କରାଗଲା"</string>
+ <string name="carrier_app_notification_text" msgid="1132487343346050225">"ଏହା ସେଟଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ସମୟ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"ତାରିଖ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="date_time_set" msgid="5777075614321087758">"ସେଟ୍ କରନ୍ତୁ"</string>
@@ -1371,90 +1254,81 @@
<string name="no_permissions" msgid="7283357728219338112">"କୌଣସି ଅନୁମତିର ଆବଶ୍ୟକତା ନାହିଁ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ଠିକ୍ ଅଛି"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB ମାଧ୍ୟମରେ ଏହି ଡିଭାଇସ୍କୁ ଚାର୍ଜ କରନ୍ତୁ"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB ମାଧ୍ୟମରେ ଯୋଡ଼ାଯାଇଥିବା ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ଚାଲୁ କରାଗଲା"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ମାଧ୍ୟମରେ PTPକୁ ଚାଲୁ କରାଗଲା"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ଟିଥରିଙ୍ଗ ଚାଲୁ କରାଗଲା"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ମାଧ୍ୟମରେ MIDIକୁ ଚାଲୁ କରାଗଲା"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ଆକ୍ସେସୋରୀ ଯୋଡ଼ାଗଲା"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
- <!-- no translation found for usb_unsupported_audio_accessory_title (3529881374464628084) -->
- <skip />
- <!-- no translation found for usb_unsupported_audio_accessory_message (6309553946441565215) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"ଯୋଡ଼ାଯାଇଥିବା ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଛି। ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ଆନାଲଗ୍ ଅଡିଓ ଆକ୍ସେସରୀ ଚିହ୍ନଟ ହେଲା"</string>
+ <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ଏହି ଫୋନ୍ରେ କନେକ୍ଟ ଥିବା ଡିଭାଇସ୍ କମ୍ପାଟିବଲ୍ ନୁହେଁ। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ଡିବଗିଙ୍ଗ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"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 taking_remote_bugreport_notification_title (6742483073875060934) -->
- <skip />
- <!-- no translation found for share_remote_bugreport_notification_title (4987095013583691873) -->
- <skip />
- <!-- no translation found for sharing_remote_bugreport_notification_title (7572089031496651372) -->
- <skip />
- <!-- no translation found for share_remote_bugreport_notification_message_finished (6029609949340992866) -->
- <skip />
- <!-- no translation found for share_remote_bugreport_action (6249476773913384948) -->
- <skip />
- <!-- no translation found for decline_remote_bugreport_action (6230987241608770062) -->
- <skip />
+ <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ବଗ୍ ରିପୋର୍ଟ ନିଆଯାଉଛି…"</string>
+ <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବେ?"</string>
+ <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରାଯାଉଛି…"</string>
+ <string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ଏହି ଡିଭାଇସ୍ର ସମସ୍ୟା ସମାଧାନ କରିବା ପାଇଁ ଆପଣଙ୍କର ଆଡମିନ୍ ଏକ ବଗ୍ ରିପୋର୍ଟ ମାଗିଛନ୍ତି। ଆପ୍ ଓ ଡାଟା ଶେୟର୍ କରାଯାଇପାରେ।"</string>
+ <string name="share_remote_bugreport_action" msgid="6249476773913384948">"ଶେୟାର୍ କରନ୍ତୁ"</string>
+ <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ"</string>
<string name="select_input_method" msgid="8547250819326693584">"କୀ’ବୋର୍ଡ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string name="show_ime" msgid="2506087537466597099">"ଫିଜିକାଲ୍ କୀ’ବୋର୍ଡ ସକ୍ରିୟ ଥିବାବେଳେ ଏହାକୁ ସ୍କ୍ରୀନ୍ ଉପରେ ରଖନ୍ତୁ"</string>
<string name="hardware" msgid="194658061510127999">"ଭର୍ଚୁଆଲ୍ କୀ’ବୋର୍ଡ ଦେଖାନ୍ତୁ"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (597189518763083494) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (8084622969903004900) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ଫିଜିକଲ୍ କୀ\'ବୋର୍ଡ କନଫିଗର୍ କରନ୍ତୁ"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ଭାଷା ଓ ଲେଆଉଟ୍ ଚୟନ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <!-- no translation found for alert_windows_notification_channel_group_name (1463953341148606396) -->
+ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ ଉପରେ ଦେଖାନ୍ତୁ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ଅନ୍ୟ ଆପ୍ ଉପରେ ଦେଖାଯାଉଛି"</string>
+ <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ଅନ୍ୟ ଆପ୍ ଉପରେ ଦେଖାଯାଉଛି"</string>
+ <string name="alert_windows_notification_message" msgid="8917232109522912560">"ଏହି ବୈଶିଷ୍ଟ୍ୟ <xliff:g id="NAME">%s</xliff:g> ବ୍ୟବହାର ନକରିବାକୁ ଯଦି ଆପଣ ଚାହାଁନ୍ତି, ସେଟିଙ୍ଗ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏହା ଅଫ୍ କରିଦିଅନ୍ତୁ।"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
<skip />
- <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
<skip />
- <!-- no translation found for alert_windows_notification_title (3697657294867638947) -->
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
<skip />
- <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
<skip />
- <!-- no translation found for alert_windows_notification_turn_off_action (2902891971380544651) -->
- <skip />
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ପ୍ରସ୍ତୁତ କରାଯାଉଛି"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ତ୍ରୁଟି ପାଇଁ ଯାଞ୍ଚ କରାଯାଉଛି"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ନୂଆ <xliff:g id="NAME">%s</xliff:g> ଚିହ୍ନଟ ହେଲା"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ଫଟୋ ଓ ମିଡିଆ ସ୍ଥାନାନ୍ତର କରାଯିବା ପାଇଁ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> କରପ୍ଟ ହୋଇଯାଇଛି"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> କରପ୍ଟ ହୋଇଯାଇଛି। ଠିକ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
<skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> ସପୋର୍ଟ କରୁନାହିଁ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟ୍ରେ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
- <skip />
+ <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେ ନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟରେ ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>କୁ ହଠାତ୍ କାଢ଼ିଦିଆଗଲା"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ଡାଟା ନଷ୍ଟ ନହେବା ପାଇଁ ବାହାର କରିବା ପୂର୍ବରୁ <xliff:g id="NAME">%s</xliff:g>କୁ ଅନ୍ମାଉଣ୍ଟ କରନ୍ତୁ"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> କାଢ଼ିଦିଆଗଲା"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ବାହାର କରାଗଲା; ନୂଆ ଗୋଟିଏ ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ଏପର୍ଯ୍ୟନ୍ତ ବାହାର କରାଯାଉଛି…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"କାଢ଼ନ୍ତୁ ନାହିଁ"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ନାହିଁ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ଏହି ଡିଭାଇସ୍ ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ନିଆଯାଉଛି"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ଡାଟା ନିଆଯାଉଛି"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ନେବା ସମ୍ପୂର୍ଣ୍ଣ ହେଲା"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ଡାଟା <xliff:g id="NAME">%s</xliff:g>କୁ ନିଆଗଲା"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ଡାଟା ନିଆଯାଇପାରିଲା ନାହିଁ"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ଡାଟାକୁ ମୂଳ ଲୋକେଶନରେ ଛାଡ଼ିଦିଆଗଲା"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ବାହାର କରିଦିଆଗଲା"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ବାହାର କରାଗଲା"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string>
@@ -1473,10 +1347,8 @@
<string name="permdesc_readInstallSessions" msgid="2049771699626019849">"ଅନୁପ୍ରୟୋଗର ଇନଷ୍ଟଲ୍ ଅବଧିକୁ ପଢିବାକୁ ଅନୁମତି ଦେଇଥାଏ। ଏହି ସକ୍ରିୟ ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ ବିଷୟରେ ବିବରଣୀ ଦେଖିବାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_requestInstallPackages" msgid="5782013576218172577">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଅନୁରୋଧ କରନ୍ତୁ"</string>
<string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"ପ୍ୟାକେଜଗୁଡ଼ିକର ଇନଷ୍ଟଲେଶନ୍ ଅନୁରୋଧ କରିବା ପାଇଁ ଆପ୍ଲିକେଶନକୁ ଅନୁମତି ଦିଏ।"</string>
- <!-- no translation found for permlab_requestDeletePackages (1703686454657781242) -->
- <skip />
- <!-- no translation found for permdesc_requestDeletePackages (3406172963097595270) -->
- <skip />
+ <string name="permlab_requestDeletePackages" msgid="1703686454657781242">"ପ୍ୟାକେଜ୍ ଡିଲିଟ୍ କରିବାକୁ ଅନୁରୋଧ କରେ"</string>
+ <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"ପ୍ୟାକେଜ୍ଗୁଡ଼ିକ ଡିଲିଟ୍ କରିବା ପାଇଁ ଅନୁରୋଧ କରିବାକୁ ଏକ ଆପ୍ଲିକେଶନକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"ବ୍ୟାଟେରୀ ଅନୁକୂଳନ ଏଡ଼ାଇବା ପାଇଁ ପଚାରନ୍ତୁ"</string>
<string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"ଆପ୍ ପାଇଁ ବ୍ୟାଟେରୀ ଅନୁକୂଳନ ଏଡ଼ାଇବାର ଅନୁମତି ମାଗିବା ନିମନ୍ତେ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"ଜୁମ୍ ନିୟନ୍ତ୍ରଣ ପାଇଁ ଦୁଇଥର ଟାପ୍ କରନ୍ତୁ"</string>
@@ -1505,34 +1377,28 @@
<string name="wallpaper_binding_label" msgid="1240087844304687662">"ୱାଲପେପର୍"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"ୱାଲପେପର୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ।"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"ବିଜ୍ଞପ୍ତି ଶ୍ରୋତା"</string>
- <!-- no translation found for vr_listener_binding_label (4316591939343607306) -->
- <skip />
+ <string name="vr_listener_binding_label" msgid="4316591939343607306">"VR ଲିସନର୍"</string>
<string name="condition_provider_service_binding_label" msgid="1321343352906524564">"ସର୍ତ୍ତ ପ୍ରଦାତା"</string>
- <!-- no translation found for notification_ranker_binding_label (774540592299064747) -->
- <skip />
+ <string name="notification_ranker_binding_label" msgid="774540592299064747">"ବିଜ୍ଞପ୍ତି ରେଙ୍କର୍ ସର୍ଭିସ୍"</string>
<string name="vpn_title" msgid="19615213552042827">"VPN ସକ୍ରିୟ ହେଲା"</string>
<string name="vpn_title_long" msgid="6400714798049252294">"<xliff:g id="APP">%s</xliff:g> ଦ୍ୱାରା VPN ସକ୍ରିୟ କରାଯାଇଛି"</string>
<string name="vpn_text" msgid="1610714069627824309">"ନେଟ୍ୱର୍କକୁ ପରିଚାଳନା କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>ରେ ସଂଯୋଗ କରାଯାଇଛି। ନେଟୱର୍କକୁ ପରିଚାଳନା କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ସର୍ବଦା-ଅନ୍ VPNରେ ସଂଯୋଗ କରୁଛି…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ସର୍ବଦା-ଅନ୍ VPN ସଂଯୁକ୍ତ"</string>
- <!-- no translation found for vpn_lockdown_disconnected (735805531187559719) -->
- <skip />
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ସର୍ବଦା-ଅନ୍ VPN ତ୍ରୁଟି"</string>
- <!-- no translation found for vpn_lockdown_config (8151951501116759194) -->
- <skip />
+ <string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ସର୍ବଦା-ଅନ୍ ଥିବା VPNରୁ ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ସର୍ବଦା ଅନ୍ ଥିବା VPN ସହ କନେକ୍ଟ କରିପାରିବ ନାହିଁ"</string>
+ <string name="vpn_lockdown_config" msgid="8151951501116759194">"ନେଟ୍ୱର୍କ କିମ୍ବା VPN ସେଟିଙ୍ଗ ବଦଳାନ୍ତୁ"</string>
<string name="upload_file" msgid="2897957172366730416">"ଫାଇଲ୍ ଚୟନ କରନ୍ତୁ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"କୌଣସି ଫାଇଲ୍ ଚୟନ କରାଯାଇନାହିଁ"</string>
<string name="reset" msgid="2448168080964209908">"ରିସେଟ୍ କରନ୍ତୁ"</string>
<string name="submit" msgid="1602335572089911941">"ଦାଖଲ କରନ୍ତୁ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"କାର୍ ମୋଡ୍ ସକ୍ଷମ କରାଯାଇଛି"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"କାର୍ ମୋଡ୍ରୁ ବାହାରିଯିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ଡ୍ରାଇଭିଙ୍ଗ ଆପ୍ ଚାଲୁଛି"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ଡ୍ରାଇଭିଙ୍ଗ ଆପ୍ରୁ ବାହାରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ଟିଥରିଙ୍ଗ କିମ୍ୱା ହଟସ୍ପଟ୍ ସକ୍ରିୟ ଅଛି"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ସେଟଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for disable_tether_notification_title (7526977944111313195) -->
- <skip />
- <!-- no translation found for disable_tether_notification_message (2913366428516852495) -->
- <skip />
+ <string name="disable_tether_notification_title" msgid="7526977944111313195">"ଟିଥରିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="disable_tether_notification_message" msgid="2913366428516852495">"ବିବରଣୀ ପାଇଁ ନିଜ ଆଡମିନ୍ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string>
<string name="back_button_label" msgid="2300470004503343439">"ଫେରନ୍ତୁ"</string>
<string name="next_button_label" msgid="1080555104677992408">"ପରବର୍ତ୍ତୀ"</string>
<string name="skip_button_label" msgid="1275362299471631819">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
@@ -1599,37 +1465,26 @@
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ଅଧିକ ବିକଳ୍ପ"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
- <!-- no translation found for storage_internal (3570990907910199483) -->
- <skip />
+ <string name="storage_internal" msgid="3570990907910199483">"ଶେୟାର୍ କରାଯାଇଥିବା ଇଣ୍ଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD କାର୍ଡ"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD କାର୍ଡ"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"USB ଡ୍ରାଇଭ୍"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ଡ୍ରାଇଭ୍"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ଷ୍ଟୋରେଜ୍"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for data_usage_warning_title (6499834033204801605) -->
- <skip />
- <!-- no translation found for data_usage_warning_body (7340198905103751676) -->
- <skip />
- <!-- no translation found for data_usage_mobile_limit_title (6561099244084267376) -->
- <skip />
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ଡାଟା ଚେତାବନୀ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ଆପଣ <xliff:g id="APP">%s</xliff:g> ଡାଟା ବ୍ୟବହାର କରିସାରିଛନ୍ତି"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ମୋବାଇଲ୍ ଡାଟା ଧାର୍ଯ୍ୟ ସୀମାରେ ପହଞ୍ଚିଲା"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ୱାଇ-ଫାଇ ଡାଟା ସୀମାରେ ପହଞ୍ଚିଗଲା"</string>
- <!-- no translation found for data_usage_limit_body (2908179506560812973) -->
- <skip />
- <!-- no translation found for data_usage_mobile_limit_snoozed_title (3171402244827034372) -->
- <skip />
- <!-- no translation found for data_usage_wifi_limit_snoozed_title (3547771791046344188) -->
- <skip />
- <!-- no translation found for data_usage_limit_snoozed_body (1671222777207603301) -->
- <skip />
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ଆପଣଙ୍କର ଅବଶିଷ୍ଟ ଚକ୍ର ପାଇଁ ଡାଟାକୁ ପଜ୍ କରିଦିଆଯାଇଛି"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ମୋବାଇଲ୍ ଡାଟା ସୀମାଠାରୁ ଅଧିକ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ଆପଣଙ୍କ ୱାଇ-ଫାଇ ଡାଟା ସୀମାଠାରୁ ଅଧିକ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ଆପଣଙ୍କର ଧାର୍ଯ୍ୟ ସୀମାଠାରୁ <xliff:g id="SIZE">%s</xliff:g>କୁ ଅତିକ୍ରମ କରିଛନ୍ତି"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡ ଡାଟା ପ୍ରତିବନ୍ଧିତ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ପ୍ରତିବନ୍ଧକ ବାହାର କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for data_usage_rapid_title (1809795402975261331) -->
- <skip />
- <!-- no translation found for data_usage_rapid_body (6897825788682442715) -->
- <skip />
- <!-- no translation found for data_usage_rapid_app_body (5396680996784142544) -->
- <skip />
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ମୋବାଇଲ୍ ଡାଟାର ଅଧିକ ବ୍ୟବହାର"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"ଆପଣଙ୍କର ଆପ୍ଗୁଡ଼ିକ ଦ୍ୱାରା ଦରକାରଠାରୁ ଅଧିକ ଡାଟା ବ୍ୟବହାର ହୋଇଛି"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ଦରକାରଠାରୁ ଅଧିକ ଡାଟା ବ୍ୟବହାର କରିଛି"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ସୁରକ୍ଷା ସର୍ଟିଫିକେଟ୍"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ସର୍ଟିଫିକେଟ୍ ବୈଧ ନୁହେଁ।"</string>
<string name="issued_to" msgid="454239480274921032">"ଏହାଙ୍କୁ ଜାରି କରାଯାଇଛି:"</string>
@@ -1657,11 +1512,9 @@
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string>
<string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ଫୋନ୍"</string>
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ଡକ୍ ସ୍ପିକର୍"</string>
- <!-- no translation found for default_audio_route_name_hdmi (1486254205617081251) -->
- <skip />
+ <string name="default_audio_route_name_hdmi" msgid="1486254205617081251">"HDMI"</string>
<string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ହେଡଫୋନ୍"</string>
- <!-- no translation found for default_audio_route_name_usb (1234984851352637769) -->
- <skip />
+ <string name="default_audio_route_name_usb" msgid="1234984851352637769">"USB"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"ସିଷ୍ଟମ୍"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ବ୍ଲୁ-ଟୁଥ୍ ଅଡିଓ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"ୱେୟାର୍ଲେସ୍ ଡିସ୍ପ୍ଲେ"</string>
@@ -1685,7 +1538,10 @@
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ଭୁଲ ପାଟର୍ନ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ଭୁଲ ପାସ୍ୱର୍ଡ"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"ଭୁଲ PIN"</string>
- <!-- no translation found for kg_too_many_failed_attempts_countdown (8790651267324125694) -->
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
+ <item quantity="one">1 ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
+ </plurals>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ନିଜ ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ଲେଖନ୍ତୁ"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN ଲେଖନ୍ତୁ"</string>
@@ -1722,35 +1578,23 @@
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ବାହାର କରନ୍ତୁ"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିସ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।"</string>
- <!-- no translation found for accessibility_shortcut_warning_dialog_title (8404780875025725199) -->
- <skip />
- <!-- no translation found for accessibility_shortcut_toogle_warning (7256507885737444807) -->
- <skip />
- <!-- no translation found for disable_accessibility_shortcut (627625354248453445) -->
- <skip />
- <!-- no translation found for leave_accessibility_shortcut_on (7653111894438512680) -->
- <skip />
- <!-- no translation found for color_inversion_feature_name (4231186527799958644) -->
- <skip />
- <!-- no translation found for color_correction_feature_name (6779391426096954933) -->
- <skip />
- <!-- no translation found for accessibility_shortcut_enabling_service (7771852911861522636) -->
- <skip />
- <!-- no translation found for accessibility_shortcut_disabling_service (2747243438223109821) -->
- <skip />
- <!-- no translation found for accessibility_button_prompt_text (4234556536456854251) -->
- <skip />
- <!-- no translation found for accessibility_button_instructional_text (6942300463612999993) -->
- <skip />
- <!-- no translation found for accessibility_magnification_chooser_text (1227146738764986237) -->
- <skip />
+ <string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ଆକ୍ସେସବିଲିଟି ଶର୍ଟକଟ୍ ବ୍ୟବହାର କରିବେ?"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"ସର୍ଟକଟ୍ ଅନ୍ ଥିବା ବେଳେ, ଉଭୟ ଭଲ୍ୟୁମ୍ ବଟନ୍ 3 ସେକେଣ୍ଡ ପାଇଁ ଦବାଇବା ଦ୍ୱାରା ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ ଆରମ୍ଭ ହେବ।\n\n ସମ୍ପ୍ରତି ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ୍ୟ:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n ସେଟିଙ୍ଗ ଓ ଆକ୍ସେସବିଲିଟିରେ ଆପଣ ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇ ପାରିବେ।"</string>
+ <string name="disable_accessibility_shortcut" msgid="627625354248453445">"ଶର୍ଟକଟ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"ଶର୍ଟକଟ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="color_inversion_feature_name" msgid="4231186527799958644">"ରଙ୍ଗ ବଦଳାଇବାର ସୁବିଧା"</string>
+ <string name="color_correction_feature_name" msgid="6779391426096954933">"ରଙ୍ଗ ସଂଶୋଧନ"</string>
+ <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅନ୍ କରାଯାଇଛି"</string>
+ <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅଫ୍ କରାଯାଇଛି"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ଆପଣ ଆକ୍ସେସବିଲିଟି ବଟନ୍ ଟାପ୍ କରିବା ବେଳେ ଏକ ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:"</string>
+ <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇବାକୁ, ଆକ୍ସେସବିଲିଟି ବଟନ୍ ସ୍ପର୍ଶ କରନ୍ତୁ ଓ ଧରିରଖନ୍ତୁ।"</string>
+ <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string>
<string name="user_switched" msgid="3768006783166984410">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> ରେ ସୁଇଚ୍ କରନ୍ତୁ…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"<xliff:g id="NAME">%1$s</xliff:g>ଙ୍କୁ ଲଗଆଉଟ୍ କରାଯାଉଛି…"</string>
<string name="owner_name" msgid="2716755460376028154">"ମାଲିକ"</string>
<string name="error_message_title" msgid="4510373083082500195">"ତ୍ରୁଟି"</string>
- <!-- no translation found for error_message_change_not_allowed (1238035947357923497) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1238035947357923497">"ଏହି ପରିବର୍ତ୍ତନ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନ୍ ଅନୁମତି ଦେଇନାହାଁନ୍ତି"</string>
<string name="app_not_found" msgid="3429141853498927379">"ଏହି କାର୍ଯ୍ୟକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ କୌଣସି ଆପ୍ଲିକେଶନ୍ ମିଳିଲା ନାହିଁ"</string>
<string name="revoke" msgid="5404479185228271586">"ବାହାର କରନ୍ତୁ"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1842,8 +1686,7 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"ପ୍ରିଣ୍ଟ ସେବାକୁ ସକ୍ଷମ କରାଯାଇନାହିଁ"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> ସେବା ଇନଷ୍ଟଲ୍ କରାଯାଇସାରିଛି"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"ସକ୍ଷମ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for restr_pin_enter_admin_pin (8641662909467236832) -->
- <skip />
+ <string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"ଆଡମିନ୍ PIN ଲେଖନ୍ତୁ"</string>
<string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN ଲେଖନ୍ତୁ"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"ଭୁଲ"</string>
<string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ବର୍ତ୍ତମାନର PIN"</string>
@@ -1874,16 +1717,11 @@
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ଅନପିନ୍ କରିବା ପୂର୍ବରୁ PIN ପଚାରନ୍ତୁ"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ଅନପିନ୍ କରିବା ପୂର୍ବରୁ ଲକ୍ ଖୋଲିବା ପାଟର୍ନ ପଚାରନ୍ତୁ"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ଅନପିନ୍ କରିବା ପୂର୍ବରୁ ପାସ୍ୱର୍ଡ ପଚାରନ୍ତୁ"</string>
- <!-- no translation found for package_installed_device_owner (6875717669960212648) -->
- <skip />
- <!-- no translation found for package_updated_device_owner (1847154566357862089) -->
- <skip />
- <!-- no translation found for package_deleted_device_owner (2307122077550236438) -->
- <skip />
- <!-- no translation found for battery_saver_description (5394663545060026162) -->
- <skip />
- <!-- no translation found for data_saver_description (6015391409098303235) -->
- <skip />
+ <string name="package_installed_device_owner" msgid="6875717669960212648">"ଆପଣଙ୍କ ଆଡମିନ୍ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି"</string>
+ <string name="package_updated_device_owner" msgid="1847154566357862089">"ଆପଣଙ୍କ ଆଡମିନ୍ ଅପଡେଟ୍ କରିଛନ୍ତି"</string>
+ <string name="package_deleted_device_owner" msgid="2307122077550236438">"ଆପଣଙ୍କ ଆଡମିନ୍ ଡିଲିଟ୍ କରିଛନ୍ତି"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"ବ୍ୟାଟେରୀ ଜୀବନକୁ ବଢ଼ାଇବା ପାଇଁ, ବ୍ୟାଟେରୀ ସେଭର୍ ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ କେବଳ ଜରୁରୀ ଆପ୍ଗୁଡ଼ିକୁ କାର୍ଯ୍ୟକ୍ଷମ ରଖିଥାଏ। ଏହି ସୁବିଧା ଚାଲୁ ହେବା ଦ୍ଵାରା ଭାଇବ୍ରେଶନ୍, ଅବସ୍ଥିତି ସେବା ଓ ବ୍ୟାକଗ୍ରାଉଣ୍ଡ ଡାଟାର ବ୍ୟବହାର କମ୍ କିମ୍ବା ବନ୍ଦ ହୋଇଯାଏ। ଇମେଲ୍, ମେସେଜିଙ୍ଗ ଓ ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ, ଯାହା ସିଙ୍କ ଉପରେ ନିର୍ଭର କରିଥା’ନ୍ତି, ସେଗୁଡ଼ିକୁ ନଖୋଲିବା ପର୍ଯ୍ୟନ୍ତ ଅପଡେଟ୍ ହେବେନାହିଁ। \n\n ଆପଣଙ୍କ ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଥିବାବେଳେ ବ୍ୟାଟେରୀ ସେଭର୍ ସ୍ଵଚାଳିତ ଭାବେ ବନ୍ଦ ହୋଇଯାଇଥାଏ।"</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବ୍ଲକ୍ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ସମୟରେ କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ, ଯେପରି, ଆପଣ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଯେଉଁ ଇମେଜ୍ ଦେଖାଯାଏ ନାହିଁ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ଡାଟା ସେଭର୍ ଅନ୍ କରିବେ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ଅନ୍ କରନ୍ତୁ"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1894,9 +1732,9 @@
<item quantity="other">%1$d ମିନିଟ୍ ପାଇଁ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
<item quantity="one">1 ମିନିଟ୍ ପାଇଁ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d ଘଣ୍ଟା ପାଇଁ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
- <item quantity="one">ଏକ ଘଣ୍ଟା ପାଇଁ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
+ <item quantity="one">, 1 ଘଣ୍ଟା ପାଇଁ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d ଘଣ୍ଟା ପାଇଁ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ)</item>
@@ -1910,9 +1748,9 @@
<item quantity="other">%d ମିନିଟ୍ ପାଇଁ</item>
<item quantity="one">1 ମିନିଟ୍ ପାଇଁ</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d ଘଣ୍ଟା ପାଇଁ</item>
- <item quantity="one">ଏକ ଘଣ୍ଟା ପାଇଁ</item>
+ <item quantity="one">, 1 ଘଣ୍ଟା ପାଇଁ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d ଘଣ୍ଟା ପାଇଁ</item>
@@ -1920,8 +1758,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ପରବର୍ତ୍ତୀ ଆଲାର୍ମ) ପର୍ଯ୍ୟନ୍ତ"</string>
- <!-- no translation found for zen_mode_forever (931849471004038757) -->
- <skip />
+ <string name="zen_mode_forever" msgid="931849471004038757">"ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"ଆପଣ \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ଛୋଟ କରନ୍ତୁ"</string>
@@ -1930,26 +1767,21 @@
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"ସପ୍ତାହରାତି"</string>
<string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"ସପ୍ତାହାନ୍ତ"</string>
<string name="zen_mode_default_events_name" msgid="8158334939013085363">"ଇଭେଣ୍ଟ"</string>
- <!-- no translation found for zen_mode_default_every_night_name (3012363838882944175) -->
- <skip />
+ <string name="zen_mode_default_every_night_name" msgid="3012363838882944175">"ଶୋଇବା"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ଦ୍ୱାରା ନିଶବ୍ଦ କରନ୍ତୁ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଏକ ସମସ୍ୟା ରହିଛି ଏବଂ ଆପଣ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଅସ୍ଥିର ରହିପାରେ।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଏକ ସମସ୍ୟା ରହିଛି। ବିବରଣୀ ପାଇଁ ଆପଣଙ୍କ ଉତ୍ପାଦକଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD ଅନୁରୋଧ DIAL ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD ଅନୁରୋଧ SS ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD ଅନୁରୋଧ ନୂଆ USSD ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
- <!-- no translation found for stk_cc_ussd_to_dial_video (585340552561515305) -->
- <skip />
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ଅନୁରୋଧ DIAL ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
- <!-- no translation found for stk_cc_ss_to_dial_video (4306210904450719045) -->
- <skip />
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ଅନୁରୋଧ USSD ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ଅନୁରୋଧ ନୂତନ SS ଅନୁରୋଧକୁ ସଂଶୋଧନ କରାଗଲା।"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD ଅନୁରୋଧ, ସ୍ଵାଭାବିକ କଲ୍ରେ ପରିବର୍ତ୍ତନ ହେଲା"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD ଅନୁରୋଧ, SS ଅନୁରୋଧକୁ ପରିବର୍ତ୍ତନ ହେଲା"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"ନୂତନ USSD ଅନୁରୋଧରେ ପରିବର୍ତ୍ତନ ହେଲା"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD ଅନୁରୋଧ, ଭିଡିଓ କଲ୍ରେ ପରିବର୍ତ୍ତନ ହେଲା"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SSଙ୍କ ଅନୁରୋଧକୁ ସ୍ଵାଭାବିକ କଲ୍ରେ ପରିବର୍ତ୍ତନ କରାଗଲା"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SSଙ୍କ ଅନୁରୋଧକୁ ଭିଡିଓ କଲ୍ରେ ପରିବର୍ତ୍ତନ କରାଗଲା"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS ଅନୁରୋଧ, USSD ଅନୁରୋଧକୁ ପରିବର୍ତ୍ତନ ହେଲା"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"ନୂତନ SS ଅନୁରୋଧରେ ପରିବର୍ତ୍ତନ ହେଲା"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
- <!-- no translation found for expand_button_content_description_collapsed (3609784019345534652) -->
- <skip />
- <!-- no translation found for expand_button_content_description_expanded (8520652707158554895) -->
- <skip />
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ବଢ଼ାନ୍ତୁ"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ଛୋଟ କରନ୍ତୁ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ଟୋଗଲ୍ ସମ୍ପ୍ରସାରଣ"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ପେରିଫେରିଆଲ୍ ପୋର୍ଟ"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
@@ -1963,171 +1795,115 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ଚୟନିତ</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ଚୟନିତ</item>
</plurals>
- <!-- no translation found for default_notification_channel_label (5929663562028088222) -->
- <skip />
- <!-- no translation found for importance_from_user (7318955817386549931) -->
- <skip />
+ <string name="default_notification_channel_label" msgid="5929663562028088222">"ଅବର୍ଗୀକୃତ"</string>
+ <string name="importance_from_user" msgid="7318955817386549931">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ପ୍ରମୁଖତା ଆପଣ ସେଟ୍ କରନ୍ତି।"</string>
<string name="importance_from_person" msgid="9160133597262938296">"ସମ୍ପୃକ୍ତ ଲୋକଙ୍କ କାରଣରୁ ଏହା ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଅଟେ।"</string>
- <!-- no translation found for user_creation_account_exists (1942606193570143289) -->
- <skip />
- <!-- no translation found for user_creation_adding (4482658054622099197) -->
- <skip />
- <!-- no translation found for language_selection_title (2680677278159281088) -->
- <skip />
+ <string name="user_creation_account_exists" msgid="1942606193570143289">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ସହ ଏକ ନୂଆ ୟୁଜର୍ ତିଆରି କରିବା ପାଇଁ <xliff:g id="APP">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="user_creation_adding" msgid="4482658054622099197">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ସହ ଏକ ନୂଆ ୟୁଜର୍ ତିଆରି କରିବାକୁ <xliff:g id="APP">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ (ଏହି ଆକାଉଣ୍ଟରେ ଜଣେ ୟୁଜର୍ ପୂର୍ବରୁ ରହିଛନ୍ତି)?"</string>
+ <string name="language_selection_title" msgid="2680677278159281088">"ଏକ ଭାଷା ଯୋଡ଼ନ୍ତୁ"</string>
<string name="country_selection_title" msgid="2954859441620215513">"ପସନ୍ଦର ଅଞ୍ଚଳ"</string>
<string name="search_language_hint" msgid="7042102592055108574">"ଭାଷାର ନାମ ଟାଇପ୍ କରନ୍ତୁ"</string>
<string name="language_picker_section_suggested" msgid="8414489646861640885">"ପରାମର୍ଶିତ"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"ସମସ୍ତ ଭାଷା"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ସମସ୍ତ ଅଞ୍ଚଳ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"ୱର୍କ ପ୍ରୋଫାଇଲ୍କୁ ଚାଲୁ କରିବେ?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"ଆପଣଙ୍କର କାର୍ଯ୍ୟକାରୀ ଆପ୍, ବିଜ୍ଞପ୍ତି, ଡାଟା ଓ ଅନ୍ୟ ୱର୍କ ପ୍ରୋଫାଇଲ୍ଗୁଡ଼ିକ ଚାଲୁ ହୋଇଯିବ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ଅନ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ଏହି ଆପ୍କୁ Androidର ପୁରୁଣା ଭର୍ସନ୍ ପାଇଁ ନିର୍ମାଣ କରାଯାଇଥିଲା ଏବଂ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ। ଏହାପାଇଁ ଅପଡେଟ୍ ଅଛି କି ନାହିଁ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ଡେଭେଲପର୍ଙ୍କ ସହିତ ସମ୍ପର୍କ କରନ୍ତୁ।"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ଅପଡେଟ୍ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"ଆପଣଙ୍କ ପାଖରେ ନୂଆ ମେସେଜ୍ ରହିଛି"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"ଦେଖିବା ପାଇଁ SMS ଆପ୍ ଖୋଲନ୍ତୁ"</string>
- <!-- no translation found for user_encrypted_title (9054897468831672082) -->
- <skip />
- <!-- no translation found for user_encrypted_message (4923292604515744267) -->
- <skip />
- <!-- no translation found for user_encrypted_detail (5708447464349420392) -->
- <skip />
- <!-- no translation found for profile_encrypted_detail (3700965619978314974) -->
- <skip />
- <!-- no translation found for profile_encrypted_message (6964994232310195874) -->
- <skip />
- <!-- no translation found for usb_mtp_launch_notification_title (8359219638312208932) -->
- <skip />
- <!-- no translation found for usb_mtp_launch_notification_description (8541876176425411358) -->
- <skip />
+ <string name="user_encrypted_title" msgid="9054897468831672082">"କିଛି ବିଶେଷତା କାମ କରିନପାରେ"</string>
+ <string name="user_encrypted_message" msgid="4923292604515744267">"ଅନଲକ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="user_encrypted_detail" msgid="5708447464349420392">"ୟୁଜର୍ଙ୍କ ଡାଟା ଲକ୍ ହେଲା"</string>
+ <string name="profile_encrypted_detail" msgid="3700965619978314974">"ୱର୍କ ପ୍ରୋଫାଇଲ୍ ଲକ୍ ଅଛି"</string>
+ <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>
- <!-- no translation found for unpin_target (3556545602439143442) -->
- <skip />
+ <string name="unpin_target" msgid="3556545602439143442">"ଅନପିନ୍ କରନ୍ତୁ"</string>
<string name="app_info" msgid="6856026610594615344">"ଆପ୍ ସୂଚନା"</string>
- <!-- no translation found for negative_duration (5688706061127375131) -->
- <skip />
+ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ଡେମୋ ଆରମ୍ଭ କରାଯାଉଛି…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"ଡିଭାଇସ୍କୁ ରିସେଟ୍ କରାଯାଉଛି…"</string>
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"ଅକ୍ଷମ ହୋଇଛି <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="conference_call" msgid="3751093130790472426">"କନ୍ଫରେନ୍ସ କଲ୍"</string>
<string name="tooltip_popup_title" msgid="5253721848739260181">"ଟୁଲଟିପ୍"</string>
- <!-- no translation found for app_category_game (5431836943981492993) -->
- <skip />
- <!-- no translation found for app_category_audio (1659853108734301647) -->
- <skip />
- <!-- no translation found for app_category_video (2728726078629384196) -->
- <skip />
- <!-- no translation found for app_category_image (4867854544519846048) -->
- <skip />
- <!-- no translation found for app_category_social (5842783057834965912) -->
- <skip />
- <!-- no translation found for app_category_news (7496506240743986873) -->
- <skip />
- <!-- no translation found for app_category_maps (5878491404538024367) -->
- <skip />
- <!-- no translation found for app_category_productivity (3742083261781538852) -->
- <skip />
- <!-- no translation found for device_storage_monitor_notification_channel (3295871267414816228) -->
- <skip />
- <!-- no translation found for adb_debugging_notification_channel_tv (5537766997350092316) -->
- <skip />
- <!-- no translation found for time_picker_hour_label (2979075098868106450) -->
- <skip />
- <!-- no translation found for time_picker_minute_label (5168864173796598399) -->
- <skip />
- <!-- no translation found for time_picker_header_text (143536825321922567) -->
- <skip />
- <!-- no translation found for time_picker_input_error (7574999942502513765) -->
- <skip />
- <!-- no translation found for time_picker_prompt_label (7588093983899966783) -->
- <skip />
- <!-- no translation found for time_picker_text_input_mode_description (4148166758173708199) -->
- <skip />
- <!-- no translation found for time_picker_radial_mode_description (4953403779779557198) -->
- <skip />
- <!-- no translation found for autofill_picker_accessibility_title (8469043291648711535) -->
- <skip />
- <!-- no translation found for autofill_save_accessibility_title (7244365268417107822) -->
- <skip />
- <!-- no translation found for autofill_error_cannot_autofill (7402758580060110371) -->
- <skip />
- <!-- no translation found for autofill_picker_no_suggestions (3908514303773350735) -->
- <skip />
- <!-- no translation found for autofill_picker_some_suggestions (5506565809835815274) -->
- <!-- no translation found for autofill_save_title (3345527308992082601) -->
- <skip />
- <!-- no translation found for autofill_save_title_with_type (8637809388029313305) -->
- <skip />
- <!-- no translation found for autofill_save_title_with_2types (5214035651838265325) -->
- <skip />
- <!-- no translation found for autofill_save_title_with_3types (6943161834231458441) -->
- <skip />
- <!-- no translation found for autofill_save_yes (6398026094049005921) -->
- <skip />
- <!-- no translation found for autofill_save_no (2625132258725581787) -->
- <skip />
- <!-- no translation found for autofill_save_type_password (5288448918465971568) -->
- <skip />
- <!-- no translation found for autofill_save_type_address (4936707762193009542) -->
- <skip />
- <!-- no translation found for autofill_save_type_credit_card (7127694776265563071) -->
- <skip />
- <!-- no translation found for autofill_save_type_username (239040540379769562) -->
- <skip />
- <!-- no translation found for autofill_save_type_email_address (5752949432129262174) -->
- <skip />
- <!-- no translation found for etws_primary_default_message_earthquake (5541962250262769193) -->
- <skip />
- <!-- no translation found for etws_primary_default_message_tsunami (1887685943498368548) -->
- <skip />
- <!-- no translation found for etws_primary_default_message_earthquake_and_tsunami (998797956848445862) -->
- <skip />
- <!-- no translation found for etws_primary_default_message_test (2709597093560037455) -->
- <skip />
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="app_category_game" msgid="5431836943981492993">"ଗେମ୍"</string>
+ <string name="app_category_audio" msgid="1659853108734301647">"ମ୍ୟୁଜିକ୍ ଓ ଅଡିଓ"</string>
+ <string name="app_category_video" msgid="2728726078629384196">"ମୁଭି ଓ ଭିଡିଓ"</string>
+ <string name="app_category_image" msgid="4867854544519846048">"ଫଟୋ ଓ ଇମେଜ୍"</string>
+ <string name="app_category_social" msgid="5842783057834965912">"ସୋସିଅଲ୍ ଓ କମ୍ୟୁନିକେଶନ୍"</string>
+ <string name="app_category_news" msgid="7496506240743986873">"ଖବର ଓ ମ୍ୟାଗାଜିନ୍"</string>
+ <string name="app_category_maps" msgid="5878491404538024367">"ମାନଚିତ୍ର ଓ ନେଭିଗେଶନ୍"</string>
+ <string name="app_category_productivity" msgid="3742083261781538852">"ଉତ୍ପାଦକତା"</string>
+ <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"ଡିଭାଇସ୍ ଷ୍ଟୋରେଜ୍"</string>
+ <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB ଡିବଗିଙ୍ଗ"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"ଘଣ୍ଟା"</string>
+ <string name="time_picker_minute_label" msgid="5168864173796598399">"ମିନିଟ୍"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"ସମୟ ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="time_picker_input_error" msgid="7574999942502513765">"ଏକ ମାନ୍ୟ ସମୟ ଲେଖନ୍ତୁ"</string>
+ <string name="time_picker_prompt_label" msgid="7588093983899966783">"ସମୟରେ ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ସମୟ ଇନପୁଟ୍ ପାଇଁ ଟେକ୍ସଟ୍ ଇନପୁଟ୍କୁ ବଦଳାନ୍ତୁ।"</string>
+ <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ସମୟ ଇନପୁଟ୍ ପାଇଁ ଘଣ୍ଟା ମୋଡ୍କୁ ବଦଳାନ୍ତୁ।"</string>
+ <string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ଅଟୋଫିଲ୍ ବିକଳ୍ପ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ଅଟୋଫିଲ୍ ପାଇଁ ସେଭ୍ କରନ୍ତୁ"</string>
+ <string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"କଣ୍ଟେଣ୍ଟ ଅଟୋଫିଲ୍ କରାଯାଇ ପାରିବ ନାହିଁ"</string>
+ <string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"କୌଣସି ଅଟୋଫିଲ୍ ପରାମର୍ଶ ନାହିଁ"</string>
+ <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
+ <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g>ଟି ଅଟୋଫିଲ୍ ପରାମର୍ଶ</item>
+ <item quantity="one">ଗୋଟିଏ ଅଟୋଫିଲ୍ ପରାମର୍ଶ</item>
+ </plurals>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>ରେ ସେଭ୍ କରିବେ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g></b>ରେ ସେଭ୍ କରିବେ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> ଏବଂ <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b>ରେ ସେଭ୍ କରିବେ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ଏବଂ <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b>ରେ ସେଭ୍ କରିବେ?"</string>
+ <string name="autofill_save_yes" msgid="6398026094049005921">"ସେଭ୍ କରନ୍ତୁ"</string>
+ <string name="autofill_save_no" msgid="2625132258725581787">"ନାଁ, ପଚାରିଥିବାରୁ ଧନ୍ୟବାଦ"</string>
+ <string name="autofill_save_type_password" msgid="5288448918465971568">"ପାସୱର୍ଡ୍"</string>
+ <string name="autofill_save_type_address" msgid="4936707762193009542">"ଠିକଣା"</string>
+ <string name="autofill_save_type_credit_card" msgid="7127694776265563071">"କ୍ରେଡିଟ୍ କାର୍ଡ"</string>
+ <string name="autofill_save_type_username" msgid="239040540379769562">"ୟୁଜରଙ୍କ ନାମ"</string>
+ <string name="autofill_save_type_email_address" msgid="5752949432129262174">"ଇମେଲ୍ ଠିକଣା"</string>
+ <string name="etws_primary_default_message_earthquake" msgid="5541962250262769193">"ଶାନ୍ତ ରୁହନ୍ତୁ ଓ ନିକଟର କୌଣସି ଏକ ଆଶ୍ରୟସ୍ଥଳ ଖୋଜନ୍ତୁ"</string>
+ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"ଉପକୂଳବର୍ତ୍ତୀ କ୍ଷେତ୍ର ଏବଂ ନଦୀର ପାର୍ଶ୍ୱ ଅଞ୍ଚଳରୁ ଏକ ଉଚ୍ଚ ଭୂମି ପରି ନିରାପଦ ସ୍ଥାନକୁ ତୁରନ୍ତ ବାହାରିଯାଆନ୍ତୁ।"</string>
+ <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"ଶାନ୍ତ ରୁହନ୍ତୁ ଓ ନିକଟର କୌଣସି ଏକ ଆଶ୍ରୟସ୍ଥଳ ଖୋଜନ୍ତୁ"</string>
+ <string name="etws_primary_default_message_test" msgid="2709597093560037455">"ଜରୁରୀକାଳୀନ ମେସେଜ୍ ପରୀକ୍ଷା"</string>
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"ଉତ୍ତର"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
- <!-- no translation found for mmcc_authentication_reject (5767701075994754356) -->
+ <string name="mmcc_authentication_reject" msgid="5767701075994754356">"SIM କାର୍ଡକୁ ଭଏସ୍ ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM କାର୍ଡକୁ ଭଏସ୍ ପାଇଁ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ"</string>
+ <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM କାର୍ଡକୁ ଭଏସ୍ ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
+ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ଫୋନକୁ ଭଏସ୍ ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
<skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr (5316658473301462825) -->
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
<skip />
- <!-- no translation found for mmcc_illegal_ms (807334478177362062) -->
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
<skip />
- <!-- no translation found for mmcc_illegal_me (1950705155760872972) -->
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
<skip />
- <!-- no translation found for popup_window_default_title (4874318849712115433) -->
- <skip />
- <!-- no translation found for slice_more_content (8504342889413274608) -->
- <skip />
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
- <!-- no translation found for shortcut_restore_not_supported (5028808567940014190) -->
- <skip />
- <!-- no translation found for shortcut_restore_signature_mismatch (2406209324521327518) -->
- <skip />
- <!-- no translation found for shortcut_restore_unknown_issue (8703738064603262597) -->
- <skip />
- <!-- no translation found for shortcut_disabled_reason_unknown (5276016910284687075) -->
- <skip />
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
- <!-- no translation found for slices_permission_request (8484943441501672932) -->
- <skip />
- <!-- no translation found for screenshot_edit (7867478911006447565) -->
- <skip />
- <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
- <skip />
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ପପ-ଅପ୍ ୱିଣ୍ଡୋ"</string>
+ <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ଆପ୍ ଭର୍ସନ୍ ପୁରୁଣା ହୋଇଯାଇଛି କିମ୍ବା ଏହି ଶର୍ଟକଟ୍ ସହିତ କାମ କରୁନାହିଁ।"</string>
+ <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ଶର୍ଟକଟ୍ ରିଷ୍ଟୋର୍ କରିହେଲା ନାହିଁ, କାରଣ ଏହି ଆପ୍ ବ୍ୟାକଅପ୍ ଏବଂ ରିଷ୍ଟୋର୍ ସପୋର୍ଟ କରେନାହିଁ"</string>
+ <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ଶର୍ଟକଟ୍ ରିଷ୍ଟୋର୍ କରିହେଲା ନାହିଁ, କାରଣ ଏହି ଆପ୍ର ସ୍ୱାକ୍ଷର ମେଳ ହେଉନାହିଁ"</string>
+ <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ଶର୍ଟକଟ୍ ରିଷ୍ଟୋର୍ କରିହେଲା ନାହିଁ"</string>
+ <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ଶର୍ଟକଟ୍ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"କୌଣସିମତେ ଖୋଲନ୍ତୁ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"ହାନିକାରକ ଆପ୍ ଚିହ୍ନଟ ହୋଇଛି"</string>
+ <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍କୁ ଦେଖାଇବା ପାଇଁ ଚାହେଁ"</string>
+ <string name="screenshot_edit" msgid="7867478911006447565">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଭାଇବ୍ରେଟ୍ ହେବ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିଃଶବ୍ଦ କରିଦିଆଯିବ"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ସିଷ୍ଟମ୍ରେ ପରିବର୍ତ୍ତନ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ଆପଣଙ୍କ ଧ୍ୟାନକୁ ଲଗାଇ ରଖିବା ପାଇଁ, ’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଲୁଚାଇଦେଉଛି"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ଏହା ନୂତନ କାର୍ଯ୍ୟକଳାପ ଅଟେ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ସିଷ୍ଟମ୍"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ସେଟିଙ୍ଗ"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 2864a85..eb6b9d0 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ਕੋਈ ਆਵਾਜ਼ੀ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ਕੋਈ ਅਵਾਜ਼ੀ ਸੇਵਾ ਜਾਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਨਹੀਂ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਬੰਦ ਹੈ"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ਰੋਮਿੰਗ ਬੈਨਰ ਚਾਲੂ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ਰੋਮਿੰਗ ਬੈਨਰ ਬੰਦ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ਸੇਵਾ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ਵਾਈ-ਫਾਈ ਤੋਂ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਦੇ ਲਈ, ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਸ ਸੇਵਾ ਦੀ ਸਥਾਪਨਾ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ। (ਗੜਬੜੀ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਨਾਲ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਰਜਿਸਟਰ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਬੇਨਤੀਆਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ਲਈ ਸਾਈਨਇਨ ਅਸ਼ੁੱਧੀ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ਸਿੰਕ ਕਰੋ"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ਸਮਕਾਲੀਕਿਰਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ਬਹੁਤ ਸਾਰੀਆਂ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ।"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ਟੈਬਲੈੱਟ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ਘੜੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ਟੀਵੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਰਤੋ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ਸੰਪਰਕ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨੀ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ ਦੇਣੇ ਹਨ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ਸਟੋਰੇਜ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ਮਾਈਕ੍ਰੋਫੋਨ"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ਕੈਮਰਾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ਤਸਵੀਰਾਂ ਲੈਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤਸਵੀਰਾਂ ਖਿੱਚਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੇਣਾ ਹੈ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੇਣਾ ਹੈ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ਸਰੀਰ ਸੰਵੇਦਕ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਸੈਂਸਰ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ਐਕਸਪਲੋਰ ਬਾਈ ਟੱਚ ਚਾਲੂ ਕਰਨਾ"</string>
@@ -492,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ਐਪ ਨੂੰ ਨਜ਼ਦੀਕੀ ਖੇਤਰ ਸੰਚਾਰ (NFC) ਟੈਗਾਂ, ਕਾਰਡਾਂ ਅਤੇ ਰੀਡਰਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ਐਪ ਨੂੰ ਕੀਲਾਕ ਅਤੇ ਕਿਸੇ ਵੀ ਸੰਬੰਧਿਤ ਪਾਸਵਰਡ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਫ਼ੋਨ ਇੱਕ ਇਨਕਮਿੰਗ ਫ਼ੋਨ ਕਾਲ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬੰਦ ਕਰਦਾ ਹੈ, ਫਿਰ ਜਦੋਂ ਕਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ ਤਾਂ ਕੀਲਾਕ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ਐਪ ਨੂੰ ਵਰਤੋਂ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰਨ ਅਤੇ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੌਜੂਦਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਟਾਓ।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
<string name="email" msgid="4560673117055050403">"ਈਮੇਲ ਕਰੋ"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"ਕਾਲ ਕਰੋ"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"ਟਿਕਾਣਾ ਦੇਖੋ"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"ਖੋਲ੍ਹੋ"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"ਸੁਨੇਹਾ ਭੇਜੋ"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"ਦੇਖੋ"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"ਸਮਾਂ-ਸੂਚੀ"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ਟਰੈਕ ਕਰੋ"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ਕੁਝ ਸਿਸਟਮ ਫੰਕਸ਼ਨ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੇ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"ਲਿਖਤ ਲਈ ਕੋਈ ਕਾਰਵਾਈ ਚੁਣੋ"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ਖੁੱਲ੍ਹੇ ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੋਵੋ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ਕੈਰੀਅਰ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ਬੰਦ ਕਰੋ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ਨਵੇਂ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਪਤਾ ਲਗਾਇਆ ਗਿਆ"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਲਈ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ਕਰਪਟਿਡ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ਗ਼ਲਤ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ਖਰਾਬ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ਅਸਮਰਥਿਤ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਅਚਨਚੇਤ ਹਟਾਇਆ ਗਿਆ"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">" ਡਾਟਾ ਦੇ ਨੁਕਸਾਨ ਤੋਂ ਬੱਚਣ ਲਈ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ <xliff:g id="NAME">%s</xliff:g> ਅਨਮਾਊਂਟ ਕਰੋ"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ਹਟਾਇਆ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਹਟਾਇਆ ਗਿਆ, ਕੋਈ ਨਵਾਂ ਸੰਮਿਲਿਤ ਕਰੋ"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ਅਜੇ ਵੀ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਕੱਢ ਰਿਹਾ ਹੈ..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ਨਾ ਹਟਾਓ"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ਲਾਪਤਾ"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਮੁੜ ਸੰਮਿਲਿਤ ਕਰੋ"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">" ਡਾਟਾ ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ਮੂਵ ਸੰਪੂਰਣ"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">" ਡਾਟਾ ਨੂੰ <xliff:g id="NAME">%s</xliff:g> ਵਿੱਚ ਮੂਵ ਕੀਤਾ ਗਿਆ"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">" ਡਾਟਾ ਨੂੰ ਮੂਵ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">" ਡਾਟਾ ਮੂਲ ਸਥਾਨ \'ਤੇ ਛੱਡਿਆ ਗਿਆ"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ਹਟਾਏ ਗਏ"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ਹਟਾਇਆ ਗਿਆ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ..."</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਤੋਂ ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"ਫਾਈਲ ਚੁਣੋ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਚੁਣੀ ਗਈ"</string>
<string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="submit" msgid="1602335572089911941">"ਪ੍ਰਸਤੁਤ ਕਰੋ"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ਗੱਡੀ ਚਲਾਉਣ ਸੰਬੰਧੀ ਐਪ ਚੱਲ ਰਹੀ ਹੈ"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ਗੱਡੀ ਚਲਾਉਣ ਸੰਬੰਧੀ ਐਪ ਤੋਂ ਬਾਹਰ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"ਬੈਟਰੀ ਲਾਈਫ਼ ਨੂੰ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਦਰਸ਼ਨ ਘਟਾਉਂਦਾ ਹੈ ਅਤੇ ਥਰਥਰਾਹਟ, ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਨੂੰ ਸੀਮਤ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ। ਈਮੇਲ, ਸੁਨੇਹਾ ਭੇਜਣੇ ਵਾਲੀਆਂ ਐਪਾਂ ਅਤੇ ਹੋਰ ਐਪਾਂ, ਜੋ ਸਮਕਾਲੀਕਰਨ \'ਤੇ ਨਿਰਭਰ ਹਨ, ਉਹ ਉਦੋਂ ਤੱਕ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਖੋਲ੍ਹਦੇ ਨਹੀਂ।\n\nਬੈਟਰੀ ਸੇਵਰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੁੰਦਾ ਹੈ।"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ਚਾਲੂ ਕਰੋ"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ਵੱਲੋਂ ਮਿਊਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਹੈ ਅਤੇ ਇਹ ਅਸਥਿਰ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਸੀ। ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਨਿਰਮਾਤਾ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD ਬੇਨਤੀ ਨੂੰ ਨਿਯਮਿਤ ਕਾਲ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD ਬੇਨਤੀ ਨੂੰ SS ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"ਨਵੀਂ USSD ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD ਬੇਨਤੀ ਨੂੰ ਵੀਡੀਓ ਕਾਲ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS ਬੇਨਤੀ ਨੂੰ ਨਿਯਮਿਤ ਕਾਲ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS ਬੇਨਤੀ ਨੂੰ ਵੀਡੀਓ ਕਾਲ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS ਬੇਨਤੀ ਨੂੰ USSD ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"ਨਵੀਂ SS ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ਸੁੰਗੇੜੋ"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ਸਿਮ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਕਰਨ ਦੀ ਵਿਵਸਥਾ ਨਹੀਂ ਹੈ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ਸਿਮ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ਫ਼ੋਨ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"ਪੌਪਅੱਪ ਵਿੰਡੋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ਐਪ ਦਾ ਵਰਜਨ ਡਾਊਨਗ੍ਰੇਡ ਕੀਤਾ ਗਿਆ, ਜਾਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ਇਹ ਨਵਾਂ ਵਤੀਰਾ ਹੈ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ਟੈਪ ਕਰਕੇ ਦੋਖੋ ਕਿ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ਸਿਸਟਮ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ਸੈਟਿੰਗਾਂ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d5515fe..92d7729 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -84,6 +84,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Brak usługi połączeń głosowych"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Brak usługi połączeń głosowych i alarmowych"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Tymczasowo wyłączone przez operatora"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Brak zasięgu sieci komórkowej"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Spróbuj zmienić preferowaną sieć. Kliknij, by zmienić."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Połączenia alarmowe są niedostępne"</string>
@@ -122,12 +124,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Baner roamingu włączony"</string>
<string name="roamingText12" msgid="1189071119992726320">"Baner roamingu wyłączony"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Wyszukiwanie usługi"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Nie udało się skonfigurować połączeń Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach. (Kod błędu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Podczas rejestrowania połączeń przez Wi-Fi u operatora wystąpił problem: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Połączenia przez Wi-Fi (%s)"</item>
@@ -161,10 +164,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później."</string>
<string name="notification_title" msgid="8967710025036163822">"Błąd logowania na konto <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronizacja"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nie udało się zsynchronizować"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Próbowano usunąć zbyt wiele elementów z aplikacji <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pamięć tabletu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Pamięć w zegarku jest pełna. Usuń niektóre pliki, by zwolnić miejsce."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Pamięć telewizora jest pełna. Usuń jakieś pliki, by zwolnić miejsce."</string>
@@ -278,40 +279,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Przełącz na profil służbowy"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostęp do kontaktów"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do kontaktów?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokalizacja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostęp do informacji o lokalizacji tego urządzenia"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendarz"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostęp do kalendarza"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"wysyłanie i wyświetlanie SMS‑ów"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na wysyłanie i wyświetlanie SMS-ów?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Pamięć wewnętrzna"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"dostęp do zdjęć, multimediów i plików na Twoim urządzeniu"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do zdjęć, multimediów i plików na urządzeniu?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"nagrywanie dźwięku"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na nagrywanie dźwięku?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Aparat"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"robienie zdjęć i nagrywanie filmów"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na robienie zdjęć i nagrywanie filmów?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"nawiązywanie połączeń telefonicznych i zarządzanie nimi"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na wykonywanie połączeń telefonicznych i zarządzanie nimi?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Czujniki na ciele"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostęp do danych czujnika podstawowych funkcji życiowych"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do danych z czujnika podstawowych funkcji życiowych?"</string>
<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>
@@ -498,6 +490,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Zezwala aplikacji aktywować metody dodawania i usuwania szablonów odcisków palców."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"używanie czytnika linii papilarnych"</string>
@@ -510,6 +504,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie rozpoznano odcisku palca."</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie można zapisać odcisku palca. Usuń istniejący odcisk palca."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string>
@@ -1056,14 +1052,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Sposób wprowadzania tekstu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Działania na tekście"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Wyślij e-maila na wybrany adres"</string>
<string name="dial" msgid="1253998302767701559">"Zadzwoń"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Zadzwoń pod wybrany numer telefonu"</string>
<string name="map" msgid="6521159124535543457">"Zlokalizuj"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Pokaż wybrany adres na mapie"</string>
<string name="browse" msgid="1245903488306147205">"Otwórz"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otwórz wybrany adres URL"</string>
<string name="sms" msgid="4560537514610063430">"Wyślij SMS-a"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Wyślij SMS-a pod wybrany numer telefonu"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Dodaj do kontaktów"</string>
<string name="view_calendar" msgid="979609872939597838">"Wyświetl"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Wyświetl wybraną datę w kalendarzu"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Zaplanuj"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Zaplanuj wydarzenie na wybraną godzinę"</string>
<string name="view_flight" msgid="7691640491425680214">"Utwór"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Śledź wybrany lot"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Kończy się miejsce"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Niektóre funkcje systemu mogą nie działać"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Za mało pamięci w systemie. Upewnij się, że masz 250 MB wolnego miejsca i uruchom urządzenie ponownie."</string>
@@ -1157,8 +1162,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Wybierz czynność, jaka ma zostać wykonana na tekście"</string>
@@ -1197,8 +1201,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Połącz się z otwartą siecią Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Połącz się z siecią Wi‑Fi operatora"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Łączę z siecią Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Połączono z siecią Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nie udało się połączyć z siecią Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string>
@@ -1314,33 +1317,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i wyłącz ją."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Wyłącz"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Przygotowuję: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sprawdzanie w poszukiwaniu błędów"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Wykryto nowy nośnik: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Do przenoszenia zdjęć i multimediów"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Nośnik <xliff:g id="NAME">%s</xliff:g> uszkodzony"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: uszkodzenie. Kliknij, by naprawić."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Nośnik <xliff:g id="NAME">%s</xliff:g> jest uszkodzony. Wybierz, by rozwiązać problem."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nośnik <xliff:g id="NAME">%s</xliff:g> nieobsługiwany"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"To urządzenie nie obsługuje <xliff:g id="NAME">%s</xliff:g>. Kliknij, by użyć obsługiwanego formatu."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"To urządzenie nie obsługuje nośnika <xliff:g id="NAME">%s</xliff:g>. Wybierz, by skonfigurować obsługiwany format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: nieoczekiwane wyjęcie"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Odłącz nośnik <xliff:g id="NAME">%s</xliff:g> przed jego wyjęciem, by uniknąć utraty danych"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Wyjęto: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Wyjęto nośnik <xliff:g id="NAME">%s</xliff:g>. Włóż nowy"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Nadal wysuwam: <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nie wyjmuj"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Skonfiguruj"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odłącz"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Przeglądaj"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Brak: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Ponownie włóż urządzenie"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Przenoszę <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Przenoszę dane"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Przenoszenie zakończone"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dane przeniesione na: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Nie udało się przenieść danych"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dane pozostały w oryginalnej lokalizacji"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Usunięto"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Odłączone"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Sprawdzam…"</string>
@@ -1399,17 +1418,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Łączę ze stałą siecią VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Połączono ze stałą siecią VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Rozłączono ze stałą siecią VPN"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nie udało się połączyć ze stałą siecią VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Zmień ustawienia sieciowe lub ustawienia sieci VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Wybierz plik"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nie wybrano pliku"</string>
<string name="reset" msgid="2448168080964209908">"Resetuj"</string>
<string name="submit" msgid="1602335572089911941">"Prześlij"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Tryb samochodowy jest włączony"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Kliknij, by zakończyć tryb samochodowy."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Aktywny tethering lub punkt dostępu"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Kliknij, by skonfigurować."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering został wyłączony"</string>
@@ -1917,6 +1933,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Karta SIM nie jest obsługiwana w przypadku usług głosowych"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Karta SIM jest niedozwolona w przypadku usług głosowych"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon jest niedozwolony w przypadku usług głosowych"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Wyskakujące okienko"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Zmieniono wersję aplikacji na starszą lub aplikacja nie jest zgodna z tym skrótem"</string>
@@ -1937,8 +1961,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"To nowe działanie. Kliknij, by zmienić."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Zmiany w trybie Nie przeszkadzać"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Kliknij, by sprawdzić, co jest zablokowane."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ustawienia"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 3380846..441ac9c 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nenhum serviço de voz nem chamada de emergência"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporariamente desativado pela sua operadora"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporariamente desativado pela sua operadora para o SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não foi possível acessar a rede móvel"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tente alterar a rede preferencial. Toque para alterar."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming ativado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desativado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Não foi possível configurar a chamada no Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Ocorreu um problema ao registrar a chamada no Wi‑Fi junto à sua operadora: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s chamada Wi-Fi"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de login para <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Não foi possível sincronizar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Tentativa de excluir muito conteúdo de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Alternar para o perfil de trabalho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acesse seus contatos"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse seus contatos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse sua agenda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envie e veja mensagens SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envie e veja mensagens SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acesse fotos, mídia e arquivos do dispositivo"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse fotos, mídia e arquivos no seu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grave áudio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grave áudio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tire fotos e grave vídeos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tire fotos e grave vídeos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> faça e gerencie chamadas telefônicas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse os dados do sensor sobre seus sinais vitais?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar cont. da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -492,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que o app execute métodos para adicionar e excluir modelos de impressão digital para uso."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"usar hardware de impressão digital"</string>
@@ -504,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Não reconhecido"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
@@ -1016,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ações de texto"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Enviar e-mail para endereço selecionado"</string>
<string name="dial" msgid="1253998302767701559">"Ligar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
<string name="map" msgid="6521159124535543457">"Localizar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localizar endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Enviar mensagem para número de telefone selecionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Adicionar"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Adicionar aos contatos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ver horário selecionado na agenda"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programar evento para a hora selecionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Rastrear"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Rastrear voo selecionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Pouco espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema podem não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string>
@@ -1117,8 +1120,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
@@ -1153,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Conectando-se à rede Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
@@ -1270,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desativar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Verificando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Analisando conteúdo atual"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novo <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toque para configurar"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e mídia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> corrompido"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para corrigir."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Ocorreu um problema com o <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toque para corrigir"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"O <xliff:g id="NAME">%s</xliff:g> está corrompido. Selecione para corrigir."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não compatível"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com esse <xliff:g id="NAME">%s</xliff:g>. Toque para configurar em um formato compatível."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo não é compatível com este <xliff:g id="NAME">%s</xliff:g>. Selecione para configurar um formato compatível."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecte <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mídia <xliff:g id="NAME">%s</xliff:g> removida."</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Mídia <xliff:g id="NAME">%s</xliff:g> removida. Insira uma nova"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ainda ejetando <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Não remova"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ejete a mídia antes da remoção para evitar a perda de conteúdo"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"É possível que algumas funcionalidades não funcionem corretamente. Insira o novo armazenamento."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejetando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Não remova"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ausente"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinserir este dispositivo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insira o dispositivo novamente"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Movendo <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Movendo dados"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Transferência concluída"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dados movidos para <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Não foi possível mover os dados"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dados deixados no local original"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transf. de conteúdo concluída"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Conteúdo movido para <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Falha ao mover o conteúdo"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Tente mover o conteúdo novamente"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removida"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejetada"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Verificando..."</string>
@@ -1355,17 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado da VPN sempre ativa"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Não foi possível se conectar à VPN sempre ativa"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Alterar configurações de VPN ou rede"</string>
<string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app de direção está em execução"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app de direção."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
@@ -1691,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita ou desativa a vibração, os serviços de localização e os dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização só podem ser atualizados se estão abertos.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1743,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Solicitação USSD alterada para chamada normal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Solicitação USSD alterada para solicitação SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Alterada para nova solicitação USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Solicitação USSD alterada para videochamada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Solicitação SS alterada para chamada normal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Solicitação SS alterada para videochamada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Solicitação SS alterada para solicitação USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Alterada para uma nova solicitação SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
@@ -1856,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM não aprovisionado para voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM não autorizado para voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não aprovisionado"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A versão do app passou por downgrade ou não é compatível com esse atalho"</string>
@@ -1876,8 +1870,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Configurações"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 324b36f..eccb4de 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Sem serviço de voz ou chamadas de emergência"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Serviço temporariamente desativado pelo operador."</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Serviço temporariamente desativado pelo operador no SIM <xliff:g id="SIMNUMBER">%d</xliff:g>."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não é possível estabelecer ligação à rede móvel."</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Experimente alterar a rede preferida. Toque para alterar."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Faixa de Roaming activada"</string>
<string name="roamingText12" msgid="1189071119992726320">"Faixa de Roaming desativada"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"A procurar Serviço"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Não foi possível configurar a funcionalidade Chamadas Wi-Fi."</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar este serviço. De seguida, nas Definições, ative novamente as Chamadas Wi-Fi. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Ocorreu um problema ao registar a funcionalidade Chamadas Wi-Fi junto do seu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chamadas por Wi-Fi da %s"</item>
@@ -481,6 +483,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite que a aplicação comunique com etiquetas, cartões e leitores Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desativar o bloqueio do ecrã"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que a aplicação desative o bloqueio de teclas e qualquer segurança por palavra-passe associada. Por exemplo, o telemóvel desativa o bloqueio de teclas quando recebe uma chamada e reativa o bloqueio de teclas ao terminar a chamada."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"Utilizar hardware biométrico"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que a aplicação utilize hardware biométrico para autenticação."</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gerir o hardware de impressão digital"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que a aplicação invoque métodos para adicionar e eliminar modelos de impressão digital para utilização."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"utilizar o hardware de impressão digital"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Não reconhecido"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"A impressão digital foi autenticada."</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não é possível armazenar a impressão digital. Remova uma impressão digital existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acções de texto"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Enviar um email para o endereço selecionado"</string>
<string name="dial" msgid="1253998302767701559">"Telefonar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Telefonar para o número de telefone selecionado"</string>
<string name="map" msgid="6521159124535543457">"Localizar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localizar o endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abrir o URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Enviar uma mensagem para o número de telefone selecionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Adicionar"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Adicionar aos contactos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ver a hora selecionada no calendário"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Agendar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Agendar um evento para a hora selecionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Monitorizar"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Monitorizar o voo selecionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Está quase sem espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema poderão não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não existe armazenamento suficiente para o sistema. Certifique-se de que tem 250 MB de espaço livre e reinicie."</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ligar à rede Wi-Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Estabelecer ligação à rede Wi‑Fi do operador"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"A ligar à rede Wi-Fi…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ligado à rede Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível ligar à rede Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplic."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desligar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"A preparar o <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"A verificar a presença de erros"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detetado"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"A verificar o <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"A rever o conteúdo atual…"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novo <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toque para configurar."</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Transf. fotos, conteúdos multimédia."</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danificado"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"O <xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para o corrigir."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Ocorreu um problema com o <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toque para corrigir."</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"O(a) <xliff:g id="NAME">%s</xliff:g> está danificado(a). Selecione para corrigir."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não suportado"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com este <xliff:g id="NAME">%s</xliff:g>. Toque para o configurar num formato compatível."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo não é compatível com este(a) <xliff:g id="NAME">%s</xliff:g>. Selecione para configurar num formato compatível."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desmontar o <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removido; insira um novo"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ainda a ejetar <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Não remover"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ejete o armazenamento multimédia antes de o remover para evitar a perda de conteúdos."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Algumas funcionalidades podem não funcionar corretamente. Insira um novo armazenamento."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"A ejetar <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Não remova."</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> em falta"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinserir este dispositivo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Volte a inserir o dispositivo."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"A mover <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"A mover dados"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Transferência concluída"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Os dados foram movidos para <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Não foi possível mover os dados"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Os dados permaneceram na localização original"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transf. de conteúdo concluída"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Conteúdo movido para o <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Não é possível mover o conteúdo"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Experimente mover novamente o conteúdo"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removido"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejetado"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"A verificar…"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu gestor"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu gestor"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado pelo seu gestor"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para prolongar a autonomia da bateria, a Poupança de bateria reduz o desempenho do dispositivo e limita ou desativa a vibração, os serviços de localização e os dados de segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização podem não ser atualizados, exceto se os abrir.\n\nA Poupança de bateria desliga-se automaticamente quando o dispositivo está a carregar."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada aplicação que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Existe um problema interno no seu dispositivo e pode ficar instável até efetuar uma reposição de dados de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Existe um problema interno no seu dispositivo. Contacte o fabricante para obter mais informações."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"O pedido USSD foi alterado para uma chamada normal."</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"O pedido USSD foi alterado para um pedido SS."</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Foi alterado para um novo pedido USSD."</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"O pedido USSD foi alterado para uma videochamada."</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"O pedido SS foi alterado para uma chamada normal."</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"O pedido SS foi alterado para uma videochamada."</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"O pedido SS foi alterado para um novo pedido USSD."</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Foi alterado para um novo pedido SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Reduzir"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM não aprovisionado para voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM não permitido para voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telemóvel não permitido para voz"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não aprovisionado"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A aplicação foi alterada para a versão anterior ou não é compatível com este atalho."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 3380846..441ac9c 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nenhum serviço de voz nem chamada de emergência"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporariamente desativado pela sua operadora"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporariamente desativado pela sua operadora para o SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não foi possível acessar a rede móvel"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tente alterar a rede preferencial. Toque para alterar."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming ativado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desativado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Não foi possível configurar a chamada no Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Ocorreu um problema ao registrar a chamada no Wi‑Fi junto à sua operadora: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s chamada Wi-Fi"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de login para <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Não foi possível sincronizar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Tentativa de excluir muito conteúdo de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Alternar para o perfil de trabalho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acesse seus contatos"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse seus contatos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse sua agenda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envie e veja mensagens SMS"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envie e veja mensagens SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acesse fotos, mídia e arquivos do dispositivo"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse fotos, mídia e arquivos no seu dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grave áudio"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grave áudio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tire fotos e grave vídeos"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tire fotos e grave vídeos?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> faça e gerencie chamadas telefônicas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse os dados do sensor sobre seus sinais vitais?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar cont. da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -492,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite que o app execute métodos para adicionar e excluir modelos de impressão digital para uso."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"usar hardware de impressão digital"</string>
@@ -504,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Não reconhecido"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
@@ -1016,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ações de texto"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Enviar e-mail para endereço selecionado"</string>
<string name="dial" msgid="1253998302767701559">"Ligar"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
<string name="map" msgid="6521159124535543457">"Localizar"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localizar endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Enviar mensagem para número de telefone selecionado"</string>
<string name="add_contact" msgid="7867066569670597203">"Adicionar"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Adicionar aos contatos"</string>
<string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ver horário selecionado na agenda"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programar evento para a hora selecionada"</string>
<string name="view_flight" msgid="7691640491425680214">"Rastrear"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Rastrear voo selecionado"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Pouco espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema podem não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string>
@@ -1117,8 +1120,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
@@ -1153,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Conectando-se à rede Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
@@ -1270,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desativar"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Verificando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Analisando conteúdo atual"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Novo <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toque para configurar"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e mídia"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> corrompido"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para corrigir."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Ocorreu um problema com o <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toque para corrigir"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"O <xliff:g id="NAME">%s</xliff:g> está corrompido. Selecione para corrigir."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não compatível"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com esse <xliff:g id="NAME">%s</xliff:g>. Toque para configurar em um formato compatível."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo não é compatível com este <xliff:g id="NAME">%s</xliff:g>. Selecione para configurar um formato compatível."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecte <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mídia <xliff:g id="NAME">%s</xliff:g> removida."</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Mídia <xliff:g id="NAME">%s</xliff:g> removida. Insira uma nova"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ainda ejetando <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Não remova"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ejete a mídia antes da remoção para evitar a perda de conteúdo"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"É possível que algumas funcionalidades não funcionem corretamente. Insira o novo armazenamento."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ejetando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Não remova"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ausente"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reinserir este dispositivo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insira o dispositivo novamente"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Movendo <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Movendo dados"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Transferência concluída"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dados movidos para <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Não foi possível mover os dados"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dados deixados no local original"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transf. de conteúdo concluída"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Conteúdo movido para <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Falha ao mover o conteúdo"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Tente mover o conteúdo novamente"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Removida"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ejetada"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Verificando..."</string>
@@ -1355,17 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado da VPN sempre ativa"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Não foi possível se conectar à VPN sempre ativa"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Alterar configurações de VPN ou rede"</string>
<string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app de direção está em execução"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app de direção."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
@@ -1691,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita ou desativa a vibração, os serviços de localização e os dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização só podem ser atualizados se estão abertos.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1743,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Solicitação USSD alterada para chamada normal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Solicitação USSD alterada para solicitação SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Alterada para nova solicitação USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Solicitação USSD alterada para videochamada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Solicitação SS alterada para chamada normal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Solicitação SS alterada para videochamada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Solicitação SS alterada para solicitação USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Alterada para uma nova solicitação SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
@@ -1856,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM não aprovisionado para voz"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM não autorizado para voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não aprovisionado"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não permitido"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A versão do app passou por downgrade ou não é compatível com esse atalho"</string>
@@ -1876,8 +1870,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Configurações"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 33bcb11..b173057 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -83,6 +83,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Fără servicii vocale"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Fără servicii de voce sau apeluri de urgență"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Dezactivat temporar de operator"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dezactivat temporar de operator pentru numărul de card SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nu se poate stabili conexiunea la rețeaua mobilă"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Încercați să schimbați rețeaua preferată. Atingeți pentru a schimba."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Apelurile de urgență nu sunt disponibile"</string>
@@ -121,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roaming activat"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roaming dezactivat"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Se caută serviciul"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Nu s-a putut configura apelarea prin Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pentru a efectua apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Apelare prin Wi-Fi %s"</item>
@@ -484,6 +486,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permite aplicației să invoce metode pentru a adăuga și pentru a șterge șabloane de amprentă pentru utilizare."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"folosește hardware-ul pentru amprentă"</string>
@@ -496,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nu este recunoscută"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Amprentă autentificată"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware-ul pentru amprentă nu este disponibil."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Amprenta nu poate fi stocată. Eliminați o amprentă existentă."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timpul pentru amprentare a expirat. Încercați din nou."</string>
@@ -1025,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metodă de intrare"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acțiuni pentru text"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Trimiteți e-mail la adresa selectată"</string>
<string name="dial" msgid="1253998302767701559">"Apelați"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Apelați numărul de telefon selectat"</string>
<string name="map" msgid="6521159124535543457">"Localizați"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Localizați adresa selectată"</string>
<string name="browse" msgid="1245903488306147205">"Deschideți"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Deschideți adresa URL selectată"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Trimiteți un mesaj la numărul de telefon selectat"</string>
<string name="add_contact" msgid="7867066569670597203">"Adăugați"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Adăugați la persoanele din Agendă"</string>
<string name="view_calendar" msgid="979609872939597838">"Afișați"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Afișați ora selectată în calendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Program"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programați evenimentul pentru momentul selectat"</string>
<string name="view_flight" msgid="7691640491425680214">"Urmăriți"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Urmăriți zborul selectat"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Spațiul de stocare aproape ocupat"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Este posibil ca unele funcții de sistem să nu funcționeze"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți."</string>
@@ -1163,8 +1177,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectați-vă la o rețea Wi‑Fi deschisă"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectați-vă la rețeaua Wi-Fi a operatorului"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Se conectează la rețeaua Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"S-a realizat conexiunea la rețeaua Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nu s-a putut stabili conexiunea la rețeaua Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string>
@@ -1280,33 +1293,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se afișează peste aplicații"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Dezactivați"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Se pregătește <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Se verifică dacă există erori"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"A fost detectat un nou <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Se verifică <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Se examinează conținutul curent"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> nou"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Atingeți pentru a configura"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pentru a transfera fotografii și fișiere media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> este deteriorat"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> este deteriorat. Atingeți pentru a remedia."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problemă cu <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Atingeți pentru a remedia"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> este corupt. Selectați pentru a remedia."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> necompatibil"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Atingeți pentru configurare într-un format compatibil."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Selectați pentru configurare într-un format compatibil."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> scos pe neașteptate"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demontați <xliff:g id="NAME">%s</xliff:g> înainte de a-l scoate pentru a nu pierde datele"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> scos"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> scos; introduceți unul nou"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Se scoate <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nu scoateți"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Îndepărtați dispozitivele media înainte de a le elimina pentru a evita pierderea conținutului"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"S-a eliminat <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Este posibil ca unele funcții să nu funcționeze corespunzător. Introduceți un spațiu de stocare nou."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Se scoate <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nu scoateți"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurați"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Scoateți"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorați"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> lipsește"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Reintroduceți dispozitivul"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Reintroduceți dispozitivul"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Se mută <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Se mută datele"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Mutare finalizată"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Date mutate pe <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Nu s-au putut muta datele"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Au rămas date în locația inițială"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transfer de conținut încheiat"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Conținut mutat pe <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Nu s-a putut muta conținutul"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Încercați să mutați din nou conținutul"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Eliminat"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Scos"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Se verifică..."</string>
@@ -1701,8 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalat de administratorul dvs."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizat de administratorul dvs."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Șters de administratorul dvs."</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Pentru a prelungi autonomia bateriei, Economisirea bateriei reduce performanțele dispozitivului și limitează sau dezactivează vibrațiile, serviciile de localizare și datele de fundal. Este posibil ca e-mailurile, mesageria și alte aplicații care depind de sincronizare să nu se actualizeze dacă nu le deschideți.\n\nEconomisirea bateriei se dezactivează automat când dispozitivul se încarcă."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activați Economizorul de date?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activați"</string>
@@ -1761,22 +1774,14 @@
<string name="muted_by" msgid="6147073845094180001">"Dezactivate de <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"A apărut o problemă internă pe dispozitiv. Pentru detalii, contactați producătorul."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Solicitarea USSD a fost schimbată cu un apel obișnuit"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Solicitarea USSD a fost schimbată cu o solicitare SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Schimbat cu o solicitare USSD nouă"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Solicitarea USSD a fost schimbată cu un apel video"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Solicitarea SS a fost schimbată cu un apel obișnuit"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Solicitarea SS a fost schimbată cu un apel video"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Solicitarea SS a fost schimbată cu o solicitare USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Schimbat cu o solicitare SS nouă"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil de serviciu"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Extindeți"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Restrângeți"</string>
@@ -1876,6 +1881,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Cardul SIM nu este activat pentru voce"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Cardul SIM nu este permis pentru voce"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonul nu este permis pentru voce"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Cardul SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nu este permis"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Cardul SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nu este prevăzut"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Cardul SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nu este permis"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Cardul SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nu este permis"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Fereastră pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplicația a trecut la o versiune inferioară sau nu este compatibilă cu această comandă rapidă"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index bea3f8b..db71ecd 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Идентификация абонента по умолчанию не запрещена. След. вызов: разрешена"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Услуга не предоставляется."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Невозможно изменить параметр идентификатора вызывающего абонента."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Мобильный Интернет недоступен"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Экстренные вызовы заблокированы"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мобильный Интернет недоступен"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Экстренные вызовы недоступны"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Голосовые вызовы недоступны"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Голосовые и экстренные вызовы недоступны"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Местная мобильная сеть временно не поддерживает эту функцию."</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сеть недоступна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Включена функция \"Звонки по Wi‑Fi\""</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Для экстренных вызовов требуется мобильная сеть."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Голосовые и экстренные вызовы недоступны"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Временно отключено вашим оператором связи."</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Временно отключено оператором связи для SIM-карты <xliff:g id="SIMNUMBER">%d</xliff:g>."</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобильная сеть недоступна"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Нажмите, чтобы выбрать другую сеть."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Экстренные вызовы недоступны"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Экстренные вызовы по Wi‑Fi недоступны."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Оповещения"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресация вызовов"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим экстренных обратных вызовов"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Баннер роуминга включен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Баннер роуминга выключен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Поиск службы"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Звонки по Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Не удалось подключить функцию \"Звонки по Wi-Fi\""</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо подключить эту услугу через оператора связи. После этого вы сможете выбрать этот параметр в настройках. Код ошибки: <xliff:g id="CODE">%1$s</xliff:g>."</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Укажите оператора и зарегистрируйтесь (код ошибки: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Ошибка подключения функции \"Звонки по Wi-Fi\" через вашего оператора: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Обрабатывается слишком много запросов. Повторите попытку позднее."</string>
<string name="notification_title" msgid="8967710025036163822">"Ошибка входа в аккаунт <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхр."</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхр."</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Слишком много удалений <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ошибка синхронизации"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Вы попытались удалить слишком много элементов (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Память планшетного ПК заполнена. Удалите какие-нибудь файлы, чтобы освободить место."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Память устройства заполнена. Удалите файлы, чтобы освободить место."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Нет места в памяти телевизора. Удалите ненужные файлы."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Администратор рабочего профиля"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"администратором домена <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Рабочий профиль удален"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Рабочий профиль удален, поскольку отсутствует приложение для администрирования"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Приложение для администрирования рабочего профиля отсутствует или повреждено. Из-за этого рабочий профиль и связанные с ним данные были удалены. Если у вас возникли вопросы, обратитесь к администратору."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Ваш рабочий профиль больше не доступен на этом устройстве"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Слишком много попыток ввести пароль."</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Это управляемое устройство"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ваша организация управляет этим устройством и может отслеживать сетевой трафик. Подробнее…"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Все данные с устройства будут удалены"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Невозможно использовать приложение для администрирования. С устройства будут удалены все данные.\n\nЕсли у вас возникли вопросы, обратитесь к администратору."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Невозможно использовать приложение для администрирования. С устройства будут удалены все данные.\n\nЕсли у вас возникли вопросы, обратитесь к администратору."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Функция печати отключена приложением \"<xliff:g id="OWNER_APP">%s</xliff:g>\""</string>
<string name="me" msgid="6545696007631404292">"Я"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Настройки планшетного ПК"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим полета"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Выключить"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Включить"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим энергосбережения"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Выключить"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Включить"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощник"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Аудиоподсказки"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Переключиться на рабочий профиль"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакты"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"доступ к контактам"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к контактам"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> доступ к контактам?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ к данным о местоположении устройства"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к данным о местоположении устройства"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> доступ к данным о местоположении устройства?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"доступ к календарю"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к календарю"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> доступ к календарю?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"отправлять и просматривать SMS-сообщения"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> отправлять и просматривать SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> отправлять и просматривать SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Память"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"доступ к фото, мультимедиа и файлам на вашем устройстве"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Разрешить приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к фото, мультимедиа и файлам на устройстве"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> доступ к фото, мультимедиа и файлам на устройстве?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"записывать аудио"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> записывать аудио"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> записывать аудио?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"снимать фото и видео"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> снимать фото и видео"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> снимать фото и видео?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"осуществление телефонных звонков и управление ими"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> выполнять звонки и управлять ими"</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>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Нательные датчики"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"доступ к данным датчиков о состоянии организма"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к данным датчиков о состоянии организма"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Разрешить приложению <b>\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"</b> доступ к данным датчиков о состоянии организма?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать Изучение касанием"</string>
@@ -310,8 +313,8 @@
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Управлять позиционированием и размером изображения на экране."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Жесты"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Может выполнять жесты нажатия, пролистывания, масштабирования и т. д."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Жесты для отпечатков пальцев"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Сохраняет жесты, выполненные на сканере отпечатков пальцев."</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Регистрировать жесты на сканере отпечатков пальцев"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Использовать сканер отпечатков пальцев для дополнительных жестов."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"Отключение/изменение строки состояния"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Приложение сможет отключать строку состояния, а также добавлять и удалять системные значки."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"Замена строки состояния"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Приложение сможет постоянно хранить свои компоненты в памяти. Это может уменьшить объем памяти, доступный другим приложениям, и замедлить работу устройства."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Сохранение элементов приложения в памяти. Это может ограничить объем памяти, доступный другим приложениям, и замедлить работу телевизора."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Приложение сможет постоянно хранить свои компоненты в памяти. Это может уменьшить объем памяти, доступный другим приложениям, и замедлить работу устройства."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"запускать активные сервисы"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Разрешить приложению использовать активные сервисы."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"Вычисление объема памяти приложений"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Приложение сможет получать сведения о размере кода, данных и кеша."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"Изменение настроек системы"</string>
@@ -484,6 +489,8 @@
<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_useBiometric" msgid="8837753668509919318">"Использование биометрического оборудования"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Приложение сможет использовать биометрическое оборудование для аутентификации"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управление сканером отпечатков"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Приложение сможет добавлять и удалять шаблоны отпечатков пальцев."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"Использование сканера отпечатков"</string>
@@ -496,6 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не распознано"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечаток пальца проверен"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Сканер недоступен"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Чтобы сохранить новый отпечаток, удалите существующий."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string>
@@ -808,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Графический ключ"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Разблокировка PIN-кода SIM-карты."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Разблокировка PUK-кода SIM-карты."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Пароль"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ввода графического ключа"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область слайдера"</string>
@@ -869,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текст скопирован в буфер обмена."</string>
<string name="more_item_label" msgid="4650918923083320495">"Ещё"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"пробел"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ввод"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"удалить"</string>
@@ -1034,14 +1050,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Операции с текстом"</string>
<string name="email" msgid="4560673117055050403">"Письмо"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Отправить письмо выбранному адресату"</string>
<string name="dial" msgid="1253998302767701559">"Позвонить"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Позвонить по выбранному номеру"</string>
<string name="map" msgid="6521159124535543457">"Найти на карте"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Показать на карте выбранный адрес"</string>
<string name="browse" msgid="1245903488306147205">"Открыть"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Открыть выбранный URL"</string>
<string name="sms" msgid="4560537514610063430">"Написать SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Отправить SMS на выбранный номер"</string>
<string name="add_contact" msgid="7867066569670597203">"Добавить"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Добавить в контакты"</string>
<string name="view_calendar" msgid="979609872939597838">"Открыть"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Посмотреть выбранный день в календаре"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Расписание"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Запланировать событие на выбранный день"</string>
<string name="view_flight" msgid="7691640491425680214">"Отследить"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Отслеживать выбранный рейс"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Недостаточно памяти"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некоторые функции могут не работать"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Недостаточно свободного места для системы. Освободите не менее 250 МБ дискового пространства и перезапустите устройство."</string>
@@ -1114,31 +1139,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Проверить обновления"</string>
<string name="smv_application" msgid="3307209192155442829">"Приложение \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" (процесс: <xliff:g id="PROCESS">%2$s</xliff:g>) нарушило собственную политику StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> нарушил собственную политику StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Обновление Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Запуск Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Обновление телефона…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Обновление планшета…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Обновление устройства…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Запуск телефона…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Запуск планшета…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Запуск устройства…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизация хранилища…"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Завершается обновление Android"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Во время обновления возможны неполадки в работе приложений."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Завершение обновления системы…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Обновление приложения \"<xliff:g id="APPLICATION">%1$s</xliff:g>\"…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизация приложения <xliff:g id="NUMBER_0">%1$d</xliff:g> из <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Подготовка приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\"..."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск приложений."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Окончание загрузки..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Приложение <xliff:g id="APP">%1$s</xliff:g> запущено"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Нажмите, чтобы вернуться в игру."</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Выберите игру"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Чтобы не снижалась производительность, не открывайте больше одной игры."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Вернуться к приложению \"<xliff:g id="OLD_APP">%1$s</xliff:g>\""</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Создан дамп кучи. Нажмите, чтобы отправить его."</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Выберите действие для текста"</string>
@@ -1177,12 +1199,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Подключитесь к открытой сети Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Подключитесь к сети Wi‑Fi оператора"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Подключение к открытой сети Wi‑Fi…"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Идет подключение к сети Wi-Fi…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Подключено к сети Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не удалось подключиться к сети Wi‑Fi"</string>
<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="1100098935861622985">"Все сети"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Все сети"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi включится автоматически"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Когда вы будете в зоне действия сохраненной сети с хорошим сигналом."</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не включать снова"</string>
@@ -1248,6 +1270,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Перезапустить"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Включить мобильную связь"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Скачайте приложение оператора, чтобы активировать новую SIM-карту"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Чтобы активировать новую SIM-карту, скачайте приложение <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Скачать приложение"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Установлена новая SIM-карта"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Нажмите, чтобы настроить."</string>
@@ -1266,13 +1289,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP включен"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Режим USB-модема включен"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI включен"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-устройство подключено"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-устройство подключено"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Нажмите, чтобы показать дополнительные параметры."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Подключенное устройство заряжается. Нажмите, чтобы увидеть другие настройки."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Обнаружено аналоговое аудиоустройство"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Подсоединенное устройство несовместимо с этим телефоном. Нажмите, чтобы узнать подробности."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Нажмите, чтобы отключить отладку по USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Нажмите, чтобы отключить отладку по USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Нажмите, чтобы отключить отладку по USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Подготовка отчета об ошибке"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Разрешить доступ к информации об ошибке?"</string>
@@ -1291,34 +1314,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Чтобы отключить эту функцию для приложения <xliff:g id="NAME">%s</xliff:g>, перейдите в настройки."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ОТКЛЮЧИТЬ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Подготовка карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Поиск ошибок"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Обнаружена новая карта \"<xliff:g id="NAME">%s</xliff:g>\""</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Отключить"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Проверка накопителя (<xliff:g id="NAME">%s</xliff:g>)…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Выполняем проверку контента."</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Новый накопитель: <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Нажмите, чтобы настроить."</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для переноса фотографий и других файлов"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> не работает"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: носитель поврежден. Нажмите, чтобы устранить неполадки."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Проблема с накопителем (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Нажмите здесь, чтобы исправить."</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Внешний носитель (<xliff:g id="NAME">%s</xliff:g>) поврежден. Выберите, чтобы исправить."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не поддерживается"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Устройство не поддерживает этот носитель (<xliff:g id="NAME">%s</xliff:g>). Нажмите, чтобы настроить."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Внешний носитель (<xliff:g id="NAME">%s</xliff:g>) не поддерживается на этом устройстве. Выберите, чтобы изменить формат."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена неправильно"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перед тем как извлечь карту \"<xliff:g id="NAME">%s</xliff:g>\", отключите ее, чтобы избежать потери данных."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена. Вставьте другую."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Извлечение карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не извлекать"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Перед тем как извлечь накопитель, отключите его, чтобы избежать потери данных."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Накопитель (<xliff:g id="NAME">%s</xliff:g>) извлечен"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Некоторые функции могут быть недоступны. Вставьте новый накопитель."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>: извлечение…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не извлекайте накопитель."</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> не найден"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Заново подключите устройство"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Перенос данных"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Перенос завершен"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Перенос данных сюда: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Не удалось перенести данные"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Данные остались там же, где были"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Контент перенесен"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Контент перенесен сюда: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Не удалось перенести контент"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Попробуйте ещё раз"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Удалено"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Извлечено"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Проверка…"</string>
@@ -1377,14 +1401,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Подключение…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Подключено"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Отключено от постоянной VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ошибка"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Нет подключения к постоянной VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Изменить настройки сети или VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Выбрать файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Не выбран файл"</string>
<string name="reset" msgid="2448168080964209908">"Сбросить"</string>
<string name="submit" msgid="1602335572089911941">"Отправить"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Режим \"В автомобиле\""</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Нажмите, чтобы выйти из автомобильного режима."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Приложение для вождения включено"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Нажмите, чтобы выйти из приложения для вождения."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Включен режим модема"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Нажмите, чтобы настроить."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Включить режим модема нельзя"</string>
@@ -1464,22 +1488,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-накопитель <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-накопитель"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Изменить"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Лимит на передачу данных"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Нажмите, чтобы проверить трафик и настройки."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Достигнут лимит трафика 2G/3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Достигнут лимит трафика 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Предупреждение"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Вы использовали <xliff:g id="APP">%s</xliff:g> трафика."</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Достигнут лимит моб. трафика"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Достигнут лимит трафика Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Передача данных приостановлена"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Превышен лимита трафика 2G и 3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Превышен лимит на трафик 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Превышен лимит на моб. трафик"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Превышен лимит трафика Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Лимит превышен на <xliff:g id="SIZE">%s</xliff:g>."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Передача данных приостановлена до конца цикла."</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Превышен лимит моб. трафика"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Превышен лимит трафика Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Вы превысили лимит на <xliff:g id="SIZE">%s</xliff:g>."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Фон. режим ограничен"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Нажмите, чтобы отменить ограничение."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Израсходовано много трафика"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"За последние несколько дней было использовано больше трафика, чем обычно. Нажмите, чтобы проверить его расход и настройки."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Высокое потребление трафика"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"В ваших приложениях было передано больше трафика, чем обычно."</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"В приложении \"<xliff:g id="APP">%s</xliff:g>\" было передано больше трафика, чем обычно."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Сертификат безопасности"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Этот сертификат действителен."</string>
<string name="issued_to" msgid="454239480274921032">"Кому выдан:"</string>
@@ -1719,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Установлено администратором"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Обновлено администратором"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Удалено администратором"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Чтобы продлить время работы устройства от батареи, в режиме энергосбережения снижается производительность, а также ограничивается использование вибросигнала, геолокации и фоновой передачи данных. Данные, требующие синхронизации, могут обновляться только после того, как вы откроете приложение.\n\nРежим энергосбережения автоматически отключается во время зарядки устройства."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Чтобы продлить время работы устройства от батареи, в режиме энергосбережения снижается производительность, а также ограничивается использование вибросигнала, геолокации и фоновой передачи данных (эти функции могут быть выключены). Данные, требующие синхронизации, могут обновляться только после того, как вы откроете приложение.\n\nРежим энергосбережения автоматически отключается во время зарядки устройства."</string>
<string name="data_saver_description" msgid="6015391409098303235">"В режиме экономии трафика фоновая передача для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Включить экономию трафика?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Включить"</string>
@@ -1735,11 +1756,11 @@
<item quantity="many">На %1$d минут (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">На %1$d минуты (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d час (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d часов (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d часов (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">На %1$d час (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="few">На %1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="many">На %1$d часов (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">На %1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">На %1$d час (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,11 +1780,11 @@
<item quantity="many">На %d минут</item>
<item quantity="other">На %d минуты</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d час</item>
- <item quantity="few">%d часа</item>
- <item quantity="many">%d часов</item>
- <item quantity="other">%d часов</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">На %d час</item>
+ <item quantity="few">На %d часа</item>
+ <item quantity="many">На %d часов</item>
+ <item quantity="other">На %d часа</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">На %d час</item>
@@ -1786,14 +1807,14 @@
<string name="muted_by" msgid="6147073845094180001">"Звук отключен приложением \"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>\""</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Произошла внутренняя ошибка, и устройство может работать нестабильно, пока вы не выполните сброс настроек."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Произошла внутренняя ошибка. Обратитесь к производителю устройства за подробными сведениями."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-запрос преобразован в DIAL-запрос"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-запрос преобразован в SS-запрос."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-запрос преобразован в новый USSD-запрос."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-запрос преобразован в запрос Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-запрос преобразован в DIAL-запрос."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-запрос преобразован в запрос Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-запрос преобразован в USSD-запрос."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-запрос преобразован в новый SS-запрос."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-запрос преобразован в обычный вызов"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-запрос преобразован в SS-запрос"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Преобразовано в USSD-запрос"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-запрос преобразован в видеовызов"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-запрос преобразован в обычный вызов"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-запрос преобразован в видеовызов"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-запрос преобразован в USSD-запрос"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Преобразовано в SS-запрос"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Рабочий профиль"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Развернуть"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Скрыть"</string>
@@ -1895,6 +1916,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-карта не активирована для голосовых вызовов"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Для SIM-карты недоступны голосовые вызовы"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Для телефона недоступны голосовые вызовы"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Использование SIM-карты <xliff:g id="SIMNUMBER">%d</xliff:g> запрещено"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-карта <xliff:g id="SIMNUMBER">%d</xliff:g> не активирована."</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Использование SIM-карты <xliff:g id="SIMNUMBER">%d</xliff:g> запрещено"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Использование SIM-карты <xliff:g id="SIMNUMBER">%d</xliff:g> запрещено"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Всплывающее окно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версия приложения устарела или несовместима с ярлыком"</string>
@@ -1907,7 +1932,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Обнаружено вредоносное приложение"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Изменить"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Для звонков и уведомлений включен вибросигнал."</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Для звонков и уведомлений отключен звук."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системные изменения"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не беспокоить"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Уведомления в режиме \"Не беспокоить\" отключены"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Этот параметр применяется впервые. Нажмите, чтобы перейти к настройкам."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройки режима \"Не беспокоить\" изменены"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Нажмите, чтобы проверить их."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Нажмите, чтобы проверить настройки."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Настройки"</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 2a6c504..b5acece 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"හඬ සේවාව නැත"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"හඬ සේවා හෝ හදිසි ඇමතුම් නොමැත"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ඔබේ වාහකය විසින් තාවකාලිකව ක්රියාවිරහිත කරන ලදී"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ජංගම ජාලය වෙත ළඟා විය නොහැකිය"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"කැමති ජාලය වෙනස් කිරීමට උත්සාහ කරන්න. වෙනස් කිරීමට තට්ටු කරන්න."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"රෝමිං බැනරය සක්රීයයි"</string>
<string name="roamingText12" msgid="1189071119992726320">"රෝමිං බැනරය අක්රියයි"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"සේවාව සඳහා සොයමින්"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi-Fi ඇමතුම් සැකසිය නොහැකි විය"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න. (දෝෂ කේතය <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"ඔබගේ වාහකය සමඟ Wi-Fi ඇමතුම් ලියාපදිංචි කිරීම නිකුත් කරන්න: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi අමතමින්"</item>
@@ -481,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"ජීවමිතික දෘඪාංග භාවිත කරන්න"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"සත්යාපනය සඳහා ජීවමිතික දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ඇඟිලි සලකුණු දෘඩාංග කළමනාකරණය කිරීම."</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ඇඟිලි සලකුණු සැකිලි එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ විධික්රම භාවිතය සඳහා මෙම යෙදුමට අවසර දෙයි."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ඇඟිලි සලකුණු දෘඩාංග භාවිතා කරන්න."</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"අඳුනාගත නොහැක"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ඇඟිලි සලකුණු දෘඪාංගය ලද නොහැකිය."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ඇඟිලි සලකුණ ගබඩා කළ නොහැක. දැනට පවතින ඇඟිලි සලකුණක් ඉවත් කරන්න."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
@@ -1007,14 +1014,23 @@
<string name="inputMethod" msgid="1653630062304567879">"ආදාන ක්රමය"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"පෙළ ක්රියාවන්"</string>
<string name="email" msgid="4560673117055050403">"ඊ-තැපෑල"</string>
+ <string name="email_desc" msgid="3638665569546416795">"තෝරා ගත් ලිපිනයට ඊ-තැපැල් කරන්න"</string>
<string name="dial" msgid="1253998302767701559">"අමතන්න"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"තෝරා ගත් දුරකථන අංකය අමතන්න"</string>
<string name="map" msgid="6521159124535543457">"ස්ථානගත කරන්න"</string>
+ <string name="map_desc" msgid="9036645769910215302">"තෝරා ගත් ලිපින පෙදෙසිය"</string>
<string name="browse" msgid="1245903488306147205">"විවෘත කරන්න"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"තෝරා ගත් URL විවෘත කරන්න"</string>
<string name="sms" msgid="4560537514610063430">"පණිවිඩය"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"තෝරා ගත් දුරකථන අංකයට පණිවිඩයක් යවන්න"</string>
<string name="add_contact" msgid="7867066569670597203">"එක් කරන්න"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"සම්බන්ධතාවලට එක් කරන්න"</string>
<string name="view_calendar" msgid="979609872939597838">"බලන්න"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"තෝරා ගත් වේලාව දින දර්ශනයෙහි බලන්න"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"කාල සටහන"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"තෝරා ගත් වේලාව සඳහා සිදුවීම කාලසටහන්ගත කරන්න"</string>
<string name="view_flight" msgid="7691640491425680214">"ශ්රව්ය ඛණ්ඩය"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"තෝරා ගත් ගුවන් ගමන හඹා යන්න"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"ආචයනය ඉඩ ප්රමාණය අඩු වී ඇත"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"සමහර පද්ධති කාර්යයන් ක්රියා නොකරනු ඇත"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"පද්ධතිය සඳහා ප්රමාණවත් ඉඩ නොමැත. ඔබට 250MB නිදහස් ඉඩක් තිබෙන ඔබට තිබෙන බව සහතික කරගෙන නැවත උත්සාහ කරන්න."</string>
@@ -1143,8 +1159,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙන්න"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"වාහක Wi-Fi ජාලයට සම්බන්ධ වන්න"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi-Fi ජාලයට සම්බන්ධ වෙමින්"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය නොහැකි විය"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string>
@@ -1260,33 +1275,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> දිස් වේ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ක්රියාවිරහිත කරන්න"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> සූදානම් කරමින්"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"වැරදි සඳහා පරීක්ෂා කරමින්"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"නව <xliff:g id="NAME">%s</xliff:g> අනාවරණය කරන ලදි"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ඡායාරූප සහ මාධ්ය හුවමාරු කිරීම සඳහා"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"දූෂිත <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> දූෂිතය. විසඳීමට තට්ටු කරන්න."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> දූෂිතයි. විසඳීමට තට්ටු කරන්න."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"සහාය නොදක්වන <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"මෙම උපාංගය මෙම <xliff:g id="NAME">%s</xliff:g> සඳහා සහාය නොදක්වයි. සහාය දක්වන ආකෘතියකින් පිහිටුවීමට තට්ටු කරන්න."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"මෙම උපාංගය මෙම <xliff:g id="NAME">%s</xliff:g> සඳහා සහාය නොදක්වයි. සහාය දක්වන ආකෘතියකින් පිහිටුවීමට තෝරන්න."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> අනපේක්ෂිතව ඉවත් කරන ලදි"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"දත්ත නැතිවීම වැළක්වීමට <xliff:g id="NAME">%s</xliff:g> ආචයනය ඉවත්කිරීමට පෙර ගලවන්න."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන ලදි"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන ලදි; අලුත් එකක් ඇතුළත් කරන්න"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> තවමත් ගලවමින්…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ඉවත් නොකරන්න"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> අස්ථානගතයි"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"මෙම උපාංගය යළි ඇතුළු කරන්න"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ගෙන යමින්"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"දත්ත ගෙන යමින්"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ගෙන යාම සම්පූර්ණ කරන්න"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"දත්ත <xliff:g id="NAME">%s</xliff:g> වෙත ගෙන යන ලදී"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"දත්ත ගෙන යාමට නොහැකි විය"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"මුල් ස්ථානයෙහි ඉතිරි දත්ත"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ඉවත් කරන ලදී"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ඉවත් කරන ලදී"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"පරික්ෂා කරමින්..."</string>
@@ -1678,8 +1709,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ඔබගේ පරිපාලක මඟින් ස්ථාපනය කර ඇත"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ඔබගේ පරිපාලක මඟින් මකා දමා ඇත"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"බැටරි ආයු කාලය දිගු කිරීමට, බැටරි සුරැකුම ඔබේ උපාංගයේ ක්රියාකාරීත්වය අඩු කරන අතර කම්පනය, ස්ථාන සේවා, සහ පසුබිම් දත්ත සීමා කරයි. ඔබ ඒවා විවෘත නොකරන්නේ නම් මිස ඊ-තැපැල්, පණිවිඩකරණය, සහ සමමුහුර්ත කිරීම මත රඳා පවතින වෙනත් යෙදුම් යාවත්කාලීන නොවිය හැකිය.\n\nඔබේ උපාංගය ආරෝපණය වන විට බැටරි සුරැකුම ස්වයංක්රියව ක්රියාවිරහිත වේ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"දත්ත සුරැකුම ක්රියාත්මක කරන්නද?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ක්රියාත්මක කරන්න"</string>
@@ -1730,22 +1760,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> විසින් නිශ්ශබ්ද කරන ලදි"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ඔබේ උපාංගය සමගින් ගැටලුවක් ඇති අතර, ඔබේ කර්මාන්තශාලා දත්ත යළි සකසන තෙක් එය අස්ථායි විය හැකිය."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ඔබේ උපාංගය සමගින් අභ්යන්තර ගැටලුවක් ඇත. විස්තර සඳහා ඔබේ නිෂ්පාදක අමතන්න."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD ඉල්ලීම සාමාන්ය ඇමතුමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD ඉල්ලීම SS ඉල්ලීමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"නව USSD ඉල්ලීමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD ඉල්ලීම වීඩියෝ ඇමතුමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS ඉල්ලීම සාමාන්ය ඇමතුමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS ඉල්ලීම වීඩියෝ ඇමතුමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS ඉල්ලීම USSD ඉල්ලීමට වෙනස් කරන ලදී"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"නව SS ඉල්ලීමට වෙනස් කරන ලදී"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"කාර්යාල පැතිකඩ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"දිග හරින්න"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"හකුළන්න"</string>
@@ -1843,6 +1865,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM හඬ සඳහා ප්රතිපාදන නොදේ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM හඬ සඳහා ඉඩ නොදේ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"දුරකථනය හඬ සඳහා ඉඩ නොදේ"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"උත්පතන කවුළුව"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"යෙදුම් අනුවාදය අවශ්රේණි කර ඇත, නැතහොත් මෙම කෙටි මග සමඟ අනුකූල නොවේ"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 8317c75..ee92b5b 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"V predvolenom nastavení nie je identifikácia volajúceho obmedzená. Ďalší hovor: Bez obmedzenia"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Služba nie je poskytovaná."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nemôžete meniť nastavenia identifikácie volajúceho."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Žiadna dátová služba"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Žiadne tiesňové hovory"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Žiadna mobilná dátová služba"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Tiesňové volania nie sú k dispozícii"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Žiadne hlasové hovory"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasové ani tiesňové volania nie sú k dispozícii"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentálne nie sú v ponuke mobilnej siete na vašom mieste"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepodarilo sa pripojiť k sieti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Ak chcete vylepšiť príjem, skúste zmeniť vybraný typ v časti Nastavenia > Sieť a internet > Mobilné siete > Preferovaný typ siete."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Volanie cez Wi‑Fi je aktívne"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Tiesňové volania vyžadujú mobilnú sieť."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Žiadna hlasová služba ani tiesňové volania"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dočasne vypnuté operátorom"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dočasne vypnuté operátorom pre SIM kartu <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nepodarilo sa pripojiť k mobilnej sieti"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Skúste zmeniť predvolenú sieť. Zmeníte ju klepnutím."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Tiesňové volania nie sú k dispozícii"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nedajú sa uskutočniť tiesňové volania cez Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornenia"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Presmerovanie hovorov"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tiesňového spätného volania"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roamingu je zapnutý"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roamingu je vypnutý"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Vyhľadávanie služby"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volanie cez Wi‑Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Volanie cez Wi-Fi sa nepodarilo nastaviť"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Ak chcete volať a odosielať správy prostredníctvom siete Wi‑Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi‑Fi. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Zaregistrujte sa u operátora (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Pri registrácii volania cez Wi‑Fi u operátora nastala chyba <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Je spracovávaných príliš veľa žiadostí. Opakujte akciu neskôr."</string>
<string name="notification_title" msgid="8967710025036163822">"Chyba prihlásenia do účtu <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronizovať"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronizovať"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Príliš veľa odstránených položiek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nie je možné synchronizovať"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pokúsili ste sa odstrániť príliš mnoho položiek typu <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Ukladací priestor tabletu je plný. Odstráňte niektoré súbory a uvoľnite miesto."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Ukladací priestor hodiniek je plný. Uvoľnite miesto odstránením niektorých súborov."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Úložisko televízora je plné. Uvoľnite miesto odstránením niektorých súborov."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Správcom vášho pracovného profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Doménou <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Pracovný profil bol odstránený"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Pracovný profil bol odstránený z dôvodu chýbajúcej aplikácie na správu"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplikácia na správu pracovného profilu buď chýba, alebo je poškodená. Z toho dôvodu bol odstránený pracovný profil aj k nemu priradené dáta. Ak potrebujete pomoc, kontaktujte svojho správcu."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Váš pracovný profil už v tomto zariadení nie je k dispozícii"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Príliš veľa pokusov o zadanie hesla"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Zariadenie je spravované"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Vaša organizácia spravuje toto zariadenie a môže sledovať sieťovú premávku. Klepnutím zobrazíte podrobnosti."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Vaše zariadenie bude vymazané"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Daná aplikácia na správu sa nedá použiť. Vaše zariadenie bude vymazané.\n\nV prípade otázok kontaktujte správcu organizácie."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Daná aplikácia na správu sa nedá použiť. Vaše zariadenie bude vymazané.\n\nV prípade otázok kontaktujte správcu organizácie."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Tlač zakázala aplikácia <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ja"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Možnosti tabletu"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim v lietadle"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim v lietadle je ZAPNUTÝ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim v lietadle je VYPNUTÝ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Šetrič batérie"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Šetrič batérie je VYPNUTÝ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Šetrič batérie je ZAPNUTÝ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavenia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomôcť"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlasový asistent"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Prepnúť na pracovný profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"prístup ku kontaktom"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k vašim kontaktom"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup ku kontaktom?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Poloha"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"prístup k polohe tohto zariadenia"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k polohe tohto zariadenia"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k polohe tohto zariadenia?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"prístup ku kalendáru"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k vášmu kalendáru"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup ku kalendáru?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"posielanie a zobrazovanie SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> odosielať a zobrazovať správy SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> odosielať a zobrazovať správy SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Úložisko"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"prístup k fotkám, médiám a súborom v zariadení"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k fotkám, médiám a súborom vo vašom zariadení"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> používať fotky, médiá a súbory v zariadení?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofón"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"nahrávanie zvuku"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> zaznamenávať zvuk"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> zaznamenávať zvuk?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotenie a natáčanie videí"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snímať fotky a zaznamenávať video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snímať fotky a zaznamenávať video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefón"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonovanie a správu hovorov"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uskutočňovať a spravovať telefonické hovory"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uskutočňovať a spravovať telefonické hovory?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Telesné senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"prístup k dátam senzorov vašich životných funkcií"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupovať k údajom senzorov o vašich životných funkciách"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> používať údaje senzorov o vašich životných funkciách?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítať obsah okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Môžete preskúmať obsah okna, s ktorým pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnúť funkciu Preskúmanie dotykom"</string>
@@ -311,7 +314,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gestá"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Je možné použiť klepnutie, prejdenie, stiahnutie prstami a ďalšie gestá."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestá odtlačkov prstov"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Dokáže zaznamenať gestá vykonané na senzore odtlačkov prstov."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Dokáže zaznamenať gestá na senzore odtlačkov prstov zariadenia."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zakázanie alebo zmeny stavového riadka"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Umožňuje aplikácii vypnúť stavový riadok alebo pridať a odstrániť systémové ikony."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"vydávanie sa za stavový riadok"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Umožňuje aplikácii uložiť niektoré svoje časti natrvalo do pamäte. Môže to obmedziť pamäť dostupnú pre ostatné aplikácie a spomaliť tak tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Umožňuje aplikácii natrvalo uložiť svoje časti v pamäti. Môže to obmedziť pamäť dostupnú pre ďalšie aplikácie, čím sa spomaľuje televízor."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Umožňuje aplikácii uložiť niektoré svoje časti natrvalo do pamäte. Môže to obmedziť pamäť dostupnú pre ostatné aplikácie a spomaliť tak telefón."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"spustiť službu v popredí"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Umožňuje aplikácii používať služby v popredí"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"zistiť veľkosť ukladacieho priestoru aplikácie"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Umožňuje aplikácii načítať svoj kód, údaje a veľkosti vyrovnávacej pamäte"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"upraviť nastavenia systému"</string>
@@ -484,6 +489,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Umožňuje aplikácii komunikovať so značkami, kartami a čítačkami s podporou technológie NFC."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivácia zámky obrazovky"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Umožňuje aplikácii zakázať uzamknutie klávesnice a akékoľvek súvisiace zabezpečenie heslom. Príkladom je zakázanie uzamknutia klávesnice pri prichádzajúcom telefonickom hovore a jeho opätovné povolenie po skončení hovoru."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"používať biometrický hardvér"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Umožňuje aplikácii používať na overenie totožnosti biometrický hardvér"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"spravovať hardvér na snímanie odtlačkov prstov"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Umožňuje aplikácii zavolať metódy, ktoré pridávajú a odstraňujú vzory odtlačkov prstov."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"použiť hardvér na snímanie odtlačkov prstov"</string>
@@ -496,6 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nebol rozpoznaný"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Odtlačok bol overený"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardvér na snímanie odtlačku prsta nie je k dispozícii"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string>
@@ -808,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odomknutie vzorom."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odomknutie tvárou."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odomknutie kódom PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Odomknutie pomocou kódu PIN SIM karty."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Odomknutie pomocou kódu PUK SIM karty."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odomknutie heslom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblasť na zadanie bezpečnostného vzoru."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblasť na prejdenie prstom."</string>
@@ -869,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text bol skopírovaný do schránky."</string>
<string name="more_item_label" msgid="4650918923083320495">"Viac"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"medzera"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"potvrdiť"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"odstrániť"</string>
@@ -1034,14 +1050,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metóda vstupu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operácie s textom"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Napísať na vybratú e-mailovú adresu"</string>
<string name="dial" msgid="1253998302767701559">"Volať"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Zavolať na vybraté telefónne číslo"</string>
<string name="map" msgid="6521159124535543457">"Nájsť"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Vyhľadať vybratú adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otvoriť"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Otvoriť vybratú webovú adresu"</string>
<string name="sms" msgid="4560537514610063430">"Správa"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Napísať SMS na vybraté telefónne číslo"</string>
<string name="add_contact" msgid="7867066569670597203">"Pridať"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Pridať medzi kontakty"</string>
<string name="view_calendar" msgid="979609872939597838">"Zobraziť"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Zobraziť vybratý čas v kalendári"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Naplánovať"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Naplánovať udalosť na vybratý čas"</string>
<string name="view_flight" msgid="7691640491425680214">"Sledovať"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Sledovať vybratý let"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nedostatok ukladacieho priestoru"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Niektoré systémové funkcie nemusia fungovať"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"V úložisku nie je dostatok voľného miesta pre systém. Zaistite, aby ste mali 250 MB voľného miesta a zariadenie reštartujte."</string>
@@ -1114,31 +1139,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Skontrolovať dostupnosť aktualizácie"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) porušila svoje vlastné vynútené pravidlá StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> porušil svoje vlastné vynútené pravidlá StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Prebieha inovácia systému Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Systém Android sa spúšťa…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefón sa aktualizuje…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet sa aktualizuje…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Zariadenie sa aktualizuje…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefón sa spúšťa…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet sa spúšťa…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Zariadenie sa spúšťa…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimalizuje sa úložisko"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončuje sa aktualizácia Androidu…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Niektoré aplikácie môžu správne fungovať až po dokončení inovácie"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Dokončuje sa aktualizácia systému…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> sa inovuje…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Prebieha optimalizácia aplikácie <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Pripravuje sa aplikácia <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Prebieha spúšťanie aplikácií."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Prebieha dokončovanie spúšťania."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Klepnutím prejdete späť do hry"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Vyberte hru"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Na zaistenie lepšej výkonnosti môže byť naraz otvorená iba jedna z týchto hier."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Prejsť späť do aplikácie <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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> sa zavrie bez uloženia"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> prekročil limit pamäte"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Boli zhromaždené zálohy údajov; zdieľajte ich klepnutím"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Boli zhromaždené zálohy dát. Zdieľajte ich klepnutím."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Chcete zdieľať zálohy údajov?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> prekročil limit <xliff:g id="SIZE">%2$s</xliff:g> pre pamäť procesu. Máte k dispozícii zálohy údajov, ktoré môžete zdieľať s vývojárom. Postupujte opatrne: tieto zálohy údajov nesmú obsahovať žiadne osobné informácie, ku ktorým má táto aplikácia prístup."</string>
<string name="sendText" msgid="5209874571959469142">"Zvoľte akciu pre text"</string>
@@ -1177,12 +1199,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Pripojenie k otvorenej sieti Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Pripojenie k sieti Wi‑Fi operátora"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Pripája sa k otvorenej sieti Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Pripája sa k sieti Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Pripojenie k sieti Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"K sieti Wi‑Fi sa nepodarilo pripojiť"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všetky siete"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Pripojiť"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Všetky siete"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všetky siete"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi sa zapne automaticky"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Keď budete v blízkosti kvalitnej uloženej siete"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Znova nezapínať"</string>
@@ -1248,6 +1270,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reštartovať"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivovať mobilnú službu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Ak chcete aktivovať novú SIM kartu, stiahnite si aplikáciu operátora"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Ak chcete aktivovať novú SIM kartu, stiahnite si aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Stiahnuť aplikáciu"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Bola vložená nová SIM karta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Nastavte ju klepnutím"</string>
@@ -1266,13 +1289,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Bol zapnutý režim PTP cez USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Bol zapnutý tethering cez USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Bol zapnutý režim MIDI cez USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Bol zapnutý režim príslušenstva USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Bolo pripojené príslušenstvo USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Klepnutím zobrazíte ďalšie možnosti."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Pripojené zariadenie sa nabíja. Ďalšie možností získate klepnutím."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Bolo zistené analógové zvukové príslušenstvo"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pripojené zariadenie nie je kompatibilné s týmto telefónom. Ďalšie informácie zobrazíte klepnutím."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Klepnutím zakážete ladenie cez USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Klepnutím vypnite ladenie cez USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vyberte, ak chcete zakázať ladenie cez USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Preberá sa hlásenie chyby…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Chcete zdieľať hlásenie chyby?"</string>
@@ -1291,34 +1314,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNÚŤ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravuje sa úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Prebieha kontrola chýb"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Bolo zistené nové úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Vypnúť"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Kontroluje sa <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Kontrola aktuálneho obsahu"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nové médium <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Klepnutím médium nastavte"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Na prenos fotiek a médií"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Poškodené úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Úložisko <xliff:g id="NAME">%s</xliff:g> je poškodené. Opravte ho klepnutím."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problém s médiom <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Problém odstránite klepnutím"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Médium <xliff:g id="NAME">%s</xliff:g> je poškodené. Vyberte ho a vyriešte problém."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodporované úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Toto zariadenie nepodporuje úložisko <xliff:g id="NAME">%s</xliff:g>. Klepnutím ho nastavíte v podporovanom formáte."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Toto zariadenie nepodporuje médium <xliff:g id="NAME">%s</xliff:g>. Vyberte ho a nastavte v podporovanom formáte."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úl. <xliff:g id="NAME">%s</xliff:g> bolo neočakávane odobraté"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ak chcete zabrániť strate údajov, úložisko <xliff:g id="NAME">%s</xliff:g> pred odobratím odpojte"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložisko <xliff:g id="NAME">%s</xliff:g> bolo odobraté"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Úložisko <xliff:g id="NAME">%s</xliff:g> bolo odobraté. Vložte nové."</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Úložisko <xliff:g id="NAME">%s</xliff:g> sa stále odpája…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neodoberajte"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Pred odobratím médium najskôr odpojte, aby ste zabránili strate obsahu"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Médium <xliff:g id="NAME">%s</xliff:g> bolo odobraté"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Niektoré funkcie nemusia byť k dispozícii. Vložte nové úložisko."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Odpája sa médium <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Neodoberajte"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastaviť"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojiť"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Preskúmať"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Chýba: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Opäť vložte toto zariadenie"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Zariadenie vložte znova"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Presúva sa aplikácia <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Presúvajú sa údaje"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Presun bol dokončený"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Údaje boli presunuté do úložiska <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Presun údajov zlyhal"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Údaje boli ponechané v pôvodnom umiestnení"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Prenos obsahu je hotový"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Obsah bol presunutý do úložiska <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Obsah sa nepodarilo presunúť"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Skúste obsah presunúť znova"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Odstránené"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Odpojené"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Prebieha kontrola..."</string>
@@ -1377,14 +1401,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Pripájanie k vždy zapnutej sieti VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Pripojenie k vždy zapnutej sieti VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Odpojené od vždy zapnutej siete VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba vždy zapnutej siete VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nepodarilo sa pripojiť k sieti VPN, ktorá je vždy zapnutá"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Zmeniť sieť alebo nastavenia VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Zvoliť súbor"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nie je vybratý žiadny súbor"</string>
<string name="reset" msgid="2448168080964209908">"Obnoviť"</string>
<string name="submit" msgid="1602335572089911941">"Odoslať"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Aktivovaný režim V aute"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Klepnutím ukončíte režim V aute."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikácia na šoférovanie je spustená"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Klepnutím ukončíte aplikáciu na šoférovanie"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering alebo prístupový bod je aktívny"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Klepnutím prejdete na nastavenie."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering je deaktivovaný"</string>
@@ -1464,22 +1488,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Disk USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Ukladací priestor USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Upraviť"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Upozornenie na spotrebu dát"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Klepnutím zobrazíte využitie a nastavenia."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Bol dosiahnutý limit 2G–3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Bol dosiahnutý limit 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Dátové upozornenie"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Využili ste <xliff:g id="APP">%s</xliff:g> dát"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dosiahnutý limit mobilných dát"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Bol dosiahnutý limit dát Wi‑Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Údaje pre zbytok cyklu pozastavené"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G, 3G dátový limit prekročený"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Dátový limit 4G bol prekročený"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekroč. limit pre mobil. dáta"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Dát. limit Wi‑Fi bol prekročený"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> nad stanovenou hranicou."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Dáta boli pozastavené do konca cyklu"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Prekročený limit mobilných dát"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Prekročený limit dát cez Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Prekročili ste stanovený limit o <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dátové prenosy obmedzené"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Klepnutím odstránite obmedzenie."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Vysoká spotreba dát"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Vaša spotreba dát za niekoľko posledných dní je vyššia ako zvyčajne. Klepnutím zobrazíte spotrebu a nastavenia."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Vysoké využitie mobilných dát"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vaše aplikácie využili viac dát než zvyčajne"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikácia <xliff:g id="APP">%s</xliff:g> využila viac dát než zvyčajne"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certifikát zabezpečenia"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certifikát je platný."</string>
<string name="issued_to" msgid="454239480274921032">"Vydané pre:"</string>
@@ -1719,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainštaloval správca"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizoval správca"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Odstránil správca"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Šetrič batérie zníži výkonnosť zariadenia a obmedzí vibrácie, služby určovania polohy a dátové prenosy na pozadí, aby predĺžil výdrž batérie. Pošta, odosielanie a prijímanie správ a ďalšie aplikácie, ktoré sú založené na synchronizácii, sa možno nebudú aktualizovať, dokým ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Šetrič batérie zníži výkonnosť zariadenia a obmedzí alebo vypne vibrácie, služby určovania polohy a dátové prenosy na pozadí, aby predĺžil výdrž batérie. Pošta, SMS a MMS i ďalšie aplikácie, ktoré sú založené na synchronizácii, sa možno nebudú aktualizovať, dokým ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Šetrič dát bráni niektorým aplikáciám odosielať alebo prijímať dáta na pozadí s cieľom znížiť spotrebu dát. Aplikácia, ktorú momentálne používate, môže prenášať dáta, ale môže to robiť menej často. Znamená to napríklad, že sa nezobrazia obrázky, kým na ne neklepnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnúť šetrič dát?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnúť"</string>
@@ -1735,11 +1756,11 @@
<item quantity="other">Na %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Na 1 min (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="few">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d hodín (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="few">Na %1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="many">Na %1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Na %1$d hodín (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Na 1 hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="few">Na %1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,11 +1780,11 @@
<item quantity="other">Na %d min</item>
<item quantity="one">Na 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="few">%d hodiny</item>
- <item quantity="many">%d hodiny</item>
- <item quantity="other">%d hodín</item>
- <item quantity="one">1 hodinu</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="few">Na %d hodiny</item>
+ <item quantity="many">Na %d hodiny</item>
+ <item quantity="other">Na %d hodín</item>
+ <item quantity="one">Na 1 hodinu</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="few">Na %d h</item>
@@ -1786,14 +1807,14 @@
<string name="muted_by" msgid="6147073845094180001">"Stlmené aplikáciou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Vo vašom zariadení došlo k internému problému. Môže byť nestabilné, kým neobnovíte jeho výrobné nastavenia."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Vo vašom zariadení došlo k internému problému. Ak chcete získať podrobné informácie, obráťte sa na jeho výrobcu."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Žiadosť USSD bola upravená na žiadosť DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Žiadosť USSD bola upravená na žiadosť SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Žiadosť USSD bola upravená na novú žiadosť USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Žiadosť USSD bola upravená na žiadosť Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Žiadosť SS bola upravená na žiadosť DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Žiadosť SS bola upravená na žiadosť Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Žiadosť SS bola upravená na žiadosť USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Žiadosť SS bola upravená na novú žiadosť SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Žiadosť USSD bola zmenená na bežný hovor"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Žiadosť USSD bola zmenená na žiadosť SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Zmenené na novú žiadosť USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Žiadosť USSD bola zmenená na videohovor"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Žiadosť SS bola zmenená na bežný hovor"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Žiadosť SS bola zmenená na videohovor"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Žiadosť SS bola zmenená na žiadosť USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Zmenené na novú žiadosť SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Pracovný profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozbaliť"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Zbaliť"</string>
@@ -1895,6 +1916,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM karta nie je k dispozícii pre hlas"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM karta nie je povolená pre hlas"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefón nie je povolený pre hlas"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> nie je povolená"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> nie je k dispozícii"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> nie je povolená"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM karta <xliff:g id="SIMNUMBER">%d</xliff:g> nie je povolená"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Automaticky otvárané okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikácia prešla na staršiu verziu alebo nie je kompatibilná s touto skratkou"</string>
@@ -1907,7 +1932,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Bola zistená škodlivá aplikácia"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovať rezy z aplikácie <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Upraviť"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Hovory a upozornenia budú vibrovať"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Hovory a upozornenia budú stlmené"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmeny systému"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nerušiť"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Nerušiť skrýva upozornenia, aby vám pomáhal sústrediť sa"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Toto je nové správanie. Zmeníte ho klepnutím."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavenie Nerušiť sa zmenilo"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Klepnutím skontrolujete vyrušenia v nastaveniach správania"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Klepnutím skontrolujete, čo je blokované."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Systém"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Nastavenia"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 7642544..4b1fbcc 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID klicatelja je ponastavljen na neomejeno. Naslednji klic: ni omejeno"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Storitev ni nastavljena in omogočena."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ne morete spremeniti nastavitve ID-ja klicatelja."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ni storitve za prenos podatkov"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Brez možnosti klicanja v sili"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ni mobilne podatkovne storitve"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Klicanje v sili ni na voljo"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ni storitve za glasovne klice"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ni storitve za glasovne klice / klice v sili"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Ta storitev trenutno ni na voljo v mobilnem omrežju na vaši lokaciji"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezave z omrežjem ni mogoče vzpostaviti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v »Nastavitve« > »Omrežje in internet« > »Mobilna omrežja« > »Prednostna vrsta omrežja«."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Klicanje prek Wi-Fi-ja je aktivno"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Za klice v sili potrebujete mobilno omrežje."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ni storitve glasovnega klicanja ali klicanja v sili"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operater je začasno izklopil storitev"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Operater je začasno izklopil storitev za kartico SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilnega omrežja ni mogoče doseči"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Poskusite spremeniti prednostno omrežje. Dotaknite se, če ga želite spremeniti."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Klicanje v sili ni na voljo"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Klicev v sili ni mogoče opravljati prek omrežja Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opozorila"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmerjanje klicev"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način za povratni klic v sili"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Pasica gostovanja je vklopljena"</string>
<string name="roamingText12" msgid="1189071119992726320">"Pasica za gostovanje je izklopljena"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Iskanje storitve"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Klicanje prek Wi-Fi-ja"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Klicanja prek Wi-Fi-ja ni bilo mogoče nastaviti"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi. (Koda napake: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registracija pri operaterju (koda napake: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Težava pri registriranju klicanja prek Wi-Fi-ja pri operaterju: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"V obdelavi je preveč zahtev. Poskusite znova pozneje."</string>
<string name="notification_title" msgid="8967710025036163822">"Napaka pri prijavi v račun <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizacija"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizacija"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Preveč izbrisov vsebine <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ni mogoče sinhronizirati"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Poskusili ste izbrisati preveč vsebine vrste <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pomnilnik tabličnega računalnika je poln. Izbrišite nekaj datotek, da sprostite prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Shramba ure je polna. Izbrišite nekaj datotek, da sprostite prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Shramba televizorja je polna. Izbrišite nekaj datotek, da sprostite prostor."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Nadzira skrbnik delovnega profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Nadzira: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Delovni profil izbrisan"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Delovni profil izbrisan zaradi manjkajoče skrbniške aplikacije"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Skrbniška aplikacija delovnega profila manjka ali pa je poškodovana, zaradi česar je bil delovni profil s povezanimi podatki izbrisan. Za pomoč se obrnite na skrbnika."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Vaš delovni profil ni več na voljo v tej napravi"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Preveč poskusov vnosa gesla"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Naprava je upravljana"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Vaša organizacija upravlja to napravo in lahko nadzira omrežni promet. Dotaknite se za podrobnosti."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Podatki v napravi bodo izbrisani"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Skrbniške aplikacije ni mogoče uporabljati. Podatki v napravi bodo izbrisani.\n\nČe imate vprašanja, se obrnite na skrbnika organizacije."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Skrbniške aplikacije ni mogoče uporabljati. Podatki v napravi bodo izbrisani.\n\nČe imate vprašanja, se obrnite na skrbnika organizacije."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Tiskanje je onemogočil pravilnik <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Jaz"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Možnosti tabličnega računalnika"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način za letalo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Način za letalo je VKLOPLJEN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način za letalo je IZKLOPLJEN"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Varčevanje z energijo akumulatorja"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Varčevanje z energijo akumulatorja je izklopljeno"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoč"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Preklopi na delovni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Stiki"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostop do stikov"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite dostop do stikov"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do stikov?"</string>
<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="8903573681261610809">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite 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="permgrouplab_calendar" msgid="5863508437783683902">"Koledar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostop do koledarja"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"pošiljanje in ogled sporočil SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite pošiljanje in ogled sporočil SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti pošiljanje in ogled sporočil SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Shramba"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"dostop do fotografij, predstavnosti in datotek v napravi"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite dostop do fotografij, predstavnosti in datotek v vaši napravi"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do fotografij, predstavnosti in datotek v svoji napravi?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snemanje zvoka"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite snemanje zvoka"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti snemanje zvoka?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparat"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografiranje in snemanje videoposnetkov"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite snemanje slik in videoposnetkov"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti fotografiranje in snemanje videoposnetkov?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"opravljanje in upravljanje telefonskih klicev"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite opravljanje in upravljanje telefonskih klicev"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti opravljanje in upravljanje telefonskih klicev?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tipala telesnih funkcij"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostop do podatkov tipala o vaših vitalnih znakih"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite dostop do podatkov tipala o vitalnih znakih"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do podatkov tipala o vitalnih znakih?"</string>
<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>
@@ -311,7 +314,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Izvajanje potez"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Mogoče je izvajanje dotikov, vlečenja, primikanja in razmikanja prstov ter drugih potez."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Poteze po tipalu prstnih odtisov"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Prepoznava poteze, narejene po tipalu prstnih odtisov naprave."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Prepoznava poteze, narejene po tipalu prstnih odtisov naprave."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogočanje ali spreminjanje vrstice stanja"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Aplikacijam omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"postane vrstica stanja"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Aplikaciji omogoča, da nekatere svoje dele naredi trajne v pomnilniku. S tem je lahko pomnilnik omejen za druge aplikacije, zaradi česar je delovanje tabličnega računalnika upočasnjeno."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Aplikaciji dovoljuje, da nekatere svoje dele naredi trajno prisotne v pomnilniku. S tem je lahko pomnilnik omejen za druge aplikacije, zaradi česar je delovanje televizorja upočasnjeno."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Aplikaciji omogoča, da nekatere svoje dele naredi trajne v pomnilniku. S tem je lahko pomnilnik omejen za druge aplikacije, zaradi česar je delovanje telefona upočasnjeno."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"Izvajanje storitve v ospredju"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Aplikaciji dovoljuje uporabo storitev v ospredju."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"izračunavanje prostora za shranjevanje aplikacije"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Aplikaciji omogoča, da pridobi njeno kodo, podatke in velikosti predpomnilnika."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"spreminjanje sistemskih nastavitev"</string>
@@ -484,6 +489,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog s prstnimi odtisi za uporabo."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"uporaba strojne opreme za prstne odtise"</string>
@@ -496,6 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ni prepoznano"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pristnost prstnega odtisa je preverjena"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Strojna oprema za prstne odtise ni na voljo."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string>
@@ -808,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odklepanje z vzorcem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odklepanje z obrazom."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odklepanje s kodo PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Odklepanje kartice SIM s kodo PIN"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Odklepanje kartice SIM s kodo PUK"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odklepanje z geslom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Območje vzorca."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Območje podrsanja."</string>
@@ -869,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Besedilo, kopirano v odložišče."</string>
<string name="more_item_label" msgid="4650918923083320495">"Več"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Meni+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"presledek"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"vnesi"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"izbriši"</string>
@@ -1034,14 +1050,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Način vnosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Besedilna dejanja"</string>
<string name="email" msgid="4560673117055050403">"E-pošta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Pošlji na izbrani naslov"</string>
<string name="dial" msgid="1253998302767701559">"Pokliči"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Pokliči izbrano telefonsko številko"</string>
<string name="map" msgid="6521159124535543457">"Poišči na zemljevidu"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Pokaži izbrani naslov na zemljevidu"</string>
<string name="browse" msgid="1245903488306147205">"Odpri"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Odpri izbrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Sporočilo"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Pošlji sporočilo na izbrano telefonsko številko"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Dodaj med stike"</string>
<string name="view_calendar" msgid="979609872939597838">"Ogled"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Ogled izbranega časa v koledarju"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Dodaj na razpored"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Razporedi dogodek na izbrano uro"</string>
<string name="view_flight" msgid="7691640491425680214">"Sledenje"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Sledi izbranemu letu"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Prostor za shranjevanje bo pošel"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Nekatere sistemske funkcije morda ne delujejo"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"V shrambi ni dovolj prostora za sistem. Sprostite 250 MB prostora in znova zaženite napravo."</string>
@@ -1114,31 +1139,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Preveri, ali je na voljo posodobitev"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) krši svoj samouveljavljiv pravilnik o strogem načinu."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> krši svoj samoizvedljivi pravilnik o strogem načinu."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Poteka nadgradnja Androida ..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android se zaganja …"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon se posodablja …"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablični računalnik se posodablja …"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Naprava se posodablja …"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon se zaganja …"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablični računalnik se zaganja …"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Naprava se zaganja …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje shrambe."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončanje posodobitve Androida …"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Nekatere aplikacije morda ne bodo delovale pravilno, dokler ne bo dokončana nadgradnja."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Zaključevanje posodobitve sistema …"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se nadgrajuje …"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Pripravljanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon aplikacij."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončevanje zagona."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Dotaknite se za vrnitev v igro"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Izberite igro"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Za večjo učinkovitost delovanja je lahko hkrati odprta samo ena od teh iger."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Nazaj v aplikacijo <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Izvoz kopice je zbran; dotaknite se za deljenje z drugimi"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Izberite dejanje za besedilo"</string>
@@ -1177,12 +1199,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Vzpostavite povezavo z odprtim omrežjem Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Vzpostavitev povezave z omrežjem Wi‑Fi operaterja"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Vzpostavljanje povezave z odprtim omrežjem Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Vzpostavljanje povezave z omrežjem Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezava z omrežjem Wi-Fi je vzpostavljena"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezave z omrežjem Wi-Fi ni bilo mogoče vzpostaviti"</string>
<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="1100098935861622985">"Vsa omrežja"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Vsa omrežja"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Povezava Wi‑Fi se bo samodejno vklopila"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Ko ste v bližini zanesljivega shranjenega omrežja"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne vklopi znova"</string>
@@ -1248,6 +1270,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Vnovičen zagon"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilno storitev"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Prenesite aplikacijo operaterja, da boste lahko aktivirali novo kartico SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Prenesite aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>, da boste lahko aktivirali novo kartico SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Prenos aplikacije"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova kartica SIM je vstavljena"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dotaknite se za nastavitev"</string>
@@ -1266,13 +1289,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Vklopljen je način PTP prek USB-ja"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Vklopljen je internet prek USB-ja"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Vklopljen je način MIDI prek USB-ja"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Vklopljen je način dodatka USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Dodatek USB je priključen"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dotaknite se za več možnosti."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Polnjenje akumulatorja v povezani napravi. Dotaknite se za več možnosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Zaznana je analogna dodatna zvočna oprema"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključena naprava ni združljiva s tem telefonom. Dotaknite se za več informacij."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje napak prek USB je povezano"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Dotaknite se za izklop odpravljanja napak prek USB."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Zajemanje poročila o napakah …"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite poslati poročilo o napakah?"</string>
@@ -1291,34 +1314,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZKLOP"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravljanje shrambe <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Iskanje napak"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zaznana je bila nova shramba <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Izklopi"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Preverjanje nosilca <xliff:g id="NAME">%s</xliff:g> …"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Pregledovanje trenutne vsebine"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nova naprava za shranjevanje: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Dotaknite se, če želite nastaviti"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prenos fotografij in predstavnosti"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Naprava za sh. <xliff:g id="NAME">%s</xliff:g> je poškodovana"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Nosilec <xliff:g id="NAME">%s</xliff:g> je poškodovan. Dotaknite se, če želite odpraviti napako."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Težava z nosilcem <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Dotaknite se, da to popravite"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Nosilec <xliff:g id="NAME">%s</xliff:g> je pokvarjen. Izberite, če ga želite popraviti."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodprta naprava za shran. <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ta naprava ne podpira tega nosilca <xliff:g id="NAME">%s</xliff:g>. Dotaknite se, če želite nastaviti v podprti obliki."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Naprava ne podpira nosilca <xliff:g id="NAME">%s</xliff:g>. Izberite, če ga želite nastaviti v podprti obliki."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Shramba <xliff:g id="NAME">%s</xliff:g> nepričak. odstranjena"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Izpnite shrambo <xliff:g id="NAME">%s</xliff:g>, preden jo odstranite, da se izognete izgubi podatkov."</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Shramba <xliff:g id="NAME">%s</xliff:g> je bila odstranjena"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Shramba <xliff:g id="NAME">%s</xliff:g> je bila odstranjena; vstavite novo"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Izvrženje shrambe <xliff:g id="NAME">%s</xliff:g> še poteka …"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne odstranite je"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Medij izvrzite, preden ga odstranite, da se izognete izgubi vsebine"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Nosilec <xliff:g id="NAME">%s</xliff:g> je odstranjen"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Nekatere funkcije morda ne bodo pravilno delovale. Vstavite novo napravo za shranjevanje."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Izvrženje nosilca <xliff:g id="NAME">%s</xliff:g> …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne odstranite"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastavi"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izvrzite"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Raziščite"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Ni shrambe <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Znova vstavite to napravo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Znova vstavite napravo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premikanje aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Premikanje podatkov"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Premik je dokončan"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Podatki so premaknjeni v shrambo <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Premik podatkov ni uspel"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Podatki so ostali na izvirni lokaciji"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Prenos vsebine je končan"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Vsebina je bila premaknjena v napravo za shranjevanje <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Vsebine ni bilo mogoče premakniti"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Poskusite znova premakniti vsebino"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Odstranjeno"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Izvrženo"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Preverjanje ..."</string>
@@ -1377,14 +1401,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezovanje v stalno vklopljeno navidezno zasebno omrežje ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Vzpostavljena povezava v stalno vklopljeno navidezno zasebno omrežje"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Prekinjena povezava s stalno vklopljenim VPN-jem"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Napaka stalno vklopljenega navideznega zasebnega omrežja"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Povezave s stalno vklopljenim VPN-jem ni bilo mogoče vzpostaviti"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Spremenite omrežne nastavitve ali nastavitve omrežja VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Izberi datoteko"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nobena datoteka ni izbrana"</string>
<string name="reset" msgid="2448168080964209908">"Ponastavi"</string>
<string name="submit" msgid="1602335572089911941">"Pošlji"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Način delovanja za avtomobil je omogočen"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Dotaknite se, če želite zapreti avtomobilski način."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikacija za vožnjo se izvaja"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Dotaknite se, če želite zapreti aplikacijo za vožnjo."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Aktivna povezava z internetom ali dostopna točka sta aktivni"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dotaknite se, če želite nastaviti."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezava z internetom prek mobilnega telefona je onemogočena"</string>
@@ -1464,22 +1488,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Pogon USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Pomnilnik USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Uredi"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Opozorilo o preneseni količini podatkov"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Dot. se za ogled upor. in nast."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dosežena pod. omejitev za 2G/3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dosežena pod. omejitev za 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Opozorilo o prenosu podatkov"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Porabili ste <xliff:g id="APP">%s</xliff:g> podatkov"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Omej. pren. mob. pod. dosežena"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dosežena pod. omejitev za Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Prenos pod. ust. do konca cikla"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Omejit. za podat. 2G-3G presež."</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Omejitev za podat. 4G presež."</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Omej. za pod. v mob. n. presež."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Presež. omej. za podatke Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Velikost <xliff:g id="SIZE">%s</xliff:g> presega omejitev"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Prenos podatkov je zaustavljen do konca obračunskega obdobja"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Prek omejitve mobilnih podatkov"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Prek omejitve podatkov Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Nastavljeno omejitev ste presegli za <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Podatki v ozadju so omejeni"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Dotaknite se za odstr. omejitve."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Velika prenesena količina podatkov"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Prenesena količina podatkov v zadnjih nekaj dneh je večja kot običajno. Dotaknite se za ogled uporabe in nastavitev."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Visoka poraba mobilnih podatkov"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vaše aplikacije so porabile več podatkov kot običajno"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikacija <xliff:g id="APP">%s</xliff:g> je porabila več podatkov kot običajno"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Varnostno potrdilo"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"To potrdilo je veljavno."</string>
<string name="issued_to" msgid="454239480274921032">"Izdano za:"</string>
@@ -1719,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Namestil skrbnik"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Posodobil skrbnik"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisal skrbnik"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Varčevanje z energijo akumulatorja podaljša čas njegovega delovanja tako, da zmanjša zmogljivost delovanja naprave in omeji vibriranje, lokacijske storitve ter prenos večine podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo akumulatorja se samodejno izklopi med polnjenjem akumulatorja naprave."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Varčevanje z energijo akumulatorja podaljša čas njegovega delovanja tako, da zmanjša zmogljivost delovanja naprave in omeji ali izklopi vibriranje, lokacijske storitve ter prenos podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo akumulatorja se samodejno izklopi med polnjenjem akumulatorja naprave."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Zaradi zmanjševanja prenesene količine podatkov varčevanje s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko prenaša podatke, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vklop varčevanja s podatki?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Vklop"</string>
@@ -1735,11 +1756,11 @@
<item quantity="few">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d uro (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">%1$d uri (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d ure (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d ur (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Za %1$d uro (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="two">Za %1$d uri (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="few">Za %1$d ure (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Za %1$d ur (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,11 +1780,11 @@
<item quantity="few">%d min</item>
<item quantity="other">%d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d uro</item>
- <item quantity="two">%d uri</item>
- <item quantity="few">%d ure</item>
- <item quantity="other">%d ur</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">Za %d uro</item>
+ <item quantity="two">Za %d uri</item>
+ <item quantity="few">Za %d ure</item>
+ <item quantity="other">Za %d ur</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d h</item>
@@ -1786,14 +1807,14 @@
<string name="muted_by" msgid="6147073845094180001">"Izklop zvoka: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Vaša naprava ima notranjo napako in bo morda nestabilna, dokler je ne ponastavite na tovarniške nastavitve."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Vaša naprava ima notranjo napako. Če želite več informacij, se obrnite na proizvajalca."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Zahteva USSD je spremenjena v zahtevo DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Zahteva USSD je spremenjena v zahtevo SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Zahteva USSD je spremenjena v novo zahtevo USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Zahteva USSD je spremenjena v zahtevo Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Zahteva SS je spremenjena v zahtevo DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Zahteva SS je spremenjena v zahtevo Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Zahteva SS je spremenjena v zahtevo USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Zahteva SS je spremenjena v novo zahtevo SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Zahteva USSD je spremenjena v navaden klic"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Zahteva USSD je spremenjena v zahtevo SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Spremenjeno v novo zahtevo USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Zahteva USSD je spremenjena v videoklic"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Zahteva SS je spremenjena v navaden klic"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Zahteva SS je spremenjena v videoklic"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Zahteva SS je spremenjena v zahtevo USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Spremenjeno v novo zahtevo SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Delovni profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Razširi"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Strni"</string>
@@ -1895,6 +1916,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Kartica SIM ne omogoča opravljanja glasovnih klicev"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Kartica SIM ne dovoljuje glasovnih klicev"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon ne dovoljuje glasovnih klicev"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Kartica SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ni dovoljena"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Kartica SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ni omogočena za uporabo"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Kartica SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ni dovoljena"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Kartica SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ni dovoljena"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pojavno okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"in še <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Zdaj imate prejšnjo različico aplikacije ali različico, ki ni združljiva s to bližnjico"</string>
@@ -1907,7 +1932,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zaznana je bila škodljiva aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Urejanje"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibriranje bo vklopljeno za klice in obvestila"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvonjenje bo izklopljeno za klice in obvestila"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske spremembe"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne moti"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način »ne moti« skriva obvestila, da se lažje osredotočite"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"To je novo vedenje. Dotaknite se, če ga želite spremeniti."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način »ne moti« je spremenjen"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dotaknite se, da preverite nastavitve vedenja pri prekinitvah"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dotaknite se, da preverite, kaj je blokirano."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Nastavitve"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index a981222..c0dddf8 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID-ja e telefonuesit kalon me paracaktim në listën e të telefonuesve të pakufizuar. Telefonata e radhës: e pakufizuar!"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Shërbimi nuk është përgatitur."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nuk mund ta ndryshosh cilësimin e ID-së së telefonuesit."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Nuk ka shërbim për të dhënat"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Asnjë telefonatë urgjence"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nuk ka shërbim të të dhënave celulare"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Telefonatat e urgjencës nuk ofrohen"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nuk ka shërbim zanor"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nuk ka shërbim zanor/urgjence"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Përkohësisht nuk ofrohet nga rrjeti celular në vendndodhjen tënde"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Rrjeti i paarritshëm"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Cilësimet > Rrjeti dhe interneti > Rrjetet celulare > Lloji i preferuar i rrjetit."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Telefonata me Wi‑Fi është aktive"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Telefonatat e urgjencës kërkojnë një rrjet celular."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nuk ka shërbim zanore ose telefonata urgjence"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Çaktivizuar përkohësisht nga operatori yt celular"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Çaktivizuar përkohësisht nga operatori yt celular për kartën SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Rrjeti celular është i paarritshëm"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Provo të ndryshosh rrjetin e preferuar. Trokit për ta ndryshuar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Telefonatat e urgjencës nuk ofrohen"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nuk mund të kryhen telefonata urgjence me Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Sinjalizimet"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transferimi i telefonatave"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Lajmëruesi i roaming-ut është i aktivizuar"</string>
<string name="roamingText12" msgid="1189071119992726320">"Lajmëruesi i roaming-ut është i çaktivizuar"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Po kërkon për shërbim"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Telefonatë me Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Telefonata me Wi-Fi nuk mund të konfigurohej"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Për të bërë telefonata dhe për të dërguar mesazhe nëpërmjet Wi-Fi, në fillim kërkoji operatorit celular të konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi nga \"Cilësimet\". (Kodi i gabimit: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Regjistrohu me operatorin tënd celular (kodi i gabimit: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Problem gjatë regjistrimit të telefonatave me Wi‑Fi me operatorin tënd celular: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Po përpunohen shumë kërkesa. Provo sërish më vonë."</string>
<string name="notification_title" msgid="8967710025036163822">"Gabim identifikimi për <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkronizo"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkronizo"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Shumë fshirje <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nuk mund të sinkronizohet"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"U përpoqe të fshish shumë <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Hapësira ruajtëse e tabletit është plot. Fshi disa skedarë për të liruar hapësirë."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Hapësira ruajtëse e orës është plot. Fshi disa skedarë për të liruar hapësirë."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Hapësira ruajtëse e televizorit është plot. Fshi disa skedarë për të liruar hapësirë."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Nga administratori i profilit tënd të punës"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Nga <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profili i punës u fshi"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profili i punës u fshi për shkak të mungesës së aplikacionit të administratorit"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplikacioni i administratorit të profilit të punës mungon ose është dëmtuar. Si rezultat i kësaj, profili yt i punës dhe të dhënat përkatëse janë fshirë. Kontakto me administratorin për ndihmë."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profili yt i punës nuk është më i disponueshëm në këtë pajisje"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Shumë përpjekje për fjalëkalimin"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Pajisja është e menaxhuar"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organizata jote e menaxhon këtë pajisje dhe mund të monitorojë trafikun e rrjetit. Trokit për detaje."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Pajisja do të spastrohet"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Aplikacioni i administratorit nuk mund të përdoret. Pajisja jote tani do të fshihet.\n\nNëse ke pyetje, kontakto me administratorin e organizatës."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Aplikacioni i administratorit nuk mund të përdoret. Pajisja jote tani do të fshihet.\n\nNëse ke pyetje, kontakto me administratorin e organizatës."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printimi është çaktivizuar nga <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Unë"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opsionet e tabletit"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"modaliteti i aeroplanit"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modaliteti i aeroplanit është i AKTIVIZUAR"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modaliteti i aeroplanit është i ÇAKTIVIZUAR"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Kursyesi i baterisë"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"\"Kursyesi i baterisë\" është JOAKTIV."</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"\"Kursyesi i baterisë\" është AKTIV"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Cilësimet"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Ndihma"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ndihma zanore"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Kalo te profili i punës"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktet"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"qasu te kontaktet e tua"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te kontaktet e tua"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te kontaktet e tua?"</string>
<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="8903573681261610809">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"qasje te kalendari yt"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"dërgo dhe shiko mesazhet SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të dërgojë dhe të shikojë mesazhe SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të dërgojë dhe të shikojë mesazhet SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Hapësira e ruajtjes"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"qasjen te fotografitë, përmbajtjet audio-vizuale dhe skedarët në pajisje"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te fotografitë, media dhe skedarët në pajisjen tënde"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te fotografitë, media dhe skedarët në pajisjen tënde?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"regjistro audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të regjistrojë audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të regjistrojë audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"bëj fotografi dhe regjistro video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> që shkrepë fotografi dhe të regjistrojë video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të nxjerrë fotografi dhe të regjistrojë video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"kryej dhe menaxho telefonata"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të kryejë dhe të menaxhojë telefonata"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të kryejë dhe të menaxhojë telefonata?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensorët e trupit"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"qasu tek të dhënat e sensorëve rreth shenjave të tua jetësore"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Lejo që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te të dhënat e sensorëve rreth shenjave të tua jetësore"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te të dhënat e sensorëve rreth shenjave të tua jetësore?"</string>
<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>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Kryen gjeste"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Mund të trokasë, rrëshqasë, bashkojë gishtat dhe kryejë gjeste të tjera."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gjestet e gjurmës së gishtit"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Mund të kapë gjestet e kryera në sensorin e gjurmës së gishtit të pajisjeve."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Mund të regjistrojë gjestet e kryera në sensorin e gjurmës së gishtit të pajisjes."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"çaktivizo ose modifiko shiritin e statusit"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Lejon aplikacionin të çaktivizojë shiritin e statusit dhe të heqë ikonat e sistemit."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"të bëhet shiriti i statusit"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Lejon aplikacionin të zaptojë një pjesë të qëndrueshme në kujtesë. Kjo mund të kufizojë kujtesën e disponueshme për aplikacionet e tjera duke e ngadalësuar tabletin."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Lejon aplikacionin të zaptojë një pjesë të qëndrueshme në kujtesë. Kjo mund të kufizojë kujtesën e disponueshme për aplikacionet e tjera duke e ngadalësuar televizorin."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Lejon aplikacionin të zaptojë një pjesë të qëndrueshme në kujtesë. Kjo mund të kufizojë kujtesën e disponueshme për aplikacionet e tjera duke e ngadalësuar telefonin."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ekzekuto shërbimin në plan të parë"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Lejon aplikacionin të përdorë shërbimet në plan të parë."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mat hapësirën ruajtëse të aplikacionit"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Lejon aplikacionin të gjejë kodin e tij, të dhënat dhe madhësitë e memorieve të përkohshme."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifiko cilësimet e sistemit"</string>
@@ -478,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"E lejon aplikacionin që të aktivizojë metoda për të shtuar dhe për të fshirë shabllonet e gjurmës së gishtit për përdorim."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"përdor harduerin e gjurmës së gishtit"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nuk njihet"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Gjurma e gishtit u vërtetua"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardueri i gjurmës së gishtit nuk mundësohet."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Gjurma e gishtit nuk mund të ruhet. Hiq një gjurmë gishti ekzistuese."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Koha e veprimit për gjurmën e gishtit skadoi. Provo përsëri."</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Shkyçje me motiv."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Shkyçje me fytyrë."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Shkyçje me PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Shkyçja e kartës SIM me kodin PIN"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Shkyçja e kartës SIM me kodin PUK"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Shkyçja e fjalëkalimit."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona e motivit."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zonën e rrëshqitjes."</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teksti u kopjua në kujtesën e fragmenteve."</string>
<string name="more_item_label" msgid="4650918923083320495">"Më shumë"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyja+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funksioni+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"hapësirë"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"fshi"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Metoda e hyrjes"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Veprimet e tekstit"</string>
<string name="email" msgid="4560673117055050403">"Dërgo mail"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Dërgo email tek adresa e zgjedhur"</string>
<string name="dial" msgid="1253998302767701559">"Telefono"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Telefono në numrin e zgjedhur të telefonit"</string>
<string name="map" msgid="6521159124535543457">"Gjej vendndodhjen"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Gjej adresën e zgjedhur"</string>
<string name="browse" msgid="1245903488306147205">"Hap"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Hap URL-në e zgjedhur"</string>
<string name="sms" msgid="4560537514610063430">"Mesazh"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Dërgo mesazh te numri i zgjedhur i telefonit"</string>
<string name="add_contact" msgid="7867066569670597203">"Shto"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Shto te kontaktet"</string>
<string name="view_calendar" msgid="979609872939597838">"Shiko"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Shiko kohën e zgjedhur në kalendar"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Orari"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planifiko ngjarjen për kohën e zgjedhur"</string>
<string name="view_flight" msgid="7691640491425680214">"Pjesë muzikore"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Monitoro fluturimin e zgjedhur"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Hapësira ruajtëse po mbaron"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Disa funksione të sistemit mund të mos punojnë"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nuk ka hapësirë të mjaftueshme ruajtjeje për sistemin. Sigurohu që të kesh 250 MB hapësirë të lirë dhe pastaj të rifillosh."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Kliko për përditësim"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacioni <xliff:g id="APPLICATION">%1$s</xliff:g> (procesi <xliff:g id="PROCESS">%2$s</xliff:g>) ka shkelur politikën e tij të vetë-imponuar \"Modaliteti i ashpër\" (StrictMode)."</string>
<string name="smv_process" msgid="5120397012047462446">"Procesi <xliff:g id="PROCESS">%1$s</xliff:g> ka shkelur politikën e tij të vetë-imponuar \"Modaliteti i rreptë\" (StrictMode)"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"\"Androidi\" po përditësohet…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"\"Androidi\" po fillon…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefoni po përditësohet…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tableti po përditësohet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Pajisja po përditësohet…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefoni po niset…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tableti po niset…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Pajisja po niset…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Po përshtat ruajtjen."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Përditësimi i Android po përfundon…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Disa aplikacione mund të mos funksionojnë si duhet deri sa të përfundojë përmirësimi"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Po përfundon përditësimi i sistemit…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> po përmirësohet…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Po përshtat aplikacionin <xliff:g id="NUMBER_0">%1$d</xliff:g> nga gjithsej <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Po përgatit <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikacionet e fillimit."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Po përfundon nisjen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> është në punë"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Trokit për t\'u kthyer te loja"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Zgjidh një lojë"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Për një cilësi më të mirë funksionimi, vetëm një nga këto lojëra mund të hapet në të njëjtën kohë."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Kthehu prapa te <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Stiva e skedarëve fiktivë është mbledhur; trokit për t\'i ndarë"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Zgjidh një veprim për tekstin"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Lidhu me rrjetin e hapur Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Lidhu me rrjetin Wi‑Fi të operatorit"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Po lidhet me rrjetin e hapur Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Po lidhet me rrjetin Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Lidhur me rrjetin e hapur Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nuk mund të lidhet me rrjetin Wi‑Fi"</string>
<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="1100098935861622985">"Të gjitha rrjetet"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Të gjitha rrjetet"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi do të aktivizohet automatikisht"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kur ndodhesh pranë një rrjeti të ruajtur me cilësi të lartë"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Mos e aktivizo përsëri"</string>
@@ -1205,6 +1227,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Rifillo"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizo shërbimin celular"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Shkarko aplikacionin e operatorit celular për të aktivizuar kartën e re SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Shkarko aplikacionin <xliff:g id="APP_NAME">%1$s</xliff:g> për të aktivizuar kartën tënde të re SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Shkarko aplikacionin"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Është futur kartë e re SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Trokit për ta konfiguruar"</string>
@@ -1223,13 +1246,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP nëpërmjet USB-së u aktivizua"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Ndarja e internetit nëpërmjet USB-së u aktivizua"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI nëpërmjet USB-së u aktivizua"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modaliteti i aksesorit me USB u aktivizua"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Aksesori i USB-së u lidh"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Trokit për më shumë opsione."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Pajisja e lidhur po ngarkohet. Trokit për opsione të tjera."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"U zbulua aksesor i audios analoge"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pajisja e bashkuar nuk është e pajtueshme me këtë telefon. Trokit për të mësuar më shumë."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Korrigjuesi i USB-së i lidhur"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Trokit për të çaktivizuar korrigjimin e gabimeve të USB-së."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Po merret raporti i defekteve në kod…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Të ndahet raporti i defektit në kod?"</string>
@@ -1248,34 +1271,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> afishohet mbi aplikacionet e tjera"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> shfaqet mbi apl. e tjera"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ÇAKTIVIZO"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Po përgatit <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Po kontrollon për gabime"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"U zbulua karta e re <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Çaktivizo"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> po kontrollohet…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Përmbajtja aktuale po rishikohet"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> e re"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Trokit për ta konfiguruar"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Për transferimin e fotografive dhe skedarëve të tjerë"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> e dëmtuar"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> është dëmtuar. Trokit për ta rregulluar."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem me <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Trokit për ta rregulluar"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> është dëmtuar. Zgjidh për ta rregulluar."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nuk mbështetet"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Kjo pajisje nuk e mbështet këtë <xliff:g id="NAME">%s</xliff:g>. Trokit për ta konfiguruar në një format të mbështetur."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Kjo pajisje nuk e mbështet këtë <xliff:g id="NAME">%s</xliff:g>. Përzgjidhe për ta konfiguruar në një format të mbështetur."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> u hoq papritur"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Shkëput <xliff:g id="NAME">%s</xliff:g> para se ta heqësh për të shmangur humbjen e të dhënave"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Është hequr <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> është hequr; fut një të re"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ende duke nxjerrë <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Mos e hiq"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Nxirr median para se ta heqësh për të shmangur humbjen e përmbajtjes"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> u hoq"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Disa funksionalitete mund të mos funksionojnë si duhet. Fut një hapësirë ruajtëse të re."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> po nxirret"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Mos e hiq"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguro"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Nxirr"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Eksploro"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mungon"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Fute përsëri këtë pajisje"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Fut përsëri pajisjen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Po zhvendos <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Po zhvendos të dhënat"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Zhvendosja përfundoi"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Të dhënat u zhvendosën te <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Të dhënat nuk mund të zhvendoseshin"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"U lanë të dhëna në vendndodhjen origjinale"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transferimi i përmbajtjes u krye"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Përmbajtja u zhvendos te <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Përmbajtja s\'mund të zhvendosej"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Provo ta zhvendosësh përsëri përmbajtjen"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"E hequr"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"E nxjerrë"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Po kontrollon..."</string>
@@ -1334,14 +1358,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Po lidh VPN-në për aktivizim të përhershëm…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN e lidhur në mënyrë të përhershme"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Shkëputur nga VPN-ja gjithmonë e aktivizuar"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Gabimi VPN-je për aktivizimin e përhershëm"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nuk mund të lidhej me VPN-në gjithmonë të aktivizuar"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Ndrysho rrjetin ose cilësimet e VPN-së"</string>
<string name="upload_file" msgid="2897957172366730416">"Zgjidh skedarin"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nuk u zgjodh asnjë skedar"</string>
<string name="reset" msgid="2448168080964209908">"Rivendos"</string>
<string name="submit" msgid="1602335572089911941">"Dërgo"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modaliteti \"në makinë\" është i aktivizuar"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Trokit për të dalë nga modaliteti \"në makinë\"."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikacioni i drejtimit të makinës është në ekzekutim"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Trokit për të dalë nga aplikacioni i drejtimit të makinës."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Lidhja e çiftimit ose ajo e qasjes në zona publike interneti është aktive"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Trokit për ta konfiguruar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Lidhja e çiftimit është çaktivizuar"</string>
@@ -1419,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-ja nga <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Hapësira ruajtëse e USB-së"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redakto"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Sinjalizimi i të dhënave"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Trokit për të parë përdorimin dhe cilësimet."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Kufiri i të dhënave 2G-3G u arrit"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Kufiri i të dhënave 4G u arrit"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Paralajmërim për të dhënat"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Ke përdorur <xliff:g id="APP">%s</xliff:g> nga të dhënat"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"U arrit kufiri i të dhënave"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"U arrit kufiri i të dhënave Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Të dhënat u ndaluan për pjesën e mbetur të ciklit"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Kufiri i të dhënave 2G-3G u tejkalua"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Kufiri i të dhënave 4G u tejkalua"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Kufiri i të dhënave celulare u tejkalua"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Kufiri i të dhënave Wi-Fi u tejkalua"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> mbi kufirin e përcaktuar."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Të dhënat u ndërprenë për pjesën e mbetur të ciklit"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mbi kufirin e të dhënave celulare"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Mbi kufirin e të dhënave të Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ke kaluar <xliff:g id="SIZE">%s</xliff:g> mbi kufirin tënd të caktuar"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Të dhënat e sfondit janë të kufizuara"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Trokit për të hequr kufizimin."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Përdorim i madh të dhënash"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Përdorimi i të dhënave të tua gjatë ditëve të fundit është më i madh se normalisht. Trokit për të parë përdorimin dhe cilësimet."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Përdorim i lartë i të dhënave celulare"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikacionet e tua kanë përdorur më shumë të dhëna se zakonisht"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ka përdorur më shumë të dhëna se zakonisht"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certifikatë sigurie"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certifikata është e vlefshme."</string>
<string name="issued_to" msgid="454239480274921032">"Lëshuar për:"</string>
@@ -1670,7 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instaluar nga administratori"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Përditësuar nga administratori"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Fshirë nga administratori"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Për të përmirësuar jetëgjatësinë e baterisë, \"Kursyesi i baterisë\" ul rendimentin e pajisjes sate si dhe kufizon dridhjet, shërbimet e vendndodhjes dhe shumicën e të dhënave në sfond. Email-i, mesazhet dhe aplikacionet e tjera që mbështeten te sinkronizimi mund të mos përditësohen nëse nuk i hap.\n\n\"Kursyesi i baterisë\" çaktivizohet automatikisht kur pajisja është në ngarkim."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Për të zgjatur jetëgjatësinë e baterisë, \"Kursyesi i baterisë\" ul cilësinë e funksionimit të pajisjes sate si dhe kufizon ose çaktivizon dridhjet, shërbimet e vendndodhjes dhe të dhënat në sfond. Email-i, mesazhet dhe aplikacionet e tjera që mbështeten te sinkronizimi mund të mos përditësohen nëse nuk i hap.\n\n\"Kursyesi i baterisë\" çaktivizohet automatikisht kur pajisja është në ngarkim."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivizo"</string>
@@ -1682,9 +1703,9 @@
<item quantity="other">Për %1$d minutë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Për 1 minutë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">Për %1$d orë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Për një orë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">Për 1 orë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Për %1$d orë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1698,9 +1719,9 @@
<item quantity="other">Për %d minuta</item>
<item quantity="one">Për 1 minutë</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Për %d orë</item>
- <item quantity="one">Për një orë</item>
+ <item quantity="one">Për 1 orë</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Për %d orë</item>
@@ -1721,14 +1742,14 @@
<string name="muted_by" msgid="6147073845094180001">"Lënë në heshtje nga <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Ka një problem të brendshëm me pajisjen tënde. Ajo mund të jetë e paqëndrueshme derisa të rivendosësh të dhënat në gjendje fabrike."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Ka një problem të brendshëm me pajisjen tënde. Kontakto prodhuesin tënd për detaje."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Kërkesa USSD është modifikuar në kërkesën DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Kërkesa USSD është modifikuar në kërkesën SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Kërkesa USSD është modifikuar në kërkesën e re USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Kërkesa USSD është modifikuar në kërkesën Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Kërkesa SS është e modifikuar në kërkesën DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Kërkesa SS është e modifikuar në kërkesën Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Kërkesa SS është modifikuar në kërkesën USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Kërkesa SS është e modifikuar në kërkesën e re SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Kërkesa USSD u ndryshua në telefonatë të rregullt"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Kërkesa USSD u ndryshua në kërkesë SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"U ndryshua në kërkesë të re USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Kërkesa USSD u ndryshua në telefonatë me video"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Kërkesa SS u ndryshua në telefonatë të rregullt"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Kërkesa SS u ndryshua në telefonatë me video"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Kërkesa SS u ndryshua në kërkesë USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"U ndryshua në kërkesë të re SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profili i punës"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Zgjero"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Palos"</string>
@@ -1826,6 +1847,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Karta SIM nuk është e përgatitur për zërin"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Karta SIM nuk lejohet për zërin"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoni nuk lejohet për zërin"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nuk lejohet"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nuk është përgatitur"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nuk lejohet"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g> nuk lejohet"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Dritare kërcyese"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versioni i aplikacionit u ul ose nuk është në përputhje me këtë shkurtore"</string>
@@ -1838,7 +1863,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"U gjet aplikacion i dëmshëm"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> dëshiron të shfaqë pjesë të <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifiko"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Do të lëshojë dridhje për telefonatat dhe njoftimet"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Do të hiqet zëri për telefonatat dhe njoftimet"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Ndryshimet e sistemit"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Mos shqetëso"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Modaliteti \"Mos shqetëso\" po fsheh njoftimet për të të ndihmuar të përqendrohesh"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Kjo është sjellje e re. Trokit për ta ndryshuar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Mos shqetëso\" ka ndryshuar"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Trokit për të kontrolluar cilësimet e sjelljes për ndërprerjet"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Trokit për të shënuar atë që është bllokuar"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistemi"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Cilësimet"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index aa5226b..e696471 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -78,15 +78,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ИД позиваоца подразумевано није ограничен. Следећи позив: Није ограничен."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Услуга није добављена."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Не можете да промените подешавање ИД-а корисника."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Нема услуге преноса података"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Хитни позиви нису могући"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Нема услуге преноса података преко мобилног оператера"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Хитни позиви нису доступни"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Нема гласовне услуге"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема гласовне услуге/услуге за хитне позиве"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено је онемогућено на мобилној мрежи на вашој локацији"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Повезивање са мрежом није успело"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Подешавања > Мрежа и интернет > Мобилне мреже > Жељени тип мреже."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi позивање је активно"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Хитни позиви захтевају мобилну мрежу."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Нема гласовне услуге ни хитних позива"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Привремено искључио мобилни оператер"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Привремено је искључио мобилни оператер за SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Повезивање са мобилном мрежом није успело"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Пробајте да промените жељену мрежу. Додирните да бисте променили."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Хитни позиви нису доступни"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Не можете да упућујете хитне позиве преко Wi‑Fi-ја"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Обавештења"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Преусмеравање позива"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим за хитан повратни позив"</string>
@@ -121,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Банер роминга је укључен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банер роминга је искључен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Претраживање услуге"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Позивање преко Wi-Fi-ја"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Подешавање позивања преко Wi-Fi-ја није успело"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја. (кôд грешке: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Региструјте се код мобилног оператера (кôд грешке: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Проблем у вези са регистровањем позивања преко Wi‑Fi-ја код мобилног оператера: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -161,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Превише захтева се обрађује. Пробајте поново касније."</string>
<string name="notification_title" msgid="8967710025036163822">"Грешка при пријављивању за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхронизација"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизација"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Превише <xliff:g id="CONTENT_TYPE">%s</xliff:g> избрисаних ставки."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Синхронизација није успела"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Превише покушаја брисања садржаја <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Меморија таблета је пуна! Избришите неке датотеке да бисте ослободили простор."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Меморија сата је пуна. Избришите неке датотеке да бисте ослободили простор."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Меморијски простор на ТВ-у је попуњен. Избришите неке датотеке да бисте ослободили простор."</string>
@@ -176,14 +177,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Од стране администратора профила за Work"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Од стране <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Пословни профил је избрисан"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Профил за Work је избрисан јер недостаје апликација за администраторе"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Апликација за администраторе на профилу за Work недостаје или је оштећена. Због тога су профил за Work и повезани подаци избрисани. Обратите се администратору за помоћ."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Профил за Work више није доступан на овом уређају"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Превише покушаја уноса лозинке"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Уређајем се управља"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Организација управља овим уређајем и може да надгледа мрежни саобраћај. Додирните за детаље."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Уређај ће бити обрисан"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Не можете да користите ову апликацију за администраторе. Уређај ће сада бити обрисан.\n\nАко имате питања, контактирајте администратора организације."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Не можете да користите ову апликацију за администраторе. Уређај ће сада бити обрисан.\n\nАко имате питања, контактирајте администратора организације."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Штампање је онемогућила апликација <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ја"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Опције за таблет"</string>
@@ -239,6 +239,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим рада у авиону"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим рада у авиону је УКЉУЧЕН"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим рада у авиону је ИСКЉУЧЕН"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Уштеда батерије"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Уштеда батерије је ИСКЉУЧЕНА"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Уштеда батерије је УКЉУЧЕНА"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Подешавања"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помоћ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помоћ"</string>
@@ -272,31 +275,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Пређи на пословни профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"приступи контактима"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа контактима"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа контактима?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"приступи локацији овог уређаја"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа локацији уређаја"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа локацији овог уређаја?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"приступи календару"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа календару"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа календару?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"шаље и прегледа SMS поруке"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> шаље и прегледа SMS-ове"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> шаље и прегледа SMS-ове?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Складиште"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"приступа сликама, медијима и датотекама на уређају"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Дозволите <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да приступа сликама, медијским датотекама и датотекама на уређају"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>приступа сликама, медијским датотекама и датотекама на уређају?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"снима звук"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> снима звук"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> снима звук?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"снима слике и видео"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> снима слике и видео снимке"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> снима слике и видео снимке?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упућује телефонске позиве и управља њима"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> упућује позиве и управља њима"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> упућује позиве и управља њима?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Сензори за тело"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"приступа подацима сензора о виталним функцијама"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа подацима сензора о виталним функцијама"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>приступа подацима сензора о виталним функцијама?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"да преузима садржај прозора"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"да укључи Истраживања додиром"</string>
@@ -308,7 +311,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Обављање покрета"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Може да додирује, листа, скупља приказ и обавља друге покрете."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Покрети за отисак прста"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Може да региструје покрете на сензору за отисак прста на уређају."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Може да региструје покрете на сензору за отисак прста на уређају."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"онемогућавање или измена статусне траке"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дозвољава апликацији да онемогући статусну траку или да додаје и уклања системске иконе."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"функционисање као статусна трака"</string>
@@ -359,6 +362,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Дозвољава апликацији да учини сопствене компоненте трајним у меморији. Ово може да ограничи меморију доступну другим апликацијама и успори таблет."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Дозвољава апликацији да неке своје делове трајно задржи у меморији. То може да ограничи меморију доступну другим апликацијама и успори ТВ."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Дозвољава апликацији да учини сопствене компоненте трајним у меморији. Ово може да ограничи меморију доступну другим апликацијама и успори телефон."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"покрени услугу у првом плану"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Дозвољава апликацији да користи услуге у првом плану."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"мерење меморијског простора у апликацији"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Дозвољава апликацији да преузме величине кôда, података и кеша."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"измена подешавања система"</string>
@@ -481,6 +486,8 @@
<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_useBiometric" msgid="8837753668509919318">"користи биометријски хардвер"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Дозвољава апликацији да користи биометријски хардвер за потврду аутентичности"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управљај хардвером за отиске прстију"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Дозвољава апликацији да активира методе за додавање и брисање шаблона отисака прстију који ће се користити."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"користи хардвер за отиске прстију"</string>
@@ -493,6 +500,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Није препознат"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отисак прста је потврђен"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отиске прстију није доступан."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string>
@@ -805,6 +813,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Откључавање шаблоном."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Откључавање лицем."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Откључавање PIN-ом."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Откључава SIM картицу PIN-ом."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Откључава SIM картицу PUK-ом."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Откључавање лозинком."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област шаблона."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област превлачења."</string>
@@ -866,6 +876,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текст је копиран у привремену меморију."</string>
<string name="more_item_label" msgid="4650918923083320495">"Још"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Мени+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"размак"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"избриши"</string>
@@ -1014,14 +1030,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string>
<string name="email" msgid="4560673117055050403">"Пошаљи имејл"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Пошаљите имејл на изабрану адресу"</string>
<string name="dial" msgid="1253998302767701559">"Позови"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Позовите изабрани број телефона"</string>
<string name="map" msgid="6521159124535543457">"Пронађи"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Пронађите изабрану адресу"</string>
<string name="browse" msgid="1245903488306147205">"Отвори"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Отворите изабрани URL"</string>
<string name="sms" msgid="4560537514610063430">"Пошаљи SMS"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Пошаљите SMS на изабрани број телефона"</string>
<string name="add_contact" msgid="7867066569670597203">"Додај"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Додајте у контакте"</string>
<string name="view_calendar" msgid="979609872939597838">"Прикажи"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Погледајте изабрано време у календару"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Закажи"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Закажите догађај у изабрано време"</string>
<string name="view_flight" msgid="7691640491425680214">"Прати"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Пратите изабрани лет"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Меморијски простор је на измаку"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Неке системске функције можда не функционишу"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string>
@@ -1094,31 +1119,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Потражи ажурирање"</string>
<string name="smv_application" msgid="3307209192155442829">"Апликација <xliff:g id="APPLICATION">%1$s</xliff:g> (процес <xliff:g id="PROCESS">%2$s</xliff:g>) је прекршила самонаметнуте StrictMode смернице."</string>
<string name="smv_process" msgid="5120397012047462446">"Процес <xliff:g id="PROCESS">%1$s</xliff:g> је прекршио самонаметнуте StrictMode смернице."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android се надограђује…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android се покреће…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефон се ажурира…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Таблет се ажурира…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Уређај се ажурира…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефон се покреће…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Таблет се покреће…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Уређај се покреће…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Меморија се оптимизује."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Довршавамо ажурирање Android-а…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Неке апликације можда неће исправно функционисати док се надоградња не доврши"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Ажурирање система се довршава…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надограђује…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизовање апликације <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Припрема се <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Покретање апликација."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Завршавање покретања."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Додирните да бисте се вратили у игру"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Одаберите игру"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Да би учинак био бољи, можете да отворите само једну од ових игара одједном."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Назад на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Снимак динамичког дела меморије је направљен; додирните за дељење"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Изаберите радњу за текст"</string>
@@ -1155,12 +1177,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Повежите се са отвореном Wi‑Fi мрежом"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Повежите се на Wi-Fi мрежу мобилног оператера"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Повезујете се са отвореном Wi‑Fi мрежом"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Повезује се са Wi-Fi мрежом..."</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Повезали сте се са Wi‑Fi мрежом"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Повезивање са Wi‑Fi мрежом није успело"</string>
<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="1100098935861622985">"Све мреже"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Све мреже"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ће се аутоматски укључити"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Када сте у близини сачуване мреже високог квалитета"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не укључуј поново"</string>
@@ -1226,6 +1248,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Поново покрени"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активирајте мобилну услугу"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Преузмите апликацију мобилног оператера да бисте активирали нови SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Преузмите апликацију <xliff:g id="APP_NAME">%1$s</xliff:g> да бисте активирали нову SIM картицу"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Преузмите апликацију"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Нова SIM картица је уметнута"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Додирните за подешавање"</string>
@@ -1244,13 +1267,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP преко USB-а је укључен"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB привезивање је укључено"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI преко USB-а је укључен"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режим USB додатка је укључен"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB додатак је повезан"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Додирните за још опција."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Повезани уређај се пуни. Додирните за још опција."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Откривена је аналогна додатна опрема за аудио садржај"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Прикључени уређај није компатибилан са овим телефоном. Додирните да бисте сазнали више."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је омогућено"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Додирните да бисте онемогућили отклањање грешака са USB-а."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Додирните да бисте искључили отклањање грешака са USB-а"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изаберите да бисте онемогућили отклањања грешака са USB-а."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Извештај о грешци се генерише…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Желите ли да поделите извештај о грешци?"</string>
@@ -1269,34 +1292,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се приказује преко других аплик."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не желите ову функцију за <xliff:g id="NAME">%s</xliff:g>, додирните да бисте отворили подешавања и искључили је."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЉУЧИ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> се припрема"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверава се да ли постоје грешке"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Нови уређај <xliff:g id="NAME">%s</xliff:g> је откривен"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Искључи"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Проверава се <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Прегледа се актуелни садржај"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Нови/а <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Додирните да бисте подесили"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренос слика и медија"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен. Додирните да бисте га поправили."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Проблем са: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Додирните да бисте исправили"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Медиј <xliff:g id="NAME">%s</xliff:g> је оштећен. Изаберите да га поправите."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Уређај <xliff:g id="NAME">%s</xliff:g> није подржан"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Овај уређај не подржава овај уређај <xliff:g id="NAME">%s</xliff:g>. Додирните да бисте подесили подржани формат."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Овај уређај не подржава овај медиј (<xliff:g id="NAME">%s</xliff:g>). Изаберите да га подесите у подржаном формату."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Уређај <xliff:g id="NAME">%s</xliff:g> је неочекивано уклоњен"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Искључите уређај <xliff:g id="NAME">%s</xliff:g> пре уклањања да не бисте изгубили податке"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен; уметните нови"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> се још увек избацује…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не уклањајте"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Избаците медијум пре него што га уклоните да не бисте изгубили садржај"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> је уклоњен/а"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Неке функције можда неће исправно радити. Уметните нов меморијски уређај."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Избацује се <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не уклањајте"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> недостаје"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Уметните уређај поново"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Подаци се преносе"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Пренос је завршен"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Подаци су пренесени на уређај <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Пренос података није успео"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Подаци су остали на оригиналној локацији"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Пренос садржаја је готов"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Садржај је премешен на: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Премештање садржаја није успело"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Пробајте да поново преместите садржај"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Уклоњен је"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Избачен је"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Проверава се..."</string>
@@ -1355,14 +1379,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Повезивање стално укљученог VPN-а..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Стално укључени VPN је повезан"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Веза са увек укљученим VPN-ом је прекинута"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка стално укљученог VPN-а"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Повезивање на стално укључени VPN није успело"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Промените подешавања VPN-а"</string>
<string name="upload_file" msgid="2897957172366730416">"Одабери датотеку"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Није изабрана ниједна датотека"</string>
<string name="reset" msgid="2448168080964209908">"Ресетуј"</string>
<string name="submit" msgid="1602335572089911941">"Пошаљи"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Режим рада у аутомобилу је омогућен"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Додирните да бисте изашли из режима рада у аутомобилу."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Апликација за вожњу је покренута"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Додирните да бисте изашли из апликације за вожњу."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Активно повезивање са интернетом преко мобилног уређаја или хотспот"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Додирните да бисте подесили."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Привезивање је онемогућено"</string>
@@ -1441,22 +1465,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB диск"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB меморија"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Измени"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Обавештење о потрошњи података"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Додирните за потрошњу и подешавања."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Нема више 2G-3G података"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Нема више 4G података"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Упозорење на потрошњу података"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Потрошили сте <xliff:g id="APP">%s</xliff:g> података"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Достигли сте ограничење података"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Нема више Wi-Fi података"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Потрошили сте податке за овај месец"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Прекорачен пренос 2G-3G података"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Прекорачење преноса 4G података"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Прекорачено огранич. прен. под."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Прекорачење преноса Wi-Fi подат."</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> преко наведеног ограничења."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Подаци су паузирани током остатка циклуса"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Потрошили сте мобилне податке"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Потрошили сте Wi-Fi податке"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Прекорачили сте <xliff:g id="SIZE">%s</xliff:g> од подешеног ограничења"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Позадински подаци су ограничени"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Додирните за уклањање ограничења."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Велика потрошња података"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Потрошња података током последњих пар дана је већа него обично. Додирните да бисте прегледали потрошњу и подешавања."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Велика потрошња моб. података"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Апликације су потрошиле више података него обично"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Апликација <xliff:g id="APP">%s</xliff:g> је потрошила више података него обично"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Безбедносни сертификат"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Овај сертификат је важећи."</string>
<string name="issued_to" msgid="454239480274921032">"Издато за:"</string>
@@ -1694,7 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирао је администратор"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ажурирао је администратор"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Избрисао је администратор"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Да би продужила трајање батерије, Уштеда батерије смањује перформансе уређаја и ограничава вибрацију, услуге локације и већину позадинских података. Имејл, размена порука и друге апликације које се ослањају на синхронизацију се неће ажурирати ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Да би продужила трајање батерије, Уштеда батерије смањује перформансе уређаја и ограничава или искључује вибрацију, услуге локације и позадинске податке. Имејл, размена порука и друге апликације које се ослањају на синхронизацију се можда неће ажурирати ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Укључити Уштеду података?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Укључи"</string>
@@ -1708,7 +1729,7 @@
<item quantity="few">За %1$d мин (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">За %1$d мин (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d сат (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">%1$d сата (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d сати (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1728,7 +1749,7 @@
<item quantity="few">За %d мин</item>
<item quantity="other">За %d мин</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d сат</item>
<item quantity="few">%d сата</item>
<item quantity="other">%d сати</item>
@@ -1753,14 +1774,14 @@
<string name="muted_by" msgid="6147073845094180001">"Звук је искључио/ла <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Дошло је до интерног проблема у вези са уређајем и можда ће бити нестабилан док не обавите ресетовање на фабричка подешавања."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Дошло је до интерног проблема у вези са уређајем. Потражите детаље од произвођача."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD захтев је промењен у DIAL захтев."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD захтев је промењен у SS захтев."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD захтев је промењен у нови USSD захтев."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD захтев је промењен у Video DIAL захтев."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS захтев је промењен у DIAL захтев."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS захтев је промењен у Video DIAL захтев."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS захтев је промењен у USSD захтев."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS захтев је промењен у нови SS захтев."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD захтев је промењен у обичан позив"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD захтев је промењен у SS захтев"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Промењено је у нови USSD захтев"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD захтев је промењен у видео позив"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS захтев је промењен у обичан позив"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS захтев је промењен у видео позив"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS захтев је промењен у USSD захтев"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Промењено је у нови SS захтев"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Профил за Work"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Прошири"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Скупи"</string>
@@ -1860,6 +1881,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM картица није подешена за гласовне услуге"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM картица није прилагођена за гласовне услуге"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефон није прилагођен за гласовне услуге"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> није дозвољен"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> није подешен"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> није дозвољен"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> није дозвољен"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Искачући прозор"</string>
<string name="slice_more_content" msgid="8504342889413274608">"и још <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Апликација је враћена на старију верзију или није компатибилна са овом пречицом"</string>
@@ -1872,7 +1897,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Откривена је штетна апликација"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Апликација <xliff:g id="APP_0">%1$s</xliff:g> жели да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Измени"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Вибрација за позиве и обавештења је укључена"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Мелодија звона за позиве и обавештење је искључена"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системске промене"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не узнемиравај"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Режим Не узнемиравај крије обавештења да би вам помогао да се фокусирате"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ово је ново понашање. Додирните да бисте променили."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Режим Не узнемиравај је промењен"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Додирните да бисте проверили да ли подешавања понашања обухватају прекиде"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Додирните да бисте проверили шта је блокирано."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Подешавања"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index e713c30..8b9714b 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Nummerpresentatörens standardinställning är inte blockerad. Nästa samtal: Inte blockerad"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Tjänsten är inte etablerad."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Det går inte att ändra inställningen för nummerpresentatör."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Datatjänst har blockerats"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Det går inte att ringa nödsamtal"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ingen mobildatatjänst"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Det går inte att ringa nödsamtal"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tjänsten för röstsamtal har blockerats"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tjänster för röst- och nödsamtal har blockerats"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Detta erbjuds för tillfället inte på mobilnätverket där du befinner dig"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Det går inte att nå nätverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Testa om du får bättre mottagning genom att ändra till en annan typ under Inställningar > Nätverk och internet > Mobila nätverk > Önskad nätverkstyp."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi-Fi-samtal är aktiverat"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Mobilnätverk krävs för att ringa nödsamtal."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Inga rösttjänster eller nödsamtal"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Tillfälligt avstängt av operatören"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Det går inte att nå mobilnätverket"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Testa att byta föredraget nätverk. Tryck om du vill ändra."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Det går inte att ringa nödsamtal"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Det går inte att ringa nödsamtal via Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Aviseringar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Vidarekoppla samtal"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Läget Återuppringning vid nödsamtal"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roamingbanner på"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roamingbanner av"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Söker efter tjänst"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-samtal"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Det gick inte att konfigurera Wi-Fi-samtal"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar. (Felkod: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrera dig hos operatören (felkod: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Följande fel uppstod när Wi-Fi-samtal skulle registreras hos operatören: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"För många begäranden bearbetas. Försök igen senare."</string>
<string name="notification_title" msgid="8967710025036163822">"Inloggningsfel för <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkronisera"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronisera"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"För många <xliff:g id="CONTENT_TYPE">%s</xliff:g>-borttagningar."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synkroniseringen misslyckades"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"För många <xliff:g id="CONTENT_TYPE">%s</xliff:g> att ta bort."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pekdatorns lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Klockans lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Lagringsutrymmet på TV:n är fullt. Ta bort några filer för att frigöra utrymme."</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Av administratören för jobbprofilen"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Jobbprofilen har raderats"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Jobbprofilen har raderats eftersom det saknas en administratörsapp"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Administratörsappen för jobbprofilen saknas eller är skadad. Det innebär att jobbprofilen och all relaterad data har raderats. Kontakta administratören om du vill ha hjälp."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Jobbprofilen är inte längre tillgänglig på enheten"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"För många försök med lösenord"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Enheten hanteras"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organisationen hanterar den här enheten och kan övervaka nätverkstrafiken. Tryck om du vill veta mer."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Enheten kommer att rensas"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Det går inte att använda administratörsappen. Enheten rensas.\n\nKontakta organisationens administratör om du har några frågor."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Det går inte att använda administratörsappen. Enheten rensas.\n\nKontakta organisationens administratör om du har några frågor."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Utskrift har inaktiverats av <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Jag"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Alternativ för surfplattan"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flygplansläge"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flygplansläge är AKTIVERAT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flygplansläge är INAKTIVERAT"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparläge"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparläget har inaktiverats"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparläget har aktiverats"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjälp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Byt till jobbprofilen"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tillgång till dina kontakter"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till dina kontakter"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till dina kontakter?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Plats"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"komma åt enhetens platsuppgifter"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till enhetens plats"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till enhetens plats?"</string>
<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="6704529828699071445">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till din kalender"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till din kalender?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"skicka och visa sms"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att skicka och visa sms"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att skicka och visa sms?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"få åtkomst till foton, media och filer på din enhet"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till foton, mediafiler och andra filer på enheten"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till foton, mediafiler och andra filer på enheten?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"spela in ljud"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att spela in ljud"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att spela in ljud?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ta bilder och spela in video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörghet att ta bilder och spela in video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att ta bilder och spela in video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ringa och hantera telefonsamtal"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att ringa och hantera telefonsamtal"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> behörighet att ringa och hantera telefonsamtal?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få åtkomst till sensordata om dina vitalparametrar"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till sensordata om vitalparametrar"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till sensordata om vitalparametrar?"</string>
<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>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Göra rörelser"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan trycka, svepa, nypa och göra andra rörelser."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingeravtrycksrörelser"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Kan registrera rörelser som utförs med hjälp av enhetens fingeravtryckssensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Kan registrera rörelser som utförs med hjälp av enhetens fingeravtryckssensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"inaktivera eller ändra statusfält"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"visas i statusfältet"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tillåter att delar av appen läggs beständigt i minnet. Detta kan innebära att det tillgängliga minnet för andra appar begränsas, vilket gör surfplattan långsam."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Tillåter att en app gör vissa delar beständiga i minnet. Det kan begränsa mängden minne som är tillgänglig för andra appar och gör TV:n långsammare."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tillåter att delar av appen läggs beständigt i minnet. Detta kan innebära att det tillgängliga minnet för andra appar begränsas, vilket gör mobilen långsam."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"kör tjänst i förgrunden"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Tillåter att appen använder tjänster i förgrunden."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mäta appens lagringsplats"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tillåter att appen hämtar kod, data och cachestorlekar"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ändra systeminställningar"</string>
@@ -478,6 +484,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Tillåter att appen anropar metoder för att lägga till och radera fingeravtrycksmallar."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"använda maskinvara för fingeravtryck"</string>
@@ -490,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Identifierades inte"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Det finns ingen maskinvara för fingeravtryck."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string>
@@ -802,6 +812,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås upp med grafiskt lösenord."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås upp med Ansiktslås."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås upp med PIN-kod."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Lås upp med SIM-kortets pinkod."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Lås upp med SIM-kortets PUK-kod."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås upp med lösenord."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Fält för grafiskt lösenord."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Fält med dragreglage."</string>
@@ -863,6 +875,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text har kopierats till urklipp."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mer"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta + "</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl + "</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt + "</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Skift + "</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Symbol + "</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funktion + "</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"utrymme"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"retur"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ta bort"</string>
@@ -994,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Indatametod"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textåtgärder"</string>
<string name="email" msgid="4560673117055050403">"Skicka e-post"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Skicka e-post till vald adress"</string>
<string name="dial" msgid="1253998302767701559">"Ring"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ring valt telefonnummer"</string>
<string name="map" msgid="6521159124535543457">"Hitta"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Hitta valda adresser"</string>
<string name="browse" msgid="1245903488306147205">"Öppna"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Öppna vald webbadress"</string>
<string name="sms" msgid="4560537514610063430">"Sms:a"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Skicka meddelande till valt telefonnummer"</string>
<string name="add_contact" msgid="7867066569670597203">"Lägg till"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Lägg till i Kontakter"</string>
<string name="view_calendar" msgid="979609872939597838">"Visa"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Visa vald tid i kalendern"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Schema"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Schemalägg händelse på den valda tiden"</string>
<string name="view_flight" msgid="7691640491425680214">"Spår"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Spåra valt flyg"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Lagringsutrymmet börjar ta slut"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Det kan hända att vissa systemfunktioner inte fungerar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Det finns inte tillräckligt med utrymme för systemet. Kontrollera att du har ett lagringsutrymme på minst 250 MB och starta om."</string>
@@ -1074,31 +1101,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Sök efter uppdateringar"</string>
<string name="smv_application" msgid="3307209192155442829">"Appen <xliff:g id="APPLICATION">%1$s</xliff:g> (processen <xliff:g id="PROCESS">%2$s</xliff:g>) har brutit mot sin egen StrictMode-policy."</string>
<string name="smv_process" msgid="5120397012047462446">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> har brutit mot sin egen StrictMode-policy."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android uppgraderas ..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android startar …"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Mobilen uppdateras …"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Surfplattan uppdateras …"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Enheten uppdateras …"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Mobilen startar …"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Surfplattan startar …"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Enheten startar …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lagringsutrymmet optimeras."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-uppdateringen slutförs …"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"En del appar kanske inte fungerar som de ska innan uppgraderingen har slutförts"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Systemuppdatering avslutas …"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> uppgraderas …"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerar app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> förbereds."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Appar startas."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Uppgraderingen är klar."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> körs"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Återgå till spelet genom att trycka här"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Välj spel"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Av prestandaskäl kan bara ett av de här spelen vara öppet åt gången."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Återgå till <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"En minnesdump har skapats – tryck här om du vill dela den"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Välj en åtgärd för text"</string>
@@ -1133,12 +1157,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Anslut till ett öppet Wi-Fi-nätverk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Anslut till operatörens Wi-Fi-nätverk"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ansluter till ett öppet Wi-Fi-nätverk"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Ansluter till Wi-Fi-nätverk"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ansluten till Wi-Fi-nätverket"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Det gick inte att ansluta till Wi‑Fi-nätverket"</string>
<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="1100098935861622985">"Alla nätverk"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alla nätverk"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi aktiveras automatiskt"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"När du är i närheten av ett sparat nätverk av hög kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Återaktivera inte"</string>
@@ -1204,6 +1228,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Starta om"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivera mobiltjänst"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Ladda ned operatörens app och aktivera det nya SIM-kortet"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Ladda ned appen <xliff:g id="APP_NAME">%1$s</xliff:g> för att aktivera det nya SIM-kortet"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ladda ned appen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nytt SIM-kort har satts in"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tryck om du vill konfigurera"</string>
@@ -1222,13 +1247,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB har aktiverats"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Internetdelning via USB har aktiverats"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB har aktiverats"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Läget för USB-tillbehör har aktiverats"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-tillbehör anslutet"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tryck för fler alternativ."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Den anslutna enheten laddas. Tryck om du vill ha fler alternativ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Ett tillbehör med analog ljudutgång hittades"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den anslutna enheten är inte kompatibel med mobilen. Tryck här om du vill veta mer."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tryck för att inaktivera USB-felsökning."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tryck om du vill 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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Felrapporten överförs …"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vill du dela felrapporten?"</string>
@@ -1247,34 +1272,50 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Om du inte vill att den här funktionen används för <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"INAKTIVERA"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Förbereder ditt <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Söker efter fel"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nytt <xliff:g id="NAME">%s</xliff:g> har hittats"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Inaktivera"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"För överföring av foton och media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> har skadats"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> har skadats. Åtgärda genom att trycka."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> har skadats. Välj för att åtgärda."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> stöds inte"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Enheten har inte stöd för <xliff:g id="NAME">%s</xliff:g>. Tryck här om du vill konfigurera i ett format som stöds."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Enheten stöder inte detta <xliff:g id="NAME">%s</xliff:g>. Välj för att konfigurera i ett format som stöds."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> togs bort oväntat"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Avmontera <xliff:g id="NAME">%s</xliff:g> före borttagningen för att undvika dataförlust"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ditt <xliff:g id="NAME">%s</xliff:g> har tagits bort"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> togs bort. Mata in ett nytt"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ditt <xliff:g id="NAME">%s</xliff:g> matas fortfarande ut …"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ta inte bort"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurera"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Mata ut"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Utforska"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> saknas"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Sätt i enheten igen"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flyttar <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Flyttar data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Flytten är klar"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data har flyttats till <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Det gick inte att flytta data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data kvar på ursprunglig plats"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Borttaget"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Utmatat"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerar …"</string>
@@ -1333,14 +1374,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ansluter till Always-on VPN ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ansluten till Always-on VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Frånkopplad från Always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fel på Always-on VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Det gick inte att ansluta till Always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Ändra inställningarna för nätverk eller VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Välj fil"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil har valts"</string>
<string name="reset" msgid="2448168080964209908">"Återställ"</string>
<string name="submit" msgid="1602335572089911941">"Skicka"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Billäge aktiverat"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tryck om du vill avsluta billäge."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Bilkörningsappen körs"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tryck här om du vill avsluta bilkörningsappen."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Internetdelning eller surfzon aktiverad"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tryck om du vill konfigurera."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Internetdelning har inaktiverats"</string>
@@ -1418,22 +1459,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-enhet (<xliff:g id="MANUFACTURER">%s</xliff:g>)"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redigera"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Varning – dataanvändning"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Visa användning och inställning."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Datagränsen för 2G-3G har uppnåtts"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Datagränsen för 4G har uppnåtts"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datavarning"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Du har använt <xliff:g id="APP">%s</xliff:g> data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Gränsen för mobildata har nåtts"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Datagränsen för Wi-Fi har uppnåtts"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data är pausade under resten av cykeln"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Gränsen för data via 2G-3G har överskridits"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Gränsen för data via 4G har överskridits"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Gränsen för mobildata har överskridits"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Gränsen för data via Wi-Fi har överskridits"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> över angiven gräns."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data är pausade under resten av cykeln"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Över gränsen för mobildata"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Över gränsen för Wi-Fi-data"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Du överskridit den inställda gränsen med <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Bakgrundsdata är begränsade"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Ta bort begränsning."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Hög dataanvändning"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Dataanvändningen har varit högre än vanligt under de senaste dagarna. Om du trycker här visas användningen och inställningarna."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Hög användning av mobildata"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Dina appar har använt mer data än vanligt"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> har använt mer data än vanligt"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Säkerhetscertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certifikatet är giltigt."</string>
<string name="issued_to" msgid="454239480274921032">"Utfärdad till:"</string>
@@ -1669,7 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratören installerade paketet"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratören uppdaterade paketet"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administratören raderade paketet"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre. Vibration, platstjänster och den mesta användningen av bakgrundsdata begränsas. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre. Vibration, platstjänster och bakgrundsdata begränsas eller inaktiveras. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Aktivera Databesparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivera"</string>
@@ -1681,7 +1719,7 @@
<item quantity="other">I %1$d min (t.o.m. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">I 1 min (t.o.m. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">I %1$d timmar (till kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">I en timme (till kl. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
@@ -1697,7 +1735,7 @@
<item quantity="other">I %d min</item>
<item quantity="one">I 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">I %d timmar</item>
<item quantity="one">I en timme</item>
</plurals>
@@ -1720,14 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har stängt av ljudet"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Ett internt problem har uppstått i enheten, och det kan hända att problemet kvarstår tills du återställer standardinställningarna."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Ett internt problem har uppstått i enheten. Kontakta tillverkaren om du vill veta mer."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-begäran har ändrats till en DIAL-begäran."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-begäran har ändrats till en SS-begäran."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-begäran har ändrats till en ny USSD-begäran."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-begäran har ändrats till en Video DIAL-begäran."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-begäran har ändrats till en DIAL-begäran."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-begäran har ändrats till en Video DIAL-begäran."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-begäran har ändrats till en USSD-begäran."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-begäran har ändrats till en ny SS-begäran."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD-begäran har ändrats till standardsamtal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD-begäran har ändrats till en SS-begäran"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Har ändrats till ny USSD-begäran"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD-begäran har ändrats till videosamtal"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS-begäran har ändrats till standardsamtal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS-begäran har ändrats till videosamtal"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS-begäran har ändrats till en USSD-begäran"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Har ändrats till ny SS-begäran"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Jobbprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Utöka"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Komprimera"</string>
@@ -1825,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kort tillhandahålls inte för röst"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort tillåts inte för röst"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tillåts inte för röst"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"popup-fönster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> till"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versionen av appen är nedgraderad eller så är den inte kompatibel med genvägen"</string>
@@ -1837,7 +1883,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"En skadlig app har upptäckts"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vill kunna visa bitar av <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redigera"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibrerar vid samtal och aviseringar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Ljudet stängs av för samtal och aviseringar"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemändringar"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Stör ej"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"I läget Stör ej döljs aviseringar så att du kan fokusera på det viktigaste"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Detta är en ny inställning. Tryck om du vill ändra."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Stör ej har ändrats"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryck om du vill kontrollera avbrott i inställningarna"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tryck om du vill se vad som blockeras."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Inställningar"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 3eeed7f..3485056 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Huduma haitathminiwi."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Hauwezi kubadilisha mpangilio wa kitambulisho cha anayepiga."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Hakuna huduma ya data"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Huwezi kupiga simu za dharura"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Hakuna huduma ya data kwa vifaa vya mkononi"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Huduma ya kupiga simu za dharura haipatikani"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hakuna huduma za simu za sauti"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hakuna huduma ya simu za dharura au za sauti"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Kwa sasa, huduma hii haipatikani katika mtandao wa simu mahali ulipo"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Haiwezi kufikia mtandao"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Ili kupata mtandao thabiti, jaribu kubadilisha aina uliyochagua katika Mipangilio > Mtandao na intaneti > Mtandao wa simu > Aina ya mtandao unaopendelea."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Umewasha kipengele cha kupiga simu kupitia Wi‑Fi"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Huduma ya kupiga simu za dharura inahitaji mtandao wa simu."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Hakuna huduma ya simu za sauti au ya simu za dharura"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Imezimwa kwa muda na mtoa huduma wako"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Mtoa huduma wako ameizima kwa muda mfupi katika SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Imeshindwa kufikia mtandao wa simu"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Jaribu kutumia mtandao unaopendelea. Gusa ili ubadilishe."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Huduma ya kupiga simu za dharura haipatikani"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Huwezi kupiga simu ya dharura kupitia Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Arifa"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kupeleka simu kwenye nambari nyingine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hali ya kupiga simu za dharura"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Washa Bango la Uzururaji"</string>
<string name="roamingText12" msgid="1189071119992726320">"Zima Bango la Uzururaji"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Inatafuta Huduma"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Upigaji Simu kwa Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Imeshindwa kuweka mipangilio ya kupiga simu kupitia Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako aweke mipangilio ya huduma hii kwanza. Kisha uwashe tena kipengele cha kupiga simu kupitia Wi-Fi kwenye Mipangilio. (Msimbo wa hitilafu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Jisajili na mtoa huduma wako (Msimbo wa hitilafu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Tatizo limetokea wakati wa kusajili huduma ya kupiga simu kupitia Wi‑Fi ya mtoa huduma wako: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<!-- String.format failed for translation -->
<!-- no translation found for wfcSpnFormats:0 (6830082633573257149) -->
@@ -158,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Maombi mengi sana yanashughulikiwa. Jaribu tena baadaye."</string>
<string name="notification_title" msgid="8967710025036163822">"Hitilafu ya kuingia ya <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sawazisha"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sawazisha"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Ufutaji mwingi sana <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Imeshindwa kusawazisha"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Umejaribu kufuta <xliff:g id="CONTENT_TYPE">%s</xliff:g> nyingi mno."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Hifadhi ya kompyuta kibao imejaa. Futa baadhi ya faili ili kupata nafasi."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Hifadhi ya saa imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Hifadhi ya runinga ni kamili. Futa baadhi ya faili ili upate nafasi."</string>
@@ -172,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Na msimamizi wa wasifu wako wa kazini"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Na <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Wasifu wa kazini umefutwa"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Wasifu wa kazini umefutwa kutokana na kupotea kwa programu ya msimamizi"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Programu ya msimamizi wa wasifu wa kazini imepotea au ina hitilafu. Kwa sababu hiyo, wasifu wako wa kazini na data husika imefutwa. Wasiliana na msimamizi wako kwa usaidizi."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Wasifu wako wa kazini haupatikani tena kwenye kifaa hiki"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Umejaribu kuweka nenosiri mara nyingi mno"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Kifaa kinadhibitiwa"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Shirika lako linadhibiti kifaa hiki na huenda likafuatilia shughuli kwenye mtandao. Gusa ili upate maelezo zaidi."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Data iliyomo kwenye kifaa chako itafutwa"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Huwezi kutumia programu ya msimamizi. Sasa data iliyo kwenye kifaa chako itafutwa.\n\nIkiwa una maswali yoyote, wasiliana na msimamizi wa shirika lako."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Huwezi kutumia programu ya msimamizi. Sasa data iliyo kwenye kifaa chako itafutwa.\n\nIkiwa una maswali yoyote, wasiliana na msimamizi wa shirika lako."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Kipengele cha kuchapisha kimezimwa na <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Mimi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Chaguo za kompyuta ndogo"</string>
@@ -234,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hali ya ndegeni"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndegeni IMEWASHWA"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndegeni IMEZIMWA"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Kiokoa betri"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Kiokoa betri KIMEZIMWA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Kiokoa betri KIMEWASHWA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Mapendekezo"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>
@@ -267,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Tumia wasifu wa kazini"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Anwani"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ifikie anwani zako"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie anwani zako"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie anwani zako?"</string>
<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="8903573681261610809">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> itambue mahali kifaa 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="permgrouplab_calendar" msgid="5863508437783683902">"Kalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ifikie kalenda yako"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"itume na iangalie SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> itume na kuangalia ujumbe wa SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> itume na ione ujumbe wa SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Hifadhi"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ifikie picha, maudhui na faili kwenye kifaa chako"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie picha, maudhui na faili kwenye kifaa chako"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie picha, maudhui na faili kwenye kifaa chako?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Kipokea sauti"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"irekodi sauti"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> irekodi sauti"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> irekodi sauti?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ipige picha na kurekodi video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige picha na kurekodi video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige picha na kurekodi video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Simu"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige na kudhibiti simu"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige na kudhibiti simu?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Vihisi vya Mwili"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kurejesha 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>
@@ -303,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Tekeleza ishara"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Unaweza kugonga, kutelezesha kidole, kubana na kutekeleza ishara zingine."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Ishara za alama ya kidole"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Inaweza kurekodi ishara zinazotekelezwa kwenye kitambua alama ya kidole."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Inaweza kurekodi ishara zinazotekelezwa kwenye kitambua alama ya kidole."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"zima au rekebisha mwambaa hali"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Inaruhusu programu kulemaza upau wa hali au kuongeza na kutoa aikoni za mfumo."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"kuwa sehemu ya arifa"</string>
@@ -354,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Inaruhusu programu kuendeleza vijisehemu vyake kwenye kumbukumbu. Hii inaweza kupunguza kumbukumbu inayopatikana katika programu nyingine ikipunguza kasi ya kompyuta ndogo."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Huruhusu programu kufanya vijisehemu vyake vidumu kwenye kumbukumbu. Hii inaweza kupunguza kumbukumbu inayopatikana katika programu nyingine ikipunguza kasi ya runinga."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Inaruhusu programu kuendelesha vijisehemu vyake kwenye kumbukumbu. Hii inaweza kupunguza kumbukumbu inayopatikana katika programu nyingine ikipunguza kasi ya simu."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"tumia huduma zinazoonekana kwenye skrini"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Huruhusu programu kutumia huduma zinazoonekana kwenye skrini."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"Pima nafasi ya hifadhi ya programu"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Huruhusu Programu kupata tena msimbo, data na ukubwa wa akiba yake"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"rekebisha mipangilio ya mfumo"</string>
@@ -476,6 +481,8 @@
<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_useBiometric" msgid="8837753668509919318">"tumia maunzi ya kibaolojia"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Huruhusu programu itumie maunzi ya kibaolojia katika uthibitishaji"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"dhibiti maunzi ya kitambulisho"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Huruhusu programu kuomba njia za kuongeza na kufuta violezo vya kitambulisho kwa matumizi."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"tumia maunzi ya kitambulisho"</string>
@@ -488,6 +495,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Haitambuliwi"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Imethibitisha alama ya kidole"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maunzi ya kitambulisho hayapatikani."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Kitambulisho hakiwezi kuhifadhiwa. Tafadhali ondoa kitambulisho kilichopo."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string>
@@ -800,6 +808,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kufungua kwa ruwaza."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Kufungua kwa uso."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Kufungua kwa PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Kufungua Pin ya Sim."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Kufungua Puk ya Sim."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Kufungua kwa nenosiri."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eneo la ruwaza."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Eneo la slaidi."</string>
@@ -861,6 +871,12 @@
<string name="text_copied" msgid="4985729524670131385">"Maandishi yamenakiliwa kwenye ubao wa kunakili."</string>
<string name="more_item_label" msgid="4650918923083320495">"Zaidi"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"mwanya"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ingiza"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"futa"</string>
@@ -992,14 +1008,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Mbinu ya uingizaji"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Vitendo vya maandishi"</string>
<string name="email" msgid="4560673117055050403">"Barua pepe"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Tuma barua pepe kwa anwani uliyochagua"</string>
<string name="dial" msgid="1253998302767701559">"Simu"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Piga simu kwa nambari uliyochagua"</string>
<string name="map" msgid="6521159124535543457">"Tafuta"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Fungua ramani za anwani uliyochagua"</string>
<string name="browse" msgid="1245903488306147205">"Fungua"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Fungua URL uliyochagua"</string>
<string name="sms" msgid="4560537514610063430">"Ujumbe"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Tuma SMS kwa nambari ya simu uliyochagua"</string>
<string name="add_contact" msgid="7867066569670597203">"Ongeza"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Ongeza kwenye anwani"</string>
<string name="view_calendar" msgid="979609872939597838">"Angalia"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Angalia wakati uliyochagua katika kalenda"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Ratiba"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Ratibu tukio la wakati uliochagua"</string>
<string name="view_flight" msgid="7691640491425680214">"Toleo"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Fuatilia ndege uliyochagua"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nafasi ya kuhifadhi inakaribia kujaa"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Baadhi ya vipengee vya mfumo huenda visifanye kazi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Hifadhi haitoshi kwa ajili ya mfumo. Hakikisha una MB 250 za nafasi ya hifadhi isiyotumika na uanzishe upya."</string>
@@ -1072,31 +1097,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Angalia masasisho"</string>
<string name="smv_application" msgid="3307209192155442829">"Programu <xliff:g id="APPLICATION">%1$s</xliff:g> (utaratibu <xliff:g id="PROCESS">%2$s</xliff:g>) imeenda kinyume na sera yake ya StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Shughuli ya <xliff:g id="PROCESS">%1$s</xliff:g> imeenda kinyume na kulazimisha sera yake ya StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Toleo jipya la Android linawekwa..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Inaanzisha Android..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Simu inasasishwa…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Kompyuta kibao inasasishwa…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Kifaa kinasasishwa…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Simu inawaka…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Kompyuta kibao inawaka…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Kifaa kiwaka…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Inaboresha hifadhi."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Inakamilisha kusasisha Android..."</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Huenda baadhi ya programu zisifanye kazi vizuri hadi itakapomaliza kusasisha"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Inakamilisha sasisho la mfumo…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> inapata toleo jipya…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Inaboresha programu <xliff:g id="NUMBER_0">%1$d</xliff:g> kutoka <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Inaandaa <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Programu zinaanza"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Inamaliza kuwasha."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> inaendelea"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Gusa ili urudi kwenye mchezo"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Chagua mchezo"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Kwa utendaji bora, unaweza kufungua mojawapo ya michezo hii pekee kwa wakati mmoja."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Rudi kwenye <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Imezidi kikomo cha hifadhi; gusa ili uishiriki"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Chagua kitendo kwa ajili ya maandishi"</string>
@@ -1131,12 +1153,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Unganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Unganisha kwenye mtandao wa mtoa huduma ya Wi‑Fi"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Inaunganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Inaunganisha kwenye mtandao wa Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Imeunganisha kwenye mtandao wa Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Imeshindwa kuunganisha kwenye mtandao wa Wi‑Fi"</string>
<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="1100098935861622985">"Mitandao Yote"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Mitandao yote"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi itawashwa kiotomatiki"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Unapokuwa karibu na mtandao uliohifadhiwa wenye ubora wa juu"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Usiwashe tena"</string>
@@ -1202,6 +1224,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Anza upya"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Washa huduma ya simu za mkononi"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Pakua programu ya mtoa huduma ili uwashe SIM yako mpya"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Pakua programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> ili utumie SIM yako mpya"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Pakua programu"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM mpya imewekwa"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Gusa ili uiweke"</string>
@@ -1220,13 +1243,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Umewasha hali ya PTP kupitia USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Umewasha hali ya kusambaza mtandao ukitumia USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Umewasha hali ya MIDI kupitia USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Umewasha hali ya vifaa vya USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Imeunganisha kifuasi cha USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Gusa ili upate chaguo zaidi."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Inachaji kifaa kilichounganishwa. Gusa ili upate chaguo zaidi."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Imetambua kifaa cha sauti ya analogi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Kifaa ulichoambatisha hakitumiki kwenye simu hii. Gusa ili upate maelezo zaidi."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Gusa ili uzime utatuaji wa USB."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Inatayarisha ripoti ya hitilafu…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Ungependa kushiriki ripoti ya hitilafu?"</string>
@@ -1245,34 +1268,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> kutumia kipengele hiki, gusa ili ufungue mipangilio na ukizime."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ZIMA"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inaandaa <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Inakagua hitilafu"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> mpya imegunduliwa"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Zima"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Inakagua <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Inakagua maudhui ya sasa"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> mpya"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Gusa ili uweke mipangilio"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kwa ajili ya kuhamisha picha na maudhui"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> iliyoharibika"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ina hitilafu. Gusa ili uirekebishe."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Tatizo limetokea kwenye <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Gusa ili urekebishe"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> imeharibika. Ichague ili uirekebishe."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> isiyotumika"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Kifaa hiki hakitumii <xliff:g id="NAME">%s</xliff:g>. Gusa ili uweke mipangilio ya muundo unaoweza kutumika."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Kifaa hiki hakitumii <xliff:g id="NAME">%s</xliff:g> hii. Ichague ili uweke muundo unaotumika."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> imeondolewa bila kutarajiwa"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ondoa <xliff:g id="NAME">%s</xliff:g> kabla ya kuchomoa ili kuepuka kupoteza data"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> imeondolewa"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> imeondolewa, weka nyingine mpya"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Bado inaondoa <xliff:g id="NAME">%s</xliff:g>..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Usiondoe"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ondoa kifaa cha maudhui kabla ya kukichomoa ili usipoteze maudhui"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Imeondoa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Huenda baadhi ya vipengele visifanye kazi vizuri. Weka hifadhi mpya."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Inaondoa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Usichomoe"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Weka mipangilio"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ondoa"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Chunguza"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> haipo"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Weka kifaa hiki tena"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Weka kifaa tena"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Inahamisha <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Inahamisha data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Imekamilisha kuhamisha"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data ilihamishiwa kwenye <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Haikuweza kuhamisha data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Data iliachwa katika eneo la awali"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Imemaliza kuhamisha maudhui"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Imehamishia maudhui kwenye <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Imeshindwa kuhamisha maudhui"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Jaribu kuhamisha maudhui tena"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Imeondolewa"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Imeondolewa"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Inakagua..."</string>
@@ -1331,14 +1355,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kila mara VPN iliyowashwa inaunganishwa…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Kila mara VPN iliyowashwa imeunganishwa"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Imeondolewa kwenye VPN iliyowashwa kila wakati"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kila mara kuna hitilafu ya VPN iliyowashwa"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Imeshindwa kuunganisha kwenye VPN iliyowashwa kila wakati"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Badilisha mipangilio ya VPN au mtandao"</string>
<string name="upload_file" msgid="2897957172366730416">"Chagua faili"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Hakuna faili iliyochaguliwa"</string>
<string name="reset" msgid="2448168080964209908">"Weka upya"</string>
<string name="submit" msgid="1602335572089911941">"Wasilisha"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mtindo wa gari umewezeshwa"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Gusa ili ufunge hali ya garini."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Umewasha programu ya kuendesha gari"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Gusa ili ufunge programu ya kuendesha gari."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Kushiriki au kusambaza intaneti kumewashwa"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Gusa ili uweke mipangilio."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Umezima kipengele cha kusambaza mtandao"</string>
@@ -1416,22 +1440,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Hifadhi ya USB iliyotengenezwa na <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Hifadhi ya USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Badilisha"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Tahadhari ya matumizi ya data"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Gusa ili uangalie matumizi na mipangilio."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Kikomo data ya 2G-3G kimefikiwa"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Kikomo cha data ya 4G kimefikiwa"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Onyo kuhusu data"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Umetumia <xliff:g id="APP">%s</xliff:g> ya data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Umefikisha kipimo cha juu cha data"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Kikomo data ya Wi-Fi kimefikiwa"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Matumizi ya data yamesitishwa kwa kipindi kilichosalia"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Kikomo cha data ya 2G-3G kimezidishwa"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Kikomo cha data cha 4G kimezidishwa"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Umepitisha kiwango cha data ulichoweka"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Taarifa za Wi-fi zimevuka kiwanga"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> juu ya kikomo kilichobainishwa."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Imesitisha data kwa kipindi kilichosalia"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Umepitisha upeo wa data ya mtandao wa simu"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Umepitisha upeo wa data ya Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Umepitisha kikomo chako kwa <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Data ya mandhari nyuma imezuiwa"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Gusa ili uondoe kizuizi."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Matumizi ya data nyingi"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Umetumia data nyingi mno katika siku chache zilizopita. Gusa ili uangalie matumizi na mipangilio."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Matumizi ya juu ya data ya simu"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Programu zako zimetumia data nyingi zaidi ya kawaida"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> imetumia data nyingi zaidi ya kawaida"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Cheti cha usalama"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Cheti hiki ni halali."</string>
<string name="issued_to" msgid="454239480274921032">"Kimetolewa kwa:"</string>
@@ -1667,7 +1688,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Imesakinishwa na msimamizi wako"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Imesasishwa na msimamizi wako"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Imefutwa na msimamizi wako"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Ili kuboresha muda wa matumizi ya betri, Kiokoa Betri hupunguza utendaji wa kifaa chako na kupunguza mtetemo, huduma za utambuzi wa mahali na data nyingi ya chini chini. Huenda haitasasisha programu za barua pepe, ujumbe na programu zinginezo zinazotegemea usawazishaji, usipozifungua.\n\nKiokoa Betri hujizima kiotomatiki wakati kifaa chako kinachaji."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Ili kuboresha muda wa matumizi ya betri, Kiokoa Betri hupunguza utendaji wa kifaa chako na kupunguza au kuzima mitetemo, huduma za utambuzi wa mahali na data inayotumika chinichini. Huenda haitasasisha programu za barua pepe, ujumbe na programu zinginezo zinazotegemea usawazishaji, usipozifungua.\n\nKiokoa Betri hujizima kiotomatiki wakati kifaa chako kinachaji."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chini chini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ungependa Kuwasha Kiokoa Data?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Washa"</string>
@@ -1679,9 +1700,9 @@
<item quantity="other">Kwa dakika %1$d (mpaka <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Kwa dakika 1 (mpaka <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">Kwa saa %1$d (hadi <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Kwa saa moja (hadi <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">Kwa saa 1 (hadi <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Kwa saa %1$d (mpaka <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1695,9 +1716,9 @@
<item quantity="other">Kwa dakika %d</item>
<item quantity="one">Kwa dakika 1</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Kwa saa %d</item>
- <item quantity="one">Kwa saa moja</item>
+ <item quantity="one">Kwa saa 1</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Kwa saa %d </item>
@@ -1718,14 +1739,14 @@
<string name="muted_by" msgid="6147073845094180001">"Sauti imezimwa na <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Kuna hitilafu ya ndani ya kifaa chako, na huenda kisiwe thabiti mpaka urejeshe mipangilio ya kiwandani."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Kuna hitilafu ya ndani ya kifaa chako. Wasiliana na mtengenezaji wa kifaa chako kwa maelezo."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Ombi la USSD limerekebishwa na kuwa ombi la DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Ombi la USSD limerekebishwa na kuwa ombi la SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Ombi la USSD limerekebishwa na kuwa ombi jipya la USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Ombi la USSD limebadilishwa kuwa ombi la DIAL la Video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Ombi la SS limerekebishwa na kuwa ombi la DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Ombi la SS limebadilishwa kuwa ombi la DIAL la Video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ombi la SS limerekebishwa na kuwa ombi la USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ombi la SS limerekebishwa na kuwa ombi jipya la SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Imebadilisha ombi la USSD kuwa simu ya kawaida"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Imebadilisha ombi la USSD kuwa ombi la SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Imebadilisha kuwa ombi jipya la USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Imebadilisha ombi la USSD kuwa simu ya video"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Imebadilisha ombi la SS kuwa simu ya kawaida"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Imebadilisha ombi la SS kuwa simu ya video"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Imebadilisha ombi la SS kuwa ombi la USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Imebadilisha kuwa ombi jipya la SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Wasifu wa kazini"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Panua"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Kunja"</string>
@@ -1823,6 +1844,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM haina mipangilio ya huduma ya sauti"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM hairuhusiwi katika huduma ya sauti"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Simu hairuhusiwi katika huduma ya sauti"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Haikubali SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Haijaweka mipangilio ya SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Haikubali SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Haikubali SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Dirisha Ibukizi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Toleo la programu limeshushwa kiwango au halioani na njia hii ya mkato"</string>
@@ -1835,7 +1860,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Imetambua programu hatari"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> inataka kuonyesha vipengee <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Badilisha"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Itatetema arifa ikitumwa au simu ikipigwa"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Haitatoa mlio arifa ikitumwa au simu ikipigwa"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Mabadiliko kwenye mfumo"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Usisumbue"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Kipengele cha Usinisumbue kinaficha arifa ili kukusaidia kuwa makini zaidi"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Hii ni mipangilio mipya. Gusa ili uibadilishe."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Kipengele cha Usinisumbue kimebadilishwa"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Gusa ili uangilie mipangilio ya hali ya ukatizaji"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Gusa ili uangalie kipengee ambacho kimezuiwa."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Mfumo"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Mipangilio"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index d8d474d..d1bcc94 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"குரல் சேவை இல்லை"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"குரல் சேவையைப் பயன்படுத்த முடியாது அல்லது அவசர அழைப்பைச் செய்ய முடியாது"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"உங்கள் மொபைல் நிறுவனம் தற்காலிகமாக ஆஃப் செய்துள்ளது"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"விருப்ப நெட்வொர்க்கை மாற்றவும். மாற்ற, தட்டவும்."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"மிக அதிகமான கோரிக்கைகள் செயல்படுத்தப்படுகின்றன. பிறகு முயற்சிக்கவும்."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> க்கான உள்நுழைவு பிழை"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ஒத்திசை"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ஒத்திசைக்க முடியவில்லை"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"அதிகளவிலான <xliff:g id="CONTENT_TYPE">%s</xliff:g> உள்ளடக்க வகைகளை நீக்க முயன்றுள்ளீர்கள்."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"டேப்லெட் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில கோப்புகளை அழிக்கவும்."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"வாட்ச் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில கோப்புகளை நீக்கவும்."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"டிவி சேமிப்பகம் நிரம்பியது. இடத்தை உருவாக்க, சில கோப்புகளை நீக்கவும்."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"பணிச் சுயவிவரத்திற்கு மாற்றவும்"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"தொடர்புகள்"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"தொடர்புகளை அணுக வேண்டும்"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"தொடர்புகளை அணுகுவதற்கு <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"இருப்பிடம்"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"இந்தச் சாதனத்தின் இருப்பிடத்தை அறிந்து கொள்ளலாம்"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"இந்தச் சாதனத்தின் இருப்பிடத்தை அணுகுவதற்கு <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"கேலெண்டர்"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"கேலெண்டரை அணுகலாம்"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"கேலெண்டரை அணுகுவதற்கு <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"மெசேஜ்களை அனுப்பவும், அவற்றைப் பார்க்கவும் <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"சேமிப்பிடம்"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"உங்கள் சாதனத்தில் உள்ள படங்கள், மீடியா மற்றும் கோப்புகளை அணுக வேண்டும்"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"உங்கள் சாதனத்திலுள்ள படங்கள், மீடியா, ஃபைல்கள் ஆகியவற்றை அணுகுவதற்கு <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"மைக்ரோஃபோன்"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ஒலிப் பதிவு செய்யலாம்"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ஆடியோவைப் பதிவு செய்ய <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"கேமரா"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"படங்கள் மற்றும் வீடியோக்கள் எடுக்கலாம்"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"படங்கள் எடுக்கவும், வீடியோ பதிவு செய்யவும் <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ஃபோன்"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"யாரையும் தொலைபேசியில் அழைக்கலாம்"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"மொபைல் அழைப்புகள் செய்யவும், அவற்றை நிர்வகிக்கவும், <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் சென்சார்கள்"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"உங்கள் உடலியக்கக் குறிகள் பற்றிய சென்சார் தரவை அணுகுவதற்கு <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"சாளர உள்ளடக்கத்தைப் பெறும்"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"நீங்கள் பணியாற்றி கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"தொடுவதன் மூலம் அறிவதை இயக்கும்"</string>
@@ -492,6 +483,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"குறுகிய இடைவெளி தகவல்பரிமாற்றம் (NFC), குறிகள், கார்டுகள் மற்றும் ரீடர்கள் ஆகியவற்றுடன் தொடர்புகொள்ள, பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"உங்கள் திரைப் பூட்டை முடக்குதல்"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"விசைப்பூட்டையும், தொடர்புடைய கடவுச்சொல் பாதுகாப்பையும் முடக்கப் பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, உள்வரும் மொபைல் அழைப்பைப் பெறும்போது மொபைல் விசைப்பூட்டை முடக்குகிறது, பிறகு அழைப்பு முடிந்தவுடன் விசைப்பூட்டை மீண்டும் இயக்குகிறது."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"கைரேகை வன்பொருளை நிர்வகி"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"பயன்படுத்துவதற்காக, கைரேகை டெம்ப்ளேட்களைச் சேர்க்க மற்றும் நீக்குவதற்கான செயல்முறைகளை இயக்குவதற்குப் பயன்பாட்டை அனுமதிக்கும்."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"கைரேகை வன்பொருளைப் பயன்படுத்து"</string>
@@ -504,6 +499,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"அறியப்படவில்லை"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"கைரேகை வன்பொருள் இல்லை."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string>
@@ -1016,14 +1013,32 @@
<string name="inputMethod" msgid="1653630062304567879">"உள்ளீட்டு முறை"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"உரை நடவடிக்கைகள்"</string>
<string name="email" msgid="4560673117055050403">"மின்னஞ்சல்"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"அழை"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"கண்டுபிடி"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"திற"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"செய்தி"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"சேர்"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"காண்பி"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"திட்டமிடுதல்"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"கண்கானி"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"சேமிப்பிடம் குறைகிறது"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"சில அமைப்பு செயல்பாடுகள் வேலை செய்யாமல் போகலாம்"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"முறைமையில் போதுமான சேமிப்பகம் இல்லை. 250மெ.பை. அளவு காலி இடவசதி இருப்பதை உறுதிசெய்து மீண்டும் தொடங்கவும்."</string>
@@ -1117,8 +1132,7 @@
<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_notification_detail (3993078784053054141) -->
- <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="SIZE">%2$s</xliff:g> அளவான தனது செயலாக்க நினைவக வரம்பை <xliff:g id="PROC">%1$s</xliff:g> செயலாக்கம் மீறியது. உங்களுக்கான ஹீப் டம்பினை அதன் டெவெலப்பருடன் பகிரலாம். கவனம்: பயன்பாடு அணுகும் விதத்தில், உங்களைப் பற்றிய எந்தத் தனிப்பட்ட தகவலும் இந்த ஹீப் டம்பில் இருக்கலாம் என்பதை நினைவில்கொள்ளவும்."</string>
<string name="sendText" msgid="5209874571959469142">"உரைக்கான செயலைத் தேர்வுசெய்யவும்"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ஆஃப் செய்"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> தயாராகிறது"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"பிழைகள் உள்ளதா எனப் பார்க்கிறது"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"புதிய <xliff:g id="NAME">%s</xliff:g> கண்டறியப்பட்டது"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"படங்களையும் மீடியாவையும் மாற்றலாம்"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது. சரிசெய்ய, தட்டவும்."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது. சரிசெய்ய, தேர்ந்தெடுக்கவும்."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ஆதரிக்கப்படாத <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"சாதனம் இந்த <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தட்டவும்."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"சாதனம் இந்த <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தேர்ந்தெடுக்கவும்."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"தரவு இழப்பைத் தவிர்க்க, <xliff:g id="NAME">%s</xliff:g>ஐ அகற்றுவதற்கு முன் இணைப்பு நீக்கவும்"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது. புதியதைச் செருகவும்"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"இன்னும் <xliff:g id="NAME">%s</xliff:g>ஐ வெளியேற்றுகிறது…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"அகற்ற வேண்டாம்"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> இல்லை"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"சாதனத்தை மீண்டும் செருகவும்"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ஐ நகர்த்துகிறது"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"தரவு நகர்த்தப்படுகிறது"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"நகர்த்தப்பட்டது"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g>க்குத் தரவு நகர்த்தப்பட்டது"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"தரவை நகர்த்த முடியவில்லை"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"அசல் இடத்திலிருந்து தரவு நகர்த்தப்படவில்லை"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"அகற்றப்பட்டது"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"வெளியேற்றப்பட்டது"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"சரிபார்க்கிறது..."</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"எப்போதும் இயங்கும் VPN உடன் இணைக்கிறது…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"எப்போதும் இயங்கும் VPN இணைக்கப்பட்டது"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"எப்போதும் இயக்கத்தில் இருக்கும்படி அமைத்த VPN இலிருந்து துண்டிக்கப்பட்டது"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"எப்போதும் ஆனில் இருக்கும்படி அமைத்த VPN உடன் இணைக்க முடியவில்லை"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"நெட்வொர்க் அல்லது VPN அமைப்புகளை மாற்றவும்"</string>
<string name="upload_file" msgid="2897957172366730416">"கோப்பைத் தேர்வுசெய்"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"எந்தக் கோப்பும் தேர்வுசெய்யப்படவில்லை"</string>
<string name="reset" msgid="2448168080964209908">"மீட்டமை"</string>
<string name="submit" msgid="1602335572089911941">"சமர்ப்பி"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"\'வாகனம் ஓட்டும் பயன்முறை’ ஆனில் உள்ளது"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"வாகனம் ஓட்டும் பயன்முறையிலிருந்து வெளியேற, தட்டவும்."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"அமைக்க, தட்டவும்."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"உங்கள் நிர்வாகி நிறுவியுள்ளார்"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"சாதனத்தின் பேட்டரி ஆயுளை அதிகரிப்பதற்காக, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வு, இருப்பிடச் சேவைகள் மற்றும் பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது அல்லது ஆஃப் செய்கிறது. ஒத்திசைவைச் சார்ந்திருக்கும் மின்னஞ்சல், செய்தியிடல் மற்றும் பிற ஆப்ஸைத் திறக்காதவரை, அவை ஒத்திசைக்கப்படாமல் இருக்கும்.\n\nசாதனம் சார்ஜ் ஆகும் போது பேட்டரி சேமிப்பான் தானாகவே ஆஃப் ஆகிவிடும்."</string>
<string name="data_saver_description" msgid="6015391409098303235">"டேட்டா பயன்பாட்டைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில பயன்பாடுகளை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் பயன்பாடானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"டேட்டா சேமிப்பானை இயக்கவா?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"இயக்கு"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ஒலியடக்கினார்"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது, அதனை ஆரம்பநிலைக்கு மீட்டமைக்கும் வரை நிலையற்று இயங்கலாம்."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது. விவரங்களுக்கு சாதன தயாரிப்பாளரைத் தொடர்புகொள்ளவும்."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD கோரிக்கை, வழக்கமான அழைப்பிற்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD கோரிக்கை, SS கோரிக்கைக்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"புதிய USSD கோரிக்கைக்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD கோரிக்கை, வீடியோ அழைப்பிற்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS கோரிக்கை, வழக்கமான அழைப்பிற்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS கோரிக்கை, வீடியோ அழைப்பிற்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS கோரிக்கை, USSD கோரிக்கைக்கு மாற்றப்பட்டது"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"புதிய SS கோரிக்கைக்கு மாற்றப்பட்டது"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"பணி சுயவிவரம்"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"விரிவாக்கும்"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"சுருக்கும்"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"குரல் அழைப்பை மேற்கொள்ளும் வசதி இந்த சிம்மிற்கு இல்லை"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"குரல் அழைப்பை மேற்கொள்ள இந்த சிம்மிற்கு அனுமதி இல்லை"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"குரல் அழைப்பை மேற்கொள்ள இந்த ஃபோனுக்கு அனுமதி இல்லை"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"பயன்பாடு முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்தக் குறுக்குவழி வேலை செய்யவில்லை"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"இது புதிய செயல்பாடாகும். மாற்ற, தட்டவும்."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"எவற்றையெல்லாம் தடுக்கிறது என்பதைப் பார்க்க, தட்டவும்."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"சிஸ்டம்"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"அமைப்புகள்"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 720f096..5d23333 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"వాయిస్ సేవ లేదు"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"వాయిస్ సేవ లేదా అత్యవసర కాలింగ్ లేదు"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"మీ క్యారియర్ తాత్కాలికంగా ఆఫ్ చేయబడింది"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> కోసం మీ క్యారియర్ తాత్కాలికంగా ఆఫ్ చేసారు"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"మొబైల్ నెట్వర్క్ అందుబాటులో లేదు"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ప్రాధాన్య నెట్వర్క్ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"రోమింగ్ బ్యానర్ ఆన్లో ఉంది"</string>
<string name="roamingText12" msgid="1189071119992726320">"రోమింగ్ బ్యానర్ ఆఫ్లో ఉంది"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"సేవ కోసం శోధిస్తోంది"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi కాలింగ్ని సెటప్ చేయడం సాధ్యపడలేదు"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fiతో కాల్లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్కి చెప్పండి. ఆ తర్వాత సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"మీ క్యారియర్తో Wi‑Fi కాలింగ్ని నమోదు చేయడంలో సమస్య: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi కాలింగ్"</item>
@@ -159,10 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"చాలా ఎక్కువ అభ్యర్థనలు ప్రాసెస్ చేయబడుతున్నాయి. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>కు సైన్ఇన్ ఎర్రర్"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"సమకాలీకరణ"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"సమకాలీకరించడం సాధ్యపడదు"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"చాలా ఎక్కువ <xliff:g id="CONTENT_TYPE">%s</xliff:g> తొలగించడానికి ప్రయత్నించారు."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"టీవీ నిల్వ నిండింది. ఖాళీ స్థలం కోసం కొన్ని ఫైల్లను తొలగించండి."</string>
@@ -272,40 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"కార్యాలయ ప్రొఫైల్కి మార్చు"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"పరిచయాలు"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"మీ పరిచయాలను యాక్సెస్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"మీ పరిచయాలను యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"స్థానం"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"క్యాలెండర్"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"మీ క్యాలెండర్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"SMS సందేశాలు పంపడానికి మరియు వీక్షించడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"నిల్వ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్లను యాక్సెస్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్లను యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"మైక్రోఫోన్"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ఆడియోను రికార్డ్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ఆడియోని రికార్డ్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"కెమెరా"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"చిత్రాలను తీయడానికి మరియు వీడియోను రికార్డ్ చేయడానికి"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"చిత్రాలు తీయడానికి మరియు వీడియో రికార్డ్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ఫోన్"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్లు చేయడం మరియు నిర్వహించడం"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"ఫోన్ కాల్లు చేయడానికి మరియు నిర్వహించడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"శరీర సెన్సార్లు"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్ను తిరిగి పొందుతుంది"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
@@ -492,6 +483,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"సమీప ఫీల్డ్ కమ్యూనికేషన్ (NFC) ట్యాగ్లు, కార్డులు మరియు రీడర్లతో కమ్యూనికేట్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"మీ స్క్రీన్ లాక్ను నిలిపివేయడం"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"కీలాక్ మరియు ఏదైనా అనుబంధించబడిన పాస్వర్డ్ భద్రతను నిలిపివేయడానికి యాప్ను అనుమతిస్తుంది. ఉదాహరణకు, ఇన్కమింగ్ ఫోన్ కాల్ వస్తున్నప్పుడు ఫోన్ కీలాక్ను నిలిపివేస్తుంది, ఆపై కాల్ ముగిసిన తర్వాత కీలాక్ను మళ్లీ ప్రారంభిస్తుంది."</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"వేలిముద్ర హార్డ్వేర్ని నిర్వహించడానికి అనుమతి"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"వినియోగం కోసం వేలిముద్ర టెంప్లేట్లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"వేలిముద్ర హార్డ్వేర్ని ఉపయోగించడానికి అనుమతి"</string>
@@ -504,6 +499,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"గుర్తించలేదు"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"వేలిముద్ర ప్రమాణీకరించబడింది"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"వేలిముద్ర హార్డ్వేర్ అందుబాటులో లేదు."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"వేలిముద్రను నిల్వ చేయడం సాధ్యపడదు. దయచేసి ఇప్పటికే ఉన్న వేలిముద్రను తీసివేయండి."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string>
@@ -1016,14 +1012,32 @@
<string name="inputMethod" msgid="1653630062304567879">"ఇన్పుట్ పద్ధతి"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"వచనానికి సంబంధించిన చర్యలు"</string>
<string name="email" msgid="4560673117055050403">"ఇమెయిల్"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"కాల్ చేయండి"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"గుర్తించండి"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"తెరవండి"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"సందేశం"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"జోడించండి"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"చూడండి"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"షెడ్యూల్"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"ట్రాక్ చేయండి"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"నిల్వ ఖాళీ అయిపోతోంది"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."</string>
@@ -1117,8 +1131,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"వచనం కోసం చర్యను ఎంచుకోండి"</string>
@@ -1153,8 +1166,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"బహిరంగ Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయండి"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"క్యారియర్ Wi‑Fi నెట్వర్క్కి కనెక్ట్ చేయండి"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi నెట్వర్క్కి కనెక్ట్ చేస్తోంది"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయబడింది"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్వర్క్లు చూడటానికి నొక్కండి"</string>
@@ -1271,33 +1283,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ఆఫ్ చేయి"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ని సిద్ధం చేస్తోంది"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"లోపాల కోసం తనిఖీ చేస్తోంది"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"కొత్త <xliff:g id="NAME">%s</xliff:g> గుర్తించబడింది"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>ని తనిఖీ చేస్తోంది…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ప్రస్తుత కంటెంట్ సమీక్షించబడుతోంది"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"కొత్త <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"సెటప్ చేయడానికి నొక్కండి"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ఫోటోలు మరియు మీడియాను బదిలీ చేయడానికి"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> పాడైంది"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> పాడైంది. సరిచేయడానికి నొక్కండి."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>తో సమస్య ఉంది"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"పరిష్కరించడానికి నొక్కండి"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> పాడైంది. సరిచేయడానికి ఎంచుకోండి."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>కి మద్దతు లేదు"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి నొక్కండి."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి ఎంచుకోండి."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"డేటా కోల్పోకుండా ఉండటానికి <xliff:g id="NAME">%s</xliff:g>ని తీసివేయడానికి ముందు అన్మౌంట్ చేయండి"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది; కొత్తదాన్ని చొప్పించండి"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ఇంకా <xliff:g id="NAME">%s</xliff:g>ని తొలగిస్తూనే ఉంది…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"తీసివేయవద్దు"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"కంటెంట్ని కోల్పోవడాన్ని నివారించాలంటే తీసివేయబోయే ముందు మీడియాని తొలగించండి"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"కొంత నిర్వాహక ప్రక్రియ సరిగ్గా పని చేస్తున్నట్లు లేదు. కొత్త నిల్వని చొప్పించండి."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>ని తొలగిస్తోంది"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"తీసివేయవద్దు"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> కనుగొనబడటం లేదు"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"ఈ పరికరం తిరిగి చొప్పించండి"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"డేటాను తరలిస్తోంది"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"తరలింపు పూర్తయింది"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"డేటా <xliff:g id="NAME">%s</xliff:g>కి తరలించబడింది"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"డేటాను తరలించలేకపోయింది"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"డేటా అసలు స్థానంలో అలాగే ఉంది"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"కంటెంట్ బదిలీ పూర్తయింది"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"కంటెంట్ <xliff:g id="NAME">%s</xliff:g>కి తరలించబడింది"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"కంటెంట్ని తరలించడం సాధ్యం కాలేదు"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"కంటెంట్ని తరలించడానికి మళ్లీ ప్రయత్నించండి"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"తీసివేయబడింది"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"తొలగించబడింది"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"తనిఖీ చేస్తోంది..."</string>
@@ -1356,17 +1369,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ఎల్లప్పుడూ-ఆన్లో ఉండే VPN కనెక్ట్ చేయబడుతోంది…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ఎల్లప్పుడూ-ఆన్లో ఉండే VPN కనెక్ట్ చేయబడింది"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ఎల్లప్పుడూ ఆన్లో ఉండే VPN నుండి డిస్కనెక్ట్ చేయబడింది"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ఎల్లప్పుడూ ఆన్లో ఉండే VPNకి కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"నెట్వర్క్ లేదా VPN సెట్టింగ్లను మార్చండి"</string>
<string name="upload_file" msgid="2897957172366730416">"ఫైల్ను ఎంచుకోండి"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ఫైల్ ఎంచుకోబడలేదు"</string>
<string name="reset" msgid="2448168080964209908">"రీసెట్ చేయి"</string>
<string name="submit" msgid="1602335572089911941">"సమర్పించు"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"డ్రైవింగ్ యాప్ అమలవుతోంది"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"డ్రైవింగ్ యాప్ నుండి నిష్క్రమించడం కోసం నొక్కండి."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"టీథర్ చేయబడినది లేదా హాట్స్పాట్ సక్రియంగా ఉండేది"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"సెటప్ చేయడానికి నొక్కండి."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"టెథెరింగ్ నిలిపివేయబడింది"</string>
@@ -1692,8 +1702,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"మీ నిర్వాహకులు ఇన్స్టాల్ చేసారు"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"మీ నిర్వాహకులు నవీకరించారు"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"మీ నిర్వాహకులు తొలగించారు"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"బ్యాటరీ జీవితకాలాన్ని పొడిగించడం కోసం, బ్యాటరీ సేవర్ మీ పరికరం యొక్క పనితీరుని తగ్గిస్తుంది మరియు వైబ్రేషన్ని, స్థాన సేవలను మరియు నేపథ్య డేటాని పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది. సమకాలీకరణపై ఆధాపరపడిన ఇమెయిల్, సందేశం మరియు ఇతర యాప్లు మీరు వాటిని తెరిచే వరకు అప్డేట్ కాకపోవచ్చు.\n\nపరికరాన్ని ఛార్జింగ్లో ఉంచినప్పుడు బ్యాటరీ సేవర్ ఆటోమేటిక్గా ఆఫ్ అవుతుంది."</string>
<string name="data_saver_description" msgid="6015391409098303235">"డేటా వినియోగాన్ని తగ్గించడంలో సహాయకరంగా ఉండటానికి, డేటా సేవర్ కొన్ని యాప్లను నేపథ్యంలో డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తున్న యాప్ డేటాను యాక్సెస్ చేయగలదు కానీ అలా అరుదుగా చేయవచ్చు. అంటే, ఉదాహరణకు, మీరు ఆ చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"డేటా సేవర్ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ఆన్ చేయి"</string>
@@ -1744,22 +1753,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ద్వారా మ్యూట్ చేయబడింది"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది మరియు మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసే వరకు అస్థిరంగా ఉంటుంది."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది. వివరాల కోసం మీ తయారీదారుని సంప్రదించండి."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD అభ్యర్థన సాధారణ కాల్కు మార్చబడింది"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD అభ్యర్థన SS అభ్యర్థనకు మార్చబడింది"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"కొత్త USSD అభ్యర్థనకు మార్చబడింది"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD అభ్యర్థన వీడియో కాల్కు మార్చబడింది"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS అభ్యర్థన సాధారణ కాల్కి మార్చబడింది"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS అభ్యర్థన వీడియో కాల్కి మార్చబడింది"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS అభ్యర్థన USSD అభ్యర్థనకు మార్చబడింది"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"కొత్త SS అభ్యర్థనకు మార్చబడింది"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"కార్యాలయ ప్రొఫైల్"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"విస్తరింపజేయి"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"కుదించు"</string>
@@ -1857,6 +1858,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"వాయిస్ కోసం SIM సదుపాయం లేదు"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"వాయిస్ కోసం SIM అనుమతించబడదు"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"వాయిస్ కోసం ఫోన్ అనుమతించబడదు"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> అనుమతించబడలేదు"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> యాక్టివ్ చేయలేదు"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> అనుమతించబడలేదు"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> అనుమతించబడలేదు"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"పాప్అప్ విండో"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"యాప్ వెర్షన్ డౌన్గ్రేడ్ చేయబడింది లేదా ఈ సత్వరమార్గంతో అనుకూలంగా లేదు"</string>
@@ -1877,8 +1882,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ఇది కొత్త ప్రవర్తన. మార్చడానికి నొక్కండి."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"బ్లాక్ చేయబడిన దాన్ని తనిఖీ చేయడానికి నొక్కండి."</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"సిస్టమ్"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"సెట్టింగ్లు"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 4614fdd..5fcff06 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ไม่มีบริการเสียง"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ไม่มีบริการโทรสนทนาหรือการโทรหมายเลขฉุกเฉิน"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ปิดชั่วคราวโดยผู้ให้บริการ"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ปิดชั่วคราวโดยผู้ให้บริการของซิม <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"เชื่อมต่อเครือข่ายมือถือไม่ได้"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ลองเปลี่ยนเครือข่ายที่ต้องการ แตะเพื่อเปลี่ยน"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"โทรหาหมายเลขฉุกเฉินไม่ได้"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"เปิดโรมมิ่งแบนเนอร์"</string>
<string name="roamingText12" msgid="1189071119992726320">"ปิดโรมมิ่งแบนเนอร์"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"กำลังค้นหาบริการ"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"ตั้งค่าการโทรผ่าน Wi‑Fi ไม่ได้"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า (รหัสข้อผิดพลาด: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"เกิดปัญหาในการลงทะเบียนการโทรผ่าน Wi‑Fi กับผู้ให้บริการของคุณ: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"กำลังเรียก Wi-Fi ของ %s"</item>
@@ -481,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"ใช้ฮาร์ดแวร์ชีวมิติ"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"อนุญาตให้แอปใช้ฮาร์ดแวร์ชีวมิติเพื่อตรวจสอบสิทธิ์"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"จัดการฮาร์ดแวร์ลายนิ้วมือ"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"อนุญาตให้แอปเรียกใช้วิธีการเพื่อเพิ่มและลบเทมเพลตลายนิ้วมือสำหรับการใช้งาน"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"ใช้ฮาร์ดแวร์ลายนิ้วมือ"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ไม่รู้จัก"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ตรวจสอบสิทธิ์ลายนิ้วมือแล้ว"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ฮาร์ดแวร์ลายนิ้วมือไม่พร้อมใช้งาน"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string>
<string name="email" msgid="4560673117055050403">"อีเมล"</string>
+ <string name="email_desc" msgid="3638665569546416795">"ส่งอีเมลไปยังที่อยู่ที่เลือก"</string>
<string name="dial" msgid="1253998302767701559">"โทร"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"โทรหาหมายเลขโทรศัพท์ที่เลือก"</string>
<string name="map" msgid="6521159124535543457">"ค้นหา"</string>
+ <string name="map_desc" msgid="9036645769910215302">"หาที่อยู่ที่เลือก"</string>
<string name="browse" msgid="1245903488306147205">"เปิด"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"เปิด URL ที่เลือก"</string>
<string name="sms" msgid="4560537514610063430">"ข้อความ"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"ส่งข้อความไปยังหมายเลขโทรศัพท์ที่เลือก"</string>
<string name="add_contact" msgid="7867066569670597203">"เพิ่ม"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"เพิ่มในรายชื่อติดต่อ"</string>
<string name="view_calendar" msgid="979609872939597838">"ดู"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"ดูเวลาที่เลือกในปฏิทิน"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"กำหนดการ"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"ตั้งเวลากิจกรรมสำหรับเวลาที่เลือก"</string>
<string name="view_flight" msgid="7691640491425680214">"แทร็ก"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"ติดตามเที่ยวบินที่เลือก"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"พื้นที่จัดเก็บเหลือน้อย"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"บางฟังก์ชันระบบอาจไม่ทำงาน"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"พื้นที่เก็บข้อมูลไม่เพียงพอสำหรับระบบ โปรดตรวจสอบว่าคุณมีพื้นที่ว่าง 250 MB แล้วรีสตาร์ท"</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"เชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"เชื่อมต่อเครือข่าย Wi‑Fi ของผู้ให้บริการ"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"กำลังเชื่อมต่อกับเครือข่าย Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"เชื่อมต่อเครือข่าย Wi-Fi แล้ว"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ไม่สามารถเชื่อมต่อเครือข่าย Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ปิด"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ตรวจพบ <xliff:g id="NAME">%s</xliff:g> ใหม่"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"กำลังตรวจสอบ <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"กำลังตรวจสอบเนื้อหาปัจจุบัน"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> ใหม่"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"แตะเพื่อตั้งค่า"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"สำหรับการโอนรูปภาพและสื่อ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> เสียหาย"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> เสียหาย แตะเพื่อแก้ไข"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ปัญหาที่พบจาก <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"แตะเพื่อแก้ไข"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> เสียหาย เลือกเพื่อแก้ไข"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"อุปกรณ์นี้ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g> นี้ แตะเพื่อตั้งค่าในรูปแบบที่สนับสนุน"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"อุปกรณ์นี้ไม่รองรับ <xliff:g id="NAME">%s</xliff:g> นี้ เลือกเพื่อตั้งค่าในรูปแบบที่รองรับ"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออกไปโดยไม่คาดคิด"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ยกเลิกการต่อเชื่อม <xliff:g id="NAME">%s</xliff:g> ก่อนนำออกเพื่อหลีกเลี่ยงข้อมูลสูญหาย"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออก โปรดใส่ใหม่"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ยังคงนำ <xliff:g id="NAME">%s</xliff:g> ออก…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ห้ามนำออก"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ดีดสื่อออกก่อนการนำออกเพื่อหลีกเลี่ยงเนื้อหาสูญหาย"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ฟังก์ชันการทำงานบางอย่างอาจทำงานไม่ถูกต้อง โปรดใส่พื้นที่เก็บข้อมูลใหม่"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"กำลังดีด <xliff:g id="NAME">%s</xliff:g> ออก"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ห้ามนำออก"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"ไม่มี <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"เสียบอุปกรณ์นี้อีกครั้ง"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"กำลังย้ายข้อมูล"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"ย้ายเสร็จสมบูรณ์แล้ว"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ย้ายข้อมูลไปยัง <xliff:g id="NAME">%s</xliff:g> แล้ว"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ไม่สามารถย้ายข้อมูล"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ข้อมูลที่เหลืออยู่ในตำแหน่งเดิม"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"โอนเนื้อหาเรียบร้อยแล้ว"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ย้ายเนื้อหาไปที่ <xliff:g id="NAME">%s</xliff:g> แล้ว"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ย้ายเนื้อหาไม่ได้"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ลองย้ายเนื้อหาอีกครั้ง"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"นำออกแล้ว"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"นำออกแล้ว"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"กำลังตรวจสอบ…"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ติดตั้งโดยผู้ดูแลระบบ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"อัปเดตโดยผู้ดูแลระบบ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ลบโดยผู้ดูแลระบบ"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"เพื่อช่วยยืดอายุการใช้งานแบตเตอรี่ โหมดประหยัดแบตเตอรี่จะลดการทำงานของอุปกรณ์และจำกัดหรือปิดการสั่น บริการตำแหน่ง และข้อมูลแบ็กกราวด์ นอกจากนี้ อีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์ก็จะไม่อัปเดตหากคุณไม่เปิดขึ้นมา\n\nโหมดประหยัดแบตเตอรี่จะปิดโดยอัตโนมัติขณะชาร์จอุปกรณ์"</string>
<string name="data_saver_description" msgid="6015391409098303235">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลเครือข่ายมือถือในการทำงานเบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงข้อมูลเครือข่ายมือถือได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"เปิด"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"ปิดเสียงโดย <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง อุปกรณ์อาจทำงานไม่เสถียรจนกว่าคุณจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง โปรดติดต่อผู้ผลิตเพื่อขอรายละเอียดเพิ่มเติม"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"คำขอ USSD เปลี่ยนเป็นการโทรปกติแล้ว"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"คำขอ USSD เปลี่ยนเป็นคำขอ SS แล้ว"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"เปลี่ยนเป็นคำขอ USSD ใหม่แล้ว"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"คำขอ USSD เปลี่ยนเป็นวิดีโอคอลแล้ว"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"คำขอ SS เปลี่ยนเป็นการโทรปกติแล้ว"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"คำขอ SS เปลี่ยนเป็นวิดีโอคอลแล้ว"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"คำขอ SS เปลี่ยนเป็นคำขอ USSD แล้ว"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"เปลี่ยนเป็นคำขอ SS ใหม่แล้ว"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"โปรไฟล์งาน"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ขยาย"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ยุบ"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ไม่มีการจัดสรรซิมสำหรับเสียง"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ไม่อนุญาตให้ใช้ซิมสำหรับเสียง"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ไม่อนุญาตให้ใช้โทรศัพท์สำหรับเสียง"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"ไม่อนุญาตให้ใช้ซิม <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ไม่มีการจัดสรรซิม <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"ไม่อนุญาตให้ใช้ซิม <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"ไม่อนุญาตให้ใช้ซิม <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"หน้าต่างป๊อปอัป"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"มีการดาวน์เกรดเวอร์ชันของแอปหรือใช้กับทางลัดนี้ไม่ได้"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 9bb64e0..b1abc84 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Naka-default na hindi pinaghihigpitan ang Caller ID. Susunod na tawag: Hindi pinaghihigpitan"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Hindi naprobisyon ang serbisyo."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Hindi mo mababago ang setting ng caller ID."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Walang serbisyo sa data"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Walang emergency na tawag"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Walang serbisyo ng data sa mobile"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hindi available ang pang-emergency na pagtawag"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Walang serbisyo para sa boses"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Walang serbisyo para sa voice/emergency"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Pansamantalang hindi inaalok ng mobile network sa iyong lokasyon"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Hindi maabot ang network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Upang mapahusay ang reception, subukang baguhin ang uring napili sa Mga Setting > Network at internet > Mga mobile network > Gustong uri ng network."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Aktibo ang pagtawag sa pamamagitan ng Wi‑Fi"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Nangangailangan ng mobile network ang mga emergency na tawag."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Walang serbisyo para sa boses o emergency na tawag"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Pansamantalang na-off ng iyong carrier"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Pansamantalang na-off ng iyong carrier para sa SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Hindi makakonekta sa mobile network"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Subukang baguhin ang gustong network. I-tap para baguhin."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hindi available ang pang-emergency na pagtawag"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Hindi makapagsagawa ng mga emergency na tawag sa pamamagitan ng Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Mga Alerto"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pagpasa ng tawag"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Naka-on ang Banner ng Roaming"</string>
<string name="roamingText12" msgid="1189071119992726320">"Naka-off ang Banner ng Roaming"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Naghahanap ng Serbisyo"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Pagtawag sa pamamagitan ng Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Hindi ma-set up ang pagtawag gamit ang Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Upang makatawag at makapagpadala ng mga mensahe sa Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay i-on muli ang pagtawag gamit ang Wi-Fi mula sa Mga Setting. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Iparehistro sa iyong carrier (Code ng error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Nagkaroon ng isyu sa pagrehistro ng pagtawag gamit ang Wi‑Fi sa iyong carrier: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Pinoproseso ang masyadong maraming kahilingan. Subukang muli sa ibang pagkakataon."</string>
<string name="notification_title" msgid="8967710025036163822">"Error sa pag-signin para sa <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"I-sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"I-sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Masyadong maraming pagtanggal ng <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Hindi ma-sync"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Sinubukang mag-delete ng masyado maraming <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Puno na ang storage ng tablet. Magtanggal ng ilang file upang magbakante ng espasyo."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Puno na ang storage ng relo. Magtanggal ng ilang file upang magbakante ng espasyo."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Puno na ang storage ng TV. Mag-delete ng ilang file upang magbakante ng espasyo."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Ng admin ng iyong profile sa trabaho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Ng <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Na-delete na ang profile sa trabaho"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Na-delete ang profile sa trabaho dahil wala itong admin app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Nawawala o nasira ang admin app ng profile sa trabaho. Dahil dito, na-delete ang profile mo sa trabaho at nauugnay na data. Makipag-ugnayan sa iyong admin para sa tulong."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Hindi na available sa device na ito ang iyong profile sa trabaho"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Masyadong maraming pagsubok sa password"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Pinamamahalaan ang device"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Pinamamahalaan ng iyong organisasyon ang device na ito, at maaari nitong subaybayan ang trapiko sa network. I-tap para sa mga detalye."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Buburahin ang iyong device"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Hindi magagamit ang admin app. Mabubura na ang iyong device.\n\nKung mayroon kang mga tanong, makipag-ugnayan sa admin ng iyong organisasyon."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Hindi magamit ang admin app. Mabubura na ang iyong device.\n\nKung mayroon kang mga tanong, makipag-ugnayan sa admin ng iyong organisasyon."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Na-disable ng <xliff:g id="OWNER_APP">%s</xliff:g> ang pag-print."</string>
<string name="me" msgid="6545696007631404292">"Ako"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Mga pagpipilian sa tablet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Naka-ON ang airplane mode"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Naka-OFF ang airplane mode"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Pangtipid sa baterya"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"NAKA-OFF ang Pangtipid sa baterya"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"NAKA-ON ang Pangtipid sa baterya"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Mga Setting"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Tulong"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Lumipat sa profile sa trabaho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Mga Contact"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"i-access ang iyong mga contact"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong mga contact"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong mga contact?"</string>
<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="8903573681261610809">"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="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="permgrouplab_calendar" msgid="5863508437783683902">"Kalendaryo"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"i-access ang iyong kalendaryo"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"magpadala at tumingin ng mga mensaheng SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na magpadala at tumingin ng mga mensaheng SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na magpadala at tumingin ng mga mensaheng SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"i-access ang mga larawan, media at file sa iyong device"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang mga larawan, media, at file sa iyong device"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang mga larawan, media, at file sa iyong device?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikropono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"mag-record ng audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na mag-record ng audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na mag-record ng audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"kumuha ng mga larawan at mag-record ng video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na kumuha ng mga larawan at mag-record ng video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na kumuha ng mga larawan at mag-record ng video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"tumawag at mamahala ng mga tawag sa telepono"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na tumawag at mamahala ng mga tawag"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na tumawag at mamahala ng mga tawag sa telepono?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Mga Sensor ng Katawan"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"i-access ang data ng sensor tungkol sa iyong vital signs"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang data ng sensor tungkol sa iyong mga vital sign"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang data ng sensor tungkol sa iyong mga vital sign?"</string>
<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>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Magsagawa ng mga galaw"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"May kakayahang mag-tap, mag-swipe, mag-pinch at magsagawa ng iba pang mga galaw."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Mga galaw gamit ang fingerprint"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Makukunan ang mga galaw na ginawa sa sensor para sa fingerprint ng mga device."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Makukunan ang mga galaw na ginawa sa sensor para sa fingerprint ng device."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"i-disable o baguhin ang status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Pinapayagan ang app na i-disable ang status bar o magdagdag at mag-alis ng mga icon ng system."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"maging status bar"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Pinapayagan ang app na panatilihin ang ilang bahagi nito sa memory. Maaari nitong limitahan ang memory na available sa iba pang apps na nagpapabagal sa tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Nagbibigay-daan sa app na iimbak sa memory ang mga bahagi nito. Maaari nitong malimitahan ang memory na available sa iba pang mga app na nagpapabagal sa TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Pinapayagan ang app na panatilihin ang ilang bahagi nito sa memory. Maaari nitong limitahan ang memory na available sa iba pang apps na nagpapabagal sa telepono."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"paganahin ang foreground na serbisyo"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Payagan ang app na gamitin ang mga foreground na serbisyo."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"sukatin ang espasyo ng storage ng app"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Pinapayagan ang app na bawiin ang code, data, at mga laki ng cache nito"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"baguhin ang mga setting ng system"</string>
@@ -478,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Pinapayagan ang app na mag-invoke ng mga paraan upang magdagdag at mag-delete ng mga template ng fingerprint na magagamit."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"gamitin ang hardware ng fingerprint"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Hindi nakilala"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Na-authenticate ang fingerprint"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hindi available ang hardware na ginagamitan ng fingerprint."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pag-unlock ng pattern."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pag-unlock ng pin."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Pag-unlock ng Pin ng Sim."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Pag-unlock ng Puk ng Sim."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pag-unlock ng password."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bahagi ng pattern."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bahagi ng slide."</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"Nakopya ang teksto sa clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"Higit pa"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espasyo"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ipasok"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"i-delete"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string>
<string name="email" msgid="4560673117055050403">"Mag-email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Mag-email sa mga piniling address"</string>
<string name="dial" msgid="1253998302767701559">"Tawagan"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Tawagan ang piniling numero ng telepono"</string>
<string name="map" msgid="6521159124535543457">"Hanapin"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Hanapin ang piniling address"</string>
<string name="browse" msgid="1245903488306147205">"Buksan"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Buksan ang piniling URL"</string>
<string name="sms" msgid="4560537514610063430">"Padalhan ng Mensahe"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Padalhan ng mensahe ang piniling numero ng telepono"</string>
<string name="add_contact" msgid="7867066569670597203">"Magdagdag"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Idagdag sa mga contact"</string>
<string name="view_calendar" msgid="979609872939597838">"Tingnan"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Tingnan ang piniling oras sa kalendaryo"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Mag-iskedyul"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Mag-iskedyul ng kaganapan para sa piniling oras"</string>
<string name="view_flight" msgid="7691640491425680214">"Subaybayan"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"I-track ang piniling flight"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nauubusan na ang puwang ng storage"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Maaaring hindi gumana nang tama ang ilang paggana ng system"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Walang sapat na storage para sa system. Tiyaking mayroon kang 250MB na libreng espasyo at i-restart."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Tingnan kung may update"</string>
<string name="smv_application" msgid="3307209192155442829">"Ang app na <xliff:g id="APPLICATION">%1$s</xliff:g> (prosesong <xliff:g id="PROCESS">%2$s</xliff:g>) ay lumabag sa sarili nitong ipinapatupad na patakarang StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Ang prosesong <xliff:g id="PROCESS">%1$s</xliff:g> ay lumabag sa sarili nitong ipinapatupad na patakarang StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Nag-a-upgrade ang Android…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Nagsisimula ang Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Nag-a-update ang telepono…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Nag-a-update ang tablet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Nag-a-update ang device…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Nagsisimula ang telepono…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Nagsisimula ang tablet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Nagsisimula ang device…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ino-optimize ang storage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Tinatapos ang pag-update sa Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Maaaring hindi gumana nang maayos ang ilang app hangga\'t hindi pa natatapos ang pag-upgrade"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Tinatapos ang pag-update ng system…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Nag-a-upgrade ang <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ino-optimize ang app <xliff:g id="NUMBER_0">%1$d</xliff:g> ng <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Ihinahanda ang <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Sinisimulan ang apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Pagtatapos ng pag-boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Mag-tap upang bumalik sa laro"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Pumili ng laro"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para sa mas mahusay na performance, isa lang sa mga larong ito ang maaaring buksan sa bawat pagkakataon."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Bumalik sa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Nakolekta na ang heap dump; i-tap upang ibahagi"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Pumili ng pagkilos para sa teksto"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Kumonekta sa bukas na Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Kumonekta sa Wi‑Fi network ng carrier"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kumokonekta sa bukas na Wi‑Fi network"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Kumokonekta sa Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Nakakonekta sa Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Hindi makakonekta sa Wi‑Fi network"</string>
<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="1100098935861622985">"Lahat ng Network"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Lahat ng network"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Awtomatikong mag-o-on ang Wi‑Fi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kapag malapit ka sa naka-save na network na mataas ang kalidad"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Huwag i-on muli"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"I-restart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"I-activate ang serbisyo sa mobile"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"I-download ang carrier app upang ma-activate ang iyong bagong SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"I-download ang <xliff:g id="APP_NAME">%1$s</xliff:g> app upang ma-activate ang iyong bagong SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"I-download ang app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nakalagay na ang bagong SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"I-tap upang i-set up ito"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Na-on ang PTP sa pamamagitan ng USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Na-on ang pag-tether ng USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Na-on ang MIDI sa pamamagitan ng USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Na-on ang USB accessory mode"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Nakakonekta ang USB accessory"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"I-tap para sa higit pang mga opsyon."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"China-charge ang nakakonektang device. Mag-tap para sa higit pang opsyon."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"May na-detect na analog na audio accessory"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Hindi tugma sa teleponong ito ang naka-attach na device. I-tap upang matuto pa."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"I-tap upang i-disable 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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Kinukuha ang ulat ng bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Gusto mo bang ibahagi ang ulat ng bug?"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Ipinapakita sa itaas ng iba pang app ang <xliff:g id="NAME">%s</xliff:g>."</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Nasa ibabaw ng ibang app ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Kung ayaw mong gamitin ng <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"I-OFF"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inihahanda ang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sinusuri para sa mga error"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Na-detect ang bagong <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"I-off"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Sinusuri ang <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Sinusuri ang kasalukuyang content"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Bagong <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Mag-tap para i-set up"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para sa paglilipat ng mga larawan at media"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Sirang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Sira ang <xliff:g id="NAME">%s</xliff:g>. I-tap upang ayusin."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Isyu sa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Mag-tap para ayusin"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Sira ang <xliff:g id="NAME">%s</xliff:g>. Piliin upang ayusin."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Hindi sinusuportahang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Hindi sinusuportahan ng device na ito ang <xliff:g id="NAME">%s</xliff:g> na ito. I-tap upang i-set up sa isang sinusuportahang format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Hindi sinusuportahan ng device na ito ang <xliff:g id="NAME">%s</xliff:g> na ito. Piliin upang i-set up sa isang sinusuportahang format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Hindi inaasahang naalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"I-unmount ang <xliff:g id="NAME">%s</xliff:g> bago alisin upang maiwasan ang pagkawala ng data"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Inalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Inalis ang <xliff:g id="NAME">%s</xliff:g>; maglagay ng bago"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ine-eject pa rin ang <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Huwag alisin"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"I-eject ang media bago tanggalin para maiwasan ang pagkawala ng content"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Inalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Maaaring hindi gumana nang maayos ang ilang functionality. Magkabit ng bagong storage."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ine-eject ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Huwag alisin"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"I-set up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"I-eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"I-explore"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Nawawala ang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Ilagay muli ang device na ito"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Ikabit muli ang device"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Inililipat ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Naglilipat ng data"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Nakumpleto na ang paglilipat"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Inilipat ang data sa <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Hindi mailipat ang data"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Iniwan ang data sa orihinal na lokasyon"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Tapos na ang paglipat ng content"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Inilipat ang content sa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Hindi malipat ang content"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Subukang ilipat muli ang content"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Inalis"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Na-eject"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Sinusuri…"</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kumukonekta ang Always-on VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Nakakonekta ang Always-on VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Nadiskonekta sa VPN na palaging naka-on"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error sa Always-on VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Hindi makakonekta sa VPN na palaging naka-on"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Baguhin ang mga setting ng network o VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Pumili ng file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Walang napiling file"</string>
<string name="reset" msgid="2448168080964209908">"I-reset"</string>
<string name="submit" msgid="1602335572089911941">"Isumite"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Pinagana ang car mode"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"I-tap upang lumabas sa car mode."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Tumatakbo ang driving app"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Mag-tap para lumabas sa app sa pagmamaneho."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Pagsasama o aktibong hotspot"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"I-tap upang i-set up."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Naka-disable ang pag-tether"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"I-edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerto sa paggamit ng data"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"I-tap tingnan paggamit/setting."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Naabot na ang limitasyon sa 2G-3G data"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Naabot na ang limitasyon sa 4G data"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Babala sa paggamit ng data"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Nakagamit ka ng <xliff:g id="APP">%s</xliff:g> na data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Naabot ang limit ng mobile data"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Naabot na ang limitasyon sa data ng Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Naka-pause ang data para sa nalalabing bahagi ng pag-ikot"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"lumampas sa 2G-3G na limitasyon ng data"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Lumampas sa 4G na limitasyon ng data"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Lumampas sa limitasyon ng data sa mobile"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Lumampas sa limitasyon ng data ng Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Lampas ng <xliff:g id="SIZE">%s</xliff:g> sa tinukoy na limitasyon."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Naka-pause ang data para sa natitirang bahagi ng iyong cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Lumampas sa mobile data limit mo"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Lumampas sa Wi-Fi data limit mo"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Lumampas ka nang <xliff:g id="SIZE">%s</xliff:g> sa iyong itinakdang limitasyon"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Pinaghihigpitan ang data ng background"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"I-tap upang alisin paghihigpit."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Malaking paggamit ng data"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Mas malaki kaysa sa karaniwan ang paggamit mo ng data sa nakalipas na ilang araw. I-tap upang matingnan ang paggamit at mga setting."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Malakas na paggamit ng data"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Gumamit ang iyong mga app ng higit pang data kaysa sa karaniwan"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Gumamit ang <xliff:g id="APP">%s</xliff:g> ng higit pang data kaysa sa karaniwan"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificate ng seguridad"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"May-bisa ang certificate na ito."</string>
<string name="issued_to" msgid="454239480274921032">"Ibinigay kay:"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Na-install ng iyong admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Na-update ng iyong admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Na-delete ng iyong admin"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Upang matulungang mapatagal ang baterya, binabawasan ng Pangtipid sa Baterya ang performance ng iyong device at nililimitahan nito ang pag-vibrate, mga serbisyo ng lokasyon, at halos lahat ng background na data. Hindi maaaring ma-update ang email, messaging, at iba pang app na umaasa sa pag-sync hangga\'t hindi mo binubuksan ang mga ito.\n\nAwtomatikong nag-o-off ang Pangtipid sa Baterya kapag naka-charge ang iyong device."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para mapatagal ang baterya, binabawasan ng Pangtipid sa Baterya ang performance ng iyong device at nililimitahan at ino-off nito ang pag-vibrate, mga serbisyo ng lokasyon, at data ng background. Maaaring hindi ma-update ang email, pagmemensahe, at iba pang app na umaasa sa pag-sync hangga\'t hindi mo binubuksan ang mga ito.\n\nAwtomatikong mag-o-off ang Pangtipid sa Baterya kapag naka-charge ang iyong device."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"I-on ang Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"I-on"</string>
@@ -1681,7 +1702,7 @@
<item quantity="one">Sa loob ng %1$d min (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Sa loob ng %1$d na min (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">Sa loob ng %1$d oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Sa loob ng %1$d na oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
@@ -1697,7 +1718,7 @@
<item quantity="one">Sa loob ng %d min</item>
<item quantity="other">Sa loob ng %d na min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">Sa loob ng %d oras</item>
<item quantity="other">Sa loob ng %d na oras</item>
</plurals>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Na-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"May internal na problema sa iyong device, at maaaring hindi ito maging stable hanggang sa i-reset mo ang factory data."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"May internal na problema sa iyong device. Makipag-ugnayan sa iyong manufacturer upang malaman ang mga detalye."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Ginawang DIAL request ang USSD request."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Ginawang SS request ang USSD request."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Ginawang bagong USSD request ang USSD request."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Ginawang kahilingan sa Video DIAL ang kahilingan sa USSD."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Ginawang DIAL request ang SS request."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Ginawang kahilingan sa Video DIAL ang kahilingan sa SS."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ginawang USSD request ang SS request."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ginawang bagong SS request ang SS request."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Ginawang regular na tawag ang USSD na kahilingan"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Ginawang SS na kahilingan ang USSD na kahilingan"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Ginawang bagong USSD na kahilingan"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Ginawang video call ang USSD na kahilingan"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Ginawang regular na tawag ang SS na kahilingan"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Ginawang video call ang SS na kahilingan"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Ginawang USSD na kahilingan ang SS na kahilingan"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Ginawang bagong SS na kahilingan"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profile sa trabaho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Palawakin"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"I-collapse"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Hindi naka-provision ang SIM para sa boses"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Hindi pinapayagan ang SIM para sa boses"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Hindi pinapayagan ang telepono para sa boses"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Hindi pinapayagan ang SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Hindi naka-provision ang SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Hindi pinapayagan ang SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Hindi pinapayagan ang SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Window ng Popup"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Na-downgrade ang bersyon ng app, o hindi ito compatible sa shortcut na ito"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"May na-detect na mapaminsalang app"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Gustong ipakita ng <xliff:g id="APP_0">%1$s</xliff:g> ang mga slice ng <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"I-edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Magva-vibrate ang mga tawag at notification"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Mamu-mute ang mga tawag at notification"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Mga pagbabago sa system"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Huwag Istorbohin"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Itinatago ng Huwag Istorbohin ang mga notification para tulungan kang tumuon"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ito ang bagong gawi. I-tap para baguhin."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Binago ang Huwag Istorbohin"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"I-tap upang tingnan ang iyong mga setting ng gawi para sa mga pagkaantala"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"I-tap para tingnan kung ano ang naka-block."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Mga Setting"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index e63e319..989e6d1 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Arayan kimliği varsayılanları kısıtlanmamıştır. Sonraki çağrı: Kısıtlanmamış"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Hizmet sağlanamadı."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Arayanın kimliği ayarını değiştiremezsiniz."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Veri hizmeti yok"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Acil durum çağrısı yok"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Mobil veri hizmeti yok"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Acil durum çağrısı kullanılamaz"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sesli çağrı hizmeti yok"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ses/acil durum hizmeti yok"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Bulunduğunuz yerdeki mobil ağ tarafından geçici olarak sunulmuyor"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ağa erişilemiyor"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Sinyal gücünü iyileştirmek için Ayarlar > Ağ ve İnternet > Mobil ağlar > Tercih edilen ağ türü bölümünde seçili türü değiştirmeyi deneyin."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Kablosuz çağrı etkin"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Acil durum çağrıları için mobil ağ gereklidir."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ses hizmeti veya acil durum çağrısı kullanılamaz"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operatörünüz tarafından geçici olarak kapatıldı"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g> numaralı SIM kart için operatörünüz tarafından geçici olarak kapatıldı"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil ağa erişilemiyor"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tercih edilen ağı değiştirmeyi deneyin. Değiştirmek için dokunun."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Acil durum çağrısı kullanılamaz"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Kablosuz ağ üzerinden acil durum çağrıları yapılamaz"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Uyarılar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Çağrı yönlendirme"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Acil geri arama modu"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Dolaşım Başlığı Açık"</string>
<string name="roamingText12" msgid="1189071119992726320">"Dolaşım Başlığı Kapalı"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Hizmet Aranıyor"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Kablosuz Çağrı"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Kablosuz çağrı kurulamadı"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Kablosuz ağ üzerinden telefon etmek ve mesaj göndermek için öncelikle operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra, Ayarlar\'dan Kablosuz çağrı özelliğini tekrar açın. (Hata kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Operatörünüze kaydettirin (Hata kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Kablosuz çağrının operatörünüze kaydı sırasında hata oluştu: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Çok fazla sayıda istek işleniyor. Daha sonra yeniden deneyin."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> hesabı için oturum açma hatası"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Senk."</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Senk."</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Çok fazla <xliff:g id="CONTENT_TYPE">%s</xliff:g> silme var."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Senkronize edilemiyor"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Çok fazla sayıda <xliff:g id="CONTENT_TYPE">%s</xliff:g> içeriği silinmeye çalışıldı."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletin depolama alanı dolu! Yer açmak için bazı dosyaları silin."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Saat depolama alanınız dolu. Lütfen yer boşaltmak için bazı dosyaları silin."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV depolama alanı dolu. Boş alan açmak için bazı dosyaları silin."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"İş profili yöneticiniz tarafından"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tarafından"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"İş profili silindi"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Eksik yönetici uygulaması nedeniyle iş profili silindi"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"İş profili yönetici uygulaması eksik ya da bozuk. Bunun sonucunda iş profiliniz ve ilgili veriler silindi. Yardım almak için yöneticiniz ile iletişim kurun."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"İş profiliniz arık bu cihazda kullanılamıyor"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Çok fazla şifre denemesi yapıldı"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Cihaz yönetiliyor"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Kuruluşunuz bu cihazı yönetmekte olup ağ trafiğini izleyebilir. Ayrıntılar için dokunun."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Cihazınız silinecek"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Yönetim uygulaması kullanılamıyor. Cihazınız şimdi silinecek.\n\nSorularınız varsa kuruluşunuzun yöneticisine başvurun."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Yönetim uygulaması kullanılamıyor. Cihazınız şimdi silinecek.\n\nSorularınız varsa kuruluşunuzun yöneticisine başvurun."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Yazdırma işlemi <xliff:g id="OWNER_APP">%s</xliff:g> tarafından devre dışı bırakıldı."</string>
<string name="me" msgid="6545696007631404292">"Ben"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet seçenekleri"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Uçak modu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçak modu AÇIK"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Uçak modu KAPALI"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Pil tasarrufu"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Pil tasarrufu KAPALI"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Pil tasarrufu AÇIK"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sesli Yardım"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"İş profiline geç"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kişiler"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"kişilerinize erişme"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının kişilerinize erişmesine izin verin"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının kişilerinize erişmesine izin verilsin mi?"</string>
<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="8903573681261610809">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının bu cihazın konumuna erişmesine izin verin"</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="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"takviminize erişme"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının takviminize erişmesine izin verin"</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>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS mesajları gönderme ve görüntüleme"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının SMS mesajları göndermesine ve gelen mesajları görüntülemesine izin verin"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının SMS mesajları göndermesine ve görüntülemesine izin verilsin mi?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Depolama"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"cihazınızdaki fotoğraflara, medyaya ve dosyalara erişme"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının cihazınızdaki fotoğraf, medya ve dosyalara erişmesine izin verin"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının cihazınızdaki fotoğraf, medya ve dosyalara erişmesine izin verilsin mi?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ses kaydetme"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının ses kaydetmesine izin verin"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının ses kaydetmesine izin verilsin mi?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotoğraf çekme ve video kaydetme"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının resim çekmesine ve video kaydı yapmasına izin verin"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının resim çekmesine ve video kaydı yapmasına izin verilsin mi?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon çağrıları yapma ve yönetme"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasına telefon çağrıları yapma ve yönetme izni verin"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının telefon etmesine ve çağrıları yönetmesine izin verilsin mi?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Vücut Sensörleri"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"hayati belirtilerinizle ilgili sensör verilerine erişme"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının hayati belirtilerinizle ilgili sensör verilerine erişmesine izin verin"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının hayati belirtilerinizle ilgili sensör verilerine erişmesine izin verilsin mi?"</string>
<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>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Haraketleri yapma"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Dokunabilir, hızlıca kaydırabilir, sıkıştırabilir ve diğer hareketleri yapabilirsiniz."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Parmak izi hareketleri"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Cihazların parmak izi sensörlerinde gerçekleştirilen hareketleri yakalayabilir."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Cihazın parmak izi sensörlerinde gerçekleştirilen hareketleri yakalayabilir."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"durum çubuğunu devre dışı bırak veya değiştir"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Uygulamaya, durum çubuğunu devre dışı bırakma ve sistem simgelerini ekleyip kaldırma izni verir."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"durum çubuğunda olma"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Uygulamaya kendisinin bir bölümünü bellekte kalıcı yapma izni verir. Bu izin, diğer uygulamaların kullanabileceği belleği sınırlandırarak tabletin yavaş çalışmasına neden olabilir."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Uygulamaya, kendi parçalarını bellekte kalıcı hale getirme izni verir. Bu, TV\'yi yavaşlatan diğer uygulamaların kullanabileceği bellek alanını sınırlayabilir."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Uygulamaya kendisinin bir bölümünü bellekte kalıcı yapma izni verir. Bu izin, diğer uygulamaların kullanabileceği belleği sınırlandırarak telefonun yavaş çalışmasına neden olabilir."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ön plan hizmetini çalıştırma"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Uygulamanın ön plan hizmetlerinden faydalanmasına izin verir."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"uygulama depolama alanını ölç"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Uygulamaya kodunu, verilerini ve önbellek boyutlarını alma izni verir"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarını değiştirme"</string>
@@ -478,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Uygulamanın, kullanılacak parmak izi şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"parmak izi donanımını kullanma"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tanınmadı"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Parmak izi kimlik doğrulaması yapıldı"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Parmak izi donanımı kullanılamıyor."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Parmak izi depolanamıyor. Lütfen mevcut parmak izlerinden birini kaldırın."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desenle kilit açma."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Yüzle kilit açma."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin koduyla kilit açma."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN kilidini açın."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK kilidini açın."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifreyle kilit açma."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Desen alanı."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kaydırma alanı."</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"Metin panoya kopyalandı."</string>
<string name="more_item_label" msgid="4650918923083320495">"Diğer"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menü+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Üst Karakter+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"İşlev+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"boşluk"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"gir"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"sil"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Giriş yöntemi"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Metin eylemleri"</string>
<string name="email" msgid="4560673117055050403">"E-posta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Seçilen adrese e-posta gönder"</string>
<string name="dial" msgid="1253998302767701559">"Telefon et"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Seçilen telefon numarasını ara"</string>
<string name="map" msgid="6521159124535543457">"Yerini bul"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Seçilen adresin konumunu bul"</string>
<string name="browse" msgid="1245903488306147205">"Aç"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Seçilen URL\'yi aç"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Seçilen telefon numarasına mesaj gönder"</string>
<string name="add_contact" msgid="7867066569670597203">"Ekle"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Kişilere ekle"</string>
<string name="view_calendar" msgid="979609872939597838">"Göster"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Seçilen zamanı takvimde göster"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Program yap"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Seçilen zaman için etkinlik programla"</string>
<string name="view_flight" msgid="7691640491425680214">"İzle"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Seçilen uçuşu takip et"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Depolama alanı bitiyor"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bazı sistem işlevleri çalışmayabilir"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistem için yeterli depolama alanı yok. 250 MB boş alanınızın bulunduğundan emin olun ve yeniden başlatın."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Güncellemeleri denetle"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması (<xliff:g id="PROCESS">%2$s</xliff:g> işlemi) kendiliğinden uyguladığı StrictMode politikasını ihlal etti."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> işlemi kendiliğinden uyguladığı StrictMode politikasını ihlal etti."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android yeni sürüme geçiriliyor..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android başlatılıyor…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon güncelleniyor…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet güncelleniyor…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Cihaz güncelleniyor…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon başlatılıyor…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet başlatılıyor…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Cihaz başlatılıyor…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Depolama optimize ediliyor."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android güncellemesi tamamlanıyor…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Yeni sürüme geçiş işlemi tamamlanana kadar bazı uygulamalar düzgün çalışmayabilir"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Sistem güncellemesi tamamlanıyor…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> yeni sürüme geçiriliyor…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> uygulama optimize ediliyor."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> hazırlanıyor."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uygulamalar başlatılıyor"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Açılış tamamlanıyor."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Oyuna geri dönmek için dokunun"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Oyun seçin"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Daha iyi performans için aynı anda bu oyunlardan yalnızca biri açık olabilir."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> uygulamasına geri dön"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın dökümü toplandı. Paylaşmak için dokunun"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Kısa mesaj için bir işlem seçin"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Açık kablosuz ağa bağlanın"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Operatöre ait kablosuz ağa bağlanın"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açık kablosuz ağa bağlandı"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Kablosuz ağa bağlanıyor"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Kablosuz ağa bağlanıldı"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kablosuz ağa bağlanamadı"</string>
<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="1100098935861622985">"Tüm Ağlar"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tüm ağlar"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kablosuz özelliği otomatik olarak açılacak"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Daha önce kaydedilmiş yüksek kaliteli bir ağın yakınında olduğunuzda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Tekrar açılmasın"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Yeniden başlat"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil hizmeti etkinleştirin"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yeni SIM\'inizi etkinleştirmek için operatörün uygulamasını indirin"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Yeni SIM\'inizi etkinleştirmek için <xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasını indirin"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Uygulama indir"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart takıldı"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Kurmak için dokunun"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB üzerinden PTP açık"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering açık"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB üzerinden MIDI açık"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB aksesuarı modu açık"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB aksesuarı bağlandı"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Diğer seçenekler için dokunun."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Bağlı cihaz şarj ediliyor. Diğer seçenekler için dokunun."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analog ses aksesuarı algılandı"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Takılan cihaz bu telefonla uyumlu değil. Daha fazla bilgi edinmek için dokunun."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB hata ayıklama özelliğini devre dışı bırakmak için dokunun."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Hata raporu alınıyor…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Hata raporu paylaşılsın mı?"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde görüntüleniyor"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde gösteriliyor"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KAPAT"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanıyor"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hatalar denetleniyor"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> algılandı"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Kapat"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> kontrol ediliyor…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Geçerli içerik inceleniyor"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Yeni <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Ayarlamak için dokunun"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoğraf ve medya aktarmak için"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Bozuk <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> bozuk. Düzeltmek için dokunun."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> medyasında sorun oluştu"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Düzeltmek için dokunun"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> bozuk. Düzeltmek için seçin."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Desteklenmeyen <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Bu cihaz, bu <xliff:g id="NAME">%s</xliff:g> ortamını desteklemiyor. Desteklenen bir biçimde kurmak için dokunun."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Bu cihaz, bu <xliff:g id="NAME">%s</xliff:g> medyasını desteklemiyor. Desteklenen bir biçimde ayarlamak için seçin."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> beklenmedik şekilde çıkarıldı"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Veri kaybı olmaması için <xliff:g id="NAME">%s</xliff:g> birimini çıkarmadan önce bağlantısını kesin"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> çıkarıldı"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> çıkarıldı; yeni bir tane takın"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> çıkarma işlemi devam ediyor…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Çıkarmayın"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"İçerik kaybı olmaması için medyayı çıkarmadan önce kaldırın"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> kaldırıldı"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Bazı işlevler düzgün çalışmayabilir. Yeni depolama birimi takın."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> çıkarılıyor"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Çıkarmayın"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Kur"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Çıkar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Keşfet"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> bulunamıyor"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Bu cihazı yeniden yerleştirin"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Cihazı tekrar takın"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> taşınıyor"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Veriler taşınıyor"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Taşıma işlemi tamamlandı"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Veriler <xliff:g id="NAME">%s</xliff:g> depolama birimine taşındı"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Veriler taşınamadı"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Orijinal konumda veri kaldı"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"İçerik aktarma işlemi tamamlandı"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"İçerik <xliff:g id="NAME">%s</xliff:g> konumuna taşındı"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"İçerik taşınamadı"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"İçeriği taşımayı tekrar deneyin"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Kaldırıldı"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Çıkarıldı"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrol ediliyor…"</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Her zaman açık VPN\'ye bağlanılıyor…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Her zaman açık VPN\'ye bağlanıldı"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Her zaman açık VPN bağlantı kesildi"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Her zaman açık VPN hatası"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Her zaman açık VPN\'ye bağlanılamadı"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Ağ veya VPN ayarlarını değiştirin"</string>
<string name="upload_file" msgid="2897957172366730416">"Dosya seç"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Seçili dosya yok"</string>
<string name="reset" msgid="2448168080964209908">"Sıfırla"</string>
<string name="submit" msgid="1602335572089911941">"Gönder"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Araba modu etkin"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Araba modundan çıkmak için dokunun."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Sürüş uygulaması çalışıyor"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Sürüş uygulamasından çıkmak için dokunun."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering veya hotspot etkin"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Ayarlamak için dokunun."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering devre dışı bırakıldı"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB sürücüsü"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB bellek"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Düzenle"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Veri kullanımı uyarısı"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Kul. ve ayar. gör. için dokunun."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G veri sınırına ulaşıldı"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G veri sınırına ulaşıldı"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Veri uyarısı"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> veri kullandınız"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobil veri limitine ulaşıldı"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Kablosuz veri sınırına ulaşıldı"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Kalan dönemde veri duraklatıldı"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G veri limiti aşıldı"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G veri limiti aşıldı"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobil veri limiti aşıldı"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Kablosuz veri limiti aşıldı"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g>, belirlenen limiti aşıyor."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Döngünüzün kalanı için veriler duraklatıldı"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mobil veri sınırınızı aştınız"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Kablosuz veri sınırınızı aştınız"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Belirlenmiş <xliff:g id="SIZE">%s</xliff:g> sınırınızı aştınız"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Arka plan verileri kısıtlı"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Kısıtlamayı kaldır. için dokunun"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Fazla veri kullanımı"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Son birkaç gün içindeki veri kullanımınız normalden fazla. Kullanımı ve ayarları görüntülemek için dokunun."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Yüksek mobil veri kullanımı"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Uygulamalarınız normalden daha fazla veri kullandı"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> normalden daha fazla veri kullandı"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Güvenlik sertifikası"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Bu sertifika geçerli."</string>
<string name="issued_to" msgid="454239480274921032">"Verilen:"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Yöneticiniz tarafından yüklendi"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Yöneticiniz tarafından güncellendi"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Yöneticiniz tarafından silindi"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Pil Tasarrufu özelliği, pil ömrünü iyileştirmeye yardımcı olmak için cihazınızın performansını düşürür, titreşimi, konum hizmetlerini ve arka plan verilerinin çoğunu sınırlar. Senkronizasyona dayalı olarak çalışan e-posta, mesajlaşma uygulamaları ve diğer uygulamalar, bunları açmadığınız sürece güncellenmeyebilir.\n\nCihazınız şarj olurken Pil Tasarrufu otomatik olarak kapatılır."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Pil Tasarrufu pil ömrünü uzatmak için cihazınızın performansını azaltır, ayrıca titreşimi, konum hizmetlerini ve arka plan verileri sınırlar. Senkronizasyona dayalı olarak çalışan e-posta, mesajlaşma ve diğer uygulamalar, açılmadıkları sürece güncellenmeyebilir.\n\nCihazınız şarj olurken, Pil Tasarrufu otomatik olarak kapanır."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Şu anda kullandığınız bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Veri Tasarrufu açılsın mı?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aç"</string>
@@ -1681,9 +1702,9 @@
<item quantity="other">%1$d dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Bir saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1718,9 @@
<item quantity="other">%d dakika için</item>
<item quantity="one">1 dakika için</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d saat için</item>
- <item quantity="one">Bir saat için</item>
+ <item quantity="one">1 saat için</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d saat için</item>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tarafından kapatıldı"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Cihazınızla ilgili dahili bir sorun oluştu ve fabrika verilerine sıfırlama işlemi gerçekleştirilene kadar kararsız çalışabilir."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Cihazınızla ilgili dahili bir sorun oluştu. Ayrıntılı bilgi için üreticinizle iletişim kurun."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD isteği DIAL isteği olarak değiştirildi."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD isteği SS isteği olarak değiştirildi."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD isteği yeni USSD isteği olarak değiştirildi."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD isteği Video DIAL isteği olarak değiştirildi."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS isteği DIAL isteği olarak değiştirildi."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS isteği, Video DIAL isteği olarak değiştirildi."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS isteği USSD isteği olarak değiştirildi."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS isteği yeni SS isteği olarak değiştirildi."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD isteği normal çağrı olarak değişti"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD isteği SS isteği olarak değişti"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Yeni USSD isteği olarak değişti"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD isteği görüntülü çağrı olarak değişti"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS isteği normal çağrı olarak değişti"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS isteği görüntülü görüşme olarak değişti"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS isteği USSD isteği olarak değişti"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Yeni SS isteği olarak değişti"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"İş profili"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Genişlet"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Daralt"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Ses için SIM\'in temel hazırlığı yapılmadı"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Ses için SIM\'e izin verilmiyor"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ses için telefona izin verilmiyor"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> numaralı SIM karta izin verilmiyor"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> numaralı SIM kart sağlanmadı"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> numaralı SIM karta izin verilmiyor"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> numaralı SIM karta izin verilmiyor"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up Pencere"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Uygulama eski sürümüne geçirildi veya bu kısayol ile uyumlu değil"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararlı uygulama tespit edildi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> uygulaması, <xliff:g id="APP_2">%2$s</xliff:g> dilimlerini göstermek istiyor"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Düzenle"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Çağrılar ve bildirimler titreşim yapacak"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Çağrılar ve bildirimlerin sesi kapalı olacak"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem değişiklikleri"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Rahatsız Etmeyin"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Konsantre olmanıza yardımcı olmak için, Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Yeni davranış bu şekildedir. Değiştirmek için dokunun."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Rahatsız Etmeyin modu değişti"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kesintilerle ilgili davranış ayarlarınızı kontrol etmek için dokunun"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nelerin engellendiğini kontrol etmek için dokunun."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ayarlar"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 61f74bf..e031539 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -79,15 +79,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Ідентиф. абонента за умовч. не обмеж. Наст. дзвінок: не обмежений"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Службу не ініціалізовано."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ви не можете змінювати налаштування ідентифікатора абонента."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Немає мобільного Інтернету"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Екстрені виклики заблоковано"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Службу передавання мобільних даних заблоковано"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Екстрені виклики недоступні"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Немає голосової служби"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Немає голосової/екстреної служби"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Тимчасово не пропонується мобільною мережею у вашому місцезнаходженні"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не вдається під’єднатися до мережі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Щоб покращити прийняття сигналу, змініть тип у меню \"Налаштування\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Виклики через Wi-Fi активовано"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Щоб здійснювати екстрені виклики, потрібне з’єднання з мобільною мережею."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Голосову службу й екстрені виклики заблоковано"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Оператор тимчасово вимкнув службу"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Оператор тимчасово вимкнув службу для SIM-карти <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Не вдається під’єднатися до мобільної мережі"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Спробуйте змінити вибрану мережу. Торкніться, щоб це зробити."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Екстрені виклики недоступні"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Не можна здійснювати екстрені виклики через Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сповіщення"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресація виклику"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим екстреного зворотного виклику"</string>
@@ -122,12 +123,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Банер роум-гу ввімк."</string>
<string name="roamingText12" msgid="1189071119992726320">"Банер роум-гу вимк."</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Пошук служби"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Дзвінок через Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Не вдалося налаштувати дзвінки через Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спершу попросіть свого оператора налаштувати цю послугу. Після цього знову ввімкніть дзвінки через Wi-Fi у налаштуваннях. (Код помилки: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Зареєструйтеся в оператора (код помилки: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Проблема з реєстрацією дзвінків через Wi‑Fi у вашого оператора: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -162,8 +163,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Обробляється забагато запитів. Спробуйте пізніше."</string>
<string name="notification_title" msgid="8967710025036163822">"Помилка входу для облікового запису <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхр."</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхр."</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Забагато видалень <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Не вдалося синхронізувати"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Спроба видалити забагато вмісту <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Пам’ять планшетного ПК заповнено. Видаліть якісь файли, щоб звільнити місце."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Пам’ять годинника заповнено. Видаліть файли, щоб звільнити місце."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Пам’ять телевізора заповнено. Видаліть файли, щоб звільнити місце."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Адміністратор робочого профілю"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Доменом <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Робочий профіль видалено"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Робочий профіль видалено через відсутність додатка адміністратора"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Додаток адміністратора в робочому профілі відсутній або пошкоджений. У результаті ваш робочий профіль і пов’язані з ним дані видалено. Зверніться до свого адміністратора по допомогу."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Робочий профіль більше не доступний на цьому пристрої"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Забагато спроб ввести пароль"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Пристрій контролюється"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Адміністратор вашої організації контролює цей пристрій і відстежує мережевий трафік. Торкніться, щоб дізнатися більше."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"З вашого пристрою буде стерто всі дані"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Не можна використовувати цей додаток адміністратора. На пристрої буде відновлено заводські налаштування.\n\nЯкщо у вас є запитання, зв’яжіться з адміністратором організації."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Не можна запускати додаток для адміністраторів. Буде відновлено заводські налаштування пристрою.\n\nЯкщо у вас є запитання, зв’яжіться з адміністратором своєї організації."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Додаток <xliff:g id="OWNER_APP">%s</xliff:g> вимкнув друк."</string>
<string name="me" msgid="6545696007631404292">"Я"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Парам. пристрою"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим польоту"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим польоту ВВІМК."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим польоту ВИМК."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим економії заряду акумулятора"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Режим економії заряду акумулятора ВИМКНЕНО"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Режим економії заряду акумулятора ВВІМКНЕНО"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Підказки"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Голос. підказки"</string>
@@ -275,31 +278,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Перейти в робочий профіль"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"отримувати доступ до контактів"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до контактів"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до контактів?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Геодані"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ до геоданих пристрою"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до геоданих пристрою"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до геоданих пристрою?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"отримувати доступ до календаря"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до календаря"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до календаря?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"надсилати та переглядати SMS-повідомлення"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> надсилати та переглядати SMS-повідомлення"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> надсилати та переглядати SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Зберігання"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"отримувати доступ до фотографій, мультимедійного вмісту та файлів на вашому пристрої"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до фото, медіа та файлів на пристрої"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до фото, медіа та файлів на пристрої?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Мікрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"записувати аудіо"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> записувати аудіо"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> записувати аудіо?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"фотографувати та записувати відео"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> робити знімки та записувати відео"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> робити знімки та записувати відео?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефонувати та керувати дзвінками"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> здійснювати телефонні виклики та керувати ними"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> здійснювати телефонні дзвінки та керувати ними?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Датчики на тілі"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"отримувати доступ до інформації датчиків про ваші життєві показники"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до життєвих показників із датчиків"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до життєвих показників із датчиків?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Отримувати вміст вікна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
@@ -311,7 +314,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Виконання жестів"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Можна торкатися, проводити пальцем, стискати пальці та виконувати інші жести."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Жести на сканері відбитків пальців"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Фіксуються жести на сканері відбитків пальців."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Може фіксувати жести на сканері відбитків пальців."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"вимикати чи змін. рядок стану"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дозволяє програмі вимикати рядок стану чи додавати та видаляти піктограми системи."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"відображатися як рядок стану"</string>
@@ -362,6 +365,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Дозволяє програмі робити свої частини сталими в пам’яті. Це може зменшувати обсяг пам’яті, доступної для інших програм, і сповільнювати роботу планшетного ПК."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Додаток може робити свої частини сталими в пам’яті. Це може зменшувати обсяг пам’яті, доступної для інших додатків, і сповільнювати роботу телевізора."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Дозволяє програмі робити свої частини сталими в пам’яті. Це може зменшувати обсяг пам’яті, доступної для інших програм, і сповільнювати роботу телефону."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"запускати пріоритетну службу"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Додаток може використовувати пріоритетні служби."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"визначати об’єм пам’яті програми"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Дозволяє програмі отримувати її код, дані та розміри кеш-пам’яті"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"змінювати налаштування системи"</string>
@@ -484,6 +489,8 @@
<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_useBiometric" msgid="8837753668509919318">"використовувати біометричне апаратне забезпечення"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Додаток може використовувати біометричне апаратне забезпечення для автентифікації"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"керувати апаратним забезпеченням для цифрових відбитків"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Увімкнути в додатку функції для додавання й видалення шаблонів цифрових відбитків."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"використання сканера цифрових відбитків"</string>
@@ -496,6 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не розпізнано"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Відбиток автентифіковано"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратне забезпечення для сканування відбитка недоступне."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Не вдалося зберегти відбиток. Видаліть наявний відбиток."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string>
@@ -808,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Розблокування ключем."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Розблокування PIN-кодом."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Розблокування SIM-карти PIN-кодом."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Розблокування SIM-карти PUK-кодом."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Розблокування паролем."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ключа."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область повзунка."</string>
@@ -869,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текст скопійов. в буф. обм."</string>
<string name="more_item_label" msgid="4650918923083320495">"Більше"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"пробіл"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1034,14 +1050,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string>
<string name="email" msgid="4560673117055050403">"Електронна пошта"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Надіслати електронний лист на вибрану адресу"</string>
<string name="dial" msgid="1253998302767701559">"Зателефонувати"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Набрати вибраний номер телефону"</string>
<string name="map" msgid="6521159124535543457">"Знайти"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Знайти вибрану адресу на картах"</string>
<string name="browse" msgid="1245903488306147205">"Відкрити"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Відкрити вибрану URL-адресу"</string>
<string name="sms" msgid="4560537514610063430">"Повідомлення"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Надіслати повідомлення за вибраним номером телефону"</string>
<string name="add_contact" msgid="7867066569670597203">"Додати"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Додати в контакти"</string>
<string name="view_calendar" msgid="979609872939597838">"Переглянути"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Переглянути вибраний час у календарі"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Запланувати"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Запланувати подію на вибраний час"</string>
<string name="view_flight" msgid="7691640491425680214">"Відстежити"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Відстежувати вибраний авіарейс"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Закінчується пам’ять"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Деякі системні функції можуть не працювати"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Недостатньо місця для системи. Переконайтесь, що на пристрої є 250 МБ вільного місця, і повторіть спробу."</string>
@@ -1114,31 +1139,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Шукати оновлення"</string>
<string name="smv_application" msgid="3307209192155442829">"Програма <xliff:g id="APPLICATION">%1$s</xliff:g> (процес <xliff:g id="PROCESS">%2$s</xliff:g>) порушила свою самозастосовну політику StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Процес <xliff:g id="PROCESS">%1$s</xliff:g> порушив свою самозастосовну політику StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android оновлюється..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Запуск ОС Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефон оновлюється…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Планшет оновлюється…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Пристрій оновлюється…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефон запускається…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Планшет запускається…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Пристрій запускається…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимізація пам’яті."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Завершується оновлення Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Деякі додатки можуть не працювати належним чином, доки не завершиться оновлення"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Завершується оновлення системи…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Додаток <xliff:g id="APPLICATION">%1$s</xliff:g> оновлюється…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимізація програми <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Підготовка додатка <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск програм."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Завершення завантаження."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Працює <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Торкніться, щоб повернутися в гру"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Виберіть гру"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Щоб підвищити продуктивність, відкривайте лише одну гру."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Назад у додаток <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Дані динамічної пам’яті зібрано. Торкніться, щоб поділитися"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Виберіть дію для тексту"</string>
@@ -1177,12 +1199,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Під’єднайтеся до відкритої мережі Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Під’єднайтеся до мережі Wi-Fi оператора"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Під’єднання до відкритої мережі Wi-Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"З’єднання з мережею Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Під’єднано до мережі Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не вдалося під’єднатися до мережі Wi-Fi"</string>
<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="1100098935861622985">"Усі мережі"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усі мережі"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi вмикатиметься автоматично"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Коли ви поблизу збереженої мережі високої якості"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не вмикати знову"</string>
@@ -1248,6 +1270,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Перезапуск"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активувати мобільну службу"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Завантажити додаток оператора, щоб активувати нову SIM-карту"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Щоб активувати нову SIM-карту, завантажте додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Завантажити додаток"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Вставлено нову SIM-карту"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Торкніться, щоб налаштувати"</string>
@@ -1266,13 +1289,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP через USB ввімкнено"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Режим USB-модема ввімкнено"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI через USB ввімкнено"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режим USB-аксесуара ввімкнено"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Під’єднано USB-аксесуар"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Торкніться, щоб переглянути більше опцій."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Під’єднаний пристрій заряджається. Торкніться, щоб побачити більше опцій."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Виявлено аналоговий аксесуар для аудіо"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Торкніться, щоб вимкнути налагодження USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Торкніться, щоб вимкнути налагоджувач USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Виберіть, щоб вимкнути налагодження за USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Створюється повідомлення про помилку…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Надіслати звіт про помилку?"</string>
@@ -1291,34 +1314,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Додаток <xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Щоб у додатку <xliff:g id="NAME">%s</xliff:g> не працювала ця функція, вимкніть її в налаштуваннях."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ВИМКНУТИ"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Підготовка пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Виявлення помилок"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Виявлено новий пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Вимкнути"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Перевіряється <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Перевірка поточного вмісту"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Новий пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Торкніться, щоб налаштувати"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перенесення фотографій і медіафайлів"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> не підключається"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носій (<xliff:g id="NAME">%s</xliff:g>) пошкоджено. Торкніться, щоб виправити."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Проблема з носієм (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Торкніться, щоб виправити"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Пристрій <xliff:g id="NAME">%s</xliff:g> пошкоджено. Виберіть, щоб виправити."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не підтримується"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> не підтримується цим пристроєм. Торкніться, щоб налаштувати підтримуваний формат."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> не підтримується на цьому пристрої. Виберіть, щоб налаштувати в підтримуваному форматі."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> несподівано вийнято"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перш ніж виймати пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>, відключіть його, щоб не втратити дані"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ви вийняли пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Ви вийняли пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>. Вставте новий пристрій"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Відключення пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не виймайте пристрій пам’яті"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Перш ніж виймати носій, відключіть його, щоб не втратити вміст"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>) вийнято"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Деякі функції можуть не працювати належним чином. Вставте новий пристрій пам’яті."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> відключається…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не виймайте пристрій пам’яті"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"Немає пристрою <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Вийміть і вставте пристрій"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"Переміщення даних"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Дані переміщено"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Дані переміщено на пристрій <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Не вдалося перемістити дані"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Дані не переміщено"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Вміст перенесено"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Вміст перенесено на пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Не вдалося перенести вміст"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Спробуйте перенести вміст знову"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Вийнято"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Відключено"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Перевірка…"</string>
@@ -1377,14 +1401,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Під’єднання до постійної мережі VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Під’єднано до постійної мережі VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Від’єднано від постійної мережі VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Помилка постійної мережі VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Не вдалося під’єднати пристрій до постійної мережі VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Змінити налаштування мережі або VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Виберіть файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Не вибрано файл"</string>
<string name="reset" msgid="2448168080964209908">"Скинути"</string>
<string name="submit" msgid="1602335572089911941">"Надіслати"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Режим авто ввімкн."</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Торкніться, щоб вийти з режиму автомобіля."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Працює додаток для автомобілів"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Торкніться, щоб вийти з додатка для автомобілів."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Прив\'язка чи точка дост. активна"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Торкніться, щоб налаштувати."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Використання телефона в режимі модема вимкнено"</string>
@@ -1464,22 +1488,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Носій USB (<xliff:g id="MANUFACTURER">%s</xliff:g>)"</string>
<string name="storage_usb" msgid="3017954059538517278">"Носій USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Редагувати"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Сповіщення про використ. трафіку"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Переглянути дані та параметри."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Досягнуто ліміту даних 2G–3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Досягнуто ліміту даних 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Застереження про передавання даних"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Ви використали <xliff:g id="APP">%s</xliff:g> даних"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Досягнуто ліміту моб. трафіку"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Досягнуто ліміту даних Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Передавання даних призупинено"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Перевищено ліміт даних 2G–3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Перевищено ліміт даних 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Перевищено ліміт мобільних даних"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Перевищено ліміт даних Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> – понад указаний ліміт."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Передавання даних призупинено до кінця циклу"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Перевищено ліміт мобільного передавання даних"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Перевищено ліміт передавання даних через Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ви перевищили ліміт на <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Викор-ня фонових даних обмежено"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Скасувати обмеження."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Надмірне використання трафіку"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"За останні кілька днів ви використовуєте більше трафіку, ніж зазвичай. Торкніться, щоб переглянути дані й налаштування."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Надмірне мобільне передавання даних"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Додатки використали більше даних, ніж зазвичай"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Додаток <xliff:g id="APP">%s</xliff:g> використав більше даних, ніж зазвичай"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Сертифікат безпеки"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Цей сертифікат дійсний."</string>
<string name="issued_to" msgid="454239480274921032">"Кому видано:"</string>
@@ -1719,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Установлено адміністратором"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Оновлено адміністратором"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Видалено адміністратором"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Щоб подовжити час роботи акумулятора, у режимі економії заряду акумулятора знижується продуктивність пристрою й обмежуються вібрація, функції служб локації та фоновий режим обміну даними. Електронна пошта, чати й інші додатки, які синхронізуються, можуть не оновлюватися, доки ви їх не відкриєте.\n\nРежим економії заряду акумулятора автоматично вимикається під час заряджання пристрою."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Щоб пристрій працював довше, у режимі економії заряду акумулятора знижується його продуктивність і обмежуються або вимикаються вібрація, служби локації й фоновий режим обміну даними. Електронна пошта, чати й інші додатки, які мають синхронізуватися, можуть не оновлюватися, доки ви їх не відкриєте.\n\nРежим економії заряду акумулятора автоматично вимикається під час заряджання пристрою."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Увімкнути Заощадження трафіку?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Увімкнути"</string>
@@ -1735,7 +1756,7 @@
<item quantity="many">Протягом %1$d хв (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Протягом %1$d хв (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d годину (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">%1$d години (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">%1$d годин (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,7 +1780,7 @@
<item quantity="many">Протягом %d хв</item>
<item quantity="other">Протягом %d хв</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d годину</item>
<item quantity="few">%d години</item>
<item quantity="many">%d годин</item>
@@ -1786,14 +1807,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає звук"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Через внутрішню помилку ваш пристрій може працювати нестабільно. Відновіть заводські налаштування."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"На пристрої сталася внутрішня помилка. Зв’яжіться з виробником пристрою, щоб дізнатися більше."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Запит USSD перетворено на запит DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Запит USSD перетворено на запит SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Запит USSD перетворено на новий запит USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Запит USSD перетворено на запит Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Запит SS перетворено на запит DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Запит SS перетворено на запит Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Запит SS перетворено на запит USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Запит SS перетворено на новий запит SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Запит USSD змінено на звичайний виклик"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Запит USSD змінено на запит SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Змінено на новий запит USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Запит USSD змінено на відеовиклик"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Запит SS змінено на звичайний виклик"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Запит SS змінено на відеовиклик"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Запит SS змінено на запит USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Змінено на новий запит SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Робочий профіль"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Розгорнути"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Згорнути"</string>
@@ -1895,6 +1916,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Не вказано SIM-карту для голосових дзвінків"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Голосові дзвінки із SIM-карти заборонено"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Голосові дзвінки з телефона заборонено"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-карту <xliff:g id="SIMNUMBER">%d</xliff:g> заборонено"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-карту <xliff:g id="SIMNUMBER">%d</xliff:g> не ініціалізовано"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-карту <xliff:g id="SIMNUMBER">%d</xliff:g> заборонено"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-карту <xliff:g id="SIMNUMBER">%d</xliff:g> заборонено"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Спливаюче вікно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версія додатка застаріла або несумісна з цим ярликом"</string>
@@ -1907,7 +1932,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Виявлено шкідливий додаток"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> хоче показати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Редагувати"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Вібросигнал для викликів і сповіщень увімкнено"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Звуковий сигнал для викликів і сповіщень вимкнено"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системні зміни"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не турбувати"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"У режимі \"Не турбувати\" сповіщення ховаються, щоб ви могли зосередитись"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Це нова поведінка. Торкніться, щоб змінити."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Налаштування режиму \"Не турбувати\" змінено"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Торкніться, щоб перевірити налаштування сповіщень"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Торкніться, щоб перевірити, що заблоковано."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Налаштування"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index cb56469..5c046ee 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"کوئی صوتی سروس نہیں"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"کوئی صوتی سروس یا ہنگامی کالنگ دستیاب نہیں ہے"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"آپ کے کیریئر نے عارضی طور پر آف کر دیا ہے"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"موبائل نیٹ ورک تک رسائی نہیں ہو سکتی"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ترجیحی نیٹ ورک تبدیل کر کے دیکھیں۔ تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ہنگامی کالنگ دستیاب نہیں ہے"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"رومنگ بینر آن ہے"</string>
<string name="roamingText12" msgid="1189071119992726320">"رومنگ بینر آف"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"سروس کی تلاش کر رہا ہے"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi کالنگ کو ترتیب نہیں دیا جا سکا"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کے لیے، پہلے اپنے کیریئر سے اس سروس کو سیٹ اپ کرنے کے لیے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔ (خراب کوڈ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"آپ کے کیریئر کے ساتھ Wi‑Fi کالنگ رجسٹر کرنے میں مسئلہ درپیش ہے: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi کالنگ"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"کافی زیادہ درخواستوں پر کارروائی کی جا رہے ہے۔ بعد میں دوبارہ کوشش کریں۔"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> کیلئے سائن ان کی خرابی"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"مطابقت پذیری کریں"</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"مطابقت پذیر نہیں کر سکا"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"بہت زیادہ <xliff:g id="CONTENT_TYPE">%s</xliff:g> حذف کرنی کی کوشش کی گئی"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ٹیبلیٹ اسٹوریج بھرا ہوا ہے. جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"دیکھنے کا اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"دفتری پروفائل پر سوئچ کریں"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"رابطے"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"اپنے رابطوں تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کے رابطوں تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"مقام"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"اس آلہ کے مقام تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو اس آلہ کے مقام تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"کیلنڈر"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کے کیلنڈر تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS پیغامات بھیجیں اور دیکھیں"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو SMS پیغامات بھیجنے اور انہیں ملاحظہ کرنے کی اجازت دیں؟"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"اسٹوریج"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"اپنے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"مائکروفون"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"آڈیو ریکارڈ کریں"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آڈیو ریکارڈ کرنے کی اجازت دیں؟"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"کیمرا"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"تصاویر لیں اور ویڈیو ریکارڈ کریں"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو تصاویر لینے اور ویڈیو ریکارڈ کرنے کی اجازت دیں؟"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"فون"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"فون کالز کریں اور ان کا نظم کریں"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"</b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو فون کالز کرنے اور ان کا نظم کرنے کی اجازت دیں؟"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"جسم سینسرز"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کے اہم اشاروں کے متعلق سینسر ڈیٹا تک رسائی کی اجازت دیں؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
@@ -492,6 +484,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>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"فنگر پرنٹ ہارڈ ویئر کا نظم کریں"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ایپ کو استعمال کیلئے فنگر پرنٹ کی تمثیلات شامل کرنے اور حذف کرنے کیلئے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"فنگر پرنٹ ہارڈ ویئر استعمال کریں"</string>
@@ -504,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"تسلیم شدہ نہیں ہے"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"فنگر پرنٹ ہارڈ ویئر دستیاب نہیں ہے۔"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string>
@@ -1016,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"اندراج کا طریقہ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"متن کی کارروائیاں"</string>
<string name="email" msgid="4560673117055050403">"ای میل"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"کال کریں"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"پتا لگائیں"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"کھولیں"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"پیغام"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"شامل کریں"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"دیکھیں"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"شیڈول کریں"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"پتہ لگائیں"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"اسٹوریج کی جگہ ختم ہو رہی ہے"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ممکن ہے سسٹم کے کچھ فنکشنز کام نہ کریں"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"سسٹم کیلئے کافی اسٹوریج نہیں ہے۔ اس بات کو یقینی بنائیں کہ آپ کے پاس 250MB خالی جگہ ہے اور دوبارہ شروع کریں۔"</string>
@@ -1117,8 +1133,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"متن کیلئے ایک کارروائی منتخب کریں"</string>
@@ -1153,8 +1168,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہوں"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"کیریئر Wi‑Fi نیٹ ورک سے منسلک ہوں"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi نیٹ ورک سے منسلک ہو رہا ہے"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہو گيا"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi نیٹ ورک سے منسلک نہیں ہو سکا"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string>
@@ -1271,33 +1285,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> دیگر ایپس پر ڈسپلے ہو رہی ہے"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے بند کریں۔"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"آف کریں"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> تیار کیا جا رہا ہے"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"خرابیوں کیلئے چیک کیا جا رہا ہے"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"نئے <xliff:g id="NAME">%s</xliff:g> کا پتا چلا"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"تصاویر اور میڈیا منتقل کرنے کیلئے"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"خراب شدہ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> خراب ہے۔ اسے ٹھیک کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> خراب ہے۔ اسے ٹھیک کرنے کیلئے منتخب کریں۔"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"غیر تعاون یافتہ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"یہ آلہ <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"یہ آلہ اس <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا ہے۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے منتخب کریں۔"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> غیر متوقع طور پر ہٹا دیا گیا"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ڈیٹا ضائع ہونے سے بچانے کیلئے ہٹانے سے پہلے <xliff:g id="NAME">%s</xliff:g> کو اَن ماؤنٹ کریں"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا؛ ایک نیا داخل کریں"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ابھی بھی <xliff:g id="NAME">%s</xliff:g> کو خارج کر رہا ہے…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"نہ ہٹائیں"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> غائب ہے"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"اس آلہ کو دوبارہ داخل کریں"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> کو منتقل کیا جا رہا ہے"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ڈیٹا منتقل کیا جا رہا ہے…"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"منتقل کرنا مکمل ہوگیا"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"ڈیٹا کو <xliff:g id="NAME">%s</xliff:g> پر منتقل کر دیا گیا"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"ڈیٹا منتقل نہیں کیا جا سکا"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"ڈیٹا اصل جگہ پر باقی ہے"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"ہٹا دیا گیا"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"اخراج شدہ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"چیک کیا جا رہا ہے…"</string>
@@ -1356,17 +1386,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ہمیشہ آن VPN مربوط ہو رہا ہے…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ہمیشہ آن VPN مربوط ہوگیا"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ہمیشہ آن VPN سے غیر منسلک ہو گيا"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ہمیشہ آن VPN سے منسلک نہیں کیا جا سکا"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"نیٹ ورک یا VPN کی ترتیبات تبدیل کریں"</string>
<string name="upload_file" msgid="2897957172366730416">"فائل منتخب کریں"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"کوئی فائل منتخب نہیں کی گئی"</string>
<string name="reset" msgid="2448168080964209908">"دوبارہ ترتیب دیں"</string>
<string name="submit" msgid="1602335572089911941">"جمع کرائیں"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ڈرائیونگ ایپ چل رہی ہے"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ڈرائیونگ ایپ سے باہر نکلنے کے لئے تھپتھپائيں۔"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ٹیدرنگ غیر فعال ہے"</string>
@@ -1692,8 +1719,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"آپ کے منتظم کے ذریعے انسٹال کیا گیا"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"آپ کے منتظم کے ذریعے اپ ڈیٹ کیا گیا"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"آپ کے منتظم کے ذریعے حذف کیا گیا"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"بیٹری لائف کی توسیع کیلئے، بیٹری سیور آپ کے آلہ کی کارکردگی میں تخفیف کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کے ڈیٹا کو محدود کر دیتی ہے یا بند کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر انحصار کرنے والی دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآپ کا آلہ چارج ہوتے وقت بیٹری سیور خود بخود آف ہو جاتی ہے۔"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتا ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا پر رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا زیادہ نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ڈیٹا سیور آن کریں؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"آن کریں"</string>
@@ -1744,22 +1770,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کے ذریعے خاموش کردہ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"آپ کے آلہ میں ایک داخلی مسئلہ ہے اور جب تک آپ فیکٹری ڈیٹا کو دوبارہ ترتیب نہیں دے دیتے ہیں، ہوسکتا ہے کہ یہ غیر مستحکم رہے۔"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"آپ کے آلہ میں ایک داخلی مسئلہ ہے۔ تفصیلات کیلئے اپنے مینوفیکچرر سے رابطہ کریں۔"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD درخواست کو ریگولر کال میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD درخواست کو SS درخواست میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"نئی USSD درخواست میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD درخواست کو ویڈیو کال میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS درخواست کو ریگولر کال میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS درخواست کو ویڈیو کال میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS درخواست کو USSD درخواست میں تبدیل کر دیا گیا"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"نئی SS درخواست میں تبدیل کر دیا گیا"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"دفتری پروفائل"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"پھیلائیں"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"سکیڑیں"</string>
@@ -1857,6 +1875,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM میں آواز کیلئے سہولت نہیں ہے"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"آواز کیلئے SIM کو اجازت نہیں ہے"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"آواز کیلئے فون کو اجازت نہیں ہے"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"پاپ اپ ونڈو"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ایپ کے ورژن کا درجہ کم ہے یا اس شارٹ کٹ کے ساتھ مطابقت پذیر نہیں ہے"</string>
@@ -1877,8 +1903,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"یہ نیا برتاؤ ہے۔ تبدیل کرنے کے لیے تھتھپائيں۔"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"مسدود کی گئی چیزوں کو چیک کرنے کے لیے تھپتھپائیں۔"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"سسٹم"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ترتیبات"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 9776eeb54..97ccc5b 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ovozli chaqiruvlar ishlamaydi"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ovozli yoki favqulodda chaqiruvlar ishlamayapti"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Aloqa operatoringiz tomonidan vaqtinchalik faolsizlantirilgan"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil tarmoqqa ulanib bo‘lmadi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tarmoq turini almashtiring. Almashtirish uchun bosing."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Favqulodda chaqiruv ishlamayapti"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Rouming banneri yoqilgan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Rouming banneri o‘chirilgan"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Xizmatlar qidirilmoqda"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Wi‑Fi chaqiruv sozlanmadi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin. (Xato kodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Aloqa operatoringiz orqali Wi-Fi chaqiruv funksiyasinini ulashda xato: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi qo‘ng‘iroqlar"</item>
@@ -159,10 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Juda ko‘p so‘rovlar amalga oshirilmoqda. Keyinroq urinib ko‘ring."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> hisobiga kirishda xato"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinx."</string>
- <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
- <skip />
- <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
- <skip />
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sinxronlanmadi"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Juda ko‘p elementni (<xliff:g id="CONTENT_TYPE">%s</xliff:g>) o‘chirib tashlashga urindingiz."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Planshet xotirasi to‘la. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Soat xotirasi to‘lgan. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Televizor xotirasi to‘lgan. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
@@ -272,40 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Ishchi profilga almashtirish"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarga kirish"</string>
- <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
- <skip />
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun kontaktlaringizga ruxsat berilsinmi?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Joylashuv"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"shu qurilmaning joylashuvi haqidagi axborotga kirish"</string>
- <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
- <skip />
+ <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="permgrouplab_calendar" msgid="5863508437783683902">"Taqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"taqvimingizga kirish"</string>
- <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
- <skip />
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun taqvimingizga ruxsat berilsinmi?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS xabarlarni yuborish va ko‘rish"</string>
- <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
- <skip />
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun SMS xabarlarni yuborish va ko‘rishga ruxsat berilsinmi?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Xotira"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"qurilmangizdagi surat, multimedia va fayllarga kirish"</string>
- <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
- <skip />
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun qurilmangizdagi surat, multimedia va fayllarga ruxsat berilsinmi?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ovoz yozib olish"</string>
- <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
- <skip />
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun audio yozib olishga ruxsat berilsinmi?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"suratga olish va video yozib olish"</string>
- <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
- <skip />
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun surat va videoga olishga ruxsat berilsinmi?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon qo‘ng‘iroqlarini amalga oshirish va boshqarish"</string>
- <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
- <skip />
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun telefon chaqiruvlarini amalga oshirish va boshqarishga ruxsat berilsinmi?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tana sezgichlari"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"organizm holati haqidagi sezgich ma’lumotlariga kirish"</string>
- <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
- <skip />
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun organizm holati haqidagi sezgichlar axborotlariga ruxsat berilsinmi?"</string>
<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>
@@ -492,6 +484,8 @@
<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_useBiometric" msgid="8837753668509919318">"biometrik sensoridan foydalanish"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Ilova haqiqiylikni tekshirish uchun biometrik sensoridan foydalanishi mumkin"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmoq izi skanerini boshqarish"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Ilova foydalanish uchun barmoq izi namunalarini qo‘shish va o‘chirish usullarini qo‘llashi mumkin."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"barmoq izi sensoridan foydalanish"</string>
@@ -504,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Aniqlanmadi"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi skaneri ish holatida emas."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
@@ -1016,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Kiritish uslubi"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Matn yozish"</string>
<string name="email" msgid="4560673117055050403">"E-pochta"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Belgilangan manzilga xat yuborish"</string>
<string name="dial" msgid="1253998302767701559">"Chaqiruv"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Belgilangan raqamga telefon qilish"</string>
<string name="map" msgid="6521159124535543457">"Xaritadan topish"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Belgilangan manzilni xaritadan topish"</string>
<string name="browse" msgid="1245903488306147205">"Ochish"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Belgilangan URL manzilini ochish"</string>
<string name="sms" msgid="4560537514610063430">"Xabar"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Belgilangan telefon raqamiga SMS yuborish"</string>
<string name="add_contact" msgid="7867066569670597203">"Qo‘shish"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Kontaktlarga saqlash"</string>
<string name="view_calendar" msgid="979609872939597838">"Ochish"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Taqvimda belgilangan vaqtni ko‘rish"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Jadval"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Belgilangan vaqt uchun tadbirni rejalashtirish"</string>
<string name="view_flight" msgid="7691640491425680214">"Trek"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Belgilangan parvozni kuzatish"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Xotirada bo‘sh joy tugamoqda"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Ba‘zi tizim funksiyalari ishlamasligi mumkin"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tizim uchun xotirada joy yetarli emas. Avval 250 megabayt joy bo‘shatib, keyin qurilmani o‘chirib yoqing."</string>
@@ -1117,8 +1122,7 @@
<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_notification_detail (3993078784053054141) -->
- <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>
<string name="sendText" msgid="5209874571959469142">"Matn uchun amalni tanlash"</string>
@@ -1153,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ochiq Wi‑Fi tarmoqqa ulaning"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Aloqa operatori Wi-Fi tarmog‘iga ulanish"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Wi‑Fi tarmoqqa ulanmoqda"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi tarmoqqa ulanildi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi tarmoqqa ulanib bo‘lmadi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string>
@@ -1271,33 +1274,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Faolsizlantirish"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> tayyorlanmoqda"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Xatolar qidirilmoqda"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yangi <xliff:g id="NAME">%s</xliff:g> kartasi aniqlandi"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Rasm va boshqa fayllarni o‘tkazish"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"“<xliff:g id="NAME">%s</xliff:g>” buzilgan"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: buzilgan. Uni tuzatish uchun bosing."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>: buzilgan. Tuzatish uchun uni tanlang."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> qo‘llab-quvvatlanmaydi"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Bu xotira qurilmasi (<xliff:g id="NAME">%s</xliff:g>) qo‘llab-quvvatlanmaydi. Uni mos keladigan formatda sozlash uchun bu yerga bosing."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Bu xotira qurilmasi (<xliff:g id="NAME">%s</xliff:g>) qo‘llab-quvvatlanmaydi. Mos formatda sozlash uchun uni tanlang."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> kutilmaganda chiqarib olindi"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ma’lumotlar yo‘qolishining oldini olish uchun <xliff:g id="NAME">%s</xliff:g> kartasini chiqarishdan oldin u bilan ulanishni uzing"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"“<xliff:g id="NAME">%s</xliff:g>” kartasi chiqarib olingan"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> chiqarib olingan; yangisini kiriting"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"“<xliff:g id="NAME">%s</xliff:g>” kartasi chiqarilmoqda…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Chiqara ko‘rmang"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Sozlash"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Chiqarish"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"O‘rganish"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> topilmadi"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Qurilmani qaytadan joylang"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ko‘chirib o‘tkazilmoqda"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Ma’lumotlar ko‘chirilmoqda"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ko‘chirib o‘tkazish tugadi"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Ma’lumotlar <xliff:g id="NAME">%s</xliff:g> xotirasiga ko‘chirib o‘tkazildi"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Ma’lumotlar ko‘chirilmadi"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Ma’lumotlar o‘z joyida qoldi"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Sug‘urib olingan"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Chiqarib olingan"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Tekshirilmoqda…"</string>
@@ -1356,17 +1375,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ulanmoqda…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ulandi"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Doimiy VPN tarmoqdan uzildi"</string>
- <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
- <skip />
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Doimiy VPN tarmoqqa ulanmadi"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Tarmoq yoki VPN sozlamalarini o‘zgartiring"</string>
<string name="upload_file" msgid="2897957172366730416">"Faylni tanlash"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Hech qanday fayl tanlanmadi"</string>
<string name="reset" msgid="2448168080964209908">"Asliga qaytarish"</string>
<string name="submit" msgid="1602335572089911941">"Yuborish"</string>
- <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
- <skip />
- <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
- <skip />
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Avtomobil ilovasi ishlayapti"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Avtomobil ilovasidan chiqish uchun bosing"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Modem rejimi yoniq"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Sozlash uchun bosing."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Modem rejimi faolsizlantirildi"</string>
@@ -1692,8 +1708,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administrator tomonidan o‘rnatilgan"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administrator tomonidan yangilangan"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administrator tomonidan o‘chirilgan"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi, joylashuv xizmatlari va orqa fonda internetdan foydalanishini cheklaydi yoki faolsizlantiradi. Sinxronlanishni talab qiladigan e-pochta, xabar almashinuv va boshqa ilovalar esa qachonki ularni ishga tushirganingizda yangilanadi.\n\nQurilma quvvat olayotganda quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Trafik tejash rejimida ayrim ilovalar uchun orqa fondan internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Trafik tejash yoqilsinmi?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Yoqish"</string>
@@ -1744,22 +1759,14 @@
<string name="muted_by" msgid="6147073845094180001">"“<xliff:g id="THIRD_PARTY">%1$s</xliff:g>” tomonidan ovozsiz qilingan"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. U zavod sozlamalari tiklanmaguncha barqaror ishlamasligi mumkin."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. Tafsilotlar uchun qurilmangiz ishlab chiqaruvchisiga murojaat qiling."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD talabi odatiy chaqiruvga almashtirildi"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD talabi SS talabiga almashtirildi"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Yangi USSD talabiga almashtirildi"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD talabi video chaqiruvga almashtirildi"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS talabi odatiy chaqiruvga almashtirildi"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS talabi video chaqiruvga almashtirildi"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS talabi USSD talabiga almashtirildi"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Yangi SS talabiga almashtirildi"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ishchi profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Yoyish"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Yig‘ish"</string>
@@ -1857,6 +1864,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Ovoz uchun SIM karta taqdim etilmagan"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Ovoz uchun SIM karta ishlatish taqiqlangan"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ovoz uchun telefon taqiqlangan"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Qalqib chiquvchi oyna"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ilova versiyasi eski yoki bu yorliq bilan mos emas"</string>
@@ -1877,8 +1892,6 @@
<string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Bu yangi xatti-harakat. O‘zgartirish uchun bosing."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nimalar bloklanganini tekshirish uchun bosing"</string>
- <!-- no translation found for notification_app_name_system (4205032194610042794) -->
- <skip />
- <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
- <skip />
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Tizim"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Sozlamalar"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 59fb3b8..e1a5791 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -82,6 +82,8 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Không có dịch vụ thoại"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Không có dịch vụ thoại hoặc gọi khẩn cấp"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Nhà mạng đã tạm thời tắt dịch vụ này"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Không thể kết nối với mạng di động"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Hãy thử thay đổi mạng ưu tiên. Nhấn để thay đổi."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Không có dịch vụ gọi khẩn cấp"</string>
@@ -120,12 +122,13 @@
<string name="roamingText11" msgid="4154476854426920970">"Biểu ngữ Chuyển vùng Bật"</string>
<string name="roamingText12" msgid="1189071119992726320">"Biểu ngữ Chuyển vùng Tắt"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Đang tìm kiếm Dịch vụ"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Không thể thiết lập tính năng gọi qua Wi‑Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt. (Mã lỗi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"Sự cố khi đăng ký dịch vụ gọi qua Wi‑Fi với nhà mạng của bạn: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Gọi điện qua Wi-Fi %s"</item>
@@ -481,6 +484,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Cho phép ứng dụng giao tiếp với thẻ Giao tiếp trường gần (NFC), thẻ và trình đọc."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"vô hiệu hóa khóa màn hình của bạn"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Cho phép ứng dụng tắt khóa phím và bất kỳ bảo mật mật khẩu được liên kết nào. Ví dụ: điện thoại tắt khóa phím khi nhận được cuộc gọi đến, sau đó bật lại khóa phím khi cuộc gọi kết thúc."</string>
+ <string name="permlab_useBiometric" msgid="8837753668509919318">"sử dụng phần cứng sinh trắc học"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"Cho phép ứng dụng dùng phần cứng sinh trắc học để xác thực"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"quản lý phần cứng vân tay"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Cho phép ứng dụng gọi các phương pháp để thêm và xóa các mẫu vân tay để sử dụng."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"sử dụng phần cứng vân tay"</string>
@@ -493,6 +498,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Không nhận dạng được"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Phần cứng vân tay không khả dụng."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lưu vân tay. Vui lòng xóa vân tay hiện có."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string>
@@ -1005,14 +1012,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Phương thức nhập"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tác vụ văn bản"</string>
<string name="email" msgid="4560673117055050403">"Email"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Gửi email đến địa chỉ đã chọn"</string>
<string name="dial" msgid="1253998302767701559">"Gọi"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Gọi đến số điện thoại đã chọn"</string>
<string name="map" msgid="6521159124535543457">"Định vị"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Định vị địa chỉ đã chọn"</string>
<string name="browse" msgid="1245903488306147205">"Mở"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Mở URL đã chọn"</string>
<string name="sms" msgid="4560537514610063430">"Gửi tin nhắn"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Nhắn tin đến số điện thoại đã chọn"</string>
<string name="add_contact" msgid="7867066569670597203">"Thêm"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Thêm vào danh bạ"</string>
<string name="view_calendar" msgid="979609872939597838">"Xem"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Xem thời gian đã chọn trong lịch"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Lịch biểu"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Lên lịch biểu sự kiện cho thời gian đã chọn"</string>
<string name="view_flight" msgid="7691640491425680214">"Theo dõi"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Theo dõi chuyến bay đã chọn"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Sắp hết dung lượng lưu trữ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Một số chức năng hệ thống có thể không hoạt động"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Không đủ bộ nhớ cho hệ thống. Đảm bảo bạn có 250 MB dung lượng trống và khởi động lại."</string>
@@ -1141,8 +1157,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Kết nối với mạng Wi-Fi đang mở"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Kết nối với mạng Wi‑Fi của nhà mạng"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Đang kết nối với mạng Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Đã kết nối với mạng Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Không thể kết nối với mạng Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Nhấn để xem tất cả các mạng"</string>
@@ -1258,33 +1273,49 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên ứng dụng khác"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Tắt"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Đang chuẩn bị <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Đang kiểm tra lỗi"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Đã phát hiện <xliff:g id="NAME">%s</xliff:g> mới"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Để chuyển ảnh và phương tiện"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> bị lỗi"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> bị lỗi. Nhấn để khắc phục."</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> bị lỗi. Chọn để sửa."</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> không được hỗ trợ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Nhấn để thiết lập ở định dạng được hỗ trợ."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Chọn để thiết lập ở định dạng được hỗ trợ."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Đã tháo đột ngột <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ngắt kết nối <xliff:g id="NAME">%s</xliff:g> trước khi tháo nhằm tránh mất dữ liệu"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Đã tháo <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Đã tháo <xliff:g id="NAME">%s</xliff:g>; hãy lắp phương tiện mới"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Vẫn đang ngắt kết nối <xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Không tháo"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<string name="ext_media_init_action" msgid="7952885510091978278">"Thiết lập"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Tháo"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Khám phá"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> bị thiếu"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Cắm lại thiết bị này"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Di chuyển <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Di chuyển dữ liệu"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Hoàn tất di chuyển"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Dữ liệu được di chuyển sang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Không thể di chuyển dữ liệu"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dữ liệu vẫn ở vị trí ban đầu"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"Đã tháo"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Đã đẩy ra"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Đang kiểm tra…"</string>
@@ -1676,8 +1707,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Do quản trị viên của bạn cài đặt"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Do quản trị viên của bạn cập nhật"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Do quản trị viên của bạn xóa"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"Để kéo dài thời lượng pin, Trình tiết kiệm pin sẽ giảm mức hoạt động của thiết bị, hạn chế hoặc tắt chế độ rung, dịch vụ vị trí và dữ liệu nền. Ứng dụng email, nhắn tin và các ứng dụng khác sử dụng đồng bộ hóa có thể không cập nhật nếu bạn không mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể truy cập dữ liệu nhưng có thể thực hiện việc đó ít thường xuyên hơn. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bật"</string>
@@ -1728,22 +1758,14 @@
<string name="muted_by" msgid="6147073845094180001">"Do <xliff:g id="THIRD_PARTY">%1$s</xliff:g> tắt tiếng"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Đã xảy ra sự cố nội bộ với thiết bị của bạn và thiết bị có thể sẽ không ổn định cho tới khi bạn thiết lập lại dữ liệu ban đầu."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Đã xảy ra sự cố nội bộ với thiết bị. Hãy liên hệ với nhà sản xuất của bạn để biết chi tiết."</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Yêu cầu USSD đã thay đổi thành cuộc gọi thông thường"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Yêu cầu USSD đã thay đổi thành yêu cầu SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Đã thay đổi thành yêu cầu USSD mới"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Yêu cầu USSD đã thay đổi thành cuộc gọi video"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Yêu cầu SS đã thay đổi thành cuộc gọi thông thường"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Yêu cầu SS đã thay đổi thành cuộc gọi video"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Yêu cầu SS đã thay đổi thành yêu cầu USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Đã thay đổi thành yêu cầu SS mới"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Hồ sơ công việc"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Mở rộng"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Thu gọn"</string>
@@ -1841,6 +1863,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM không được cung cấp tính năng thoại"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM không được phép sử dụng tính năng thoại"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Điện thoại không được phép sử dụng tính năng thoại"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"Cửa sổ bật lên"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Phiên bản của ứng dụng đã bị hạ cấp hoặc không tương thích với lối tắt này"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index ff11ef5..6ac57ae 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -77,15 +77,17 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"默认显示本机号码,在下一次通话中也显示"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"未提供服务。"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"您无法更改来电显示设置。"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"无法使用数据服务"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"无法进行紧急呼救"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"无法使用移动数据服务"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"无法使用紧急呼救服务"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"无法使用语音通话服务"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"无法使用语音通话/紧急呼救服务"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的移动网络暂时不提供这项服务"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"无法连接网络"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"要改善信号情况,请尝试更改在“设置”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"正在进行 WLAN 通话"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"紧急呼救需要使用移动网络。"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"无法使用语音服务或紧急呼救服务"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"已由运营商暂时关闭"</string>
+ <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
+ <skip />
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"无法连接到移动网络"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"请尝试更改首选网络。点按即可更改。"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"无法使用紧急呼救服务"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"无法通过 WLAN 拨打紧急呼救电话"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"提醒"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"来电转接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"紧急回拨模式"</string>
@@ -120,12 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"启用漫游横幅"</string>
<string name="roamingText12" msgid="1189071119992726320">"禁用漫游横幅"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜索服务"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"WLAN 通话"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"无法设置 WLAN 通话"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能(错误代码:<xliff:g id="CODE">%1$s</xliff:g>)。"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"向您的运营商注册(错误代码:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"向您的运营商注册 WLAN 通话时遇到问题:<xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +162,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"正在处理的请求太多,请稍后重试。"</string>
<string name="notification_title" msgid="8967710025036163822">"登录 <xliff:g id="ACCOUNT">%1$s</xliff:g> 时出错"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"同步"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同步"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"太多<xliff:g id="CONTENT_TYPE">%s</xliff:g>删除项。"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"无法同步"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"尝试删除的<xliff:g id="CONTENT_TYPE">%s</xliff:g>数量太多。"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"平板电脑存储空间已满。请删除一些文件以腾出空间。"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"手表存储空间已满。请删除一些文件以腾出空间。"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"电视存储空间已满。请删除一些文件以腾出空间。"</string>
@@ -174,14 +176,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"由您的工作资料管理员监控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 监控"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"工作资料已删除"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"由于缺少管理应用,工作资料已被删除"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"工作资料管理应用缺失或损坏,因此系统已删除您的工作资料及相关数据。如需帮助,请与您的管理员联系。"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"您的工作资料已不在此设备上"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"密码尝试次数过多"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"设备为受管理设备"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"贵单位会管理该设备,且可能会监控网络流量。点按即可了解详情。"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"系统将清空您的设备"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"相关管理应用无法使用,系统现在将清空您的设备。\n\n如有疑问,请与您所在单位的管理员联系。"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"无法使用管理应用,系统现在将清空您的设备。\n\n如有疑问,请与您所在单位的管理员联系。"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"“<xliff:g id="OWNER_APP">%s</xliff:g>”已停用打印功能。"</string>
<string name="me" msgid="6545696007631404292">"我"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"平板电脑选项"</string>
@@ -236,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飞行模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"已开启飞行模式"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"未开启飞行模式"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"省电模式"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"省电模式已关闭"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"省电模式已开启"</string>
<string name="global_action_settings" msgid="1756531602592545966">"设置"</string>
<string name="global_action_assist" msgid="3892832961594295030">"助理"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"语音助理"</string>
@@ -269,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"切换到工作资料"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通讯录"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"访问您的通讯录"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的通讯录"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的通讯录吗?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置信息"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"获取此设备的位置信息"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>获取此设备的位置信息"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>获取此设备的位置信息吗?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的日历"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的日历吗?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"短信"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"发送和查看短信"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>发送和查看短信"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>发送和查看短信吗?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"存储空间"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"访问您设备上的照片、媒体内容和文件"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"允许“<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>”访问您设备上的照片、媒体内容和文件"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您设备上的照片、媒体内容和文件吗?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麦克风"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"录制音频"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>录音"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>录音吗?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"相机"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍摄照片和录制视频"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>拍摄照片和录制视频"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>拍摄照片和录制视频吗?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>拨打电话和管理通话"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>拨打电话和管理通话吗?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"身体传感器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问与您的生命体征相关的传感器数据"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问与您的生命体征相关的传感器数据吗?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检测您正访问的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
@@ -305,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"执行手势"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"可执行点按、滑动、双指张合等手势。"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"指纹手势"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"可以捕获在设备指纹传感器上执行的手势。"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"可以捕获在设备指纹传感器上执行的手势。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或修改状态栏"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"允许应用停用状态栏或者增删系统图标。"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"用作状态栏"</string>
@@ -356,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"允许该应用在内存中持续保留其自身的某些组件。这会限制其他应用可用的内存,从而减缓平板电脑运行速度。"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"允许应用在内存中持续保留其自身的部分组件。此权限可能会限制其他应用可用的内存,从而减缓电视运行速度。"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"允许该应用在内存中持续保留其自身的某些组件。这会限制其他应用可用的内存,从而减缓手机运行速度。"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"运行前台服务"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"允许该应用使用前台服务。"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"计算应用存储空间"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"允许应用检索其代码、数据和缓存大小"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"修改系统设置"</string>
@@ -478,6 +484,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"允许应用与近距离无线通信(NFC)标签、卡和读取器通信。"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"停用屏幕锁定"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"允许该应用停用键锁以及任何关联的密码安全措施。例如,让手机在接听来电时停用键锁,在通话结束后重新启用键锁。"</string>
+ <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
+ <skip />
+ <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
+ <skip />
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指纹硬件"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"允许该应用调用方法来添加和删除可用的指纹模板。"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"使用指纹硬件"</string>
@@ -490,6 +500,8 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"无法识别"</string>
+ <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
+ <skip />
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指纹硬件无法使用。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"无法存储指纹。请移除一个现有的指纹。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string>
@@ -802,6 +814,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"图案解锁。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人脸解锁。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN码解锁。"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM 卡 PIN 码解锁。"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM 卡 PUK 码解锁。"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密码解锁。"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"图案区域。"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑动区域。"</string>
@@ -863,6 +877,12 @@
<string name="text_copied" msgid="4985729524670131385">"文本已复制到剪贴板。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"MENU+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"空格"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter 键"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"删除"</string>
@@ -994,14 +1014,32 @@
<string name="inputMethod" msgid="1653630062304567879">"输入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="email" msgid="4560673117055050403">"电子邮件"</string>
+ <!-- no translation found for email_desc (3638665569546416795) -->
+ <skip />
<string name="dial" msgid="1253998302767701559">"拨打电话"</string>
+ <!-- no translation found for dial_desc (6573723404985517250) -->
+ <skip />
<string name="map" msgid="6521159124535543457">"定位"</string>
+ <!-- no translation found for map_desc (9036645769910215302) -->
+ <skip />
<string name="browse" msgid="1245903488306147205">"打开"</string>
+ <!-- no translation found for browse_desc (8220976549618935044) -->
+ <skip />
<string name="sms" msgid="4560537514610063430">"发短信"</string>
+ <!-- no translation found for sms_desc (7526588350969638809) -->
+ <skip />
<string name="add_contact" msgid="7867066569670597203">"添加"</string>
+ <!-- no translation found for add_contact_desc (4830217847004590345) -->
+ <skip />
<string name="view_calendar" msgid="979609872939597838">"查看"</string>
+ <!-- no translation found for view_calendar_desc (5828320291870344584) -->
+ <skip />
<string name="add_calendar_event" msgid="1953664627192056206">"排定时间"</string>
+ <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
+ <skip />
<string name="view_flight" msgid="7691640491425680214">"跟踪"</string>
+ <!-- no translation found for view_flight_desc (3876322502674253506) -->
+ <skip />
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"存储空间不足"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"某些系统功能可能无法正常使用"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系统存储空间不足。请确保您有250MB的可用空间,然后重新启动。"</string>
@@ -1074,31 +1112,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"检查更新"</string>
<string name="smv_application" msgid="3307209192155442829">"“<xliff:g id="APPLICATION">%1$s</xliff:g>”应用(<xliff:g id="PROCESS">%2$s</xliff:g> 进程)违反了自我强制执行的严格模式 (StrictMode) 政策。"</string>
<string name="smv_process" msgid="5120397012047462446">"进程 <xliff:g id="PROCESS">%1$s</xliff:g> 违反了自我强制执行的严格模式 (StrictMode) 政策。"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android正在升级..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android 正在启动…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"手机正在更新…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"平板电脑正在更新…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"设备正在更新…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"手机正在启动…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"平板电脑正在启动…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"设备正在启动…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在优化存储空间。"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"即将完成 Android 更新…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"在升级完成之前,部分应用可能无法正常运行"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"正在完成系统更新…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"正在升级<xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"正在优化第<xliff:g id="NUMBER_0">%1$d</xliff:g>个应用(共<xliff:g id="NUMBER_1">%2$d</xliff:g>个)。"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"正在准备升级<xliff:g id="APPNAME">%1$s</xliff:g>。"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在启动应用。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"即将完成启动。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>正在运行"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"点按即可返回游戏"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"选择游戏"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"为了提升性能,一次只能打开其中一个游戏。"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"返回<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆转储数据;点按即可共享"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"选择要对文字执行的操作"</string>
@@ -1133,12 +1168,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"连接到开放的 WLAN 网络"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"连接到运营商 WLAN 网络"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在连接到开放的 WLAN 网络"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"正在连接到 WLAN 网络"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已连接到 WLAN 网络"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"无法连接到 WLAN 网络"</string>
<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="1100098935861622985">"所有网络"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有网络"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN 将自动开启"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"当您位于已保存的高品质网络信号范围内时"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新开启"</string>
@@ -1204,6 +1239,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"重新启动"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"激活移动网络服务"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下载运营商应用即可激活您的新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"下载<xliff:g id="APP_NAME">%1$s</xliff:g>应用即可激活您的新 SIM 卡"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下载应用"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"点按即可进行设置"</string>
@@ -1222,13 +1258,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"已开启 USB PTP 模式"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"已开启 USB 网络共享模式"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"已开启 USB MIDI 模式"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已开启 USB 配件模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB 配件已连接"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"点按即可查看更多选项。"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"正在为连接的设备充电。点按即可查看更多选项。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"检测到模拟音频配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"连接的设备与此手机不兼容。点按即可了解详情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到 USB 调试"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"点按即可停用 USB 调试功能。"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"点按即可关闭 USB 调试"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"选择即可停用 USB 调试功能。"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在生成错误报告…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享错误报告吗?"</string>
@@ -1245,36 +1281,52 @@
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"显示在其他应用的上层"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string>
- <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string>
+ <string name="alert_windows_notification_title" msgid="3697657294867638947">"“<xliff:g id="NAME">%s</xliff:g>”正在其他应用的上层显示内容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想让<xliff:g id="NAME">%s</xliff:g>使用此功能,请点按以打开设置,然后关闭此功能。"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"关闭"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在准备<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"检查是否有错误"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"检测到新的<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"关闭"</string>
+ <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
+ <skip />
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用于传输照片和媒体文件"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>已损坏"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已损坏,点按即可修复。"</string>
- <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>已损坏。选择即可进行修正。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>不受支持"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"该设备不支持此<xliff:g id="NAME">%s</xliff:g>。点按即可使用支持的格式进行设置。"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"此设备不支持该<xliff:g id="NAME">%s</xliff:g>。选择即可使用支持的格式进行设置。"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>已意外移除"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"请先卸载<xliff:g id="NAME">%s</xliff:g>,再将其移除,以防数据丢失。"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>已移除,请插入新的外部媒体"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"仍然弹出<xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"请勿移除"</string>
+ <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
+ <skip />
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"缺少<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"重新插入此设备"</string>
+ <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
+ <skip />
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"正在移动<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"正在移动数据"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"数据移动完成"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"数据已移到<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"无法移动数据"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"数据仍保存在原来的位置"</string>
+ <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
+ <skip />
<string name="ext_media_status_removed" msgid="6576172423185918739">"已移除"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"已弹出"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"正在检查…"</string>
@@ -1333,14 +1385,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在连接到始终开启的 VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"已连接到始终开启的 VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"始终开启的 VPN 已断开连接"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"始终开启的 VPN 出现错误"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"无法连接到始终开启的 VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"更改网络或 VPN 设置"</string>
<string name="upload_file" msgid="2897957172366730416">"选择文件"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"未选定任何文件"</string>
<string name="reset" msgid="2448168080964209908">"重置"</string>
<string name="submit" msgid="1602335572089911941">"提交"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已启用车载模式"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"点按即可退出车载模式。"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"驾驶应用正在运行"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"点按即可退出驾驶应用。"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"网络共享或热点已启用"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"点按即可进行设置。"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"网络共享已停用"</string>
@@ -1418,22 +1470,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> U 盘"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB存储器"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"修改"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"流量消耗提醒"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"点按即可查看使用情况和设置。"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"已达到2G-3G流量上限"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"已达到4G流量上限"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"数据流量警告"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"您已使用 <xliff:g id="APP">%s</xliff:g> 的数据流量"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"已达到移动数据流量上限"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"已达到WLAN流量上限"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"已暂停本周期剩余时间的流量使用"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"已超出 2G-3G 数据流量限制"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"已超出 4G 数据使用上限"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"已超出移动数据流量上限"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"超出了WLAN数据流量上限"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"超出规定上限 <xliff:g id="SIZE">%s</xliff:g>。"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"已暂停使用数据网络连接,直到这个周期结束为止"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"已超出移动数据流量上限"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"已超出 WLAN 数据流量上限"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"您已使用 <xliff:g id="SIZE">%s</xliff:g>,超出所设上限"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"后台流量受限制"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"点按即可取消限制。"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"流量消耗较多"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"您过去几天的流量消耗超出了正常消耗量。点按即可查看流量消耗情况和设置。"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"移动数据用量较多"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"您的应用使用的数据流量比平时多"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g>使用的数据流量比平时多"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"安全证书"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"该证书有效。"</string>
<string name="issued_to" msgid="454239480274921032">"颁发给:"</string>
@@ -1669,7 +1718,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理员安装"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理员更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理员删除"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"为了延长电池的续航时间,省电模式会降低设备的性能,并限制振动、位置信息服务和大部分后台流量。对于电子邮件、聊天工具等依赖于同步功能的应用,可能要打开这类应用时才能收到新信息。\n\n省电模式会在设备充电时自动关闭。"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"为了延长电池的续航时间,省电模式会降低设备的性能,并限制或关闭振动、位置信息服务和后台流量。对于电子邮件、聊天工具等依赖于同步功能的应用,可能要打开这类应用时才能收到新信息。\n\n省电模式会在设备充电时自动关闭。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"为了减少流量消耗,流量节省程序会阻止某些应用在后台收发数据。您当前使用的应用可以收发数据,但频率可能会降低。举例而言,这可能意味着图片只有在您点按之后才会显示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要开启流量节省程序吗?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"开启"</string>
@@ -1681,9 +1730,9 @@
<item quantity="other">%1$d 分钟(到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>))</item>
<item quantity="one">1 分钟(到<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d 小时(到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 小时(到<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d 小时(直到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">1 小时(直到<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d 小时(到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,7 +1746,7 @@
<item quantity="other">%d 分钟</item>
<item quantity="one">1 分钟</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d 小时</item>
<item quantity="one">1 小时</item>
</plurals>
@@ -1720,14 +1769,14 @@
<string name="muted_by" msgid="6147073845094180001">"已被<xliff:g id="THIRD_PARTY">%1$s</xliff:g>设为静音"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"您的设备内部出现了问题。如果不将设备恢复出厂设置,设备运行可能会不稳定。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"您的设备内部出现了问题。请联系您的设备制造商了解详情。"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD 请求已修改为 DIAL 请求。"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD 请求已修改为 SS 请求。"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD 请求已修改为新的 USSD 请求。"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD 请求已修改为视频 DIAL 请求。"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 请求已修改为 DIAL 请求。"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS 请求已修改为视频 DIAL 请求。"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 请求已修改为 USSD 请求。"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 请求已修改为新的 SS 请求。"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD 请求已更改为普通通话"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD 请求已更改为 SS 请求"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"已更改为新的 USSD 请求"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD 请求已更改为视频通话"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS 请求已更改为普通通话"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS 请求已更改为视频通话"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS 请求已更改为 USSD 请求"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"已更改为新的 SS 请求"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作资料"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展开"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收起"</string>
@@ -1825,6 +1874,14 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"未配置支持语音的 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM 卡不支持语音"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手机不支持语音"</string>
+ <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
+ <skip />
+ <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
+ <skip />
+ <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
+ <skip />
<string name="popup_window_default_title" msgid="4874318849712115433">"弹出式窗口"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"应用版本已降级或与此快捷方式不兼容"</string>
@@ -1837,7 +1894,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"检测到有害应用"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"“<xliff:g id="APP_0">%1$s</xliff:g>”想要显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"编辑"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"有来电和通知时会振动"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有来电和通知时会静音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系统变更"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"勿扰"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"“勿扰”模式将会隐藏通知,以帮助您集中注意力"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"这是新行为。点按即可更改。"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"“勿扰”设置有变更"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"点按即可查看您的干扰行为设置"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"点按即可查看屏蔽内容。"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"系统"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"设置"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index e46a4b6..0c9e347 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"沒有語音服務"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"無法使用語音服務或撥打緊急電話"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"已由流動網絡供應商暫時關閉"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g> 暫時遭電信業者停用"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"無法連線至流動網絡"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"請嘗試變更偏好的網絡。輕按即可變更。"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"無法撥打緊急電話"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"漫遊橫幅開啟"</string>
<string name="roamingText12" msgid="1189071119992726320">"漫遊橫幅關閉"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"無法設定 Wi-Fi 通話"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"如要透過 Wi-Fi 撥打電話和傳送訊息,請先向流動網絡供應商要求設定此服務,然後再次在「設定」中開啟「Wi-Fi 通話」。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"向您的流動網絡供應商註冊 Wi-Fi 通話時發生問題:<xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 通話"</item>
@@ -160,7 +162,7 @@
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> 登入錯誤"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Google Sync"</string>
<string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"無法同步處理"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"嘗試刪除的「<xliff:g id="CONTENT_TYPE">%s</xliff:g>」數量過多。"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"嘗試刪除 <xliff:g id="CONTENT_TYPE">%s</xliff:g> 的次數過多。"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"平板電腦的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"手錶的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"電視儲存空間已滿。請刪除部分檔案,以釋放儲存空間。"</string>
@@ -270,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"切換至工作設定檔"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通訊錄"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的通訊錄"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的聯絡人嗎?"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取您的聯絡人嗎?"</string>
<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="permgrouprequest_location" msgid="3788275734953323491">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取此裝置的位置資訊嗎?"</string>
<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>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取您的日曆嗎?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"短訊"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"傳送和查看短訊"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」傳送及查看簡訊嗎?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>傳送和查看短訊嗎?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存空間"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"存取裝置上的相片、媒體和檔案"</string>
- <string name="permgrouprequest_storage" msgid="7885942926944299560">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置中的相片、媒體和檔案嗎?"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取您裝置上的相片、媒體和檔案嗎?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麥克風"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"錄音"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」錄音嗎?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>錄音嗎?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"相機"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照和錄製影片"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」拍攝相片及錄製影片嗎?"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>拍照和錄製影片嗎?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
- <string name="permgrouprequest_phone" msgid="9166979577750581037">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話嗎?"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>撥打電話和管理通話嗎?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命體徵相關的感應器資料"</string>
- <string name="permgrouprequest_sensors" msgid="6349806962814556786">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取與你生命徵象相關的感應器資料嗎?"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取與您身體機能相關的感應器資料嗎?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
@@ -481,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"使用生物識別硬件"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"允許應用程式使用生物識別硬件驗證"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指紋硬件"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"允許應用程式調用加入和刪除指紋模板的方法以供使用。"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"使用指紋硬件"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"未能辨別"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋驗證成功"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"無法使用指紋軟件。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋無法儲存。請移除現有指紋。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"輸入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="email" msgid="4560673117055050403">"電郵"</string>
+ <string name="email_desc" msgid="3638665569546416795">"Send email 去指定地址"</string>
<string name="dial" msgid="1253998302767701559">"通話"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"打指定電話號碼"</string>
<string name="map" msgid="6521159124535543457">"尋找"</string>
+ <string name="map_desc" msgid="9036645769910215302">"搵出指定地址"</string>
<string name="browse" msgid="1245903488306147205">"開啟"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"打開指定網址"</string>
<string name="sms" msgid="4560537514610063430">"短訊"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Send 短訊去指定電話號碼"</string>
<string name="add_contact" msgid="7867066569670597203">"新增"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"加入通訊錄"</string>
<string name="view_calendar" msgid="979609872939597838">"查看"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"喺日曆度睇返指定時間"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"時間表"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"將活動安排喺指定時間"</string>
<string name="view_flight" msgid="7691640491425680214">"追蹤"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"追蹤指定航班"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"部分系統功能可能無法運作"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確認裝置有 250 MB 的可用空間,然後重新啟動。"</string>
@@ -1106,7 +1120,7 @@
<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>
- <string name="dump_heap_notification_detail" msgid="3993078784053054141">"已取得記憶體快照資料。輕觸即可分享。"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"選擇處理文字的操作"</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi-Fi 網絡"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連接流動網絡供應商的 Wi‑Fi 網絡"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"正在連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"關閉"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"已偵測到新<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"正在檢查 <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"正在檢查目前的內容"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"新的 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"輕觸即可進行設定"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"用於轉移相片和媒體"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> 已受損"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已損壞,輕按即可修復。"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>發生問題"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"輕觸即可修正問題"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>已損毀。選取即可修正。"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"不支援的 <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"此裝置並不支援此 <xliff:g id="NAME">%s</xliff:g>。輕按即可在支援的格式設定。"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"這部裝置不支援此 <xliff:g id="NAME">%s</xliff:g>。選取即可使用支援的格式設定。"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>被意外移除"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載<xliff:g id="NAME">%s</xliff:g>,然後才移除,以免遺失資料。"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"已移除<xliff:g id="NAME">%s</xliff:g>;請插入新的外部儲存空間"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"仍在移除<xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"不要移除"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"請先退出媒體,再將其移除,以免內容遺失"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"已移除 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"部分功能可能無法正常運作。請插入新的儲存空間。"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"正在退出 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"請勿移除"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"找不到<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"重新插入此裝置"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"正在轉移資料"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"完成轉移"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"資料已轉移至<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"無法轉移資料"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"資料仍然儲存在原來位置"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"內容轉移作業已完成"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"已將內容移至 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"無法移動內容"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"請再次嘗試移動內容"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"已移除"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"已卸載"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"正在檢查…"</string>
@@ -1343,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"永遠開啟的 VPN 已中斷連線"</string>
- <string name="vpn_lockdown_error" msgid="3133844445659711681">"無法連上永久連線的 VPN"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"無法連接永久連線的 VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"變更網絡或 VPN 設定"</string>
<string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"未選擇檔案"</string>
<string name="reset" msgid="2448168080964209908">"重設"</string>
<string name="submit" msgid="1602335572089911941">"提交"</string>
- <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"行車應用程式執行中"</string>
- <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"輕觸即可結束行車應用程式。"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"駕駛應用程式執行中"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"輕按即可退出駕駛應用程式。"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"已啟用網絡共享或熱點"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"輕按即可設定。"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"網絡共享已停用"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理員刪除"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"為延長電池壽命,省電模式會降低裝置效能,並限制或關閉震動功能、位置資訊服務和背景數據。此外,如果未開啟電郵、短訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n省電模式會在裝置充電時自動關閉。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟「數據節省模式」嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"靜音設定者:<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"您裝置的系統發生問題,回復原廠設定後即可解決該問題。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"您裝置的系統發生問題,請聯絡您的製造商瞭解詳情。"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD 要求已變更為一般通話"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD 要求已變更為 SS 要求"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"已變更為新的 USSD 要求"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD 要求已變更為視像通話"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS 要求已變更為一般通話"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS 要求已變更為視像通話"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS 要求已變更為 USSD 要求"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"已變更為新的 SS 要求"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作設定檔"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"未佈建支援語音的 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM 卡不支援語音"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手機不支援語音"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"未佈建 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"應用程式版本已降級或與此捷徑不兼容"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 88d4168..5d73d07 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -82,6 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"無法使用語音通話服務"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"沒有語音通話服務或無法撥打緊急電話"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"暫時由電信業者關閉"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g> 暫時遭電信業者停用"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"無法連上行動網路"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"請嘗試變更偏好的網路。輕觸即可變更。"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"無法撥打緊急電話"</string>
@@ -120,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"漫遊橫幅開啟"</string>
<string name="roamingText12" msgid="1189071119992726320">"漫遊橫幅關閉"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"無法設定 Wi‑Fi 通話"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"如要透過 Wi-Fi 網路撥打電話及傳送訊息,請先要求電信業者為你設定這項服務,然後再次前往「設定」頁面啟用 Wi-Fi 通話功能。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"向你的電信業者註冊 Wi‑Fi 通話時發生問題:<xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 通話"</item>
@@ -481,6 +483,8 @@
<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_useBiometric" msgid="8837753668509919318">"使用生物特徵硬體"</string>
+ <string name="permdesc_useBiometric" msgid="8389855232721612926">"允許應用程式使用生物特徵硬體進行驗證"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指紋硬體"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"允許應用程式呼叫方法來新增及移除可用的指紋範本"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"使用指紋硬體"</string>
@@ -493,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"無法識別"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋驗證成功"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋硬體無法使用。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"無法儲存指紋,請先移除現有指紋。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string>
@@ -1005,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"輸入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string>
<string name="email" msgid="4560673117055050403">"電子郵件"</string>
+ <string name="email_desc" msgid="3638665569546416795">"將電子郵件寄到所選地址"</string>
<string name="dial" msgid="1253998302767701559">"通話"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"撥打所選電話號碼"</string>
<string name="map" msgid="6521159124535543457">"定位"</string>
+ <string name="map_desc" msgid="9036645769910215302">"找到所選地址"</string>
<string name="browse" msgid="1245903488306147205">"開啟"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"開啟所選網址"</string>
<string name="sms" msgid="4560537514610063430">"訊息"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"將訊息傳送到所選電話號碼"</string>
<string name="add_contact" msgid="7867066569670597203">"新增"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"新增至聯絡人"</string>
<string name="view_calendar" msgid="979609872939597838">"查看"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"在日曆中查看所選時間"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"時間表"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"將活動安排在所選時間"</string>
<string name="view_flight" msgid="7691640491425680214">"追蹤"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"追蹤所選航班"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"部分系統功能可能無法運作"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確定你已釋出 250MB 的可用空間,然後重新啟動。"</string>
@@ -1141,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi‑Fi 網路"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連上電信業者的 Wi‑Fi 網路"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"正在連線至 Wi‑Fi 網路"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網路"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi‑Fi 網路"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string>
@@ -1258,33 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"關閉"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備「<xliff:g id="NAME">%s</xliff:g>」"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"偵測到新的「<xliff:g id="NAME">%s</xliff:g>」"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"正在檢查 <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"正在檢查目前的內容"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"新的 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"輕觸即可進行設定"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用於傳輸相片和媒體"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"「<xliff:g id="NAME">%s</xliff:g>」毀損"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已損毀。輕觸即可修正。"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>發生問題"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"輕觸即可修正問題"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>已損毀。選取即可進行修正。"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"不支援的「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"此裝置不支援這個 <xliff:g id="NAME">%s</xliff:g>。輕觸即可使用支援的格式進行設定。"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"此裝置不支援這個 <xliff:g id="NAME">%s</xliff:g>。選取即可使用支援的格式進行設定。"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"意外移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載「<xliff:g id="NAME">%s</xliff:g>」,再將其移除,以免資料遺失。"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"已移除「<xliff:g id="NAME">%s</xliff:g>」;請插入新的媒體"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"依然退出「<xliff:g id="NAME">%s</xliff:g>」..."</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"請勿移除"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"請先退出媒體,再將其移除,以免內容遺失"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"已移除 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"部分功能可能無法正常運作。請插入新的儲存空間。"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"正在退出 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"請勿移除"</string>
<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>
<string name="ext_media_missing_title" msgid="620980315821543904">"找不到 <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"重新插入這部裝置"</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>
<string name="ext_media_move_title" msgid="1022809140035962662">"正在移動資料"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"移動完成"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"資料已移動至「<xliff:g id="NAME">%s</xliff:g>」"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"無法移動資料"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"資料留在原來的位置"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"內容轉移作業已完成"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"已將內容移至 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"無法移動內容"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"請再次嘗試移動內容"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"已移除"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"已退出"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"檢查中…"</string>
@@ -1676,8 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由你的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由你的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由你的管理員刪除"</string>
- <!-- no translation found for battery_saver_description (4660824093877546730) -->
- <skip />
+ <string name="battery_saver_description" msgid="4660824093877546730">"為了延長電池續航力,節約耗電量模式會降低裝置效能,並限制或關閉震動、定位服務及背景數據傳輸。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當你為裝置充電時,節約耗電量模式會自動關閉。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1728,22 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"由 <xliff:g id="THIRD_PARTY">%1$s</xliff:g> 設為靜音"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"你的裝置發生內部問題,詳情請洽裝置製造商。"</string>
- <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
- <skip />
- <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
- <skip />
- <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
- <skip />
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD 要求已變更為一般通話"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD 要求已變更為 SS 要求"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"已變更為新的 USSD 要求"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD 要求已變更為視訊通話"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS 要求已變更為一般通話"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS 要求已變更為視訊通話"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS 要求已變更為 USSD 要求"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"已變更為新的 SS 要求"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work 設定檔"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
@@ -1841,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"未佈建支援語音的 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM 卡不支援語音"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手機不支援語音"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"未佈建 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"不允許使用 SIM 卡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"應用程式版本已降級或與這個捷徑不相容"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 74bca25..c430da9 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -77,15 +77,16 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"I-ID Yomshayeli ishintshela kokungavinjelwe. Ucingo olulandelayo: Aluvinjelwe"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Isevisi ayilungiselelwe."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ngeke ukwazi ukuguqul izilungiselelo zemininingwane yoshayayo."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ayikho isevisi yedatha"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Akukho ukushaya kwesimo esiphuthumayo"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ayikho isevisi yedatha yeselula"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Ukushaya okuphuthumayo akutholakali"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ayikho isevisi yezwi"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ayikho isevisi yezwi/yesimo esiphuthumayo"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Okwesikhashana akunikezwa inethiwekhi yeselula endaweni yakho"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ayikwazi ukufinyelela inethiwekhi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Ukuze uthuthukise ukwamukela, zama ukushintsha uhlobo olukhethiwe kuzilungiselelo > Inethiwekhi ne-inthanethi > Amanethiwekhi eselula > Uhlobo lwenethiwekhi oluncanyelwayo."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Ukushaya kwe-Wi-Fi kuyasebenza"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Amakholi aphuthumayo adinga inethiwekhi yeselula."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ayikho isevisi yezwi noma ukushaya okuphuthumayo"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Kuvalwe okwesikhashana inkampani yakho yenethiwekhi"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Kuvalwe okwesikhashana inkampani yakho yenethiwekhi ku-SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ayikwazi ukufinyelela kunethiwekhi yeselula"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Zama ukushintsha inethiwekhi encanyelwayo. Thepha ukuze ushintshe."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Ukushaya okuphuthumayo akutholakali"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Ayikwazi ukwenza amakholi aphuthumayo nge-Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Izexwayiso"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Ukudlulisa ikholi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Imodi yokushayela yesimo esiphuthumayo"</string>
@@ -120,12 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Ibhena Yokuzulazula Ivuliwe"</string>
<string name="roamingText12" msgid="1189071119992726320">"Ibhena yokuzulazula ivaliwe"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Iseshela Isevisi"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Ukushaya kwe-Wi-Fi"</string>
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"Ayikwazanga ukusetha ukushaya kwe-Wi-Fi"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-Fi, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le sevisi. Bese uvula ukushaya kwe-Wi-Fi futhi kusukela kuzilungiselelo (Ikhodi yephutha: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Bhalisa ngenkampani yakho yenethiwekhi (Ikhodi yephutha: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
+ <item msgid="7372514042696663278">"Inkinga yokubhalisa ukushaya kwe-Wi-Fi ngenkampani yakho yenethiwekhi: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -160,8 +161,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Kunezicelo eziningi ezenziwayo. Zama futhi emva kwesikhathi"</string>
<string name="notification_title" msgid="8967710025036163822">"Iphutha lokungena <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Vumelanisa"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Vumelanisa"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Kunokususa <xliff:g id="CONTENT_TYPE">%s</xliff:g> okuningi kakhulu."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ayikwazi ukuvumelanisa"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Izame ukususa i-<xliff:g id="CONTENT_TYPE">%s</xliff:g> eningi kakhulu."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Isilondolozi sethebhulethi sigcwele! Susa amanye amafayela ukukhulula isikhala."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Isitoreji sokubuka sigcwele. Susa amanye amafayela ukukhulula isikhala."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Isitoreji se-TV sigcwele. Susa amanye amafayela ukuze wenze kukhululeke isikhala."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Ngomlawuli wakho wephrofayela yomsebenzi"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Nge-<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Iphrofayela yomsebenzi isusiwe"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Iphrofayela yomsebenzi isuswe ngenxa yohlelo lokusebenza olungekho lomlawuli"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Uhlelo lokusebenza lokulawula lephrofayela yomsebenzi kungenzeka alukho noma lonakele. Njengomphumela, iphrofayela yakho yomsebenzi nedatha ehlobene isusiwe. Xhumana nomlawuli wakho ukuze uthole usizo."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Iphrofayela yakho yomsebenzi ayisatholakali kule divayisi"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Imizamo yamaphasiwedi eminingi kakhulu"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Idivayisi iphethwe"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Inhlangano yakho iphethe le divayisi futhi kungenzeka ingaqaphi ithrafikhi yenethiwekhi. Thephela imininingwane."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Idivayisi yakho izosulwa"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Uhlelo lokusebenza lomlawuli alikwazi ukusetshenziswa. Idivayisi yakho manje izosuswa.\n\nUma unemibuzo, xhumana nomlawuli wezinhlangano zakho."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Uhlelo lokusebenza lomlawuli alikwazi ukusetshenziswa. Idivayisi yakho manje izosuswa.\n\nUma unemibuzo, xhumana nomlawuli wezinhlangano zakho."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Ukuphrinta kukhutshazwe nge-<xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Mina"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Okukhethwa kukho kwethebhulethi"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Imodi yendiza"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Imodi yendiza IVULIWE"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Imodi yendiza IVALIWE"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Isilondolozi sebhethri"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Iseva yebhethri SIVALIWE"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Isilondolozi sebhethri SIVULIWE"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Siza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Isisekeli sezwi"</string>
@@ -269,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Shintshela kuphrofayela yomsebenzi"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Oxhumana nabo"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"finyelela koxhumana nabo"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithole ukufinyelela koxhumana nabo"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithole ukufinyelela koxhumana nabo?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Indawo"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"finyelela kundawo yale divayisi"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele indawo yale divayisi"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele indawo yale divayisi?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"finyelela kukhalenda yakho"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele 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>
<string name="permgrouplab_sms" msgid="228308803364967808">"I-SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"thumela uphinde ubuke imilayezo ye-SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithumele iphinde ibuke imilayezo ye-SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithumele iphinde ibuke imilayezo ye-SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Isitoreji"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"finyelela kuzithombe, imidiya, namafayela kudivayisi yakho"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kuzithombe, imidiya, namafayela akudivayisi yakho"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kuzithombe, imidiya, namafayela akudivayisi yakho?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"I-Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"rekhoda ividiyo"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi irekhode umsindo"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi irekhode umsindo?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Ikhamela"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"thatha izithombe uphinde urekhode ividiyo"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthatha izithombe iphinde irekhode ividiyo"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthatha izithombe iphinde irekhode ividiyo?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Ifoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"yenza uphinde uphathe amakholi wefoni"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi yenze iphinde iphathe amakholi efoni"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi yenze iphinde iphathe amakholi efoni?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Izinzwa zomzimba"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"finyelela idatha yesizweli mayelana nezimpawu zakho ezibalulekile"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kudatha yenzwa emayelana nezimpawu zakho ezibalulekile"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kudatha yenzwa emayelana nezimpawu zakho ezibalulekile?"</string>
<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>
@@ -305,7 +308,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Yenza ukuthinta"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Ingathepha, iswayiphe, incinze, futhi yenze okunye ukuthintwa."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Ukuthinta kwezigxivizo zeminwe"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Ingathatha ukuthinta okwenziwe kunzwa yezigxivizo zeminwe zamadivayisi."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Ingathatha ukuthinta okwenziwe kunzwa yezigxivizo zeminwe zedivayisi."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"khubaza noma guqula ibha yomumo"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ivumela uhlelo lokusebenza ukuthi yenze umudwa ochaza ngesimo ukuthi ungasebenzi noma ukufaka noma ukukhipha izithonjana zohlelo."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"yiba yibha yesimo"</string>
@@ -356,6 +359,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ivumela uhlelo kusebenza ukwenza izingxenye yazo ezicindezelayo kumemori. Lokhu kungakhawulela imemori ekhona kwezinye izinhlelo zokusebenza ukwenza ukuthi ithebhulethi ingasheshi."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ivumela uhlelo lokusebenza ukwenza izingxenye zalo ziqhubeke kumemori. Lokhu kungakhawulela imemori etholakala kwezinye izinhlelo zokusebenza ezenza i-TV ihambe kancane."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ivumela uhlelo kusebenza ukwenza izingxenye yazo ezicindezelayo kumemori. Lokhu kungakhawulela imemori ekhona kwezinye izinhlelo zokusebenza ukwenza ukuthi ifoni ingasheshi."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"qalisa amasevisi waphambili"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Vumela uhlelo lokusebenza ukusebenzisa amasevisi wangaphambili."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"linganisa isikhala sokugcina uhlelo lokusebenza"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ivuela uhlelo lokusebenza ukuthi ithole kabusha ikhodi yayo, i-dat kanye nosayizi abagcinwe okwesikhashana."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"guqula izilungiselelo zohlelo"</string>
@@ -478,6 +483,8 @@
<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_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>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Ivumela uhlelo lokusebenza ukuthi libuyisele izindlela zokungeza nokususa izifanekiso zezigxivizo zeminwe ngokusetshenziswa."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"sebenzisa izingxenyekazi zekhompyutha zezigxivizo zeminwe"</string>
@@ -490,6 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Akubonwa"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Isingxivizo somunwe sigunyaziwe"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Izingxenyekazi zekhompuyutha zezingxivizo zeminwe azitholakali."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Izigxivizo zeminwe azikwazi ukugcinwa. Sicela ususe izigxivizo zeminwe ezikhona."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string>
@@ -802,6 +810,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Vula ngobuso"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ukuvula ngephinikhodi."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Ukuvulwa kwephinikhodi ye-Sim."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Ukuvulwa kwe-puk ye-Sim."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ukuvula ngephasiwedi."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Indawo yephethini."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Indawo yokushelelisa."</string>
@@ -863,6 +873,12 @@
<string name="text_copied" msgid="4985729524670131385">"Umbhalo ukopishwe ebhodini lokunamathisela."</string>
<string name="more_item_label" msgid="4650918923083320495">"Okuningi"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Imenyu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"isikhala"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"faka"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"susa"</string>
@@ -994,14 +1010,23 @@
<string name="inputMethod" msgid="1653630062304567879">"Indlela yokufakwayo"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Izenzo zombhalo"</string>
<string name="email" msgid="4560673117055050403">"I-imeyili"</string>
+ <string name="email_desc" msgid="3638665569546416795">"I-imeyili ikhethe amakheli"</string>
<string name="dial" msgid="1253998302767701559">"Shaya"</string>
+ <string name="dial_desc" msgid="6573723404985517250">"Ikholi ikhethe inombolo yefoni"</string>
<string name="map" msgid="6521159124535543457">"Beka"</string>
+ <string name="map_desc" msgid="9036645769910215302">"Isifunda sikhethe ikheli"</string>
<string name="browse" msgid="1245903488306147205">"Vula"</string>
+ <string name="browse_desc" msgid="8220976549618935044">"Vula i-URL ekhethiwe"</string>
<string name="sms" msgid="4560537514610063430">"Umlayezo"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"Umlayezo ukhethe inombolo yefoni"</string>
<string name="add_contact" msgid="7867066569670597203">"Engeza"</string>
+ <string name="add_contact_desc" msgid="4830217847004590345">"Engeza koxhumana nabo"</string>
<string name="view_calendar" msgid="979609872939597838">"Buka"</string>
+ <string name="view_calendar_desc" msgid="5828320291870344584">"Buka isikhathi esikhethiwe kwikhalenda"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"Ishejuli"</string>
+ <string name="add_calendar_event_desc" msgid="4326891793260687388">"Shejula imicimbi yesikhathi esikhethiwe"</string>
<string name="view_flight" msgid="7691640491425680214">"Landelela"</string>
+ <string name="view_flight_desc" msgid="3876322502674253506">"Ithrekhi ikhethe indiza"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Isikhala sokulondoloza siyaphela"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Eminye imisebenzi yohlelo ingahle ingasebenzi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Akusona isitoreji esanele sesistimu. Qiniseka ukuthi unesikhala esikhululekile esingu-250MB uphinde uqalise kabusha."</string>
@@ -1074,31 +1099,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Hlola izibuyekezo"</string>
<string name="smv_application" msgid="3307209192155442829">"Inqubo <xliff:g id="APPLICATION">%1$s</xliff:g> (yohlelo <xliff:g id="PROCESS">%2$s</xliff:g>) iphule inqubomgomo oziphoqelela yona Yemodi Ebukhali."</string>
<string name="smv_process" msgid="5120397012047462446">"Inqubo <xliff:g id="PROCESS">%1$s</xliff:g> yephule inqubomgomo yokuziphoqelela Yemodi Ebukhali."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"I-Android ifaka ezakamuva..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"I-Android iyaqala…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Ifoni iyabuyekeza…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Ithebulethi iyabuyekeza…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Idivayisi iyabuyekeza…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Ifoni iyaqala…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Ithebulethi iyaqala…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Idivayisi iyaqala…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ikhulisa isitoreji."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Iqedela isibuyekezo se-Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Ezinye izinhlelo zokusebenza kungenzeka zingasebenzi kahle kuze kuqedwe ukuthuthukiswa"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Iqedela ukubuyekezwa kwesistimu…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> iyathuthukisa…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ukubeka ezingeni eliphezulu <xliff:g id="NUMBER_0">%1$d</xliff:g> uhlelo lokusebenza <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Ukulungisela i-<xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Qalisa izinhlelo zokusebenza."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Qedela ukuqala kabusha."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> iyasebenza"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Thepha ukuze ubuyele emuva kwigeyimu"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Khetha igeyimu"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Ngokusebenza okungcono, eyodwa yalawa mageyimu ingavulwa ngesikhathi."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Emuva ku-<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <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>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Ukulahlwa kwehipu kuqoqiwe; thepha ukuze wabelane"</string>
+ <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>
<string name="sendText" msgid="5209874571959469142">"Khetha okufanele kwenziwe okomqhafazo"</string>
@@ -1133,12 +1155,12 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Xhuma kunethiwekhi evulekile ye-Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Xhumeka kunethiwekhi yenkampani yenethiwekhi ye-Wi-Fi"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ixhuma kunethiwekhi evulekile ye-Wi‑Fi"</string>
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Ixhumeka kunethiwekhi ye-Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Kuxhumeke kunethiwekhi ye-Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ayikwazanga ukuxhumeka kunethiwekhi ye-Wi-Fi"</string>
<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="1100098935861622985">"Onke amanethiwekhi"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Onke amanethiwekhi"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"I-Wi-Fi izovuleka ngokuzenzakalela"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Uma useduze kwenethiwekhi yekhwalithi ephezulu elondoloziwe"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ungaphindi uvule"</string>
@@ -1204,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Qala phansi"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Yenza kusebenze isevisi yeselula"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Landa uhlelo lokusebenza lwenkampani yenethiwekhi ukuze wenze kusebenze i-SIM yakho entsha"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Landa uhlelo lokusebenza lwe-<xliff:g id="APP_NAME">%1$s</xliff:g> ukuze wenze kusebenze i-SIM yakho entsha"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Landa uhlelo lokusebenza"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Kufakwe i-SIM entsha"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Thepha ukuze uyisethe"</string>
@@ -1222,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"I-PTP nge-USB ivuliwe"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Kuvulwe ukusebenzisa ifoni njengemodemu kwe-USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"I-MIDI nge-USB ivuliwe"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Imodi yesisetshenziswa se-USB ivuliwe"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Insiza ye-USB ixhunyiwe"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Thepha ngezinketho eziningi."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole ezinye izinketho."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Kutholwe isisetshenziswa se-analog yomsindo"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Thepha ukuze ukhubaze ukususa isiphazamisi se-USB."</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>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Ithatha umbiko wesiphazamisi..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Yabelana ngombiko wesiphazamisi?"</string>
@@ -1247,34 +1270,35 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ukubonisa ngaphezu kwezinye izinhlelo zokusebenza"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ibonisa ngaphezu kwezinye izinhlelo zokusebenza"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Uma ungafuni ukuthi i-<xliff:g id="NAME">%s</xliff:g> isebenzise lesi sici, thepha ukuze uvule izilungiselelo bese usivale."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VALA"</string>
- <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ilungiselela i-<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ihlolela amaphutha"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"I-<xliff:g id="NAME">%s</xliff:g> entsha itholiwe"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Vala"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Iyahlola <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Ukubuyekeza okuqukethwe kwamanje"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Okusha <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Thepha ukuze usethe"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Ukuze kudluliselwe izithombe nemidiya"</string>
- <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Yonakele <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> yonakele. Thepha ukuze ulungise."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Inkinga ngo-<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Thepha ukuze ulungise"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> yonakele. Khetha ukulungisa."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Akusekelwe <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Le divayisi ayisekeli le <xliff:g id="NAME">%s</xliff:g>. Thepha ukuze usethe ngefomethi esekelwayo."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Le divayisi ayisekeli le <xliff:g id="NAME">%s</xliff:g>. Khetha ukuze usethe ngefomethi esekelwayo."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"I-<xliff:g id="NAME">%s</xliff:g> isuswe ngokungalindelekile"</string>
- <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Yehlisa i-<xliff:g id="NAME">%s</xliff:g> ngaphambi kokususa ukuze ugweme ukulahleka kwedatha"</string>
- <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"I-<xliff:g id="NAME">%s</xliff:g> isusiwe"</string>
- <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"I-<xliff:g id="NAME">%s</xliff:g> isusiwe; faka entsha"</string>
- <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Isakhipha i-<xliff:g id="NAME">%s</xliff:g>…"</string>
- <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ungayisusi"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Khipha imidiya ngaphambi kokususa ukuze ugweme ukulahlekelwa okuqukethwe"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ususiwe"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Eminye imisebenzi ingahle ingasebenzi kahle. Faka isitoreji esisha."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ukukhipha i-<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ungayisusi"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Setha"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Khipha"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Hlola"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> okulahlekile"</string>
- <string name="ext_media_missing_message" msgid="5761133583368750174">"Faka kabusha le divayisi"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Faka idivayisi futhi"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Ihambisa i-<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Ihambisa idatha"</string>
- <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ukuhamba kuphelele"</string>
- <string name="ext_media_move_success_message" msgid="4199002148206265426">"Idatha iyiswe ku-<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Ayikwazanga ukuhambisa idatha"</string>
- <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Idatha isele endaweni yoqobo"</string>
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Ukudlulisela okuqukethwe kwenziwe"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Okuqukethwe kuyiswe ku-<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ayikwazanga ukuhambisa okuqukethwe"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Zama ukuhambisa okuqukethwe futhi"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Susiwe"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Khipha"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Iyahlola..."</string>
@@ -1333,14 +1357,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"I-VPN ehlala ikhanya iyaxhuma…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"I-VPN ehlala ikhanya ixhunyiwe"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Inqamukile kusuka ku-VPN njalo"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Iphutha le-VPN ehlala ikhanya"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ayikwazanga ukuxhumeka ku-VPN ehlala ivuliwe"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Shintsha inethiwekhi noma izilungiselelo ze-VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Khetha ifayela"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ayikho ifayela ekhethiwe"</string>
<string name="reset" msgid="2448168080964209908">"Setha kabusha"</string>
<string name="submit" msgid="1602335572089911941">"Hambisa"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Imodi yemoto ivunyelwe"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Thepha ukuze uphume kumodi yemoto."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Uhlelo lokusebenza lokushayela luyasebenza"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Thepha ukuze uphume kuhlelo lokusebenza lokushayela."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Thepha ukuze usethe."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string>
@@ -1418,22 +1442,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> idrayivu ye-USB"</string>
<string name="storage_usb" msgid="3017954059538517278">"Isitoreji se-USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Hlela"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Izexwayiso zokusetshenziswa kwedatha"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Thepha ukuze ubuke ukusetshenziswa nezilungiselelo."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G umkhawulo wedatha ufinyelelwe"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G umkhawulo wedatha ufinyelelwe"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Isexwayiso sedatha"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Usebenzise i-<xliff:g id="APP">%s</xliff:g> yedatha"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Kufinyelelwe kumkhawulo wedatha yeselula"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Umkhawulo wedatha ye-Wi-Fi ufinyelelwe"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Idatha imiswe ngokusetha kabusha umjikelezo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"umkhawulo wedatha ye-2G-3G ufinyelelwe"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Umkhawulo wedatha ye-4G ufinyelelwe"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Umkhawulo wedatha yefoni ufinyelelwe"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Kufinyelwe kunkhawulo we-Wi-Fi ongedlulwe"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ngaphezu komkhawulo ocacisiwe"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Idatha imiswe okwesikhashana kuwo wonke umjikelezo wakho"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Ngaphezulu komkhawulo wakho wedatha osethiwe weselula"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Ngaphezulu komkhawulo wakho wedatha ye-Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Udlule ngokungu-<xliff:g id="SIZE">%s</xliff:g> ngaphezulu komkhawulo wakho osethiwe"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Imininingo egciniwe ivinjelwe"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Thepha ukuze ususe umkhawulo."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Ukusetshenziswa okukhulu kwedatha"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Ukusetshenziswa kwedatha yakho ezinsukwini zokugcina ezimbalwa yinkulu kunokujwayelekile. Thepha ukuze ubuke ukusetshenziswa nezilungiselelo."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Ukusetshenziswa kwedatha yeselula okuphezulu"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Izinhlelo zakho zokusebenza zisebenzise idatha eningi kunejwayelekile"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"I-<xliff:g id="APP">%s</xliff:g> isebenzise idatha engaphezulu kunokujwayelekile"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Isitifiketi sokuvikeleka"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Lesi sitifiketi silungile."</string>
<string name="issued_to" msgid="454239480274921032">"Ikhishelwe u:"</string>
@@ -1669,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Kufakwe umlawuli wakho"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Kubuyekezwe umlawuli wakho"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Kususwe umlawuli wakho"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Ukuze kusizwe ukuthuthukisa impilo yebhethri, isilondolozi sebhethri sehlisa ukusebenza kwedivayisi yakho kuphinde kukhawulele ukudlidliza, amasevisi endawo kanye nedatha eningi yasemuva. I-imeyili, ukulayeza nezinye izinhlelo zokusebenza ezithembele ekuvunyelanisweni kungenzeka zingabuyekezwa ngaphandle kokuthi uzivule.\n\nIsilondolozi sebhethri sivalwa ngokuzenzakalela uma idivayisi yakho ishaja."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Ukuze kunwetshwe impilo yebhethri, Isilondolozi sebhethri sehlisa ukusebenza kwedivayisi yakho siphinde sikhawulele noma sivale ukudlidliza, amasevisi endawo, nedatha engemuva. I-imeyili, ukulayeza, nezinye izinhlelo zokusebenza ezithembele ekuvunyelanisweni kungenzeka zingabuyekezi ngaphandle kokuthi uzivule.\n\nIsilondolozi sebhethri sivalwa ngokuzenzakalela uma idivayisi yakho ishaja."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vula iseva yedatha?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Vula"</string>
@@ -1681,9 +1702,9 @@
<item quantity="one">Ngeminithi elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Ngeminithi elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">Kwamahora angu-%1$d (kuze kube ngo-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Kwamahora angu-%1$d (kuze kube ngo-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Amahora angu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Amahora angu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">Ngehora elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,7 +1718,7 @@
<item quantity="one">Ngeminithi elingu-%d</item>
<item quantity="other">Ngeminithi elingu-%d</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">Amahora angu-%d</item>
<item quantity="other">Amahora angu-%d</item>
</plurals>
@@ -1720,14 +1741,14 @@
<string name="muted_by" msgid="6147073845094180001">"Ithuliswe ngu-<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Kukhona inkinga yangaphakathi ngedivayisi yakho, futhi ingase ibe engazinzile kuze kube yilapho usetha kabusha yonke idatha."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Kukhona inkinga yangaphakathi ngedivayisi yakho. Xhumana nomkhiqizi wakho ukuze uthole imininingwane."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Isicelo se-USSD siguqulelwe kusicelo se-DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Isicelo se-USSD siguqulelwe kusicelo se-SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Isicelo se-USSD siguqulelwe kusicelo esisha se-USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Isicelo se-USSD siguqulelwe kusicelo se-DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Isicelo se-SS siguqulelwe kusicelo se-DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Isicelo se-SS siguqulelwe kusicelo se-DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Isicelo se-SS siguqulelwe kusicelo se-USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Isicelo se-SS siguqulelwe kusicelo esisha se-SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Isicelo se-USSD sishintshele kukholi ejwayelekile"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Isicelo se-USSD sishintshele kusicelo se-SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Kushintshwelwe kusicelo esisha se-USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Isicelo se-USSD sishintshele kukholi yevidiyo"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Isicelo se-SS sishintshele kukholi ejwayelekile"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Isicelo se-SS sishintshele kukholi yevidiyo"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Isicelo se-SS sishintshele kusicelo se-USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Ishintshele kusicelo esisha se-SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Iphrofayela yomsebenzi"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Nweba"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Goqa"</string>
@@ -1825,6 +1846,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"I-SIM ayinikezelwe izwi"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"I-SIM ayivunyelwe kwizwi"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ifoni ayivunyelwe izwi"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"I-SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ayivunyelwe"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"I-SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ayinikeziwe"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"I-SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ayivunyelwe"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"I-SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ayivunyelwe"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iwindi lesigelekeqe"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Inguqulo yohlelo lokusebenza yehliselwe phansi noma ayihambelani nalesi sinqamuleli"</string>
@@ -1837,7 +1862,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Uhlelo lokusebenza oluyingozi lutholakele"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"I-<xliff:g id="APP_0">%1$s</xliff:g> ifuna ukubonisa izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Hlela"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Amakholi nezaziso zizodlidliza"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Amakholi nezaziso zizothuliswa"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Ushintsho lwesistimu"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ungaphazamasi"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Okuthi Ungaphazamisi kufihla izaziso ukukusiza ukuthi ugxile"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Lokhu ukuziphatha okusha. Thepha ukuze ushintshe."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ukungaphazamisi kushintshile"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Thepha ukuze uhlole izilungiselelo zokuziphatha zokuphazanyiswa"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Thepha ukuze uhlole ukuthi yini evinjelwe."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Isistimu"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Izilungiselelo"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 3135455..aceba08 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2123,44 +2123,48 @@
<!-- Controls how the window is laid out if there is a {@code DisplayCutout}.
<p>
Defaults to {@code default}.
-
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
- @see android.view.DisplayCutout
- @see android.R.attr#layoutInDisplayCutoutMode -->
+ <p>
+ See also
+ {@link android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode
+ WindowManager.LayoutParams.layoutInDisplayCutoutMode},
+ {@link android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT},
+ {@link android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES},
+ {@link android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER},
+ and {@link android.view.DisplayCutout DisplayCutout}
+ -->
<attr name="windowLayoutInDisplayCutoutMode">
- <!-- The window is allowed to extend into the {@code DisplayCutout} area, only if the
- {@code DisplayCutout} is fully contained within a system bar. Otherwise, the window is
- laid out such that it does not overlap with the {@code DisplayCutout} area.
-
- @see android.view.DisplayCutout
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
+ <!-- <p>
+ The window is allowed to extend into the <code>DisplayCutout</code> area, only if
+ the <code>DisplayCutout</code> is fully contained within a system bar. Otherwise, the
+ window is laid out such that it does not overlap with the <code>DisplayCutout</code>
+ area.
+ <p>
+ Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT</code>.
-->
<enum name="default" value="0" />
- <!--
- The window is always allowed to extend into the {@code DisplayCutout} areas on the short
- edges of the screen even if fullscreen or in landscape.
- The window will never extend into a {@link DisplayCutout} area on the long edges of the
- screen.
+ <!-- <p>
+ The window is always allowed to extend into the <code>DisplayCutout</code> areas on the
+ short edges of the screen even if fullscreen or in landscape.
+ The window will never extend into a <code>DisplayCutout</code> area on the long edges of
+ the screen.
<p>
The window must make sure that no important content overlaps with the
- {@link DisplayCutout}.
-
- @see android.view.DisplayCutout
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+ <code>DisplayCutout</code>.
+ <p>
+ Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES</code>.
-->
<enum name="shortEdges" value="1" />
- <!-- Use {@code shortEdges} instead. This is temporarily here to unblock pushing the SDK
- until all usages have been migrated to {@code shortEdges} -->
+ <!-- Use <code>shortEdges</code> instead. This is temporarily here to unblock pushing
+ the SDK until all usages have been migrated to <code>shortEdges</code> -->
<enum name="always" value="1" />
- <!-- The window is never allowed to overlap with the DisplayCutout area.
+ <!-- <p>
+ The window is never allowed to overlap with the <code>DisplayCutout</code> area.
<p>
- This should be used with windows that transiently set {@code SYSTEM_UI_FLAG_FULLSCREEN}
- to avoid a relayout of the window when the flag is set or cleared.
-
- @see android.view.DisplayCutout
- @see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+ This should be used with windows that transiently set
+ <code>SYSTEM_UI_FLAG_FULLSCREEN</code> to avoid a relayout of the window when the
+ flag is set or cleared.
+ <p>
+ Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER</code>.
-->
<enum name="never" value="2" />
</attr>
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 449d3e7..c63f319 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -33,11 +33,16 @@
a light UI more visible. -->
<drawable name="screen_background_light_transparent">#80ffffff</drawable>
<color name="safe_mode_text">#80ffffff</color>
+ <!-- The color white, equivalent to 0xffffffff -->
<color name="white">#ffffffff</color>
+ <!-- The color black, equivalent to 0xff000000 -->
<color name="black">#ff000000</color>
<color name="red">#ffff0000</color>
+ <!-- Fully transparent, equivalent to 0x00000000 -->
<color name="transparent">#00000000</color>
+ <!-- Equivalent to 0xff000000 -->
<color name="background_dark">#ff000000</color>
+ <!-- Equivalent to 0xffffffff -->
<color name="background_light">#ffffffff</color>
<color name="bright_foreground_dark">@android:color/background_light</color>
<color name="bright_foreground_light">@android:color/background_dark</color>
@@ -80,6 +85,7 @@
<!-- For settings framework -->
<color name="lighter_gray">#ddd</color>
+ <!-- A dark gray, equivalent to 0xffaaaaaa -->
<color name="darker_gray">#aaa</color>
<!-- For security permissions -->
diff --git a/core/res/res/values/colors_holo.xml b/core/res/res/values/colors_holo.xml
index 917c781..4297eea 100644
--- a/core/res/res/values/colors_holo.xml
+++ b/core/res/res/values/colors_holo.xml
@@ -50,29 +50,29 @@
<!-- General purpose colors for Holo-themed elements -->
<eat-comment />
- <!-- A light Holo shade of blue -->
+ <!-- A light Holo shade of blue. Equivalent to #ff33b5e5. -->
<color name="holo_blue_light">#ff33b5e5</color>
- <!-- A light Holo shade of gray -->
+ <!-- A light Holo shade of gray. Equivalent to #33999999. -->
<color name="holo_gray_light">#33999999</color>
- <!-- A light Holo shade of green -->
+ <!-- A light Holo shade of green. Equivalent to #ff99cc00. -->
<color name="holo_green_light">#ff99cc00</color>
- <!-- A light Holo shade of red -->
+ <!-- A light Holo shade of red. Equivalent to #ffff4444. <-->
<color name="holo_red_light">#ffff4444</color>
- <!-- A dark Holo shade of blue -->
+ <!-- A dark Holo shade of blue. Equivalent to #ff0099cc -->
<color name="holo_blue_dark">#ff0099cc</color>
- <!-- A dark Holo shade of green -->
+ <!-- A dark Holo shade of green. Equivalent to #ff669900 -->
<color name="holo_green_dark">#ff669900</color>
- <!-- A dark Holo shade of red -->
+ <!-- A dark Holo shade of red. Equivalent to #ffcc0000 -->
<color name="holo_red_dark">#ffcc0000</color>
- <!-- A Holo shade of purple -->
+ <!-- A Holo shade of purple. Equivalent to #ffaa66cc -->
<color name="holo_purple">#ffaa66cc</color>
- <!-- A light Holo shade of orange -->
+ <!-- A light Holo shade of orange. Equivalent to #ffffbb33. -->
<color name="holo_orange_light">#ffffbb33</color>
- <!-- A dark Holo shade of orange -->
+ <!-- A dark Holo shade of orange. Equivalent to ffff8800. -->
<color name="holo_orange_dark">#ffff8800</color>
- <!-- A really bright Holo shade of blue -->
+ <!-- A really bright Holo shade of blue. Equivalent to #ff00ddff. -->
<color name="holo_blue_bright">#ff00ddff</color>
- <!-- A really bright Holo shade of gray -->
+ <!-- A really bright Holo shade of gray. Equivalent to #33cccccc. -->
<color name="holo_gray_bright">#33CCCCCC</color>
<!-- Forward compatibility for Material-style theme colors -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 55c17b9..6d07d57 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -30,33 +30,32 @@
<item><xliff:g id="id">@string/status_bar_rotate</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_headset</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_data_saver</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_ime</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_sync_failing</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_sync_active</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_cast</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_hotspot</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_location</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_nfc</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_tty</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_speakerphone</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_zen</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_mute</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_volume</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_ethernet</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_cdma_eri</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_data_connection</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_phone_signal</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_secure</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_clock</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_cast</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_location</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_hotspot</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_ethernet</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
</string-array>
<string translatable="false" name="status_bar_rotate">rotate</string>
@@ -1095,6 +1094,9 @@
<!-- Display low battery warning when battery level dips to this value -->
<integer name="config_lowBatteryWarningLevel">15</integer>
+ <!-- The default suggested battery % at which we enable battery saver automatically. -->
+ <integer name="config_lowBatteryAutoTriggerDefaultLevel">15</integer>
+
<!-- Close low battery warning when battery level reaches the lowBatteryWarningLevel
plus this -->
<integer name="config_lowBatteryCloseWarningBump">5</integer>
@@ -1428,6 +1430,9 @@
<!-- True if WallpaperService is enabled -->
<bool name="config_enableWallpaperService">true</bool>
+ <!-- True if the device should block turning display on at boot until wallpaper is ready -->
+ <bool name="config_checkWallpaperAtBoot">true</bool>
+
<!-- Class name of WallpaperManagerService. -->
<string name="config_wallpaperManagerServiceName">com.android.server.wallpaper.WallpaperManagerService</string>
@@ -2365,19 +2370,6 @@
<item>com.android.inputmethod.latin</item>
</string-array>
- <!-- The list of carrier applications which should be disabled until used.
- This function suppresses update notifications for these pre-installed apps.
- In SubscriptionInfoUpdater, the listed applications are disabled until used when all of the
- following conditions are met.
- 1. Not currently carrier-privileged according to the inserted SIM
- 2. Pre-installed
- 3. In the default state (enabled but not explicitly)
- And SubscriptionInfoUpdater undoes this and marks the app enabled when a SIM is inserted
- that marks the app as carrier privileged. It also grants the app default permissions
- for Phone and Location. As such, apps MUST only ever be added to this list if they
- obtain user consent to access their location through other means. -->
- <string-array name="config_disabledUntilUsedPreinstalledCarrierApps" translatable="false" />
-
<!-- The list of classes that should be added to the notification ranking pipeline.
See {@link com.android.server.notification.NotificationSignalExtractor}
If you add a new extractor to this list make sure to update
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 7ff96fa..0581856 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -643,6 +643,9 @@
-->
<dimen name="autofill_save_icon_max_size">300dp</dimen>
+ <!-- Maximum number of datasets that are visible in the UX picker without scrolling -->
+ <integer name="autofill_max_visible_datasets">3</integer>
+
<!-- Size of a slice shortcut view -->
<dimen name="slice_shortcut_size">56dp</dimen>
<!-- Size of action icons in a slice -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 0246c80..42cc54f 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -708,23 +708,38 @@
<public type="dimen" name="thumbnail_height" id="0x01050001" />
<public type="dimen" name="thumbnail_width" id="0x01050002" />
+ <!-- Equivalent to 0xffaaaaaa -->
<public type="color" name="darker_gray" id="0x01060000" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="primary_text_dark" id="0x01060001" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="primary_text_dark_nodisable" id="0x01060002" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="primary_text_light" id="0x01060003" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="primary_text_light_nodisable" id="0x01060004" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="secondary_text_dark" id="0x01060005" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="secondary_text_dark_nodisable" id="0x01060006" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="secondary_text_light" id="0x01060007" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="secondary_text_light_nodisable" id="0x01060008" />
+ <!-- Equivalent to 0xff808080 -->
<public type="color" name="tab_indicator_text" id="0x01060009" />
+ <!-- Equivalent to 0xff000000 -->
<public type="color" name="widget_edittext_dark" id="0x0106000a" />
<public type="color" name="white" id="0x0106000b" />
<public type="color" name="black" id="0x0106000c" />
<public type="color" name="transparent" id="0x0106000d" />
+ <!-- Equivalent to 0xff000000 -->
<public type="color" name="background_dark" id="0x0106000e" />
+ <!-- Equivalent to 0xffffffff -->
<public type="color" name="background_light" id="0x0106000f" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="tertiary_text_dark" id="0x01060010" />
+ <!-- {@deprecated Use a text color from your theme instead.} -->
<public type="color" name="tertiary_text_light" id="0x01060011" />
<public type="array" name="emailAddressTypes" id="0x01070000" />
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 2e8f663..17b9d28 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1325,6 +1325,11 @@
disables the keylock when receiving an incoming phone call, then
re-enables the keylock when the call is finished.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] -->
+ <string name="permlab_useBiometric">use biometric hardware</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this.[CHAR_LIMIT=NONE] -->
+ <string name="permdesc_useBiometric">Allows the app to use biometric hardware for authentication</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_manageFingerprint">manage fingerprint hardware</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -2752,30 +2757,57 @@
<!-- Label for item in the text selection menu to trigger an Email app [CHAR LIMIT=20] -->
<string name="email">Email</string>
+ <!-- Accessibility description for an item in the text selection menu to trigger an Email app [CHAR LIMIT=NONE] -->
+ <string name="email_desc">Email selected address</string>
+
<!-- Label for item in the text selection menu to trigger a Dialer app [CHAR LIMIT=20] -->
<string name="dial">Call</string>
+ <!-- Accessibility description for an item in the text selection menu to call a phone number [CHAR LIMIT=NONE] -->
+ <string name="dial_desc">Call selected phone number</string>
+
<!-- Label for item in the text selection menu to trigger a Map app [CHAR LIMIT=20] -->
- <string name="map">Locate</string>
+ <string name="map">Map</string>
+
+ <!-- Accessibility description for an item in the text selection menu to open maps for an address [CHAR LIMIT=NONE] -->
+ <string name="map_desc">Locate selected address</string>
<!-- Label for item in the text selection menu to trigger a Browser app [CHAR LIMIT=20] -->
<string name="browse">Open</string>
+ <!-- Accessibility description for an item in the text selection menu to open a URL in a browser [CHAR LIMIT=NONE] -->
+ <string name="browse_desc">Open selected URL</string>
+
<!-- Label for item in the text selection menu to trigger an SMS app [CHAR LIMIT=20] -->
<string name="sms">Message</string>
+ <!-- Accessibility description for an item in the text selection menu to send an SMS to a phone number [CHAR LIMIT=NONE] -->
+ <string name="sms_desc">Message selected phone number</string>
+
<!-- Label for item in the text selection menu to trigger adding a contact [CHAR LIMIT=20] -->
<string name="add_contact">Add</string>
+ <!-- Accessibility description for an item in the text selection menu to add the selected detail to contacts [CHAR LIMIT=NONE] -->
+ <string name="add_contact_desc">Add to contacts</string>
+
<!-- Label for item in the text selection menu to view the calendar for the selected time/date [CHAR LIMIT=20] -->
<string name="view_calendar">View</string>
+ <!-- Accessibility description for an item in the text selection menu to view the calendar for a date [CHAR LIMIT=NONE]-->
+ <string name="view_calendar_desc">View selected time in calendar</string>
+
<!-- Label for item in the text selection menu to create a calendar event at the selected time/date [CHAR LIMIT=20] -->
<string name="add_calendar_event">Schedule</string>
+ <!-- Accessibility description for an item in the text selection menu to schedule an event for a date [CHAR LIMIT=NONE] -->
+ <string name="add_calendar_event_desc">Schedule event for selected time</string>
+
<!-- Label for item in the text selection menu to track a selected flight number [CHAR LIMIT=20] -->
<string name="view_flight">Track</string>
+ <!-- Accessibility description for an item in the text selection menu to track a flight [CHAR LIMIT=NONE] -->
+ <string name="view_flight_desc">Track selected flight</string>
+
<!-- If the device is getting low on internal storage, a notification is shown to the user. This is the title of that notification. -->
<string name="low_internal_storage_view_title">Storage space running out</string>
<!-- If the device is getting low on internal storage, a notification is shown to the user. This is the message of that notification. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 75f8013..eebf581 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -294,6 +294,7 @@
<java-symbol type="bool" name="split_action_bar_is_narrow" />
<java-symbol type="bool" name="config_useVolumeKeySounds" />
<java-symbol type="bool" name="config_enableWallpaperService" />
+ <java-symbol type="bool" name="config_checkWallpaperAtBoot" />
<java-symbol type="string" name="config_wallpaperManagerServiceName" />
<java-symbol type="bool" name="config_enableUpdateableTimeZoneRules" />
<java-symbol type="bool" name="config_timeZoneRulesUpdateTrackingEnabled" />
@@ -545,14 +546,23 @@
<java-symbol type="string" name="undo" />
<java-symbol type="string" name="redo" />
<java-symbol type="string" name="email" />
+ <java-symbol type="string" name="email_desc" />
<java-symbol type="string" name="dial" />
+ <java-symbol type="string" name="dial_desc" />
<java-symbol type="string" name="map" />
+ <java-symbol type="string" name="map_desc" />
<java-symbol type="string" name="browse" />
+ <java-symbol type="string" name="browse_desc" />
<java-symbol type="string" name="sms" />
+ <java-symbol type="string" name="sms_desc" />
<java-symbol type="string" name="add_contact" />
+ <java-symbol type="string" name="add_contact_desc" />
<java-symbol type="string" name="view_calendar" />
+ <java-symbol type="string" name="view_calendar_desc" />
<java-symbol type="string" name="add_calendar_event" />
+ <java-symbol type="string" name="add_calendar_event_desc" />
<java-symbol type="string" name="view_flight" />
+ <java-symbol type="string" name="view_flight_desc" />
<java-symbol type="string" name="textSelectionCABTitle" />
<java-symbol type="string" name="BaMmi" />
<java-symbol type="string" name="CLIRDefaultOffNextCallOff" />
@@ -1233,7 +1243,6 @@
<java-symbol type="array" name="supported_locales" />
<java-symbol type="array" name="config_cdma_dun_supported_types" />
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" />
- <java-symbol type="array" name="config_disabledUntilUsedPreinstalledCarrierApps" />
<java-symbol type="array" name="config_callBarringMMI" />
<java-symbol type="array" name="config_globalActionsList" />
<java-symbol type="array" name="config_telephonyEuiccDeviceCapabilities" />
@@ -1611,6 +1620,8 @@
<java-symbol type="anim" name="task_open_enter" />
<java-symbol type="anim" name="cross_profile_apps_thumbnail_enter" />
<java-symbol type="anim" name="task_open_enter_cross_profile_apps" />
+ <java-symbol type="anim" name="activity_translucent_open_enter" />
+ <java-symbol type="anim" name="activity_translucent_close_exit" />
<java-symbol type="array" name="config_autoRotationTiltTolerance" />
<java-symbol type="array" name="config_keyboardTapVibePattern" />
@@ -2722,6 +2733,10 @@
<java-symbol type="string" name="status_bar_alarm_clock" />
<java-symbol type="string" name="status_bar_secure" />
<java-symbol type="string" name="status_bar_clock" />
+ <java-symbol type="string" name="status_bar_airplane" />
+ <java-symbol type="string" name="status_bar_mobile" />
+ <java-symbol type="string" name="status_bar_ethernet" />
+ <java-symbol type="string" name="status_bar_vpn" />
<!-- Locale picker -->
<java-symbol type="id" name="locale_search_menu" />
@@ -3019,10 +3034,14 @@
<java-symbol type="layout" name="autofill_save"/>
<java-symbol type="layout" name="autofill_dataset_picker"/>
<java-symbol type="layout" name="autofill_dataset_picker_fullscreen"/>
+ <java-symbol type="layout" name="autofill_dataset_picker_header_footer"/>
+ <java-symbol type="layout" name="autofill_dataset_picker_header_footer_fullscreen"/>
+ <java-symbol type="id" name="autofill" />
<java-symbol type="id" name="autofill_dataset_container"/>
+ <java-symbol type="id" name="autofill_dataset_footer"/>
+ <java-symbol type="id" name="autofill_dataset_header"/>
<java-symbol type="id" name="autofill_dataset_list"/>
<java-symbol type="id" name="autofill_dataset_picker"/>
- <java-symbol type="id" name="autofill" />
<java-symbol type="id" name="autofill_save_custom_subtitle" />
<java-symbol type="id" name="autofill_save_icon" />
<java-symbol type="id" name="autofill_save_no" />
@@ -3052,6 +3071,7 @@
<java-symbol type="dimen" name="autofill_dataset_picker_max_height"/>
<java-symbol type="dimen" name="autofill_save_custom_subtitle_max_height"/>
<java-symbol type="dimen" name="autofill_save_icon_max_size"/>
+ <java-symbol type="integer" name="autofill_max_visible_datasets" />
<java-symbol type="dimen" name="notification_big_picture_max_height"/>
<java-symbol type="dimen" name="notification_big_picture_max_width"/>
@@ -3312,4 +3332,6 @@
<java-symbol type="string" name="notification_app_name_system" />
<java-symbol type="string" name="notification_app_name_settings" />
+ <java-symbol type="integer" name="config_lowBatteryAutoTriggerDefaultLevel" />
+
</resources>
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index a99e139..9ef58ab 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -16,7 +16,10 @@
package android.app.activity;
+import static org.junit.Assert.assertNull;
+
import android.app.Activity;
+import android.app.ActivityThread;
import android.app.IApplicationThread;
import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ClientTransaction;
@@ -76,6 +79,21 @@
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
}
+ /** Verify that repeated resume requests to activity will be ignored. */
+ @Test
+ public void testRepeatedResume() throws Exception {
+ final Activity activity = mActivityTestRule.launchActivity(new Intent());
+ final ActivityThread activityThread = activity.getActivityThread();
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ activityThread.executeTransaction(newResumeTransaction(activity));
+ assertNull(activityThread.performResumeActivity(activity.getActivityToken(),
+ true /* finalStateRequest */, "test"));
+
+ assertNull(activityThread.performResumeActivity(activity.getActivityToken(),
+ false /* finalStateRequest */, "test"));
+ });
+ }
+
private static ClientTransaction newRelaunchResumeTransaction(Activity activity) {
final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null,
null, 0, new MergedConfiguration(), false /* preserveWindow */);
diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
index 58ee7a7..5db416b 100644
--- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java
+++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
@@ -16,9 +16,6 @@
package android.app.backup;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
import android.content.Context;
import android.support.test.filters.LargeTest;
@@ -102,6 +99,28 @@
include.getRequiredFlags());
}
+ public void testParseBackupSchemeFromXml_onlyIncludeRequireFakeEncryptionFlag()
+ throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>"
+ + "<include path=\"onlyInclude.txt\" domain=\"file\""
+ + " requireFlags=\"fakeClientSideEncryption\"/>"
+ + "</full-backup-content>"));
+
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
+ assertEquals("Invalid path parsed for <include/>",
+ new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>",
+ BackupAgent.FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED,
+ include.getRequiredFlags());
+ }
+
public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlag() throws Exception {
mXpp.setInput(new StringReader(
"<full-backup-content>" +
diff --git a/core/tests/coretests/src/android/os/MemoryFileTest.java b/core/tests/coretests/src/android/os/MemoryFileTest.java
index 82af662..20b298d 100644
--- a/core/tests/coretests/src/android/os/MemoryFileTest.java
+++ b/core/tests/coretests/src/android/os/MemoryFileTest.java
@@ -23,6 +23,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.BufferOverflowException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -110,7 +111,7 @@
try {
os.write(new byte[] { -1, -1 });
fail();
- } catch (IndexOutOfBoundsException expected) {
+ } catch (IndexOutOfBoundsException | BufferOverflowException expected) {
}
byte[] copy = new byte[file.length()];
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 6ef773a..dfc99f6 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -267,6 +267,7 @@
Settings.Global.LOW_POWER_MODE,
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX,
Settings.Global.LOW_POWER_MODE_STICKY,
+ Settings.Global.LOW_POWER_MODE_SUGGESTION_PARAMS,
Settings.Global.LTE_SERVICE_FORCED,
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
Settings.Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY,
@@ -586,7 +587,9 @@
Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
Settings.Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT,
- Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED);
+ Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED,
+ Settings.Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION,
+ Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
index b77982b..861a43a 100644
--- a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
@@ -33,8 +33,11 @@
@Test
public void testParcel() {
final SelectionEvent[] captured = new SelectionEvent[1];
- final Logger logger = new Logger(new Logger.Config(
- InstrumentationRegistry.getTargetContext(), Logger.WIDGET_TEXTVIEW, null)) {
+ final Logger logger = new Logger(
+ new Logger.Config(
+ InstrumentationRegistry.getTargetContext(),
+ TextClassifier.WIDGET_TYPE_TEXTVIEW,
+ null)) {
@Override
public void writeEvent(SelectionEvent event) {
captured[0] = event;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index 57db153..a3c24cb 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -38,6 +38,7 @@
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -49,19 +50,14 @@
private Context mContext;
private TextClassificationManager mTcm;
private TextClassifier mClassifier;
- private TextSelection.Options mSelectionOptions;
- private TextClassification.Options mClassificationOptions;
- private TextLinks.Options mLinksOptions;
@Before
public void setup() {
mContext = InstrumentationRegistry.getTargetContext();
mTcm = mContext.getSystemService(TextClassificationManager.class);
- mTcm.setTextClassifier(null);
- mClassifier = mTcm.getTextClassifier();
- mSelectionOptions = new TextSelection.Options().setDefaultLocales(LOCALES);
- mClassificationOptions = new TextClassification.Options().setDefaultLocales(LOCALES);
- mLinksOptions = new TextLinks.Options().setDefaultLocales(LOCALES);
+ // Test with the local textClassifier only. (We only bundle "en" model by default).
+ // It's hard to reliably test the results of the device's TextClassifierServiceImpl here.
+ mClassifier = mTcm.getTextClassifier(TextClassifier.LOCAL);
}
@Test
@@ -75,9 +71,12 @@
int endIndex = startIndex + selected.length();
int smartStartIndex = text.indexOf(suggested);
int smartEndIndex = smartStartIndex + suggested.length();
+ TextSelection.Request request = new TextSelection.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextSelection selection = mClassifier.suggestSelection(
- text, startIndex, endIndex, mSelectionOptions);
+ TextSelection selection = mClassifier.suggestSelection(request);
assertThat(selection,
isTextSelection(smartStartIndex, smartEndIndex, TextClassifier.TYPE_EMAIL));
}
@@ -93,9 +92,12 @@
int endIndex = startIndex + selected.length();
int smartStartIndex = text.indexOf(suggested);
int smartEndIndex = smartStartIndex + suggested.length();
+ TextSelection.Request request = new TextSelection.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextSelection selection = mClassifier.suggestSelection(
- text, startIndex, endIndex, mSelectionOptions);
+ TextSelection selection = mClassifier.suggestSelection(request);
assertThat(selection,
isTextSelection(smartStartIndex, smartEndIndex, TextClassifier.TYPE_URL));
}
@@ -108,9 +110,12 @@
String selected = "Hello";
int startIndex = text.indexOf(selected);
int endIndex = startIndex + selected.length();
+ TextSelection.Request request = new TextSelection.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextSelection selection = mClassifier.suggestSelection(
- text, startIndex, endIndex, mSelectionOptions);
+ TextSelection selection = mClassifier.suggestSelection(request);
assertThat(selection,
isTextSelection(startIndex, endIndex, NO_TYPE));
}
@@ -123,14 +128,13 @@
String classifiedText = "droid@android.com";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextClassification classification = mClassifier.classifyText(
- text, startIndex, endIndex, mClassificationOptions);
- assertThat(classification,
- isTextClassification(
- classifiedText,
- TextClassifier.TYPE_EMAIL,
- "mailto:" + classifiedText));
+ TextClassification classification = mClassifier.classifyText(request);
+ assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_EMAIL));
}
@Test
@@ -141,14 +145,13 @@
String classifiedText = "www.android.com";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextClassification classification = mClassifier.classifyText(
- text, startIndex, endIndex, mClassificationOptions);
- assertThat(classification,
- isTextClassification(
- classifiedText,
- TextClassifier.TYPE_URL,
- "http://" + classifiedText));
+ TextClassification classification = mClassifier.classifyText(request);
+ assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_URL));
}
@Test
@@ -156,13 +159,13 @@
if (isTextClassifierDisabled()) return;
String text = "Brandschenkestrasse 110, Zürich, Switzerland";
- TextClassification classification = mClassifier.classifyText(
- text, 0, text.length(), mClassificationOptions);
- assertThat(classification,
- isTextClassification(
- text,
- TextClassifier.TYPE_ADDRESS,
- "geo:0,0?q=Brandschenkestrasse+110%2C+Z%C3%BCrich%2C+Switzerland"));
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, 0, text.length())
+ .setDefaultLocales(LOCALES)
+ .build();
+
+ TextClassification classification = mClassifier.classifyText(request);
+ assertThat(classification, isTextClassification(text, TextClassifier.TYPE_ADDRESS));
}
@Test
@@ -173,14 +176,13 @@
String classifiedText = "HTTP://ANDROID.COM";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextClassification classification = mClassifier.classifyText(
- text, startIndex, endIndex, mClassificationOptions);
- assertThat(classification,
- isTextClassification(
- classifiedText,
- TextClassifier.TYPE_URL,
- "http://ANDROID.COM"));
+ TextClassification classification = mClassifier.classifyText(request);
+ assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_URL));
}
@Test
@@ -191,14 +193,13 @@
String classifiedText = "January 9, 2018";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextClassification classification = mClassifier.classifyText(
- text, startIndex, endIndex, mClassificationOptions);
- assertThat(classification,
- isTextClassification(
- classifiedText,
- TextClassifier.TYPE_DATE,
- null));
+ TextClassification classification = mClassifier.classifyText(request);
+ assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_DATE));
}
@Test
@@ -209,21 +210,22 @@
String classifiedText = "2018/01/01 10:30:20";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
+ TextClassification.Request request = new TextClassification.Request.Builder(
+ text, startIndex, endIndex)
+ .setDefaultLocales(LOCALES)
+ .build();
- TextClassification classification = mClassifier.classifyText(
- text, startIndex, endIndex, mClassificationOptions);
+ TextClassification classification = mClassifier.classifyText(request);
assertThat(classification,
- isTextClassification(
- classifiedText,
- TextClassifier.TYPE_DATE_TIME,
- null));
+ isTextClassification(classifiedText, TextClassifier.TYPE_DATE_TIME));
}
@Test
public void testGenerateLinks_phone() {
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
- assertThat(mClassifier.generateLinks(text, null),
+ TextLinks.Request request = new TextLinks.Request.Builder(text).build();
+ assertThat(mClassifier.generateLinks(request),
isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE));
}
@@ -231,9 +233,14 @@
public void testGenerateLinks_exclude() {
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
- assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
- Collections.EMPTY_LIST, Arrays.asList(TextClassifier.TYPE_PHONE)))),
+ List<String> hints = Collections.EMPTY_LIST;
+ List<String> included = Collections.EMPTY_LIST;
+ List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+ TextLinks.Request request = new TextLinks.Request.Builder(text)
+ .setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
+ .setDefaultLocales(LOCALES)
+ .build();
+ assertThat(mClassifier.generateLinks(request),
not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
}
@@ -241,9 +248,12 @@
public void testGenerateLinks_explicit_address() {
if (isTextClassifierDisabled()) return;
String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!";
- assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- TextClassifier.EntityConfig.createWithEntityList(
- Arrays.asList(TextClassifier.TYPE_ADDRESS)))),
+ List<String> explicit = Arrays.asList(TextClassifier.TYPE_ADDRESS);
+ TextLinks.Request request = new TextLinks.Request.Builder(text)
+ .setEntityConfig(TextClassifier.EntityConfig.createWithExplicitEntityList(explicit))
+ .setDefaultLocales(LOCALES)
+ .build();
+ assertThat(mClassifier.generateLinks(request),
isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA",
TextClassifier.TYPE_ADDRESS));
}
@@ -252,10 +262,14 @@
public void testGenerateLinks_exclude_override() {
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
- assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
- Arrays.asList(TextClassifier.TYPE_PHONE),
- Arrays.asList(TextClassifier.TYPE_PHONE)))),
+ List<String> hints = Collections.EMPTY_LIST;
+ List<String> included = Arrays.asList(TextClassifier.TYPE_PHONE);
+ List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+ TextLinks.Request request = new TextLinks.Request.Builder(text)
+ .setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
+ .setDefaultLocales(LOCALES)
+ .build();
+ assertThat(mClassifier.generateLinks(request),
not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
}
@@ -264,7 +278,8 @@
if (isTextClassifierDisabled()) return;
char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength()];
Arrays.fill(manySpaces, ' ');
- TextLinks links = mClassifier.generateLinks(new String(manySpaces), null);
+ TextLinks.Request request = new TextLinks.Request.Builder(new String(manySpaces)).build();
+ TextLinks links = mClassifier.generateLinks(request);
assertTrue(links.getLinks().isEmpty());
}
@@ -275,7 +290,8 @@
}
char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength() + 1];
Arrays.fill(manySpaces, ' ');
- mClassifier.generateLinks(new String(manySpaces), null);
+ TextLinks.Request request = new TextLinks.Request.Builder(new String(manySpaces)).build();
+ mClassifier.generateLinks(request);
}
@Test
@@ -355,39 +371,15 @@
}
private static Matcher<TextClassification> isTextClassification(
- final String text, final String type, final String intentUri) {
+ final String text, final String type) {
return new BaseMatcher<TextClassification>() {
@Override
public boolean matches(Object o) {
if (o instanceof TextClassification) {
TextClassification result = (TextClassification) o;
- final boolean typeRequirementSatisfied;
- String scheme;
- switch (type) {
- case TextClassifier.TYPE_EMAIL:
- scheme = result.getIntent().getData().getScheme();
- typeRequirementSatisfied = "mailto".equals(scheme);
- break;
- case TextClassifier.TYPE_URL:
- scheme = result.getIntent().getData().getScheme();
- typeRequirementSatisfied = "http".equals(scheme)
- || "https".equals(scheme);
- break;
- case TextClassifier.TYPE_ADDRESS:
- scheme = result.getIntent().getData().getScheme();
- typeRequirementSatisfied = "geo".equals(scheme);
- break;
- default:
- typeRequirementSatisfied = true;
- }
-
- return typeRequirementSatisfied
- && text.equals(result.getText())
+ return text.equals(result.getText())
&& result.getEntityCount() > 0
- && type.equals(result.getEntity(0))
- && (intentUri == null
- || intentUri.equals(result.getIntent().getDataString()));
- // TODO: Include other properties.
+ && type.equals(result.getEntity(0));
}
return false;
}
@@ -395,8 +387,7 @@
@Override
public void describeTo(Description description) {
description.appendText("text=").appendValue(text)
- .appendText(", type=").appendValue(type)
- .appendText(", intent.data=").appendValue(intentUri);
+ .appendText(", type=").appendValue(type);
}
};
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
index ada19fc..09ace4c 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
@@ -17,15 +17,19 @@
package android.view.textclassifier;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import android.app.PendingIntent;
+import android.app.RemoteAction;
+import android.content.Context;
import android.content.Intent;
-import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Icon;
import android.os.LocaleList;
import android.os.Parcel;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
@@ -33,58 +37,56 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Calendar;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.Locale;
-import java.util.TimeZone;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TextClassificationTest {
- public BitmapDrawable generateTestDrawable(int width, int height, int colorValue) {
+ public Icon generateTestIcon(int width, int height, int colorValue) {
final int numPixels = width * height;
final int[] colors = new int[numPixels];
for (int i = 0; i < numPixels; ++i) {
colors[i] = colorValue;
}
final Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
- final BitmapDrawable drawable = new BitmapDrawable(Resources.getSystem(), bitmap);
- drawable.setTargetDensity(bitmap.getDensity());
- return drawable;
+ return Icon.createWithBitmap(bitmap);
}
@Test
public void testParcel() {
+ final Context context = InstrumentationRegistry.getTargetContext();
final String text = "text";
- final BitmapDrawable primaryIcon = generateTestDrawable(16, 16, Color.RED);
- final String primaryLabel = "primarylabel";
- final Intent primaryIntent = new Intent("primaryintentaction");
- final View.OnClickListener primaryOnClick = v -> { };
- final BitmapDrawable secondaryIcon0 = generateTestDrawable(32, 288, Color.GREEN);
- final String secondaryLabel0 = "secondarylabel0";
- final Intent secondaryIntent0 = new Intent("secondaryintentaction0");
- final BitmapDrawable secondaryIcon1 = generateTestDrawable(576, 288, Color.BLUE);
- final String secondaryLabel1 = "secondaryLabel1";
- final Intent secondaryIntent1 = null;
- final BitmapDrawable secondaryIcon2 = null;
- final String secondaryLabel2 = null;
- final Intent secondaryIntent2 = new Intent("secondaryintentaction2");
- final ColorDrawable secondaryIcon3 = new ColorDrawable(Color.CYAN);
- final String secondaryLabel3 = null;
- final Intent secondaryIntent3 = null;
- final String signature = "signature";
+
+ final Icon primaryIcon = generateTestIcon(576, 288, Color.BLUE);
+ final String primaryLabel = "primaryLabel";
+ final String primaryDescription = "primaryDescription";
+ final Intent primaryIntent = new Intent("primaryIntentAction");
+ final PendingIntent primaryPendingIntent = PendingIntent.getActivity(context, 0,
+ primaryIntent, 0);
+ final RemoteAction remoteAction0 = new RemoteAction(primaryIcon, primaryLabel,
+ primaryDescription, primaryPendingIntent);
+
+ final Icon secondaryIcon = generateTestIcon(32, 288, Color.GREEN);
+ final String secondaryLabel = "secondaryLabel";
+ final String secondaryDescription = "secondaryDescription";
+ final Intent secondaryIntent = new Intent("secondaryIntentAction");
+ final PendingIntent secondaryPendingIntent = PendingIntent.getActivity(context, 0,
+ secondaryIntent, 0);
+ final RemoteAction remoteAction1 = new RemoteAction(secondaryIcon, secondaryLabel,
+ secondaryDescription, secondaryPendingIntent);
+
+ final String id = "id";
final TextClassification reference = new TextClassification.Builder()
.setText(text)
- .setPrimaryAction(primaryIntent, primaryLabel, primaryIcon)
- .setOnClickListener(primaryOnClick)
- .addSecondaryAction(null, null, null) // ignored
- .addSecondaryAction(secondaryIntent0, secondaryLabel0, secondaryIcon0)
- .addSecondaryAction(secondaryIntent1, secondaryLabel1, secondaryIcon1)
- .addSecondaryAction(secondaryIntent2, secondaryLabel2, secondaryIcon2)
- .addSecondaryAction(secondaryIntent3, secondaryLabel3, secondaryIcon3)
+ .addAction(remoteAction0)
+ .addAction(remoteAction1)
.setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
.setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
- .setSignature(signature)
+ .setId(id)
.build();
// Parcel and unparcel
@@ -94,46 +96,26 @@
final TextClassification result = TextClassification.CREATOR.createFromParcel(parcel);
assertEquals(text, result.getText());
- assertEquals(signature, result.getSignature());
- assertEquals(4, result.getSecondaryActionsCount());
+ assertEquals(id, result.getId());
+ assertEquals(2, result.getActions().size());
- // Primary action (re-use existing icon).
- final Bitmap resPrimaryIcon = ((BitmapDrawable) result.getIcon()).getBitmap();
- assertEquals(primaryIcon.getBitmap().getPixel(0, 0), resPrimaryIcon.getPixel(0, 0));
- assertEquals(16, resPrimaryIcon.getWidth());
- assertEquals(16, resPrimaryIcon.getHeight());
- assertEquals(primaryLabel, result.getLabel());
- assertEquals(primaryIntent.getAction(), result.getIntent().getAction());
- assertEquals(null, result.getOnClickListener()); // Non-parcelable.
+ // Legacy API.
+ assertNull(result.getIcon());
+ assertNull(result.getLabel());
+ assertNull(result.getIntent());
+ assertNull(result.getOnClickListener());
- // Secondary action 0 (scale with height limit).
- final Bitmap resSecondaryIcon0 = ((BitmapDrawable) result.getSecondaryIcon(0)).getBitmap();
- assertEquals(secondaryIcon0.getBitmap().getPixel(0, 0), resSecondaryIcon0.getPixel(0, 0));
- assertEquals(16, resSecondaryIcon0.getWidth());
- assertEquals(144, resSecondaryIcon0.getHeight());
- assertEquals(secondaryLabel0, result.getSecondaryLabel(0));
- assertEquals(secondaryIntent0.getAction(), result.getSecondaryIntent(0).getAction());
+ // Primary action.
+ final RemoteAction primaryAction = result.getActions().get(0);
+ assertEquals(primaryLabel, primaryAction.getTitle());
+ assertEquals(primaryDescription, primaryAction.getContentDescription());
+ assertEquals(primaryPendingIntent, primaryAction.getActionIntent());
- // Secondary action 1 (scale with width limit).
- final Bitmap resSecondaryIcon1 = ((BitmapDrawable) result.getSecondaryIcon(1)).getBitmap();
- assertEquals(secondaryIcon1.getBitmap().getPixel(0, 0), resSecondaryIcon1.getPixel(0, 0));
- assertEquals(144, resSecondaryIcon1.getWidth());
- assertEquals(72, resSecondaryIcon1.getHeight());
- assertEquals(secondaryLabel1, result.getSecondaryLabel(1));
- assertEquals(null, result.getSecondaryIntent(1));
-
- // Secondary action 2 (no icon).
- assertEquals(null, result.getSecondaryIcon(2));
- assertEquals(null, result.getSecondaryLabel(2));
- assertEquals(secondaryIntent2.getAction(), result.getSecondaryIntent(2).getAction());
-
- // Secondary action 3 (convert non-bitmap drawable with negative size).
- final Bitmap resSecondaryIcon3 = ((BitmapDrawable) result.getSecondaryIcon(3)).getBitmap();
- assertEquals(secondaryIcon3.getColor(), resSecondaryIcon3.getPixel(0, 0));
- assertEquals(1, resSecondaryIcon3.getWidth());
- assertEquals(1, resSecondaryIcon3.getHeight());
- assertEquals(null, result.getSecondaryLabel(3));
- assertEquals(null, result.getSecondaryIntent(3));
+ // Secondary action.
+ final RemoteAction secondaryAction = result.getActions().get(1);
+ assertEquals(secondaryLabel, secondaryAction.getTitle());
+ assertEquals(secondaryDescription, secondaryAction.getContentDescription());
+ assertEquals(secondaryPendingIntent, secondaryAction.getActionIntent());
// Entities.
assertEquals(2, result.getEntityCount());
@@ -144,21 +126,66 @@
}
@Test
- public void testParcelOptions() {
- Calendar referenceTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US);
- referenceTime.setTimeInMillis(946771200000L); // 2000-01-02
+ public void testParcelLegacy() {
+ final Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ final String text = "text";
- TextClassification.Options reference = new TextClassification.Options();
- reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
- reference.setReferenceTime(referenceTime);
+ final Icon icon = generateTestIcon(384, 192, Color.BLUE);
+ final String label = "label";
+ final Intent intent = new Intent("intent");
+ final View.OnClickListener onClickListener = v -> { };
+
+ final String id = "id";
+ final TextClassification reference = new TextClassification.Builder()
+ .setText(text)
+ .setIcon(icon.loadDrawable(context))
+ .setLabel(label)
+ .setIntent(intent)
+ .setOnClickListener(onClickListener)
+ .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
+ .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
+ .setId(id)
+ .build();
+
+ // Parcel and unparcel
+ final Parcel parcel = Parcel.obtain();
+ reference.writeToParcel(parcel, reference.describeContents());
+ parcel.setDataPosition(0);
+ final TextClassification result = TextClassification.CREATOR.createFromParcel(parcel);
+
+ final Bitmap resultIcon = ((BitmapDrawable) result.getIcon()).getBitmap();
+ assertEquals(icon.getBitmap().getPixel(0, 0), resultIcon.getPixel(0, 0));
+ assertEquals(192, resultIcon.getWidth());
+ assertEquals(96, resultIcon.getHeight());
+ assertEquals(label, result.getLabel());
+ assertEquals(intent.getAction(), result.getIntent().getAction());
+ assertNull(result.getOnClickListener());
+ }
+
+ @Test
+ public void testParcelParcel() {
+ final ZonedDateTime referenceTime = ZonedDateTime.ofInstant(
+ Instant.ofEpochMilli(946771200000L), // 2000-01-02
+ ZoneId.of("UTC"));
+ final String text = "text";
+
+ final TextClassification.Request reference =
+ new TextClassification.Request.Builder(text, 0, text.length())
+ .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+ .setReferenceTime(referenceTime)
+ .build();
// Parcel and unparcel.
final Parcel parcel = Parcel.obtain();
reference.writeToParcel(parcel, reference.describeContents());
parcel.setDataPosition(0);
- TextClassification.Options result = TextClassification.Options.CREATOR.createFromParcel(
- parcel);
+ final TextClassification.Request result =
+ TextClassification.Request.CREATOR.createFromParcel(parcel);
+ assertEquals(text, result.getText());
+ assertEquals(0, result.getStartIndex());
+ assertEquals(text.length(), result.getEndIndex());
+ assertEquals(referenceTime, result.getReferenceTime());
assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
assertEquals(referenceTime, result.getReferenceTime());
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
index 4279675..fb09e3e 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
@@ -20,12 +20,10 @@
import android.os.LocaleList;
import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,17 +38,6 @@
@RunWith(AndroidJUnit4.class)
public class TextLinksTest {
- private TextClassificationManager mTcm;
- private TextClassifier mClassifier;
-
- @Before
- public void setup() {
- mTcm = InstrumentationRegistry.getTargetContext()
- .getSystemService(TextClassificationManager.class);
- mTcm.setTextClassifier(null);
- mClassifier = mTcm.getTextClassifier();
- }
-
private Map<String, Float> getEntityScores(float address, float phone, float other) {
final Map<String, Float> result = new ArrayMap<>();
if (address > 0.f) {
@@ -99,20 +86,22 @@
@Test
public void testParcelOptions() {
- TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create(
+ final TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create(
Arrays.asList(TextClassifier.HINT_TEXT_IS_EDITABLE),
Arrays.asList("a", "b", "c"),
Arrays.asList("b"));
- TextLinks.Options reference = new TextLinks.Options();
- reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
- reference.setEntityConfig(entityConfig);
+ final TextLinks.Request reference = new TextLinks.Request.Builder("text")
+ .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+ .setEntityConfig(entityConfig)
+ .build();
// Parcel and unparcel.
final Parcel parcel = Parcel.obtain();
reference.writeToParcel(parcel, reference.describeContents());
parcel.setDataPosition(0);
- TextLinks.Options result = TextLinks.Options.CREATOR.createFromParcel(parcel);
+ final TextLinks.Request result = TextLinks.Request.CREATOR.createFromParcel(parcel);
+ assertEquals("text", result.getText());
assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
assertEquals(new String[]{TextClassifier.HINT_TEXT_IS_EDITABLE},
result.getEntityConfig().getHints().toArray());
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
index a6ea021..4855dad 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
@@ -17,7 +17,6 @@
package android.view.textclassifier;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import android.os.LocaleList;
import android.os.Parcel;
@@ -37,12 +36,12 @@
public void testParcel() {
final int startIndex = 13;
final int endIndex = 37;
- final String signature = "signature";
+ final String id = "id";
final TextSelection reference = new TextSelection.Builder(startIndex, endIndex)
.setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
.setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
.setEntityType(TextClassifier.TYPE_URL, 0.1f)
- .setSignature(signature)
+ .setId(id)
.build();
// Parcel and unparcel
@@ -53,7 +52,7 @@
assertEquals(startIndex, result.getSelectionStartIndex());
assertEquals(endIndex, result.getSelectionEndIndex());
- assertEquals(signature, result.getSignature());
+ assertEquals(id, result.getId());
assertEquals(3, result.getEntityCount());
assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0));
@@ -65,18 +64,22 @@
}
@Test
- public void testParcelOptions() {
- TextSelection.Options reference = new TextSelection.Options();
- reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
- reference.setDarkLaunchAllowed(true);
+ public void testParcelRequest() {
+ final String text = "text";
+ final TextSelection.Request reference =
+ new TextSelection.Request.Builder(text, 0, text.length())
+ .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+ .build();
// Parcel and unparcel.
final Parcel parcel = Parcel.obtain();
reference.writeToParcel(parcel, reference.describeContents());
parcel.setDataPosition(0);
- TextSelection.Options result = TextSelection.Options.CREATOR.createFromParcel(parcel);
+ final TextSelection.Request result = TextSelection.Request.CREATOR.createFromParcel(parcel);
+ assertEquals(text, result.getText());
+ assertEquals(0, result.getStartIndex());
+ assertEquals(text.length(), result.getEndIndex());
assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
- assertTrue(result.isDarkLaunchAllowed());
}
}
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 79433ac..320a7ac 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -80,6 +80,7 @@
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
+import android.view.textclassifier.TextLinksParams;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
import com.android.frameworks.coretests.R;
@@ -381,8 +382,12 @@
mActivity.getSystemService(TextClassificationManager.class);
TextClassifier textClassifier = textClassificationManager.getTextClassifier();
Spannable content = new SpannableString("Call me at +19148277737");
- TextLinks links = textClassifier.generateLinks(content);
- links.apply(content, TextLinks.APPLY_STRATEGY_REPLACE, null, false /* allowPrefix */);
+ TextLinks.Request request = new TextLinks.Request.Builder(content).build();
+ TextLinks links = textClassifier.generateLinks(request);
+ TextLinksParams applyParams = new TextLinksParams.Builder()
+ .setApplyStrategy(TextLinks.APPLY_STRATEGY_REPLACE)
+ .build();
+ applyParams.apply(content, links);
mActivityRule.runOnUiThread(() -> {
textView.setText(content);
diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java
index 2b5b27b..4f1efbf 100644
--- a/core/tests/coretests/src/android/widget/TextViewTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewTest.java
@@ -17,6 +17,7 @@
package android.widget;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
@@ -32,9 +33,11 @@
import android.support.test.runner.AndroidJUnit4;
import android.text.GetChars;
import android.text.Layout;
+import android.text.PrecomputedText;
import android.text.Selection;
import android.text.Spannable;
import android.view.View;
+import android.widget.TextView.BufferType;
import org.junit.Before;
import org.junit.Rule;
@@ -241,6 +244,82 @@
mTextView.onTextContextMenuItem(TextView.ID_CUT);
}
+ @Test
+ public void testUseDynamicLayout() {
+ mTextView = new TextView(mActivity);
+ mTextView.setTextIsSelectable(true);
+ String text = "HelloWorld";
+ PrecomputedText precomputed =
+ PrecomputedText.create(text, mTextView.getTextMetricsParams());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(text);
+ assertFalse(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(text);
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(precomputed);
+ assertFalse(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(precomputed);
+ assertTrue(mTextView.useDynamicLayout());
+ }
+
+ @Test
+ public void testUseDynamicLayout_SPANNABLE() {
+ mTextView = new TextView(mActivity);
+ mTextView.setTextIsSelectable(true);
+ String text = "HelloWorld";
+ PrecomputedText precomputed =
+ PrecomputedText.create(text, mTextView.getTextMetricsParams());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(text, BufferType.SPANNABLE);
+ android.util.Log.e("TextViewTest", "Text:" + mTextView.getText().getClass().getName());
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(text, BufferType.SPANNABLE);
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(precomputed, BufferType.SPANNABLE);
+ assertFalse(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(precomputed, BufferType.SPANNABLE);
+ assertTrue(mTextView.useDynamicLayout());
+ }
+
+ @Test
+ public void testUseDynamicLayout_EDITABLE() {
+ mTextView = new TextView(mActivity);
+ mTextView.setTextIsSelectable(true);
+ String text = "HelloWorld";
+ PrecomputedText precomputed =
+ PrecomputedText.create(text, mTextView.getTextMetricsParams());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(text, BufferType.EDITABLE);
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(text, BufferType.EDITABLE);
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(false);
+ mTextView.setText(precomputed, BufferType.EDITABLE);
+ assertTrue(mTextView.useDynamicLayout());
+
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(precomputed, BufferType.EDITABLE);
+ assertTrue(mTextView.useDynamicLayout());
+ }
+
private String createLongText() {
int size = 600 * 1000;
final StringBuilder builder = new StringBuilder(size);
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index acf3022..992b46f 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -273,53 +273,6 @@
}
@SmallTest
- public void testAppBluetoothScan_workChainAccounting() throws Exception {
- final MockClocks clocks = new MockClocks();MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
- long curr = 0; // realtime in us
-
- // On battery
- curr = 1000 * (clocks.realtime = clocks.uptime = 100);
- bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr); // on battery
-
- // App in foreground
- bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
-
- WorkSource ws = new WorkSource();
- ws.createWorkChain().addNode(500, "foo");
- ws.createWorkChain().addNode(500, "bar");
-
- // Test start / stop and reset with isUnoptimized == false.
- bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
- BatteryStatsImpl.Uid stats = (BatteryStatsImpl.Uid) bi.getUidStats().get(500);
- assertEquals(ws.getWorkChains(), stats.getAllBluetoothWorkChains());
- assertNull(stats.getUnoptimizedBluetoothWorkChains());
-
- bi.noteBluetoothScanStoppedFromSourceLocked(ws, false);
- assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
- assertNull(stats.getUnoptimizedBluetoothWorkChains());
-
- bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
- bi.noteResetBluetoothScanLocked();
- assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
- assertNull(stats.getUnoptimizedBluetoothWorkChains());
-
- // Test start / stop and reset with isUnoptimized == true.
- bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
- stats = (BatteryStatsImpl.Uid) bi.getUidStats().get(500);
- assertEquals(ws.getWorkChains(), stats.getAllBluetoothWorkChains());
- assertEquals(ws.getWorkChains(), stats.getUnoptimizedBluetoothWorkChains());
-
- bi.noteBluetoothScanStoppedFromSourceLocked(ws, true);
- assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
- assertTrue(stats.getUnoptimizedBluetoothWorkChains().isEmpty());
-
- bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
- bi.noteResetBluetoothScanLocked();
- assertTrue(stats.getAllBluetoothWorkChains().isEmpty());
- assertTrue(stats.getUnoptimizedBluetoothWorkChains().isEmpty());
- }
-
- @SmallTest
public void testJob() throws Exception {
final MockClocks clocks = new MockClocks();
MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
diff --git a/data/etc/hiddenapi-package-whitelist.xml b/data/etc/hiddenapi-package-whitelist.xml
index bacddf14..95aff9a 100644
--- a/data/etc/hiddenapi-package-whitelist.xml
+++ b/data/etc/hiddenapi-package-whitelist.xml
@@ -55,6 +55,7 @@
<hidden-api-whitelisted-app package="com.android.companiondevicemanager" />
<hidden-api-whitelisted-app package="com.android.customlocale2" />
<hidden-api-whitelisted-app package="com.android.defcontainer" />
+ <hidden-api-whitelisted-app package="com.android.development" />
<hidden-api-whitelisted-app package="com.android.documentsui" />
<hidden-api-whitelisted-app package="com.android.dreams.basic" />
<hidden-api-whitelisted-app package="com.android.egg" />
@@ -64,6 +65,7 @@
<hidden-api-whitelisted-app package="com.android.gallery" />
<hidden-api-whitelisted-app package="com.android.hotspot2" />
<hidden-api-whitelisted-app package="com.android.keychain" />
+ <hidden-api-whitelisted-app package="com.android.launcher3" />
<hidden-api-whitelisted-app package="com.android.location.fused" />
<hidden-api-whitelisted-app package="com.android.managedprovisioning" />
<hidden-api-whitelisted-app package="com.android.mms.service" />
diff --git a/data/keyboards/Android.mk b/data/keyboards/Android.mk
index 2daef0c..7949c77 100644
--- a/data/keyboards/Android.mk
+++ b/data/keyboards/Android.mk
@@ -28,7 +28,7 @@
validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX)
$(LOCAL_BUILT_MODULE): PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps)
$(LOCAL_BUILT_MODULE) : $(framework_keylayouts) $(framework_keycharmaps) $(framework_keyconfigs) | $(validatekeymaps)
- $(hide) -q $(PRIVATE_VALIDATEKEYMAPS) $^
+ $(hide) $(PRIVATE_VALIDATEKEYMAPS) -q $^
$(hide) mkdir -p $(dir $@) && touch $@
# Run validatekeymaps uncondionally for platform build.
diff --git a/docs/html/reference/images/display_cutout/default_mode/fullscreen_letterbox.png b/docs/html/reference/images/display_cutout/default_mode/fullscreen_letterbox.png
new file mode 100644
index 0000000..8602290
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/default_mode/fullscreen_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/default_mode/landscape.png b/docs/html/reference/images/display_cutout/default_mode/landscape.png
new file mode 100644
index 0000000..be112f4
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/default_mode/landscape.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/default_mode/landscape_corner.png b/docs/html/reference/images/display_cutout/default_mode/landscape_corner.png
new file mode 100644
index 0000000..7aa92b4
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/default_mode/landscape_corner.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/default_mode/portrait.png b/docs/html/reference/images/display_cutout/default_mode/portrait.png
new file mode 100644
index 0000000..6392ad5
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/default_mode/portrait.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/default_mode/portrait_corner.png b/docs/html/reference/images/display_cutout/default_mode/portrait_corner.png
new file mode 100644
index 0000000..dc8e6d0
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/default_mode/portrait_corner.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/never_mode/landscape.png b/docs/html/reference/images/display_cutout/never_mode/landscape.png
new file mode 100644
index 0000000..be112f4
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/never_mode/landscape.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/never_mode/portrait_top_letterbox.png b/docs/html/reference/images/display_cutout/never_mode/portrait_top_letterbox.png
new file mode 100644
index 0000000..fc7dfcf
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/never_mode/portrait_top_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/fullscreen_corner_no_letterbox.png b/docs/html/reference/images/display_cutout/short_edge/fullscreen_corner_no_letterbox.png
new file mode 100644
index 0000000..09f942d
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/fullscreen_corner_no_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/fullscreen_side_letterbox.png b/docs/html/reference/images/display_cutout/short_edge/fullscreen_side_letterbox.png
new file mode 100644
index 0000000..9aafc58
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/fullscreen_side_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/fullscreen_top_no_letterbox.png b/docs/html/reference/images/display_cutout/short_edge/fullscreen_top_no_letterbox.png
new file mode 100644
index 0000000..75e913b
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/fullscreen_top_no_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/landscape_corner.png b/docs/html/reference/images/display_cutout/short_edge/landscape_corner.png
new file mode 100644
index 0000000..d9e0f99
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/landscape_corner.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/landscape_sideboxed.png b/docs/html/reference/images/display_cutout/short_edge/landscape_sideboxed.png
new file mode 100644
index 0000000..9d44493
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/landscape_sideboxed.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/landscape_top_no_letterbox.png b/docs/html/reference/images/display_cutout/short_edge/landscape_top_no_letterbox.png
new file mode 100644
index 0000000..ac023c5
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/landscape_top_no_letterbox.png
Binary files differ
diff --git a/docs/html/reference/images/display_cutout/short_edge/portrait_side_letterbox.png b/docs/html/reference/images/display_cutout/short_edge/portrait_side_letterbox.png
new file mode 100644
index 0000000..50228db
--- /dev/null
+++ b/docs/html/reference/images/display_cutout/short_edge/portrait_side_letterbox.png
Binary files differ
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 5dc4463..71ee6c2 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -41,13 +41,19 @@
/**
* Should only be assigned in constructors (or setBitmap if software canvas),
* freed by NativeAllocation.
+ * @hide
*/
protected long mNativeCanvasWrapper;
/**
* Used to determine when compatibility scaling is in effect.
+ * @hide
*/
protected int mScreenDensity = Bitmap.DENSITY_NONE;
+
+ /**
+ * @hide
+ */
protected int mDensity = Bitmap.DENSITY_NONE;
private boolean mAllowHwBitmapsInSwMode = false;
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index b0bc102..3cc92bc 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -47,6 +47,7 @@
* Canvas and Drawables</a> developer guide.</p></div>
*/
public class Canvas extends BaseCanvas {
+ private static int sCompatiblityVersion = 0;
/** @hide */
public static boolean sCompatibilityRestore = false;
/** @hide */
@@ -306,7 +307,7 @@
/**
* Restore the current matrix when restore() is called.
- *
+ * @removed
* @deprecated Use the flagless version of {@link #save()}, {@link #saveLayer(RectF, Paint)} or
* {@link #saveLayerAlpha(RectF, int)}. For saveLayer() calls the matrix
* was always restored for {@link #isHardwareAccelerated() Hardware accelerated}
@@ -318,6 +319,7 @@
/**
* Restore the current clip when restore() is called.
*
+ * @removed
* @deprecated Use the flagless version of {@link #save()}, {@link #saveLayer(RectF, Paint)} or
* {@link #saveLayerAlpha(RectF, int)}. For saveLayer() calls the clip
* was always restored for {@link #isHardwareAccelerated() Hardware accelerated}
@@ -329,6 +331,7 @@
/**
* The layer requires a per-pixel alpha channel.
*
+ * @removed
* @deprecated This flag is ignored. Use the flagless version of {@link #saveLayer(RectF, Paint)}
* {@link #saveLayerAlpha(RectF, int)}.
*/
@@ -337,6 +340,7 @@
/**
* The layer requires full 8-bit precision for each color channel.
*
+ * @removed
* @deprecated This flag is ignored. Use the flagless version of {@link #saveLayer(RectF, Paint)}
* {@link #saveLayerAlpha(RectF, int)}.
*/
@@ -349,6 +353,7 @@
* <code>saveLayerAlpha()</code> variants. Not passing this flag generally
* triggers extremely poor performance with hardware accelerated rendering.
*
+ * @removed
* @deprecated This flag results in poor performance and the same effect can be achieved with
* a single layer or multiple draw commands with different clips.
*
@@ -367,6 +372,14 @@
*/
public static final int ALL_SAVE_FLAG = 0x1F;
+ private static void checkValidSaveFlags(int saveFlags) {
+ if (sCompatiblityVersion >= Build.VERSION_CODES.P
+ && saveFlags != ALL_SAVE_FLAG) {
+ throw new IllegalArgumentException(
+ "Invalid Layer Save Flag - only ALL_SAVE_FLAGS is allowed");
+ }
+ }
+
/**
* Saves the current matrix and clip onto a private stack.
* <p>
@@ -393,6 +406,7 @@
* restore() is made, those calls will be forgotten, and the settings that
* existed before the save() will be reinstated.
*
+ * @removed
* @deprecated Use {@link #save()} instead.
* @param saveFlags flag bits that specify which parts of the Canvas state
* to save/restore
@@ -407,10 +421,8 @@
* redirects drawing to an offscreen bitmap.
* <p class="note"><strong>Note:</strong> this method is very expensive,
* incurring more than double rendering cost for contained content. Avoid
- * using this method, especially if the bounds provided are large, or if
- * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the
- * {@code saveFlags} parameter. It is recommended to use a
- * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
+ * using this method, especially if the bounds provided are large. It is
+ * recommended to use a {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
* to apply an xfermode, color filter, or alpha, as it will perform much
* better than this method.
* <p>
@@ -424,6 +436,9 @@
* {@link Paint#getColorFilter() ColorFilter} are applied when the
* offscreen bitmap is drawn back when restore() is called.
*
+ * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+ * {@code saveFlags} is {@link #ALL_SAVE_FLAG}. All other flags are ignored.
+ *
* @deprecated Use {@link #saveLayer(RectF, Paint)} instead.
* @param bounds May be null. The maximum size the offscreen bitmap
* needs to be (in local coordinates)
@@ -437,7 +452,9 @@
if (bounds == null) {
bounds = new RectF(getClipBounds());
}
- return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags);
+ checkValidSaveFlags(saveFlags);
+ return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint,
+ ALL_SAVE_FLAG);
}
/**
@@ -471,15 +488,26 @@
}
/**
+ * @hide
+ */
+ public int saveUnclippedLayer(int left, int top, int right, int bottom) {
+ return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom, 0, 0);
+ }
+
+ /**
* Helper version of saveLayer() that takes 4 values rather than a RectF.
*
+ * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+ * {@code saveFlags} is {@link #ALL_SAVE_FLAG}. All other flags are ignored.
+ *
* @deprecated Use {@link #saveLayer(float, float, float, float, Paint)} instead.
*/
public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint,
@Saveflags int saveFlags) {
+ checkValidSaveFlags(saveFlags);
return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom,
paint != null ? paint.getNativeInstance() : 0,
- saveFlags);
+ ALL_SAVE_FLAG);
}
/**
@@ -495,10 +523,8 @@
* redirects drawing to an offscreen bitmap.
* <p class="note"><strong>Note:</strong> this method is very expensive,
* incurring more than double rendering cost for contained content. Avoid
- * using this method, especially if the bounds provided are large, or if
- * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the
- * {@code saveFlags} parameter. It is recommended to use a
- * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
+ * using this method, especially if the bounds provided are large. It is
+ * recommended to use a {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
* to apply an xfermode, color filter, or alpha, as it will perform much
* better than this method.
* <p>
@@ -510,6 +536,9 @@
* The {@code alpha} parameter is applied when the offscreen bitmap is
* drawn back when restore() is called.
*
+ * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+ * {@code saveFlags} is {@link #ALL_SAVE_FLAG}. All other flags are ignored.
+ *
* @deprecated Use {@link #saveLayerAlpha(RectF, int)} instead.
* @param bounds The maximum size the offscreen bitmap needs to be
* (in local coordinates)
@@ -523,7 +552,9 @@
if (bounds == null) {
bounds = new RectF(getClipBounds());
}
- return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha, saveFlags);
+ checkValidSaveFlags(saveFlags);
+ return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha,
+ ALL_SAVE_FLAG);
}
/**
@@ -542,13 +573,17 @@
/**
* Helper for saveLayerAlpha() that takes 4 values instead of a RectF.
*
+ * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+ * {@code saveFlags} is {@link #ALL_SAVE_FLAG}. All other flags are ignored.
+ *
* @deprecated Use {@link #saveLayerAlpha(float, float, float, float, int)} instead.
*/
public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
@Saveflags int saveFlags) {
+ checkValidSaveFlags(saveFlags);
alpha = Math.min(255, Math.max(0, alpha));
return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom,
- alpha, saveFlags);
+ alpha, ALL_SAVE_FLAG);
}
/**
@@ -738,6 +773,14 @@
return m;
}
+ private static void checkValidClipOp(@NonNull Region.Op op) {
+ if (sCompatiblityVersion >= Build.VERSION_CODES.P
+ && op != Region.Op.INTERSECT && op != Region.Op.DIFFERENCE) {
+ throw new IllegalArgumentException(
+ "Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed");
+ }
+ }
+
/**
* Modify the current clip with the specified rectangle.
*
@@ -750,9 +793,13 @@
* are intended to only expand the clip as a result of a restore operation. This enables a view
* parent to clip a canvas to clearly define the maximal drawing area of its children. The
* recommended alternative calls are {@link #clipRect(RectF)} and {@link #clipOutRect(RectF)};
+ *
+ * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and
+ * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters.
*/
@Deprecated
public boolean clipRect(@NonNull RectF rect, @NonNull Region.Op op) {
+ checkValidClipOp(op);
return nClipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom,
op.nativeInt);
}
@@ -770,9 +817,13 @@
* are intended to only expand the clip as a result of a restore operation. This enables a view
* parent to clip a canvas to clearly define the maximal drawing area of its children. The
* recommended alternative calls are {@link #clipRect(Rect)} and {@link #clipOutRect(Rect)};
+ *
+ * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and
+ * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters.
*/
@Deprecated
public boolean clipRect(@NonNull Rect rect, @NonNull Region.Op op) {
+ checkValidClipOp(op);
return nClipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom,
op.nativeInt);
}
@@ -846,10 +897,14 @@
* parent to clip a canvas to clearly define the maximal drawing area of its children. The
* recommended alternative calls are {@link #clipRect(float,float,float,float)} and
* {@link #clipOutRect(float,float,float,float)};
+ *
+ * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and
+ * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters.
*/
@Deprecated
public boolean clipRect(float left, float top, float right, float bottom,
@NonNull Region.Op op) {
+ checkValidClipOp(op);
return nClipRect(mNativeCanvasWrapper, left, top, right, bottom, op.nativeInt);
}
@@ -932,9 +987,13 @@
* parent to clip a canvas to clearly define the maximal drawing area of its children. The
* recommended alternative calls are {@link #clipPath(Path)} and
* {@link #clipOutPath(Path)};
+ *
+ * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and
+ * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters.
*/
@Deprecated
public boolean clipPath(@NonNull Path path, @NonNull Region.Op op) {
+ checkValidClipOp(op);
return nClipPath(mNativeCanvasWrapper, path.readOnlyNI(), op.nativeInt);
}
@@ -1220,7 +1279,10 @@
}
/** @hide */
- public static void setCompatibilityVersion(int apiLevel) { nSetCompatibilityVersion(apiLevel); }
+ public static void setCompatibilityVersion(int apiLevel) {
+ sCompatiblityVersion = apiLevel;
+ nSetCompatibilityVersion(apiLevel);
+ }
private static native void nFreeCaches();
private static native void nFreeTextLayoutCaches();
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 5ca0ad6..31abf92 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -21,10 +21,12 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
+import android.annotation.AnyThread;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
+import android.annotation.WorkerThread;
import android.content.ContentResolver;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
@@ -57,14 +59,132 @@
import java.util.concurrent.atomic.AtomicBoolean;
/**
- * Class for decoding images as {@link Bitmap}s or {@link Drawable}s.
+ * <p>A class for converting encoded images (like {@code PNG}, {@code JPEG},
+ * {@code WEBP}, {@code GIF}, or {@code HEIF}) into {@link Drawable} or
+ * {@link Bitmap} objects.
+ *
+ * <p>To use it, first create a {@link Source Source} using one of the
+ * {@code createSource} overloads. For example, to decode from a {@link File}, call
+ * {@link #createSource(File)} and pass the result to {@link #decodeDrawable(Source)}
+ * or {@link #decodeBitmap(Source)}:
+ *
+ * <pre class="prettyprint">
+ * File file = new File(...);
+ * ImageDecoder.Source source = ImageDecoder.createSource(file);
+ * Drawable drawable = ImageDecoder.decodeDrawable(source);
+ * </pre>
+ *
+ * <p>To change the default settings, pass the {@link Source Source} and an
+ * {@link OnHeaderDecodedListener OnHeaderDecodedListener} to
+ * {@link #decodeDrawable(Source, OnHeaderDecodedListener)} or
+ * {@link #decodeBitmap(Source, OnHeaderDecodedListener)}. For example, to
+ * create a sampled image with half the width and height of the original image,
+ * call {@link #setTargetSampleSize setTargetSampleSize(2)} inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}:
+ *
+ * <pre class="prettyprint">
+ * OnHeaderDecodedListener listener = new OnHeaderDecodedListener() {
+ * public void onHeaderDecoded(ImageDecoder decoder, ImageInfo info, Source source) {
+ * decoder.setTargetSampleSize(2);
+ * }
+ * };
+ * Drawable drawable = ImageDecoder.decodeDrawable(source, listener);
+ * </pre>
+ *
+ * <p>The {@link ImageInfo ImageInfo} contains information about the encoded image, like
+ * its width and height, and the {@link Source Source} can be used to match to a particular
+ * {@link Source Source} if a single {@link OnHeaderDecodedListener OnHeaderDecodedListener}
+ * is used with multiple {@link Source Source} objects.
+ *
+ * <p>The {@link OnHeaderDecodedListener OnHeaderDecodedListener} can also be implemented
+ * as a lambda:
+ *
+ * <pre class="prettyprint">
+ * Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -> {
+ * decoder.setTargetSampleSize(2);
+ * });
+ * </pre>
+ *
+ * <p>If the encoded image is an animated {@code GIF} or {@code WEBP},
+ * {@link #decodeDrawable decodeDrawable} will return an {@link AnimatedImageDrawable}. To
+ * start its animation, call {@link AnimatedImageDrawable#start AnimatedImageDrawable.start()}:
+ *
+ * <pre class="prettyprint">
+ * Drawable drawable = ImageDecoder.decodeDrawable(source);
+ * if (drawable instanceof AnimatedImageDrawable) {
+ * ((AnimatedImageDrawable) drawable).start();
+ * }
+ * </pre>
+ *
+ * <p>By default, a {@link Bitmap} created by {@link ImageDecoder} (including
+ * one that is inside a {@link Drawable}) will be immutable (i.e.
+ * {@link Bitmap#isMutable Bitmap.isMutable()} returns {@code false}), and it
+ * will typically have {@code Config} {@link Bitmap.Config#HARDWARE}. Although
+ * these properties can be changed with {@link #setMutableRequired setMutableRequired(true)}
+ * (which is only compatible with {@link #decodeBitmap(Source)} and
+ * {@link #decodeBitmap(Source, OnHeaderDecodedListener)}) and {@link #setAllocator},
+ * it is also possible to apply custom effects regardless of the mutability of
+ * the final returned object by passing a {@link PostProcessor} to
+ * {@link #setPostProcessor setPostProcessor}. A {@link PostProcessor} can also be a lambda:
+ *
+ * <pre class="prettyprint">
+ * Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -> {
+ * decoder.setPostProcessor((canvas) -> {
+ * // This will create rounded corners.
+ * Path path = new Path();
+ * path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
+ * int width = canvas.getWidth();
+ * int height = canvas.getHeight();
+ * path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
+ * Paint paint = new Paint();
+ * paint.setAntiAlias(true);
+ * paint.setColor(Color.TRANSPARENT);
+ * paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+ * canvas.drawPath(path, paint);
+ * return PixelFormat.TRANSLUCENT;
+ * });
+ * });
+ * </pre>
+ *
+ * <p>If the encoded image is incomplete or contains an error, or if an
+ * {@link Exception} occurs during decoding, a {@link DecodeException DecodeException}
+ * will be thrown. In some cases, the {@link ImageDecoder} may have decoded part of
+ * the image. In order to display the partial image, an
+ * {@link OnPartialImageListener OnPartialImageListener} must be passed to
+ * {@link #setOnPartialImageListener setOnPartialImageListener}. For example:
+ *
+ * <pre class="prettyprint">
+ * Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -> {
+ * decoder.setOnPartialImageListener((DecodeException e) -> {
+ * // Returning true indicates to create a Drawable or Bitmap even
+ * // if the whole image could not be decoded. Any remaining lines
+ * // will be blank.
+ * return true;
+ * });
+ * });
+ * </pre>
*/
public final class ImageDecoder implements AutoCloseable {
/** @hide **/
public static int sApiLevel;
/**
- * Source of the encoded image data.
+ * Source of encoded image data.
+ *
+ * <p>References the data that will be used to decode a {@link Drawable}
+ * or {@link Bitmap} in {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}. Constructing a {@code Source} (with
+ * one of the overloads of {@code createSource}) can be done on any thread
+ * because the construction simply captures values. The real work is done
+ * in {@link #decodeDrawable decodeDrawable} or {@link #decodeBitmap decodeBitmap}.
+ *
+ * <p>A {@code Source} object can be reused to create multiple versions of the
+ * same image. For example, to decode a full size image and its thumbnail,
+ * the same {@code Source} can be used once with no
+ * {@link OnHeaderDecodedListener OnHeaderDecodedListener} and once with an
+ * implementation of {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}
+ * that calls {@link #setTargetSize} with smaller dimensions. One {@code Source}
+ * even used simultaneously in multiple threads.</p>
*/
public static abstract class Source {
private Source() {}
@@ -120,7 +240,8 @@
int length = mBuffer.limit() - mBuffer.position();
return nCreate(mBuffer.array(), offset, length, this);
}
- return nCreate(mBuffer, mBuffer.position(), mBuffer.limit(), this);
+ ByteBuffer buffer = mBuffer.slice();
+ return nCreate(buffer, buffer.position(), buffer.limit(), this);
}
}
@@ -232,6 +353,8 @@
/**
* For backwards compatibility, this does *not* close the InputStream.
+ *
+ * Further, unlike other Sources, this one is not reusable.
*/
private static class InputStreamSource extends Source {
InputStreamSource(Resources res, InputStream is, int inputDensity) {
@@ -322,12 +445,17 @@
final Resources mResources;
final int mResId;
int mResDensity;
+ private Object mLock = new Object();
@Override
public Resources getResources() { return mResources; }
@Override
- public int getDensity() { return mResDensity; }
+ public int getDensity() {
+ synchronized (mLock) {
+ return mResDensity;
+ }
+ }
@Override
public ImageDecoder createImageDecoder() throws IOException {
@@ -336,10 +464,12 @@
// keep it alive.
InputStream is = mResources.openRawResource(mResId, value);
- if (value.density == TypedValue.DENSITY_DEFAULT) {
- mResDensity = DisplayMetrics.DENSITY_DEFAULT;
- } else if (value.density != TypedValue.DENSITY_NONE) {
- mResDensity = value.density;
+ synchronized (mLock) {
+ if (value.density == TypedValue.DENSITY_DEFAULT) {
+ mResDensity = DisplayMetrics.DENSITY_DEFAULT;
+ } else if (value.density != TypedValue.DENSITY_NONE) {
+ mResDensity = value.density;
+ }
}
return createFromAsset((AssetInputStream) is, this);
@@ -396,7 +526,7 @@
}
/**
- * Contains information about the encoded image.
+ * Information about an encoded image.
*/
public static class ImageInfo {
private final Size mSize;
@@ -426,12 +556,24 @@
/**
* Whether the image is animated.
*
- * <p>Calling {@link #decodeDrawable} will return an
- * {@link AnimatedImageDrawable}.</p>
+ * <p>If {@code true}, {@link #decodeDrawable decodeDrawable} will
+ * return an {@link AnimatedImageDrawable}.</p>
*/
public boolean isAnimated() {
return mDecoder.mAnimated;
}
+
+ /**
+ * If known, the color space the decoded bitmap will have. Note that the
+ * output color space is not guaranteed to be the color space the bitmap
+ * is encoded with. If not known (when the config is
+ * {@link Bitmap.Config#ALPHA_8} for instance), or there is an error,
+ * it is set to null.
+ */
+ @Nullable
+ public ColorSpace getColorSpace() {
+ return mDecoder.getColorSpace();
+ }
};
/** @removed
@@ -441,16 +583,25 @@
public static class IncompleteException extends IOException {};
/**
- * Optional listener supplied to {@link #decodeDrawable} or
- * {@link #decodeBitmap}.
+ * Interface for changing the default settings of a decode.
+ *
+ * <p>Supply an instance to
+ * {@link #decodeDrawable(Source, OnHeaderDecodedListener) decodeDrawable}
+ * or {@link #decodeBitmap(Source, OnHeaderDecodedListener) decodeBitmap},
+ * which will call {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}
+ * (in the same thread) once the size is known. The implementation of
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded} can then
+ * change the decode settings as desired.
*/
public static interface OnHeaderDecodedListener {
/**
- * Called when the header is decoded and the size is known.
+ * Called by {@link ImageDecoder} when the header has been decoded and
+ * the image size is known.
*
- * @param decoder allows changing the default settings of the decode.
- * @param info Information about the encoded image.
- * @param source that created the decoder.
+ * @param decoder the object performing the decode, for changing
+ * its default settings.
+ * @param info information about the encoded image.
+ * @param source object that created {@code decoder}.
*/
public void onHeaderDecoded(@NonNull ImageDecoder decoder,
@NonNull ImageInfo info, @NonNull Source source);
@@ -533,7 +684,10 @@
}
/**
- * Retrieve the {@link Source} that was interrupted.
+ * Retrieve the {@link Source Source} that was interrupted.
+ *
+ * <p>This can be used for equality checking to find the Source which
+ * failed to completely decode.</p>
*/
@NonNull
public Source getSource() {
@@ -555,25 +709,36 @@
}
/**
- * Optional listener supplied to the ImageDecoder.
+ * Interface for inspecting a {@link DecodeException DecodeException}
+ * and potentially preventing it from being thrown.
*
- * Without this listener, errors will throw {@link java.io.IOException}.
+ * <p>If an instance is passed to
+ * {@link #setOnPartialImageListener setOnPartialImageListener}, a
+ * {@link DecodeException DecodeException} that would otherwise have been
+ * thrown can be inspected inside
+ * {@link OnPartialImageListener#onPartialImage onPartialImage}.
+ * If {@link OnPartialImageListener#onPartialImage onPartialImage} returns
+ * {@code true}, a partial image will be created.
*/
public static interface OnPartialImageListener {
/**
- * Called when there is only a partial image to display.
+ * Called by {@link ImageDecoder} when there is only a partial image to
+ * display.
*
- * If decoding is interrupted after having decoded a partial image,
- * this listener lets the client know that and allows them to
- * optionally finish the rest of the decode/creation process to create
- * a partial {@link Drawable}/{@link Bitmap}.
+ * <p>If decoding is interrupted after having decoded a partial image,
+ * this method will be called. The implementation can inspect the
+ * {@link DecodeException DecodeException} and optionally finish the
+ * rest of the decode creation process to create a partial {@link Drawable}
+ * or {@link Bitmap}.
*
- * @param e containing information about the decode interruption.
- * @return True to create and return a {@link Drawable}/{@link Bitmap}
- * with partial data. False (which is the default) to abort the
- * decode and throw {@code e}.
+ * @param exception exception containing information about the
+ * decode interruption.
+ * @return {@code true} to create and return a {@link Drawable} or
+ * {@link Bitmap} with partial data. {@code false} (which is the
+ * default) to abort the decode and throw {@code e}. Any undecoded
+ * lines in the image will be blank.
*/
- boolean onPartialImage(@NonNull DecodeException e);
+ boolean onPartialImage(@NonNull DecodeException exception);
};
// Fields
@@ -582,16 +747,17 @@
private final int mHeight;
private final boolean mAnimated;
- private int mDesiredWidth;
- private int mDesiredHeight;
- private int mAllocator = ALLOCATOR_DEFAULT;
- private boolean mRequireUnpremultiplied = false;
- private boolean mMutable = false;
- private boolean mConserveMemory = false;
- private boolean mDecodeAsAlphaMask = false;
- private Rect mCropRect;
- private Rect mOutPaddingRect;
- private Source mSource;
+ private int mDesiredWidth;
+ private int mDesiredHeight;
+ private int mAllocator = ALLOCATOR_DEFAULT;
+ private boolean mUnpremultipliedRequired = false;
+ private boolean mMutable = false;
+ private boolean mConserveMemory = false;
+ private boolean mDecodeAsAlphaMask = false;
+ private ColorSpace mDesiredColorSpace = null;
+ private Rect mCropRect;
+ private Rect mOutPaddingRect;
+ private Source mSource;
private PostProcessor mPostProcessor;
private OnPartialImageListener mOnPartialImageListener;
@@ -638,13 +804,15 @@
}
/**
- * Create a new {@link Source} from a resource.
+ * Create a new {@link Source Source} from a resource.
*
* @param res the {@link Resources} object containing the image data.
* @param resId resource ID of the image data.
* @return a new Source object, which can be passed to
- * {@link #decodeDrawable} or {@link #decodeBitmap}.
+ * {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}.
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull Resources res, int resId)
{
@@ -652,13 +820,22 @@
}
/**
- * Create a new {@link Source} from a {@link android.net.Uri}.
+ * Create a new {@link Source Source} from a {@link android.net.Uri}.
+ *
+ * <h5>Accepts the following URI schemes:</h5>
+ * <ul>
+ * <li>content ({@link ContentResolver#SCHEME_CONTENT})</li>
+ * <li>android.resource ({@link ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
+ * <li>file ({@link ContentResolver#SCHEME_FILE})</li>
+ * </ul>
*
* @param cr to retrieve from.
* @param uri of the image file.
* @return a new Source object, which can be passed to
- * {@link #decodeDrawable} or {@link #decodeBitmap}.
+ * {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}.
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull ContentResolver cr,
@NonNull Uri uri) {
@@ -670,6 +847,7 @@
*
* @hide
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull ContentResolver cr,
@NonNull Uri uri, @Nullable Resources res) {
@@ -677,25 +855,30 @@
}
/**
- * Create a new {@link Source} from a file in the "assets" directory.
+ * Create a new {@link Source Source} from a file in the "assets" directory.
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull AssetManager assets, @NonNull String fileName) {
return new AssetSource(assets, fileName);
}
/**
- * Create a new {@link Source} from a byte array.
+ * Create a new {@link Source Source} from a byte array.
*
* @param data byte array of compressed image data.
* @param offset offset into data for where the decoder should begin
* parsing.
* @param length number of bytes, beginning at offset, to parse.
+ * @return a new Source object, which can be passed to
+ * {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}.
* @throws NullPointerException if data is null.
* @throws ArrayIndexOutOfBoundsException if offset and length are
* not within data.
* @hide
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull byte[] data, int offset,
int length) throws ArrayIndexOutOfBoundsException {
@@ -714,48 +897,69 @@
* See {@link #createSource(byte[], int, int).
* @hide
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull byte[] data) {
return createSource(data, 0, data.length);
}
/**
- * Create a new {@link Source} from a {@link java.nio.ByteBuffer}.
+ * Create a new {@link Source Source} from a {@link java.nio.ByteBuffer}.
*
- * <p>Decoding will start from {@link java.nio.ByteBuffer#position()}. The
- * position of {@code buffer} will not be affected.</p>
+ * <p>Decoding will start from {@link java.nio.ByteBuffer#position() buffer.position()}.
+ * The position of {@code buffer} will not be affected.</p>
*
- * <p>Note: If this {@code Source} is passed to {@link #decodeDrawable}, and
- * the encoded image is animated, the returned {@link AnimatedImageDrawable}
+ * <p>Note: If this {@code Source} is passed to {@link #decodeDrawable decodeDrawable},
+ * and the encoded image is animated, the returned {@link AnimatedImageDrawable}
* will continue reading from the {@code buffer}, so its contents must not
* be modified, even after the {@code AnimatedImageDrawable} is returned.
* {@code buffer}'s contents should never be modified during decode.</p>
+ *
+ * @return a new Source object, which can be passed to
+ * {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}.
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull ByteBuffer buffer) {
- return new ByteBufferSource(buffer.slice());
+ return new ByteBufferSource(buffer);
}
/**
* Internal API used to generate bitmaps for use by Drawables (i.e. BitmapDrawable)
+ *
+ * <p>Unlike other Sources, this one cannot be reused.</p>
+ *
* @hide
*/
+ @AnyThread
+ @NonNull
public static Source createSource(Resources res, InputStream is) {
return new InputStreamSource(res, is, Bitmap.getDefaultDensity());
}
/**
* Internal API used to generate bitmaps for use by Drawables (i.e. BitmapDrawable)
+ *
+ * <p>Unlike other Sources, this one cannot be reused.</p>
+ *
* @hide
*/
+ @AnyThread
@TestApi
+ @NonNull
public static Source createSource(Resources res, InputStream is, int density) {
return new InputStreamSource(res, is, density);
}
/**
- * Create a new {@link Source} from a {@link java.io.File}.
+ * Create a new {@link Source Source} from a {@link java.io.File}.
+ *
+ * @return a new Source object, which can be passed to
+ * {@link #decodeDrawable decodeDrawable} or
+ * {@link #decodeBitmap decodeBitmap}.
*/
+ @AnyThread
@NonNull
public static Source createSource(@NonNull File file) {
return new FileSource(file);
@@ -766,14 +970,16 @@
*
* <p>This takes an input that functions like
* {@link BitmapFactory.Options#inSampleSize}. It returns a width and
- * height that can be acheived by sampling the encoded image. Other widths
+ * height that can be achieved by sampling the encoded image. Other widths
* and heights may be supported, but will require an additional (internal)
* scaling step. Such internal scaling is *not* supported with
- * {@link #setRequireUnpremultiplied} set to {@code true}.</p>
+ * {@link #setUnpremultipliedRequired} set to {@code true}.</p>
*
* @param sampleSize Sampling rate of the encoded image.
* @return {@link android.util.Size} of the width and height after
* sampling.
+ *
+ * @hide
*/
@NonNull
public Size getSampledSize(int sampleSize) {
@@ -789,14 +995,35 @@
}
// Modifiers
+ /** @removed
+ * @deprecated Renamed to {@link #setTargetSize}.
+ */
+ @java.lang.Deprecated
+ public ImageDecoder setResize(int width, int height) {
+ this.setTargetSize(width, height);
+ return this;
+ }
+
/**
- * Resize the output to have the following size.
+ * Specify the size of the output {@link Drawable} or {@link Bitmap}.
+ *
+ * <p>By default, the output size will match the size of the encoded
+ * image, which can be retrieved from the {@link ImageInfo ImageInfo} in
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ *
+ * <p>This will sample or scale the output to an arbitrary size that may
+ * be smaller or larger than the encoded size.</p>
+ *
+ * <p>Only the last call to this or {@link #setTargetSampleSize} is
+ * respected.</p>
+ *
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*
* @param width must be greater than 0.
* @param height must be greater than 0.
- * @return this object for chaining.
*/
- public ImageDecoder setResize(int width, int height) {
+ public void setTargetSize(int width, int height) {
if (width <= 0 || height <= 0) {
throw new IllegalArgumentException("Dimensions must be positive! "
+ "provided (" + width + ", " + height + ")");
@@ -804,21 +1031,70 @@
mDesiredWidth = width;
mDesiredHeight = height;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #setTargetSampleSize}.
+ */
+ @java.lang.Deprecated
+ public ImageDecoder setResize(int sampleSize) {
+ this.setTargetSampleSize(sampleSize);
return this;
}
+ private int getTargetDimension(int original, int sampleSize, int computed) {
+ // Sampling will never result in a smaller size than 1.
+ if (sampleSize >= original) {
+ return 1;
+ }
+
+ // Use integer divide to find the desired size. If that is what
+ // getSampledSize computed, that is the size to use.
+ int target = original / sampleSize;
+ if (computed == target) {
+ return computed;
+ }
+
+ // If sampleSize does not divide evenly into original, the decoder
+ // may round in either direction. It just needs to get a result that
+ // is close.
+ int reverse = computed * sampleSize;
+ if (Math.abs(reverse - original) < sampleSize) {
+ // This is the size that can be decoded most efficiently.
+ return computed;
+ }
+
+ // The decoder could not get close (e.g. it is a DNG image).
+ return target;
+ }
+
/**
- * Resize based on a sample size.
+ * Set the target size with a sampleSize.
*
- * <p>This has the same effect as passing the result of
- * {@link #getSampledSize} to {@link #setResize(int, int)}.</p>
+ * <p>By default, the output size will match the size of the encoded
+ * image, which can be retrieved from the {@link ImageInfo ImageInfo} in
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ *
+ * <p>Requests the decoder to subsample the original image, returning a
+ * smaller image to save memory. The {@code sampleSize} is the number of pixels
+ * in either dimension that correspond to a single pixel in the output.
+ * For example, {@code sampleSize == 4} returns an image that is 1/4 the
+ * width/height of the original, and 1/16 the number of pixels.</p>
+ *
+ * <p>Must be greater than or equal to 1.</p>
+ *
+ * <p>Only the last call to this or {@link #setTargetSize} is respected.</p>
+ *
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*
* @param sampleSize Sampling rate of the encoded image.
- * @return this object for chaining.
*/
- public ImageDecoder setResize(int sampleSize) {
+ public void setTargetSampleSize(int sampleSize) {
Size size = this.getSampledSize(sampleSize);
- return this.setResize(size.getWidth(), size.getHeight());
+ int targetWidth = getTargetDimension(mWidth, sampleSize, size.getWidth());
+ int targetHeight = getTargetDimension(mHeight, sampleSize, size.getHeight());
+ this.setTargetSize(targetWidth, targetHeight);
}
private boolean requestedResize() {
@@ -832,7 +1108,8 @@
* Will typically result in a {@link Bitmap.Config#HARDWARE}
* allocation, but may be software for small images. In addition, this will
* switch to software when HARDWARE is incompatible, e.g.
- * {@link #setMutable}, {@link #setDecodeAsAlphaMask}.
+ * {@link #setMutableRequired setMutableRequired(true)} or
+ * {@link #setDecodeAsAlphaMaskEnabled setDecodeAsAlphaMaskEnabled(true)}.
*/
public static final int ALLOCATOR_DEFAULT = 0;
@@ -855,9 +1132,10 @@
* Require a {@link Bitmap.Config#HARDWARE} {@link Bitmap}.
*
* When this is combined with incompatible options, like
- * {@link #setMutable} or {@link #setDecodeAsAlphaMask}, {@link #decodeDrawable}
- * / {@link #decodeBitmap} will throw an
- * {@link java.lang.IllegalStateException}.
+ * {@link #setMutableRequired setMutableRequired(true)} or
+ * {@link #setDecodeAsAlphaMaskEnabled setDecodeAsAlphaMaskEnabled(true)},
+ * {@link #decodeDrawable decodeDrawable} or {@link #decodeBitmap decodeBitmap}
+ * will throw an {@link java.lang.IllegalStateException}.
*/
public static final int ALLOCATOR_HARDWARE = 3;
@@ -871,17 +1149,18 @@
/**
* Choose the backing for the pixel memory.
*
- * This is ignored for animated drawables.
+ * <p>This is ignored for animated drawables.</p>
+ *
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*
* @param allocator Type of allocator to use.
- * @return this object for chaining.
*/
- public ImageDecoder setAllocator(@Allocator int allocator) {
+ public void setAllocator(@Allocator int allocator) {
if (allocator < ALLOCATOR_DEFAULT || allocator > ALLOCATOR_HARDWARE) {
throw new IllegalArgumentException("invalid allocator " + allocator);
}
mAllocator = allocator;
- return this;
}
/**
@@ -900,23 +1179,40 @@
* {@link android.view.View} system (i.e. to a {@link Canvas}). Calling
* this method with a value of {@code true} will result in
* {@link #decodeBitmap} returning a {@link Bitmap} with unpremultiplied
- * pixels. See {@link Bitmap#isPremultiplied}. This is incompatible with
- * {@link #decodeDrawable}; attempting to decode an unpremultiplied
- * {@link Drawable} will throw an {@link java.lang.IllegalStateException}.
- * </p>
+ * pixels. See {@link Bitmap#isPremultiplied Bitmap.isPremultiplied()}.
+ * This is incompatible with {@link #decodeDrawable decodeDrawable};
+ * attempting to decode an unpremultiplied {@link Drawable} will throw an
+ * {@link java.lang.IllegalStateException}. </p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*/
- public ImageDecoder setRequireUnpremultiplied(boolean requireUnpremultiplied) {
- mRequireUnpremultiplied = requireUnpremultiplied;
+ public void setUnpremultipliedRequired(boolean unpremultipliedRequired) {
+ mUnpremultipliedRequired = unpremultipliedRequired;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #setUnpremultipliedRequired}.
+ */
+ @java.lang.Deprecated
+ public ImageDecoder setRequireUnpremultiplied(boolean unpremultipliedRequired) {
+ this.setUnpremultipliedRequired(unpremultipliedRequired);
return this;
}
/**
* Return whether the {@link Bitmap} will have unpremultiplied pixels.
*/
+ public boolean isUnpremultipliedRequired() {
+ return mUnpremultipliedRequired;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #isUnpremultipliedRequired}.
+ */
+ @java.lang.Deprecated
public boolean getRequireUnpremultiplied() {
- return mRequireUnpremultiplied;
+ return this.isUnpremultipliedRequired();
}
/**
@@ -926,17 +1222,21 @@
* {@link Bitmap}. For a {@code Drawable} or an immutable {@code Bitmap},
* this is the only way to process the image after decoding.</p>
*
+ * <p>If combined with {@link #setTargetSize} and/or {@link #setCrop},
+ * {@link PostProcessor#onPostProcess} occurs last.</p>
+ *
* <p>If set on a nine-patch image, the nine-patch data is ignored.</p>
*
* <p>For an animated image, the drawing commands drawn on the
* {@link Canvas} will be recorded immediately and then applied to each
* frame.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ *
*/
- public ImageDecoder setPostProcessor(@Nullable PostProcessor p) {
- mPostProcessor = p;
- return this;
+ public void setPostProcessor(@Nullable PostProcessor postProcessor) {
+ mPostProcessor = postProcessor;
}
/**
@@ -951,17 +1251,18 @@
* Set (replace) the {@link OnPartialImageListener} on this object.
*
* <p>Will be called if there is an error in the input. Without one, an
- * error will result in an Exception being thrown.</p>
+ * error will result in an {@code Exception} being thrown.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ *
*/
- public ImageDecoder setOnPartialImageListener(@Nullable OnPartialImageListener l) {
- mOnPartialImageListener = l;
- return this;
+ public void setOnPartialImageListener(@Nullable OnPartialImageListener listener) {
+ mOnPartialImageListener = listener;
}
/**
- * Return the {@link OnPartialImageListener} currently set.
+ * Return the {@link OnPartialImageListener OnPartialImageListener} currently set.
*/
@Nullable
public OnPartialImageListener getOnPartialImageListener() {
@@ -972,19 +1273,20 @@
* Crop the output to {@code subset} of the (possibly) scaled image.
*
* <p>{@code subset} must be contained within the size set by
- * {@link #setResize} or the bounds of the image if setResize was not
- * called. Otherwise an {@link IllegalStateException} will be thrown by
- * {@link #decodeDrawable}/{@link #decodeBitmap}.</p>
+ * {@link #setTargetSize} or the bounds of the image if setTargetSize was
+ * not called. Otherwise an {@link IllegalStateException} will be thrown by
+ * {@link #decodeDrawable decodeDrawable}/{@link #decodeBitmap decodeBitmap}.</p>
*
* <p>NOT intended as a replacement for
- * {@link BitmapRegionDecoder#decodeRegion}. This supports all formats,
- * but merely crops the output.</p>
+ * {@link BitmapRegionDecoder#decodeRegion BitmapRegionDecoder.decodeRegion()}.
+ * This supports all formats, but merely crops the output.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ *
*/
- public ImageDecoder setCrop(@Nullable Rect subset) {
+ public void setCrop(@Nullable Rect subset) {
mCropRect = subset;
- return this;
}
/**
@@ -1001,45 +1303,63 @@
* If the image is a nine patch, this Rect will be set to the padding
* rectangle during decode. Otherwise it will not be modified.
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*
* @hide
*/
- public ImageDecoder setOutPaddingRect(@NonNull Rect outPadding) {
+ public void setOutPaddingRect(@NonNull Rect outPadding) {
mOutPaddingRect = outPadding;
- return this;
}
/**
* Specify whether the {@link Bitmap} should be mutable.
*
- * <p>By default, a {@link Bitmap} created will be immutable, but that can
- * be changed with this call.</p>
+ * <p>By default, a {@link Bitmap} created by {@link #decodeBitmap decodeBitmap}
+ * will be immutable i.e. {@link Bitmap#isMutable() Bitmap.isMutable()} returns
+ * {@code false}. This can be changed with {@code setMutableRequired(true)}.
*
* <p>Mutable Bitmaps are incompatible with {@link #ALLOCATOR_HARDWARE},
* because {@link Bitmap.Config#HARDWARE} Bitmaps cannot be mutable.
* Attempting to combine them will throw an
* {@link java.lang.IllegalStateException}.</p>
*
- * <p>Mutable Bitmaps are also incompatible with {@link #decodeDrawable},
+ * <p>Mutable Bitmaps are also incompatible with {@link #decodeDrawable decodeDrawable},
* which would require retrieving the Bitmap from the returned Drawable in
* order to modify. Attempting to decode a mutable {@link Drawable} will
* throw an {@link java.lang.IllegalStateException}.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*/
- public ImageDecoder setMutable(boolean mutable) {
+ public void setMutableRequired(boolean mutable) {
mMutable = mutable;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #setMutableRequired}.
+ */
+ @java.lang.Deprecated
+ public ImageDecoder setMutable(boolean mutable) {
+ this.setMutableRequired(mutable);
return this;
}
/**
- * Return whether the {@link Bitmap} will be mutable.
+ * Return whether the decoded {@link Bitmap} will be mutable.
*/
- public boolean getMutable() {
+ public boolean isMutableRequired() {
return mMutable;
}
+ /** @removed
+ * @deprecated Renamed to {@link #isMutableRequired}.
+ */
+ @java.lang.Deprecated
+ public boolean getMutable() {
+ return this.isMutableRequired();
+ }
+
/**
* Specify whether to potentially save RAM at the expense of quality.
*
@@ -1052,11 +1372,11 @@
* This necessarily lowers the quality of the output, but saves half
* the memory used.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*/
- public ImageDecoder setConserveMemory(boolean conserveMemory) {
+ public void setConserveMemory(boolean conserveMemory) {
mConserveMemory = conserveMemory;
- return this;
}
/**
@@ -1077,45 +1397,106 @@
* with only one channel, treat that channel as alpha. Otherwise this call has
* no effect.</p>
*
- * <p>setDecodeAsAlphaMask is incompatible with {@link #ALLOCATOR_HARDWARE}. Trying to
- * combine them will result in {@link #decodeDrawable}/
- * {@link #decodeBitmap} throwing an
+ * <p>This is incompatible with {@link #ALLOCATOR_HARDWARE}. Trying to
+ * combine them will result in {@link #decodeDrawable decodeDrawable}/
+ * {@link #decodeBitmap decodeBitmap} throwing an
* {@link java.lang.IllegalStateException}.</p>
*
- * @return this object for chaining.
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
*/
- public ImageDecoder setDecodeAsAlphaMask(boolean decodeAsAlphaMask) {
- mDecodeAsAlphaMask = decodeAsAlphaMask;
+ public void setDecodeAsAlphaMaskEnabled(boolean enabled) {
+ mDecodeAsAlphaMask = enabled;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #setDecodeAsAlphaMaskEnabled}.
+ */
+ @java.lang.Deprecated
+ public ImageDecoder setDecodeAsAlphaMask(boolean enabled) {
+ this.setDecodeAsAlphaMaskEnabled(enabled);
return this;
}
/** @removed
- * @deprecated Call {@link #setDecodeAsAlphaMask} instead.
+ * @deprecated Renamed to {@link #setDecodeAsAlphaMaskEnabled}.
*/
@java.lang.Deprecated
public ImageDecoder setAsAlphaMask(boolean asAlphaMask) {
- return this.setDecodeAsAlphaMask(asAlphaMask);
+ this.setDecodeAsAlphaMask(asAlphaMask);
+ return this;
}
/**
* Return whether to treat single channel input as alpha.
*
- * <p>This returns whether {@link #setDecodeAsAlphaMask} was set to {@code true}.
- * It may still return {@code true} even if the image has more than one
- * channel and therefore will not be treated as an alpha mask.</p>
+ * <p>This returns whether {@link #setDecodeAsAlphaMaskEnabled} was set to
+ * {@code true}. It may still return {@code true} even if the image has
+ * more than one channel and therefore will not be treated as an alpha
+ * mask.</p>
*/
+ public boolean isDecodeAsAlphaMaskEnabled() {
+ return mDecodeAsAlphaMask;
+ }
+
+ /** @removed
+ * @deprecated Renamed to {@link #isDecodeAsAlphaMaskEnabled}.
+ */
+ @java.lang.Deprecated
public boolean getDecodeAsAlphaMask() {
return mDecodeAsAlphaMask;
}
/** @removed
- * @deprecated Call {@link #getDecodeAsAlphaMask} instead.
+ * @deprecated Renamed to {@link #isDecodeAsAlphaMaskEnabled}.
*/
@java.lang.Deprecated
public boolean getAsAlphaMask() {
return this.getDecodeAsAlphaMask();
}
+ /**
+ * Specify the desired {@link ColorSpace} for the output.
+ *
+ * <p>If non-null, the decoder will try to decode into {@code colorSpace}.
+ * If it is null, which is the default, or the request cannot be met, the
+ * decoder will pick either the color space embedded in the image or the
+ * {@link ColorSpace} best suited for the requested image configuration
+ * (for instance {@link ColorSpace.Named#SRGB sRGB} for the
+ * {@link Bitmap.Config#ARGB_8888} configuration).</p>
+ *
+ * <p>{@link Bitmap.Config#RGBA_F16} always uses the
+ * {@link ColorSpace.Named#LINEAR_EXTENDED_SRGB scRGB} color space.
+ * Bitmaps in other configurations without an embedded color space are
+ * assumed to be in the {@link ColorSpace.Named#SRGB sRGB} color space.</p>
+ *
+ * <p class="note">Only {@link ColorSpace.Model#RGB} color spaces are
+ * currently supported. An <code>IllegalArgumentException</code> will
+ * be thrown by {@link #decodeDrawable decodeDrawable}/
+ * {@link #decodeBitmap decodeBitmap} when setting a non-RGB color space
+ * such as {@link ColorSpace.Named#CIE_LAB Lab}.</p>
+ *
+ * <p class="note">The specified color space's transfer function must be
+ * an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve}. An
+ * <code>IllegalArgumentException</code> will be thrown by the decode methods
+ * if calling {@link ColorSpace.Rgb#getTransferParameters()} on the
+ * specified color space returns null.</p>
+ *
+ * <p>Like all setters on ImageDecoder, this must be called inside
+ * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+ */
+ public void setTargetColorSpace(ColorSpace colorSpace) {
+ mDesiredColorSpace = colorSpace;
+ }
+
+ /**
+ * Closes this resource, relinquishing any underlying resources. This method
+ * is invoked automatically on objects managed by the try-with-resources
+ * statement.
+ *
+ * <p>This is an implementation detail of {@link ImageDecoder}, and should
+ * never be called manually.</p>
+ */
@Override
public void close() {
mCloseGuard.close();
@@ -1151,9 +1532,20 @@
}
}
- if (mPostProcessor != null && mRequireUnpremultiplied) {
+ if (mPostProcessor != null && mUnpremultipliedRequired) {
throw new IllegalStateException("Cannot draw to unpremultiplied pixels!");
}
+
+ if (mDesiredColorSpace != null) {
+ if (!(mDesiredColorSpace instanceof ColorSpace.Rgb)) {
+ throw new IllegalArgumentException("The target color space must use the "
+ + "RGB color model - provided: " + mDesiredColorSpace);
+ }
+ if (((ColorSpace.Rgb) mDesiredColorSpace).getTransferParameters() == null) {
+ throw new IllegalArgumentException("The target color space must use an "
+ + "ICC parametric transfer function - provided: " + mDesiredColorSpace);
+ }
+ }
}
private static void checkSubset(int width, int height, Rect r) {
@@ -1166,13 +1558,14 @@
}
}
+ @WorkerThread
@NonNull
private Bitmap decodeBitmapInternal() throws IOException {
checkState();
return nDecodeBitmap(mNativePtr, this, mPostProcessor != null,
mDesiredWidth, mDesiredHeight, mCropRect,
- mMutable, mAllocator, mRequireUnpremultiplied,
- mConserveMemory, mDecodeAsAlphaMask);
+ mMutable, mAllocator, mUnpremultipliedRequired,
+ mConserveMemory, mDecodeAsAlphaMask, mDesiredColorSpace);
}
private void callHeaderDecoded(@Nullable OnHeaderDecodedListener listener,
@@ -1191,13 +1584,15 @@
* Create a {@link Drawable} from a {@code Source}.
*
* @param src representing the encoded image.
- * @param listener for learning the {@link ImageInfo} and changing any
+ * @param listener for learning the {@link ImageInfo ImageInfo} and changing any
* default settings on the {@code ImageDecoder}. This will be called on
* the same thread as {@code decodeDrawable} before that method returns.
+ * This is required in order to change any of the default settings.
* @return Drawable for displaying the image.
* @throws IOException if {@code src} is not found, is an unsupported
* format, or cannot be decoded for any reason.
*/
+ @WorkerThread
@NonNull
public static Drawable decodeDrawable(@NonNull Source src,
@NonNull OnHeaderDecodedListener listener) throws IOException {
@@ -1208,6 +1603,7 @@
return decodeDrawableImpl(src, listener);
}
+ @WorkerThread
@NonNull
private static Drawable decodeDrawableImpl(@NonNull Source src,
@Nullable OnHeaderDecodedListener listener) throws IOException {
@@ -1215,7 +1611,7 @@
decoder.mSource = src;
decoder.callHeaderDecoded(listener, src);
- if (decoder.mRequireUnpremultiplied) {
+ if (decoder.mUnpremultipliedRequired) {
// Though this could be supported (ignored) for opaque images,
// it seems better to always report this error.
throw new IllegalStateException("Cannot decode a Drawable " +
@@ -1268,8 +1664,18 @@
}
/**
- * See {@link #decodeDrawable(Source, OnHeaderDecodedListener)}.
+ * Create a {@link Drawable} from a {@code Source}.
+ *
+ * <p>Since there is no {@link OnHeaderDecodedListener OnHeaderDecodedListener},
+ * the default settings will be used. In order to change any settings, call
+ * {@link #decodeDrawable(Source, OnHeaderDecodedListener)} instead.</p>
+ *
+ * @param src representing the encoded image.
+ * @return Drawable for displaying the image.
+ * @throws IOException if {@code src} is not found, is an unsupported
+ * format, or cannot be decoded for any reason.
*/
+ @WorkerThread
@NonNull
public static Drawable decodeDrawable(@NonNull Source src)
throws IOException {
@@ -1280,13 +1686,15 @@
* Create a {@link Bitmap} from a {@code Source}.
*
* @param src representing the encoded image.
- * @param listener for learning the {@link ImageInfo} and changing any
+ * @param listener for learning the {@link ImageInfo ImageInfo} and changing any
* default settings on the {@code ImageDecoder}. This will be called on
* the same thread as {@code decodeBitmap} before that method returns.
+ * This is required in order to change any of the default settings.
* @return Bitmap containing the image.
* @throws IOException if {@code src} is not found, is an unsupported
* format, or cannot be decoded for any reason.
*/
+ @WorkerThread
@NonNull
public static Bitmap decodeBitmap(@NonNull Source src,
@NonNull OnHeaderDecodedListener listener) throws IOException {
@@ -1297,6 +1705,7 @@
return decodeBitmapImpl(src, listener);
}
+ @WorkerThread
@NonNull
private static Bitmap decodeBitmapImpl(@NonNull Source src,
@Nullable OnHeaderDecodedListener listener) throws IOException {
@@ -1353,7 +1762,7 @@
float scale = (float) dstDensity / srcDensity;
int scaledWidth = (int) (decoder.mWidth * scale + 0.5f);
int scaledHeight = (int) (decoder.mHeight * scale + 0.5f);
- decoder.setResize(scaledWidth, scaledHeight);
+ decoder.setTargetSize(scaledWidth, scaledHeight);
return dstDensity;
}
@@ -1362,9 +1771,24 @@
return nGetMimeType(mNativePtr);
}
+ @Nullable
+ private ColorSpace getColorSpace() {
+ return nGetColorSpace(mNativePtr);
+ }
+
/**
- * See {@link #decodeBitmap(Source, OnHeaderDecodedListener)}.
+ * Create a {@link Bitmap} from a {@code Source}.
+ *
+ * <p>Since there is no {@link OnHeaderDecodedListener OnHeaderDecodedListener},
+ * the default settings will be used. In order to change any settings, call
+ * {@link #decodeBitmap(Source, OnHeaderDecodedListener)} instead.</p>
+ *
+ * @param src representing the encoded image.
+ * @return Bitmap containing the image.
+ * @throws IOException if {@code src} is not found, is an unsupported
+ * format, or cannot be decoded for any reason.
*/
+ @WorkerThread
@NonNull
public static Bitmap decodeBitmap(@NonNull Source src) throws IOException {
return decodeBitmapImpl(src, null);
@@ -1410,12 +1834,14 @@
boolean doPostProcess,
int width, int height,
@Nullable Rect cropRect, boolean mutable,
- int allocator, boolean requireUnpremul,
- boolean conserveMemory, boolean decodeAsAlphaMask)
+ int allocator, boolean unpremulRequired,
+ boolean conserveMemory, boolean decodeAsAlphaMask,
+ @Nullable ColorSpace desiredColorSpace)
throws IOException;
private static native Size nGetSampledSize(long nativePtr,
int sampleSize);
private static native void nGetPadding(long nativePtr, @NonNull Rect outRect);
private static native void nClose(long nativePtr);
private static native String nGetMimeType(long nativePtr);
+ private static native ColorSpace nGetColorSpace(long nativePtr);
}
diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java
index 098cdc6..cd0862c 100644
--- a/graphics/java/android/graphics/Path.java
+++ b/graphics/java/android/graphics/Path.java
@@ -24,6 +24,8 @@
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
+import libcore.util.NativeAllocationRegistry;
+
/**
* The Path class encapsulates compound (multiple contour) geometric paths
* consisting of straight line segments, quadratic curves, and cubic curves.
@@ -32,10 +34,14 @@
* text on a path.
*/
public class Path {
+
+ private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ Path.class.getClassLoader(), nGetFinalizer(), 48 /* dummy size */);
+
/**
* @hide
*/
- public long mNativePath;
+ public final long mNativePath;
/**
* @hide
@@ -52,6 +58,7 @@
*/
public Path() {
mNativePath = nInit();
+ sRegistry.registerNativeAllocation(this, mNativePath);
}
/**
@@ -69,6 +76,7 @@
}
}
mNativePath = nInit(valNative);
+ sRegistry.registerNativeAllocation(this, mNativePath);
}
/**
@@ -297,7 +305,7 @@
* a rectangle
* @return true if the path specifies a rectangle
*/
- public boolean isRect(RectF rect) {
+ public boolean isRect(@Nullable RectF rect) {
return nIsRect(mNativePath, rect);
}
@@ -771,15 +779,6 @@
nTransform(mNativePath, matrix.native_instance);
}
- protected void finalize() throws Throwable {
- try {
- nFinalize(mNativePath);
- mNativePath = 0; // Other finalizers can still call us.
- } finally {
- super.finalize();
- }
- }
-
/** @hide */
public final long readOnlyNI() {
return mNativePath;
@@ -820,7 +819,7 @@
private static native long nInit();
private static native long nInit(long nPath);
- private static native void nFinalize(long nPath);
+ private static native long nGetFinalizer();
private static native void nSet(long native_dst, long nSrc);
private static native void nComputeBounds(long nPath, RectF bounds);
private static native void nIncReserve(long nPath, int extraPtCount);
diff --git a/graphics/java/android/graphics/PostProcessor.java b/graphics/java/android/graphics/PostProcessor.java
index b1712e9..6fed39b 100644
--- a/graphics/java/android/graphics/PostProcessor.java
+++ b/graphics/java/android/graphics/PostProcessor.java
@@ -16,25 +16,26 @@
package android.graphics;
-import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.graphics.drawable.AnimatedImageDrawable;
import android.graphics.drawable.Drawable;
/**
* Helper interface for adding custom processing to an image.
*
- * <p>The image being processed may be a {@link Drawable}, {@link Bitmap} or frame
- * of an animated image produced by {@link ImageDecoder}. This is called before
- * the requested object is returned.</p>
+ * <p>The image being processed may be a {@link Drawable}, a {@link Bitmap}, or
+ * a frame of an {@link AnimatedImageDrawable} produced by {@link ImageDecoder}.
+ * This is called before the requested object is returned.</p>
*
- * <p>This custom processing also applies to image types that are otherwise
- * immutable, such as {@link Bitmap.Config#HARDWARE}.</p>
+ * <p>This custom processing can even be applied to images that will be returned
+ * as immutable objects, such as a {@link Bitmap} with {@code Config}
+ * {@link Bitmap.Config#HARDWARE} returned by {@link ImageDecoder}.</p>
*
- * <p>On an animated image, the callback will only be called once, but the drawing
- * commands will be applied to each frame, as if the {@code Canvas} had been
- * returned by {@link Picture#beginRecording}.<p>
+ * <p>On an {@link AnimatedImageDrawable}, the callback will only be called once,
+ * but the drawing commands will be applied to each frame, as if the {@link Canvas}
+ * had been returned by {@link Picture#beginRecording Picture.beginRecording}.<p>
*
- * <p>Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor}.</p>
+ * <p>Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor setPostProcessor}.</p>
*/
public interface PostProcessor {
/**
@@ -43,43 +44,44 @@
* <p>Drawing to the {@link Canvas} will behave as if the initial processing
* (e.g. decoding) already exists in the Canvas. An implementation can draw
* effects on top of this, or it can even draw behind it using
- * {@link PorterDuff.Mode#DST_OVER}. A common effect is to add transparency
- * to the corners to achieve rounded corners. That can be done with the
- * following code:</p>
+ * {@link PorterDuff.Mode#DST_OVER PorterDuff.Mode.DST_OVER}. A common
+ * effect is to add transparency to the corners to achieve rounded corners.
+ * That can be done with the following code:</p>
*
- * <code>
- * Path path = new Path();
- * path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
- * int width = canvas.getWidth();
- * int height = canvas.getHeight();
- * path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
- * Paint paint = new Paint();
- * paint.setAntiAlias(true);
- * paint.setColor(Color.TRANSPARENT);
- * paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
- * canvas.drawPath(path, paint);
- * return PixelFormat.TRANSLUCENT;
- * </code>
+ * <pre class="prettyprint">
+ * Path path = new Path();
+ * path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
+ * int width = canvas.getWidth();
+ * int height = canvas.getHeight();
+ * path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
+ * Paint paint = new Paint();
+ * paint.setAntiAlias(true);
+ * paint.setColor(Color.TRANSPARENT);
+ * paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+ * canvas.drawPath(path, paint);
+ * return PixelFormat.TRANSLUCENT;
+ * </pre>
*
*
* @param canvas The {@link Canvas} to draw to.
* @return Opacity of the result after drawing.
- * {@link PixelFormat#UNKNOWN} means that the implementation did not
- * change whether the image has alpha. Return this unless you added
- * transparency (e.g. with the code above, in which case you should
- * return {@code PixelFormat.TRANSLUCENT}) or you forced the image to
- * be opaque (e.g. by drawing everywhere with an opaque color and
- * {@code PorterDuff.Mode.DST_OVER}, in which case you should return
- * {@code PixelFormat.OPAQUE}).
- * {@link PixelFormat#TRANSLUCENT} means that the implementation added
- * transparency. This is safe to return even if the image already had
- * transparency. This is also safe to return if the result is opaque,
- * though it may draw more slowly.
- * {@link PixelFormat#OPAQUE} means that the implementation forced the
- * image to be opaque. This is safe to return even if the image was
- * already opaque.
- * {@link PixelFormat#TRANSPARENT} (or any other integer) is not
- * allowed, and will result in throwing an
+ * {@link PixelFormat#UNKNOWN PixelFormat.UNKNOWN} means that the
+ * implementation did not change whether the image has alpha. Return
+ * this unless you added transparency (e.g. with the code above, in
+ * which case you should return
+ * {@link PixelFormat#TRANSLUCENT PixelFormat.TRANSLUCENT}) or you
+ * forced the image to be opaque (e.g. by drawing everywhere with an
+ * opaque color and {@link PorterDuff.Mode#DST_OVER PorterDuff.Mode.DST_OVER},
+ * in which case you should return {@link PixelFormat#OPAQUE PixelFormat.OPAQUE}).
+ * {@link PixelFormat#TRANSLUCENT PixelFormat.TRANSLUCENT} means that
+ * the implementation added transparency. This is safe to return even
+ * if the image already had transparency. This is also safe to return
+ * if the result is opaque, though it may draw more slowly.
+ * {@link PixelFormat#OPAQUE PixelFormat.OPAQUE} means that the
+ * implementation forced the image to be opaque. This is safe to return
+ * even if the image was already opaque.
+ * {@link PixelFormat#TRANSPARENT PixelFormat.TRANSPARENT} (or any other
+ * integer) is not allowed, and will result in throwing an
* {@link java.lang.IllegalArgumentException}.
*/
@PixelFormat.Opacity
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 97edf22..1eebd26 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -318,13 +318,17 @@
* Retrieve the timestamp associated with the texture image set by the most recent call to
* updateTexImage.
*
- * This timestamp is in nanoseconds, and is normally monotonically increasing. The timestamp
- * should be unaffected by time-of-day adjustments, and for a camera should be strictly
- * monotonic but for a MediaPlayer may be reset when the position is set. The
- * specific meaning and zero point of the timestamp depends on the source providing images to
- * the SurfaceTexture. Unless otherwise specified by the image source, timestamps cannot
- * generally be compared across SurfaceTexture instances, or across multiple program
- * invocations. It is mostly useful for determining time offsets between subsequent frames.
+ * <p>This timestamp is in nanoseconds, and is normally monotonically increasing. The timestamp
+ * should be unaffected by time-of-day adjustments. The specific meaning and zero point of the
+ * timestamp depends on the source providing images to the SurfaceTexture. Unless otherwise
+ * specified by the image source, timestamps cannot generally be compared across SurfaceTexture
+ * instances, or across multiple program invocations. It is mostly useful for determining time
+ * offsets between subsequent frames.</p>
+ *
+ * <p>For camera sources, timestamps should be strictly monotonic. Timestamps from MediaPlayer
+ * sources may be reset when the playback position is set. For EGL and Vulkan producers, the
+ * timestamp is the desired present time set with the EGL_ANDROID_presentation_time or
+ * VK_GOOGLE_display_timing extensions.</p>
*/
public long getTimestamp() {
diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
index 457e4aa..898939e 100644
--- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
@@ -52,8 +52,20 @@
/**
* {@link Drawable} for drawing animated images (like GIF).
*
+ * <p>The framework handles decoding subsequent frames in another thread and
+ * updating when necessary. The drawable will only animate while it is being
+ * displayed.</p>
+ *
* <p>Created by {@link ImageDecoder#decodeDrawable}. A user needs to call
* {@link #start} to start the animation.</p>
+ *
+ * <p>It can also be defined in XML using the <code><animated-image></code>
+ * element.</p>
+ *
+ * @attr ref android.R.styleable#AnimatedImageDrawable_src
+ * @attr ref android.R.styleable#AnimatedImageDrawable_autoStart
+ * @attr ref android.R.styleable#AnimatedImageDrawable_repeatCount
+ * @attr ref android.R.styleable#AnimatedImageDrawable_autoMirrored
*/
public class AnimatedImageDrawable extends Drawable implements Animatable2 {
private int mIntrinsicWidth;
@@ -456,8 +468,8 @@
* <p>Does nothing if the animation is already running. If the animation is stopped,
* this will reset it.</p>
*
- * <p>If the animation starts, this will call
- * {@link Animatable2.AnimationCallback#onAnimationStart}.</p>
+ * <p>When the drawable is drawn, starting the animation,
+ * {@link Animatable2.AnimationCallback#onAnimationStart} will be called.</p>
*/
@Override
public void start() {
diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl
index 5a8fa07..0d32075 100644
--- a/keystore/java/android/security/IKeyChainService.aidl
+++ b/keystore/java/android/security/IKeyChainService.aidl
@@ -33,8 +33,8 @@
boolean isUserSelectable(String alias);
void setUserSelectable(String alias, boolean isUserSelectable);
- boolean generateKeyPair(in String algorithm, in ParcelableKeyGenParameterSpec spec);
- boolean attestKey(in String alias, in byte[] challenge, in int[] idAttestationFlags,
+ int generateKeyPair(in String algorithm, in ParcelableKeyGenParameterSpec spec);
+ int attestKey(in String alias, in byte[] challenge, in int[] idAttestationFlags,
out KeymasterCertificateChain chain);
boolean setKeyPairCertificate(String alias, in byte[] userCert, in byte[] certChain);
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 2daf733..46a7fa8 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -246,6 +246,82 @@
public static final String EXTRA_KEY_ACCESSIBLE = "android.security.extra.KEY_ACCESSIBLE";
/**
+ * Indicates that a call to {@link #generateKeyPair} was successful.
+ * @hide
+ */
+ public static final int KEY_GEN_SUCCESS = 0;
+
+ /**
+ * An alias was missing from the key specifications when calling {@link #generateKeyPair}.
+ * @hide
+ */
+ public static final int KEY_GEN_MISSING_ALIAS = 1;
+
+ /**
+ * A key attestation challenge was provided to {@link #generateKeyPair}, but it shouldn't
+ * have been provided.
+ * @hide
+ */
+ public static final int KEY_GEN_SUPERFLUOUS_ATTESTATION_CHALLENGE = 2;
+
+ /**
+ * Algorithm not supported by {@link #generateKeyPair}
+ * @hide
+ */
+ public static final int KEY_GEN_NO_SUCH_ALGORITHM = 3;
+
+ /**
+ * Invalid algorithm parameters when calling {@link #generateKeyPair}
+ * @hide
+ */
+ public static final int KEY_GEN_INVALID_ALGORITHM_PARAMETERS = 4;
+
+ /**
+ * Keystore is not available when calling {@link #generateKeyPair}
+ * @hide
+ */
+ public static final int KEY_GEN_NO_KEYSTORE_PROVIDER = 5;
+
+ /**
+ * General failure while calling {@link #generateKeyPair}
+ * @hide
+ */
+ public static final int KEY_GEN_FAILURE = 6;
+
+ /**
+ * Successful call to {@link #attestKey}
+ * @hide
+ */
+ public static final int KEY_ATTESTATION_SUCCESS = 0;
+
+ /**
+ * Attestation challenge missing when calling {@link #attestKey}
+ * @hide
+ */
+ public static final int KEY_ATTESTATION_MISSING_CHALLENGE = 1;
+
+ /**
+ * The caller requested Device ID attestation when calling {@link #attestKey}, but has no
+ * permissions to get device identifiers.
+ * @hide
+ */
+ public static final int KEY_ATTESTATION_CANNOT_COLLECT_DATA = 2;
+
+ /**
+ * The underlying hardware does not support Device ID attestation or cannot attest to the
+ * identifiers that are stored on the device. This indicates permanent inability
+ * to get attestation records on the device.
+ * @hide
+ */
+ public static final int KEY_ATTESTATION_CANNOT_ATTEST_IDS = 3;
+
+ /**
+ * General failure when calling {@link #attestKey}
+ * @hide
+ */
+ public static final int KEY_ATTESTATION_FAILURE = 4;
+
+ /**
* Returns an {@code Intent} that can be used for credential
* installation. The intent may be used without any extras, in
* which case the user will be able to install credentials from
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 1924bbe..fe05c13 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -16,6 +16,7 @@
package android.security;
+import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.Application;
import android.app.KeyguardManager;
@@ -66,6 +67,7 @@
public static final int VALUE_CORRUPTED = 8;
public static final int UNDEFINED_ACTION = 9;
public static final int WRONG_PASSWORD = 10;
+ public static final int CANNOT_ATTEST_IDS = -66;
public static final int HARDWARE_TYPE_UNAVAILABLE = -68;
/**
@@ -278,7 +280,7 @@
/**
* Attempt to lock the keystore for {@code user}.
*
- * @param user Android user to lock.
+ * @param userId Android user to lock.
* @return whether {@code user}'s keystore was locked.
*/
public boolean lock(int userId) {
@@ -299,7 +301,7 @@
* This is required before keystore entries created with FLAG_ENCRYPTED can be accessed or
* created.
*
- * @param user Android user ID to operate on
+ * @param userId Android user ID to operate on
* @param password user's keystore password. Should be the most recent value passed to
* {@link #onUserPasswordChanged} for the user.
*
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
index e4cf84a..cc80560 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
@@ -93,15 +93,17 @@
putSymmetricCipherImpl("AES/CTR/NoPadding",
PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$CTR$NoPadding");
- putSymmetricCipherImpl("DESede/CBC/NoPadding",
+ if ("true".equals(System.getProperty("supports3DES"))) {
+ putSymmetricCipherImpl("DESede/CBC/NoPadding",
PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$NoPadding");
- putSymmetricCipherImpl("DESede/CBC/PKCS7Padding",
+ putSymmetricCipherImpl("DESede/CBC/PKCS7Padding",
PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$PKCS7Padding");
- putSymmetricCipherImpl("DESede/ECB/NoPadding",
+ putSymmetricCipherImpl("DESede/ECB/NoPadding",
PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$NoPadding");
- putSymmetricCipherImpl("DESede/ECB/PKCS7Padding",
+ putSymmetricCipherImpl("DESede/ECB/PKCS7Padding",
PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$PKCS7Padding");
+ }
putSymmetricCipherImpl("AES/GCM/NoPadding",
PACKAGE_NAME + ".AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding");
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
index 09b3b9b..419eb24 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
@@ -243,13 +243,7 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(),
- spec.isUserAuthenticationRequired(),
- spec.getUserAuthenticationValidityDurationSeconds(),
- spec.isUserAuthenticationValidWhileOnBody(),
- spec.isInvalidatedByBiometricEnrollment(),
- GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
- spec.isUserConfirmationRequired());
+ KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), spec);
} catch (IllegalStateException | IllegalArgumentException e) {
throw new InvalidAlgorithmParameterException(e);
}
@@ -285,16 +279,7 @@
args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes);
args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterPaddings);
args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
- KeymasterUtils.addUserAuthArgs(args,
- spec.isUserAuthenticationRequired(),
- spec.getUserAuthenticationValidityDurationSeconds(),
- spec.isUserAuthenticationValidWhileOnBody(),
- spec.isInvalidatedByBiometricEnrollment(),
- GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
- spec.isUserConfirmationRequired());
- if (spec.isTrustedUserPresenceRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
- }
+ KeymasterUtils.addUserAuthArgs(args, spec);
KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
args,
mKeymasterAlgorithm,
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
index e33e3cd..5fc742a 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -344,13 +344,7 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(),
- mSpec.isUserAuthenticationRequired(),
- mSpec.getUserAuthenticationValidityDurationSeconds(),
- mSpec.isUserAuthenticationValidWhileOnBody(),
- mSpec.isInvalidatedByBiometricEnrollment(),
- GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
- mSpec.isUserConfirmationRequired());
+ KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), mSpec);
} catch (IllegalArgumentException | IllegalStateException e) {
throw new InvalidAlgorithmParameterException(e);
}
@@ -481,6 +475,12 @@
success = true;
return keyPair;
+ } catch (ProviderException e) {
+ if ((mSpec.getPurposes() & KeyProperties.PURPOSE_WRAP_KEY) != 0) {
+ throw new SecureKeyImportUnavailableException(e);
+ } else {
+ throw e;
+ }
} finally {
if (!success) {
Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid);
@@ -541,13 +541,7 @@
args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterSignaturePaddings);
args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
- KeymasterUtils.addUserAuthArgs(args,
- mSpec.isUserAuthenticationRequired(),
- mSpec.getUserAuthenticationValidityDurationSeconds(),
- mSpec.isUserAuthenticationValidWhileOnBody(),
- mSpec.isInvalidatedByBiometricEnrollment(),
- GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
- mSpec.isUserConfirmationRequired());
+ KeymasterUtils.addUserAuthArgs(args, mSpec);
args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, mSpec.getKeyValidityStart());
args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
mSpec.getKeyValidityForOriginationEnd());
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
index 2c45d43..9b7695d 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
@@ -67,6 +67,8 @@
public AndroidKeyStoreProvider() {
super(PROVIDER_NAME, 1.0, "Android KeyStore security provider");
+ boolean supports3DES = "true".equals(System.getProperty("supports3DES"));
+
// java.security.KeyStore
put("KeyStore.AndroidKeyStore", PACKAGE_NAME + ".AndroidKeyStoreSpi");
@@ -80,16 +82,21 @@
// javax.crypto.KeyGenerator
put("KeyGenerator.AES", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$AES");
- put("KeyGenerator.DESede", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$DESede");
put("KeyGenerator.HmacSHA1", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA1");
put("KeyGenerator.HmacSHA224", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA224");
put("KeyGenerator.HmacSHA256", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA256");
put("KeyGenerator.HmacSHA384", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA384");
put("KeyGenerator.HmacSHA512", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA512");
+ if (supports3DES) {
+ put("KeyGenerator.DESede", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$DESede");
+ }
+
// java.security.SecretKeyFactory
putSecretKeyFactoryImpl("AES");
- putSecretKeyFactoryImpl("DESede");
+ if (supports3DES) {
+ putSecretKeyFactoryImpl("DESede");
+ }
putSecretKeyFactoryImpl("HmacSHA1");
putSecretKeyFactoryImpl("HmacSHA224");
putSecretKeyFactoryImpl("HmacSHA256");
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
index 05cc74a..3e9853c 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
@@ -26,6 +26,7 @@
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
+import android.security.keystore.SecureKeyImportUnavailableException;
import android.security.keystore.WrappedKeyEntry;
import android.util.Log;
@@ -497,13 +498,7 @@
importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterEncryptionPaddings);
importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING,
KeyProperties.SignaturePadding.allToKeymaster(spec.getSignaturePaddings()));
- KeymasterUtils.addUserAuthArgs(importArgs,
- spec.isUserAuthenticationRequired(),
- spec.getUserAuthenticationValidityDurationSeconds(),
- spec.isUserAuthenticationValidWhileOnBody(),
- spec.isInvalidatedByBiometricEnrollment(),
- spec.getBoundToSpecificSecureUserId(),
- spec.isUserConfirmationRequired());
+ KeymasterUtils.addUserAuthArgs(importArgs, spec);
importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
spec.getKeyValidityStart());
importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
@@ -700,13 +695,7 @@
int[] keymasterPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
params.getEncryptionPaddings());
args.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterPaddings);
- KeymasterUtils.addUserAuthArgs(args,
- params.isUserAuthenticationRequired(),
- params.getUserAuthenticationValidityDurationSeconds(),
- params.isUserAuthenticationValidWhileOnBody(),
- params.isInvalidatedByBiometricEnrollment(),
- params.getBoundToSpecificSecureUserId(),
- params.isUserConfirmationRequired());
+ KeymasterUtils.addUserAuthArgs(args, params);
KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
args,
keymasterAlgorithm,
@@ -767,7 +756,9 @@
0, // FIXME fingerprint id?
mUid,
new KeyCharacteristics());
- if (errorCode != KeyStore.NO_ERROR) {
+ if (errorCode == KeymasterDefs.KM_ERROR_UNIMPLEMENTED) {
+ throw new SecureKeyImportUnavailableException("Could not import wrapped key");
+ } else if (errorCode != KeyStore.NO_ERROR) {
throw new KeyStoreException("Failed to import wrapped key. Keystore error code: "
+ errorCode);
}
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index da23c70..c0d0fb0 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -21,6 +21,7 @@
import android.annotation.Nullable;
import android.app.KeyguardManager;
import android.hardware.fingerprint.FingerprintManager;
+import android.security.GateKeeper;
import android.security.KeyStore;
import android.text.TextUtils;
@@ -232,7 +233,7 @@
* key = (SecretKey) keyStore.getKey("key2", null);
* }</pre>
*/
-public final class KeyGenParameterSpec implements AlgorithmParameterSpec {
+public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAuthArgs {
private static final X500Principal DEFAULT_CERT_SUBJECT = new X500Principal("CN=fake");
private static final BigInteger DEFAULT_CERT_SERIAL_NUMBER = new BigInteger("1");
@@ -258,13 +259,14 @@
private final boolean mRandomizedEncryptionRequired;
private final boolean mUserAuthenticationRequired;
private final int mUserAuthenticationValidityDurationSeconds;
- private final boolean mTrustedUserPresenceRequred;
+ private final boolean mUserPresenceRequired;
private final byte[] mAttestationChallenge;
private final boolean mUniqueIdIncluded;
private final boolean mUserAuthenticationValidWhileOnBody;
private final boolean mInvalidatedByBiometricEnrollment;
private final boolean mIsStrongBoxBacked;
private final boolean mUserConfirmationRequired;
+ private final boolean mUnlockedDeviceRequired;
/**
* @hide should be built with Builder
@@ -289,13 +291,14 @@
boolean randomizedEncryptionRequired,
boolean userAuthenticationRequired,
int userAuthenticationValidityDurationSeconds,
- boolean trustedUserPresenceRequired,
+ boolean userPresenceRequired,
byte[] attestationChallenge,
boolean uniqueIdIncluded,
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
boolean isStrongBoxBacked,
- boolean userConfirmationRequired) {
+ boolean userConfirmationRequired,
+ boolean unlockedDeviceRequired) {
if (TextUtils.isEmpty(keyStoreAlias)) {
throw new IllegalArgumentException("keyStoreAlias must not be empty");
}
@@ -336,7 +339,7 @@
mBlockModes = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(blockModes));
mRandomizedEncryptionRequired = randomizedEncryptionRequired;
mUserAuthenticationRequired = userAuthenticationRequired;
- mTrustedUserPresenceRequred = trustedUserPresenceRequired;
+ mUserPresenceRequired = userPresenceRequired;
mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
mAttestationChallenge = Utils.cloneIfNotNull(attestationChallenge);
mUniqueIdIncluded = uniqueIdIncluded;
@@ -344,6 +347,7 @@
mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
mIsStrongBoxBacked = isStrongBoxBacked;
mUserConfirmationRequired = userConfirmationRequired;
+ mUnlockedDeviceRequired = unlockedDeviceRequired;
}
/**
@@ -591,8 +595,8 @@
* Returns {@code true} if the key is authorized to be used only if a test of user presence has
* been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
*/
- public boolean isTrustedUserPresenceRequired() {
- return mTrustedUserPresenceRequred;
+ public boolean isUserPresenceRequired() {
+ return mUserPresenceRequired;
}
/**
@@ -669,6 +673,24 @@
}
/**
+ * Returns {@code true} if the screen must be unlocked for this key to be used for encryption or
+ * signing. Decryption and signature verification will still be available when the screen is
+ * locked.
+ *
+ * @see Builder#setUnlockedDeviceRequired(boolean)
+ */
+ public boolean isUnlockedDeviceRequired() {
+ return mUnlockedDeviceRequired;
+ }
+
+ /**
+ * @hide
+ */
+ public long getBoundToSpecificSecureUserId() {
+ return GateKeeper.INVALID_SECURE_USER_ID;
+ }
+
+ /**
* Builder of {@link KeyGenParameterSpec} instances.
*/
public final static class Builder {
@@ -692,13 +714,14 @@
private boolean mRandomizedEncryptionRequired = true;
private boolean mUserAuthenticationRequired;
private int mUserAuthenticationValidityDurationSeconds = -1;
- private boolean mTrustedUserPresenceRequired = false;
+ private boolean mUserPresenceRequired = false;
private byte[] mAttestationChallenge = null;
private boolean mUniqueIdIncluded = false;
private boolean mUserAuthenticationValidWhileOnBody;
private boolean mInvalidatedByBiometricEnrollment = true;
private boolean mIsStrongBoxBacked = false;
private boolean mUserConfirmationRequired;
+ private boolean mUnlockedDeviceRequired = false;
/**
* Creates a new instance of the {@code Builder}.
@@ -754,7 +777,7 @@
mUserAuthenticationRequired = sourceSpec.isUserAuthenticationRequired();
mUserAuthenticationValidityDurationSeconds =
sourceSpec.getUserAuthenticationValidityDurationSeconds();
- mTrustedUserPresenceRequired = sourceSpec.isTrustedUserPresenceRequired();
+ mUserPresenceRequired = sourceSpec.isUserPresenceRequired();
mAttestationChallenge = sourceSpec.getAttestationChallenge();
mUniqueIdIncluded = sourceSpec.isUniqueIdIncluded();
mUserAuthenticationValidWhileOnBody = sourceSpec.isUserAuthenticationValidWhileOnBody();
@@ -1159,8 +1182,8 @@
* {@code Signature.initSign()} and {@code Signature.sign()} method calls.
*/
@NonNull
- public Builder setTrustedUserPresenceRequired(boolean required) {
- mTrustedUserPresenceRequired = required;
+ public Builder setUserPresenceRequired(boolean required) {
+ mUserPresenceRequired = required;
return this;
}
@@ -1267,6 +1290,19 @@
}
/**
+ * Sets whether the keystore requires the screen to be unlocked before allowing decryption
+ * using this key. If this is set to {@code true}, any attempt to decrypt or sign using this
+ * key while the screen is locked will fail. A locked device requires a PIN, password,
+ * fingerprint, or other trusted factor to access. While the screen is locked, the key can
+ * still be used for encryption or signature verification.
+ */
+ @NonNull
+ public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
+ mUnlockedDeviceRequired = unlockedDeviceRequired;
+ return this;
+ }
+
+ /**
* Builds an instance of {@code KeyGenParameterSpec}.
*/
@NonNull
@@ -1291,13 +1327,14 @@
mRandomizedEncryptionRequired,
mUserAuthenticationRequired,
mUserAuthenticationValidityDurationSeconds,
- mTrustedUserPresenceRequired,
+ mUserPresenceRequired,
mAttestationChallenge,
mUniqueIdIncluded,
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
mIsStrongBoxBacked,
- mUserConfirmationRequired);
+ mUserConfirmationRequired,
+ mUnlockedDeviceRequired);
}
}
}
diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java
index f54b6de..f12a659 100644
--- a/keystore/java/android/security/keystore/KeyProperties.java
+++ b/keystore/java/android/security/keystore/KeyProperties.java
@@ -689,7 +689,11 @@
*/
public static final int ORIGIN_UNKNOWN = 1 << 2;
- /** Key was imported into the AndroidKeyStore in an encrypted wrapper */
+ /**
+ * Key was imported into the AndroidKeyStore in an encrypted wrapper. Unlike imported keys,
+ * securely imported keys can be imported without appearing as plaintext in the device's host
+ * memory.
+ */
public static final int ORIGIN_SECURELY_IMPORTED = 1 << 3;
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index b5b3281..4daf30c 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -212,7 +212,7 @@
* ...
* }</pre>
*/
-public final class KeyProtection implements ProtectionParameter {
+public final class KeyProtection implements ProtectionParameter, UserAuthArgs {
private final Date mKeyValidityStart;
private final Date mKeyValidityForOriginationEnd;
private final Date mKeyValidityForConsumptionEnd;
@@ -224,11 +224,13 @@
private final boolean mRandomizedEncryptionRequired;
private final boolean mUserAuthenticationRequired;
private final int mUserAuthenticationValidityDurationSeconds;
+ private final boolean mUserPresenceRequred;
private final boolean mUserAuthenticationValidWhileOnBody;
private final boolean mInvalidatedByBiometricEnrollment;
private final long mBoundToSecureUserId;
private final boolean mCriticalToDeviceEncryption;
private final boolean mUserConfirmationRequired;
+ private final boolean mUnlockedDeviceRequired;
private KeyProtection(
Date keyValidityStart,
@@ -242,11 +244,13 @@
boolean randomizedEncryptionRequired,
boolean userAuthenticationRequired,
int userAuthenticationValidityDurationSeconds,
+ boolean userPresenceRequred,
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
long boundToSecureUserId,
boolean criticalToDeviceEncryption,
- boolean userConfirmationRequired) {
+ boolean userConfirmationRequired,
+ boolean unlockedDeviceRequired) {
mKeyValidityStart = Utils.cloneIfNotNull(keyValidityStart);
mKeyValidityForOriginationEnd = Utils.cloneIfNotNull(keyValidityForOriginationEnd);
mKeyValidityForConsumptionEnd = Utils.cloneIfNotNull(keyValidityForConsumptionEnd);
@@ -260,11 +264,13 @@
mRandomizedEncryptionRequired = randomizedEncryptionRequired;
mUserAuthenticationRequired = userAuthenticationRequired;
mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
+ mUserPresenceRequred = userPresenceRequred;
mUserAuthenticationValidWhileOnBody = userAuthenticationValidWhileOnBody;
mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
mBoundToSecureUserId = boundToSecureUserId;
mCriticalToDeviceEncryption = criticalToDeviceEncryption;
mUserConfirmationRequired = userConfirmationRequired;
+ mUnlockedDeviceRequired = unlockedDeviceRequired;
}
/**
@@ -437,6 +443,14 @@
}
/**
+ * Returns {@code true} if the key is authorized to be used only if a test of user presence has
+ * been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
+ */
+ public boolean isUserPresenceRequired() {
+ return mUserPresenceRequred;
+ }
+
+ /**
* Returns {@code true} if the key will be de-authorized when the device is removed from the
* user's body. This option has no effect on keys that don't have an authentication validity
* duration, and has no effect if the device lacks an on-body sensor.
@@ -494,6 +508,17 @@
}
/**
+ * Returns {@code true} if the screen must be unlocked for this key to be used for encryption or
+ * signing. Decryption and signature verification will still be available when the screen is
+ * locked.
+ *
+ * @see Builder#setUnlockedDeviceRequired(boolean)
+ */
+ public boolean isUnlockedDeviceRequired() {
+ return mUnlockedDeviceRequired;
+ }
+
+ /**
* Builder of {@link KeyProtection} instances.
*/
public final static class Builder {
@@ -509,9 +534,12 @@
private boolean mRandomizedEncryptionRequired = true;
private boolean mUserAuthenticationRequired;
private int mUserAuthenticationValidityDurationSeconds = -1;
+ private boolean mUserPresenceRequired = false;
private boolean mUserAuthenticationValidWhileOnBody;
private boolean mInvalidatedByBiometricEnrollment = true;
private boolean mUserConfirmationRequired;
+ private boolean mUnlockedDeviceRequired = false;
+
private long mBoundToSecureUserId = GateKeeper.INVALID_SECURE_USER_ID;
private boolean mCriticalToDeviceEncryption = false;
@@ -811,6 +839,16 @@
}
/**
+ * Sets whether a test of user presence is required to be performed between the
+ * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
+ */
+ @NonNull
+ public Builder setUserPresenceRequired(boolean required) {
+ mUserPresenceRequired = required;
+ return this;
+ }
+
+ /**
* Sets whether the key will remain authorized only until the device is removed from the
* user's body up to the limit of the authentication validity period (see
* {@link #setUserAuthenticationValidityDurationSeconds} and
@@ -892,6 +930,19 @@
}
/**
+ * Sets whether the keystore requires the screen to be unlocked before allowing decryption
+ * using this key. If this is set to {@code true}, any attempt to decrypt or sign using this
+ * key while the screen is locked will fail. A locked device requires a PIN, password,
+ * fingerprint, or other trusted factor to access. While the screen is locked, the key can
+ * still be used for encryption or signature verification.
+ */
+ @NonNull
+ public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
+ mUnlockedDeviceRequired = unlockedDeviceRequired;
+ return this;
+ }
+
+ /**
* Builds an instance of {@link KeyProtection}.
*
* @throws IllegalArgumentException if a required field is missing
@@ -910,11 +961,13 @@
mRandomizedEncryptionRequired,
mUserAuthenticationRequired,
mUserAuthenticationValidityDurationSeconds,
+ mUserPresenceRequired,
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
mBoundToSecureUserId,
mCriticalToDeviceEncryption,
- mUserConfirmationRequired);
+ mUserConfirmationRequired,
+ mUnlockedDeviceRequired);
}
}
}
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 4e28601..f829bb7 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -16,7 +16,7 @@
package android.security.keystore;
-import android.util.Log;
+import android.app.ActivityManager;
import android.hardware.fingerprint.FingerprintManager;
import android.security.GateKeeper;
import android.security.KeyStore;
@@ -100,23 +100,26 @@
* state (e.g., secure lock screen not set up) for generating or importing keys that
* require user authentication.
*/
- public static void addUserAuthArgs(KeymasterArguments args,
- boolean userAuthenticationRequired,
- int userAuthenticationValidityDurationSeconds,
- boolean userAuthenticationValidWhileOnBody,
- boolean invalidatedByBiometricEnrollment,
- long boundToSpecificSecureUserId,
- boolean userConfirmationRequired) {
- if (userConfirmationRequired) {
+ public static void addUserAuthArgs(KeymasterArguments args, UserAuthArgs spec) {
+
+ if (spec.isUserConfirmationRequired()) {
args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
}
- if (!userAuthenticationRequired) {
+ if (spec.isUserPresenceRequired()) {
+ args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
+ }
+
+ if (spec.isUnlockedDeviceRequired()) {
+ args.addBoolean(KeymasterDefs.KM_TAG_UNLOCKED_DEVICE_REQUIRED);
+ }
+
+ if (!spec.isUserAuthenticationRequired()) {
args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
return;
}
- if (userAuthenticationValidityDurationSeconds == -1) {
+ if (spec.getUserAuthenticationValidityDurationSeconds() == -1) {
// Every use of this key needs to be authorized by the user. This currently means
// fingerprint-only auth.
FingerprintManager fingerprintManager =
@@ -132,9 +135,9 @@
}
long sid;
- if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) {
- sid = boundToSpecificSecureUserId;
- } else if (invalidatedByBiometricEnrollment) {
+ if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
+ sid = spec.getBoundToSpecificSecureUserId();
+ } else if (spec.isInvalidatedByBiometricEnrollment()) {
// The fingerprint-only SID will change on fingerprint enrollment or removal of all,
// enrolled fingerprints, invalidating the key.
sid = fingerprintOnlySid;
@@ -147,14 +150,14 @@
args.addUnsignedLong(
KeymasterDefs.KM_TAG_USER_SECURE_ID, KeymasterArguments.toUint64(sid));
args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, KeymasterDefs.HW_AUTH_FINGERPRINT);
- if (userAuthenticationValidWhileOnBody) {
+ if (spec.isUserAuthenticationValidWhileOnBody()) {
throw new ProviderException("Key validity extension while device is on-body is not "
+ "supported for keys requiring fingerprint authentication");
}
} else {
long sid;
- if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) {
- sid = boundToSpecificSecureUserId;
+ if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
+ sid = spec.getBoundToSpecificSecureUserId();
} else {
// The key is authorized for use for the specified amount of time after the user has
// authenticated. Whatever unlocks the secure lock screen should authorize this key.
@@ -165,8 +168,8 @@
args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE,
KeymasterDefs.HW_AUTH_PASSWORD | KeymasterDefs.HW_AUTH_FINGERPRINT);
args.addUnsignedInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
- userAuthenticationValidityDurationSeconds);
- if (userAuthenticationValidWhileOnBody) {
+ spec.getUserAuthenticationValidityDurationSeconds());
+ if (spec.isUserAuthenticationValidWhileOnBody()) {
args.addBoolean(KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY);
}
}
diff --git a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
index e5fdea7..911bbf8 100644
--- a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
@@ -101,7 +101,7 @@
out.writeBoolean(mSpec.isUniqueIdIncluded());
out.writeBoolean(mSpec.isUserAuthenticationValidWhileOnBody());
out.writeBoolean(mSpec.isInvalidatedByBiometricEnrollment());
- out.writeBoolean(mSpec.isTrustedUserPresenceRequired());
+ out.writeBoolean(mSpec.isUserPresenceRequired());
}
private static Date readDateOrNull(Parcel in) {
@@ -165,7 +165,7 @@
builder.setUniqueIdIncluded(in.readBoolean());
builder.setUserAuthenticationValidWhileOnBody(in.readBoolean());
builder.setInvalidatedByBiometricEnrollment(in.readBoolean());
- builder.setTrustedUserPresenceRequired(in.readBoolean());
+ builder.setUserPresenceRequired(in.readBoolean());
mSpec = builder.build();
}
diff --git a/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
new file mode 100644
index 0000000..d1cc572
--- /dev/null
+++ b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+package android.security.keystore;
+
+import android.security.KeyStore;
+import android.security.KeyStoreException;
+
+import java.security.ProviderException;
+
+/**
+ * Indicates that the Keystore does not support securely importing wrapped keys.
+ */
+public class SecureKeyImportUnavailableException extends ProviderException {
+
+ public SecureKeyImportUnavailableException() {
+ super();
+ }
+
+ public SecureKeyImportUnavailableException(String message) {
+ super(message, new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE,
+ "Secure Key Import not available"));
+ }
+
+ public SecureKeyImportUnavailableException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public SecureKeyImportUnavailableException(Throwable cause) {
+ super(cause);
+ }
+}
+
diff --git a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
index 66a77ed..6c7e9a9 100644
--- a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
+++ b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
@@ -27,13 +27,22 @@
*/
public class StrongBoxUnavailableException extends ProviderException {
- /**
- * @hide
- */
+ public StrongBoxUnavailableException() {
+ super();
+ }
+
public StrongBoxUnavailableException(String message) {
super(message,
new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE, "No StrongBox available")
);
}
+
+ public StrongBoxUnavailableException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public StrongBoxUnavailableException(Throwable cause) {
+ super(cause);
+ }
}
diff --git a/keystore/java/android/security/keystore/UserAuthArgs.java b/keystore/java/android/security/keystore/UserAuthArgs.java
new file mode 100644
index 0000000..6952060
--- /dev/null
+++ b/keystore/java/android/security/keystore/UserAuthArgs.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+package android.security.keystore;
+
+/**
+ * @hide
+ *
+ * This is an interface to encapsulate the user authentication arguments that
+ * are passed to KeymasterUtils.addUserAuthArgs. Classes that represent
+ * authorization characteristics for new or imported keys can implement this
+ * interface to be passed to that method.
+ */
+public interface UserAuthArgs {
+
+ boolean isUserAuthenticationRequired();
+ int getUserAuthenticationValidityDurationSeconds();
+ boolean isUserAuthenticationValidWhileOnBody();
+ boolean isInvalidatedByBiometricEnrollment();
+ boolean isUserConfirmationRequired();
+ long getBoundToSpecificSecureUserId();
+ boolean isUserPresenceRequired();
+ boolean isUnlockedDeviceRequired();
+}
diff --git a/keystore/java/android/security/keystore/WrappedKeyEntry.java b/keystore/java/android/security/keystore/WrappedKeyEntry.java
index a8f4afe..7155686 100644
--- a/keystore/java/android/security/keystore/WrappedKeyEntry.java
+++ b/keystore/java/android/security/keystore/WrappedKeyEntry.java
@@ -21,7 +21,55 @@
import java.security.spec.AlgorithmParameterSpec;
/**
- * An {@link Entry} that holds a wrapped key.
+ * An {@link Entry} that holds a wrapped key. Wrapped keys contain encrypted key data and
+ * description information that can be used to securely import key material into a hardware-backed
+ * Keystore.
+ *
+ * <p>
+ * The wrapped key is in DER-encoded ASN.1 format, specified by the following schema:
+ * </p>
+ *
+ * <pre>
+ * KeyDescription ::= SEQUENCE(
+ * keyFormat INTEGER, # Values from KeyFormat enum.
+ * keyParams AuthorizationList,
+ * )
+ *
+ * SecureKeyWrapper ::= SEQUENCE(
+ * version INTEGER, # Contains value 0
+ * encryptedTransportKey OCTET_STRING,
+ * initializationVector OCTET_STRING,
+ * keyDescription KeyDescription,
+ * encryptedKey OCTET_STRING,
+ * tag OCTET_STRING
+ * )
+ * </pre>
+ * <ul>
+ * <li>keyFormat is an integer from the KeyFormat enum, defining the format of the plaintext
+ * key material.
+ * </li>
+ * <li>keyParams is the characteristics of the key to be imported (as with generateKey or
+ * importKey). If the secure import is successful, these characteristics must be
+ * associated with the key exactly as if the key material had been insecurely imported
+ * with importKey. See <a href="https://developer.android.com/training/articles/security-key-attestation.html#certificate_schema">Key Attestation</a> for the AuthorizationList format.
+ * </li>
+ * <li>encryptedTransportKey is a 256-bit AES key, XORed with a masking key and then encrypted
+ * in RSA-OAEP mode (SHA-256 digest, SHA-1 MGF1 digest) with the wrapping key specified by
+ * wrappingKeyBlob.
+ * </li>
+ * <li>keyDescription is a KeyDescription, above.
+ * </li>
+ * <li>encryptedKey is the key material of the key to be imported, in format keyFormat, and
+ * encrypted with encryptedEphemeralKey in AES-GCM mode, with the DER-encoded
+ * representation of keyDescription provided as additional authenticated data.
+ * </li>
+ * <li>tag is the tag produced by the AES-GCM encryption of encryptedKey.
+ * </li>
+ *</ul>
+ *
+ * <p>
+ * Imported wrapped keys will have KeymasterDefs.KM_ORIGIN_SECURELY_IMPORTED
+ * </p>
*/
public class WrappedKeyEntry implements Entry {
@@ -30,6 +78,14 @@
private final String mTransformation;
private final AlgorithmParameterSpec mAlgorithmParameterSpec;
+ /**
+ * Constructs a {@link WrappedKeyEntry} with a binary wrapped key.
+ *
+ * @param wrappedKeyBytes ASN.1 DER encoded wrapped key
+ * @param wrappingKeyAlias identifies the private key that can unwrap the wrapped key
+ * @param transformation used to unwrap the key. ex: "RSA/ECB/OAEPPadding"
+ * @param algorithmParameterSpec spec for the private key used to unwrap the wrapped key
+ */
public WrappedKeyEntry(byte[] wrappedKeyBytes, String wrappingKeyAlias, String transformation,
AlgorithmParameterSpec algorithmParameterSpec) {
mWrappedKeyBytes = wrappedKeyBytes;
@@ -54,3 +110,4 @@
return mAlgorithmParameterSpec;
}
}
+
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 35790b6..592a6e6 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -168,6 +168,7 @@
"pipeline/skia/ReorderBarrierDrawables.cpp",
"pipeline/skia/ShaderCache.cpp",
"pipeline/skia/SkiaDisplayList.cpp",
+ "pipeline/skia/SkiaMemoryTracer.cpp",
"pipeline/skia/SkiaOpenGLPipeline.cpp",
"pipeline/skia/SkiaOpenGLReadback.cpp",
"pipeline/skia/SkiaPipeline.cpp",
diff --git a/libs/hwui/PathParser.cpp b/libs/hwui/PathParser.cpp
index a48fdfc..47fcca9 100644
--- a/libs/hwui/PathParser.cpp
+++ b/libs/hwui/PathParser.cpp
@@ -156,10 +156,63 @@
return;
}
-bool PathParser::isVerbValid(char verb) {
- verb = tolower(verb);
- return verb == 'a' || verb == 'c' || verb == 'h' || verb == 'l' || verb == 'm' || verb == 'q' ||
- verb == 's' || verb == 't' || verb == 'v' || verb == 'z';
+void PathParser::validateVerbAndPoints(char verb, size_t points, PathParser::ParseResult* result) {
+ size_t numberOfPointsExpected = -1;
+ switch (verb) {
+ case 'z':
+ case 'Z':
+ numberOfPointsExpected = 0;
+ break;
+ case 'm':
+ case 'l':
+ case 't':
+ case 'M':
+ case 'L':
+ case 'T':
+ numberOfPointsExpected = 2;
+ break;
+ case 'h':
+ case 'v':
+ case 'H':
+ case 'V':
+ numberOfPointsExpected = 1;
+ break;
+ case 'c':
+ case 'C':
+ numberOfPointsExpected = 6;
+ break;
+ case 's':
+ case 'q':
+ case 'S':
+ case 'Q':
+ numberOfPointsExpected = 4;
+ break;
+ case 'a':
+ case 'A':
+ numberOfPointsExpected = 7;
+ break;
+ default:
+ result->failureOccurred = true;
+ result->failureMessage += verb;
+ result->failureMessage += " is not a valid verb. ";
+ return;
+ }
+ if (numberOfPointsExpected == 0 && points == 0) {
+ return;
+ }
+ if (numberOfPointsExpected > 0 && points % numberOfPointsExpected == 0) {
+ return;
+ }
+
+ result->failureOccurred = true;
+ result->failureMessage += verb;
+ result->failureMessage += " needs to be followed by ";
+ if (numberOfPointsExpected > 0) {
+ result->failureMessage += "a multiple of ";
+ }
+ result->failureMessage += std::to_string(numberOfPointsExpected)
+ + " floats. However, " + std::to_string(points)
+ + " float(s) are found. ";
}
void PathParser::getPathDataFromAsciiString(PathData* data, ParseResult* result,
@@ -186,13 +239,11 @@
end = nextStart(pathStr, strLen, end);
std::vector<float> points;
getFloats(&points, result, pathStr, start, end);
- if (!isVerbValid(pathStr[start])) {
- result->failureOccurred = true;
- result->failureMessage = "Invalid pathData. Failure occurred at position " +
- std::to_string(start) + " of path: " + pathStr;
- }
- // If either verb or points is not valid, return immediately.
+ validateVerbAndPoints(pathStr[start], points.size(), result);
if (result->failureOccurred) {
+ // If either verb or points is not valid, return immediately.
+ result->failureMessage += "Failure occurred at position " +
+ std::to_string(start) + " of path: " + pathStr;
return;
}
data->verbs.push_back(pathStr[start]);
@@ -203,9 +254,10 @@
}
if ((end - start) == 1 && start < strLen) {
- if (!isVerbValid(pathStr[start])) {
- result->failureOccurred = true;
- result->failureMessage = "Invalid pathData. Failure occurred at position " +
+ validateVerbAndPoints(pathStr[start], 0, result);
+ if (result->failureOccurred) {
+ // If either verb or points is not valid, return immediately.
+ result->failureMessage += "Failure occurred at position " +
std::to_string(start) + " of path: " + pathStr;
return;
}
diff --git a/libs/hwui/PathParser.h b/libs/hwui/PathParser.h
index e4ec7be..474eb97 100644
--- a/libs/hwui/PathParser.h
+++ b/libs/hwui/PathParser.h
@@ -43,7 +43,7 @@
ANDROID_API static void getPathDataFromAsciiString(PathData* outData, ParseResult* result,
const char* pathStr, size_t strLength);
static void dump(const PathData& data);
- static bool isVerbValid(char verb);
+ static void validateVerbAndPoints(char verb, size_t points, ParseResult* result);
};
}; // namespace uirenderer
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index fedcc10..d93a757 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -243,24 +243,11 @@
return;
}
- if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator)) {
+ if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator, info.errorHandler)) {
damageSelf(info);
}
if (!hasLayer()) {
- Caches::getInstance().dumpMemoryUsage();
- if (info.errorHandler) {
- std::ostringstream err;
- err << "Unable to create layer for " << getName();
- const int maxTextureSize = Caches::getInstance().maxTextureSize;
- if (getWidth() > maxTextureSize || getHeight() > maxTextureSize) {
- err << ", size " << getWidth() << "x" << getHeight() << " exceeds max size "
- << maxTextureSize;
- } else {
- err << ", see logcat for more info";
- }
- info.errorHandler->onError(err.str());
- }
return;
}
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp
index d9584db..293e45f 100644
--- a/libs/hwui/pipeline/skia/LayerDrawable.cpp
+++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp
@@ -34,7 +34,8 @@
}
}
-bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer) {
+bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer,
+ const SkRect* dstRect) {
if (context == nullptr) {
SkDEBUGF(("Attempting to draw LayerDrawable into an unsupported surface"));
return false;
@@ -43,8 +44,8 @@
SkMatrix layerTransform;
layer->getTransform().copyTo(layerTransform);
sk_sp<SkImage> layerImage;
- int layerWidth = layer->getWidth();
- int layerHeight = layer->getHeight();
+ const int layerWidth = layer->getWidth();
+ const int layerHeight = layer->getHeight();
if (layer->getApi() == Layer::Api::OpenGL) {
GlLayer* glLayer = static_cast<GlLayer*>(layer);
GrGLTextureInfo externalTexture;
@@ -62,21 +63,21 @@
}
if (layerImage) {
- SkMatrix textureMatrix;
- layer->getTexTransform().copyTo(textureMatrix);
+ SkMatrix textureMatrixInv;
+ layer->getTexTransform().copyTo(textureMatrixInv);
// TODO: after skia bug https://bugs.chromium.org/p/skia/issues/detail?id=7075 is fixed
// use bottom left origin and remove flipV and invert transformations.
SkMatrix flipV;
flipV.setAll(1, 0, 0, 0, -1, 1, 0, 0, 1);
- textureMatrix.preConcat(flipV);
- textureMatrix.preScale(1.0f / layerWidth, 1.0f / layerHeight);
- textureMatrix.postScale(layerWidth, layerHeight);
- SkMatrix textureMatrixInv;
- if (!textureMatrix.invert(&textureMatrixInv)) {
- textureMatrixInv = textureMatrix;
+ textureMatrixInv.preConcat(flipV);
+ textureMatrixInv.preScale(1.0f / layerWidth, 1.0f / layerHeight);
+ textureMatrixInv.postScale(layerWidth, layerHeight);
+ SkMatrix textureMatrix;
+ if (!textureMatrixInv.invert(&textureMatrix)) {
+ textureMatrix = textureMatrixInv;
}
- SkMatrix matrix = SkMatrix::Concat(layerTransform, textureMatrixInv);
+ SkMatrix matrix = SkMatrix::Concat(layerTransform, textureMatrix);
SkPaint paint;
paint.setAlpha(layer->getAlpha());
@@ -88,7 +89,20 @@
canvas->save();
canvas->concat(matrix);
}
- canvas->drawImage(layerImage.get(), 0, 0, &paint);
+ if (dstRect) {
+ SkMatrix matrixInv;
+ if (!matrix.invert(&matrixInv)) {
+ matrixInv = matrix;
+ }
+ SkRect srcRect = SkRect::MakeIWH(layerWidth, layerHeight);
+ matrixInv.mapRect(&srcRect);
+ SkRect skiaDestRect = *dstRect;
+ matrixInv.mapRect(&skiaDestRect);
+ canvas->drawImageRect(layerImage.get(), srcRect, skiaDestRect, &paint,
+ SkCanvas::kFast_SrcRectConstraint);
+ } else {
+ canvas->drawImage(layerImage.get(), 0, 0, &paint);
+ }
// restore the original matrix
if (nonIdentityMatrix) {
canvas->restore();
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.h b/libs/hwui/pipeline/skia/LayerDrawable.h
index 3450387..18d1184 100644
--- a/libs/hwui/pipeline/skia/LayerDrawable.h
+++ b/libs/hwui/pipeline/skia/LayerDrawable.h
@@ -32,7 +32,8 @@
public:
explicit LayerDrawable(DeferredLayerUpdater* layerUpdater) : mLayerUpdater(layerUpdater) {}
- static bool DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer);
+ static bool DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer,
+ const SkRect* dstRect = nullptr);
protected:
virtual SkRect onGetBounds() override {
diff --git a/libs/hwui/pipeline/skia/ShaderCache.cpp b/libs/hwui/pipeline/skia/ShaderCache.cpp
index 2fa56f6..6700748 100644
--- a/libs/hwui/pipeline/skia/ShaderCache.cpp
+++ b/libs/hwui/pipeline/skia/ShaderCache.cpp
@@ -83,10 +83,12 @@
int maxTries = 3;
while (valueSize > mObservedBlobValueSize && maxTries > 0) {
mObservedBlobValueSize = std::min(valueSize, maxValueSize);
- valueBuffer = realloc(valueBuffer, mObservedBlobValueSize);
- if (!valueBuffer) {
+ void *newValueBuffer = realloc(valueBuffer, mObservedBlobValueSize);
+ if (!newValueBuffer) {
+ free(valueBuffer);
return nullptr;
}
+ valueBuffer = newValueBuffer;
valueSize = bc->get(key.data(), keySize, valueBuffer, mObservedBlobValueSize);
maxTries--;
}
diff --git a/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp b/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp
new file mode 100644
index 0000000..ee99622
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ */
+
+#include "SkiaMemoryTracer.h"
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+SkiaMemoryTracer::SkiaMemoryTracer(std::vector<ResourcePair> resourceMap, bool itemizeType)
+ : mResourceMap(resourceMap)
+ , mItemizeType(itemizeType)
+ , mTotalSize("bytes", 0)
+ , mPurgeableSize("bytes", 0) {}
+
+SkiaMemoryTracer::SkiaMemoryTracer(const char* categoryKey, bool itemizeType)
+ : mCategoryKey(categoryKey)
+ , mItemizeType(itemizeType)
+ , mTotalSize("bytes", 0)
+ , mPurgeableSize("bytes", 0) {}
+
+const char* SkiaMemoryTracer::mapName(const char* resourceName) {
+ for (auto& resource : mResourceMap) {
+ if (SkStrContains(resourceName, resource.first)) {
+ return resource.second;
+ }
+ }
+ return nullptr;
+}
+
+void SkiaMemoryTracer::processElement() {
+ if(!mCurrentElement.empty()) {
+ // Only count elements that contain "size", other values just provide metadata.
+ auto sizeResult = mCurrentValues.find("size");
+ if (sizeResult != mCurrentValues.end()) {
+ mTotalSize.value += sizeResult->second.value;
+ mTotalSize.count++;
+ } else {
+ mCurrentElement.clear();
+ mCurrentValues.clear();
+ return;
+ }
+
+ // find the purgeable size if one exists
+ auto purgeableResult = mCurrentValues.find("purgeable_size");
+ if (purgeableResult != mCurrentValues.end()) {
+ mPurgeableSize.value += purgeableResult->second.value;
+ mPurgeableSize.count++;
+ }
+
+ // find the type if one exists
+ const char* type;
+ auto typeResult = mCurrentValues.find("type");
+ if (typeResult != mCurrentValues.end()) {
+ type = typeResult->second.units;
+ } else if (mItemizeType) {
+ type = "Other";
+ }
+
+ // compute the type if we are itemizing or use the default "size" if we are not
+ const char* key = (mItemizeType) ? type : sizeResult->first;
+ SkASSERT(key != nullptr);
+
+ // compute the top level element name using either the map or category key
+ const char* resourceName = mapName(mCurrentElement.c_str());
+ if (mCategoryKey != nullptr) {
+ // find the category if one exists
+ auto categoryResult = mCurrentValues.find(mCategoryKey);
+ if (categoryResult != mCurrentValues.end()) {
+ resourceName = categoryResult->second.units;
+ } else if (mItemizeType) {
+ resourceName = "Other";
+ }
+ }
+
+ // if we don't have a resource name then we don't know how to label the
+ // data and should abort.
+ if (resourceName == nullptr) {
+ mCurrentElement.clear();
+ mCurrentValues.clear();
+ return;
+ }
+
+ auto result = mResults.find(resourceName);
+ if (result != mResults.end()) {
+ auto& resourceValues = result->second;
+ typeResult = resourceValues.find(key);
+ if (typeResult != resourceValues.end()) {
+ SkASSERT(sizeResult->second.units == typeResult->second.units);
+ typeResult->second.value += sizeResult->second.value;
+ typeResult->second.count++;
+ } else {
+ resourceValues.insert({key, sizeResult->second});
+ }
+ } else {
+ mCurrentValues.clear();
+ mCurrentValues.insert({key, sizeResult->second});
+ mResults.insert({resourceName, mCurrentValues});
+ }
+ }
+
+ mCurrentElement.clear();
+ mCurrentValues.clear();
+}
+
+void SkiaMemoryTracer::dumpNumericValue(const char* dumpName, const char* valueName,
+ const char* units, uint64_t value) {
+ if (mCurrentElement != dumpName) {
+ processElement();
+ mCurrentElement = dumpName;
+ }
+ mCurrentValues.insert({valueName, {units, value}});
+}
+
+void SkiaMemoryTracer::logOutput(String8& log) {
+ // process any remaining elements
+ processElement();
+
+ for (const auto& namedItem : mResults) {
+ if (mItemizeType) {
+ log.appendFormat(" %s:\n", namedItem.first.c_str());
+ for (const auto& typedValue : namedItem.second) {
+ TraceValue traceValue = convertUnits(typedValue.second);
+ const char* entry = (traceValue.count > 1) ? "entries" : "entry";
+ log.appendFormat(" %s: %.2f %s (%d %s)\n", typedValue.first,
+ traceValue.value, traceValue.units, traceValue.count, entry);
+ }
+ } else {
+ auto result = namedItem.second.find("size");
+ if (result != namedItem.second.end()) {
+ TraceValue traceValue = convertUnits(result->second);
+ const char* entry = (traceValue.count > 1) ? "entries" : "entry";
+ log.appendFormat(" %s: %.2f %s (%d %s)\n", namedItem.first.c_str(),
+ traceValue.value, traceValue.units, traceValue.count, entry);
+ }
+ }
+ }
+}
+
+void SkiaMemoryTracer::logTotals(String8& log) {
+ TraceValue total = convertUnits(mTotalSize);
+ TraceValue purgeable = convertUnits(mPurgeableSize);
+ log.appendFormat(" %.0f bytes, %.2f %s (%.2f %s is purgeable)\n", mTotalSize.value,
+ total.value, total.units, purgeable.value, purgeable.units);
+}
+
+SkiaMemoryTracer::TraceValue SkiaMemoryTracer::convertUnits(const TraceValue& value) {
+ TraceValue output(value);
+ if (SkString("bytes") == SkString(output.units) && output.value >= 1024) {
+ output.value = output.value / 1024.0f;
+ output.units = "KB";
+ }
+ if (SkString("KB") == SkString(output.units) && output.value >= 1024) {
+ output.value = output.value / 1024.0f;
+ output.units = "MB";
+ }
+ return output;
+}
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaMemoryTracer.h b/libs/hwui/pipeline/skia/SkiaMemoryTracer.h
new file mode 100644
index 0000000..abf1f4b
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaMemoryTracer.h
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <SkString.h>
+#include <SkTraceMemoryDump.h>
+#include <utils/String8.h>
+#include <unordered_map>
+#include <vector>
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+typedef std::pair<const char*, const char*> ResourcePair;
+
+class SkiaMemoryTracer : public SkTraceMemoryDump {
+public:
+ SkiaMemoryTracer(std::vector<ResourcePair> resourceMap, bool itemizeType);
+ SkiaMemoryTracer(const char* categoryKey, bool itemizeType);
+ ~SkiaMemoryTracer() override {}
+
+ void logOutput(String8& log);
+ void logTotals(String8& log);
+
+ void dumpNumericValue(const char* dumpName, const char* valueName, const char* units,
+ uint64_t value) override;
+
+ void dumpStringValue(const char* dumpName, const char* valueName, const char* value) override {
+ // for convenience we just store this in the same format as numerical values
+ dumpNumericValue(dumpName, valueName, value, 0);
+ }
+
+ LevelOfDetail getRequestedDetails() const override {
+ return SkTraceMemoryDump::kLight_LevelOfDetail;
+ }
+
+ bool shouldDumpWrappedObjects() const override { return true; }
+ void setMemoryBacking(const char*, const char*, const char*) override { }
+ void setDiscardableMemoryBacking(const char*, const SkDiscardableMemory&) override { }
+
+private:
+ struct TraceValue {
+ TraceValue(const char* units, uint64_t value) : units(units), value(value), count(1) {}
+ TraceValue(const TraceValue& v) : units(v.units), value(v.value), count(v.count) {}
+
+ const char* units;
+ float value;
+ int count;
+ };
+
+ const char* mapName(const char* resourceName);
+ void processElement();
+ TraceValue convertUnits(const TraceValue& value);
+
+ const std::vector<ResourcePair> mResourceMap;
+ const char* mCategoryKey = nullptr;
+ const bool mItemizeType;
+
+ // variables storing the size of all elements being dumped
+ TraceValue mTotalSize;
+ TraceValue mPurgeableSize;
+
+ // variables storing information on the current node being dumped
+ std::string mCurrentElement;
+ std::unordered_map<const char*, TraceValue> mCurrentValues;
+
+ // variable that stores the final format of the data after the individual elements are processed
+ std::unordered_map<std::string, std::unordered_map<const char*, TraceValue>> mResults;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 365d740..74cfb28 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -138,7 +138,9 @@
SkBudgeted::kYes, bitmap->info());
Layer* layer = deferredLayer->backingLayer();
- if (LayerDrawable::DrawLayer(mRenderThread.getGrContext(), tmpSurface->getCanvas(), layer)) {
+ const SkRect dstRect = SkRect::MakeIWH(bitmap->width(), bitmap->height());
+ if (LayerDrawable::DrawLayer(mRenderThread.getGrContext(), tmpSurface->getCanvas(), layer,
+ &dstRect)) {
sk_sp<SkImage> tmpImage = tmpSurface->makeImageSnapshot();
if (tmpImage->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), 0, 0)) {
bitmap->notifyPixelsChanged();
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 0cd1c15..07052cd 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -22,6 +22,7 @@
#include <SkOverdrawColorFilter.h>
#include <SkPicture.h>
#include <SkPictureRecorder.h>
+#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "utils/TraceUtils.h"
@@ -158,7 +159,7 @@
}
bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
- bool wideColorGamut) {
+ bool wideColorGamut, ErrorHandler* errorHandler) {
// compute the size of the surface (i.e. texture) to be allocated for this layer
const int surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE;
const int surfaceHeight = ceilf(node->getHeight() / float(LAYER_SIZE)) * LAYER_SIZE;
@@ -182,6 +183,20 @@
Matrix4 windowTransform;
damageAccumulator.computeCurrentTransform(&windowTransform);
node->getSkiaLayer()->inverseTransformInWindow = windowTransform;
+ } else {
+ String8 cachesOutput;
+ mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput,
+ &mRenderThread.renderState());
+ ALOGE("%s", cachesOutput.string());
+ if (errorHandler) {
+ std::ostringstream err;
+ err << "Unable to create layer for " << node->getName();
+ const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
+ err << ", size " << info.width() << "x" << info.height() << " max size "
+ << maxTextureSize << " color type " << (int)info.colorType()
+ << " has context " << (int)(mRenderThread.getGrContext() != nullptr);
+ errorHandler->onError(err.str());
+ }
}
return true;
}
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index 3800194..38ad9c0 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -47,7 +47,7 @@
const BakedOpRenderer::LightInfo& lightInfo) override;
bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
- bool wideColorGamut) override;
+ bool wideColorGamut, ErrorHandler* errorHandler) override;
void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
const std::vector<sp<RenderNode>>& nodes, bool opaque, bool wideColorGamut,
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index 907f2d2..3ca9295 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -20,10 +20,12 @@
#include "Properties.h"
#include "RenderThread.h"
#include "pipeline/skia/ShaderCache.h"
+#include "pipeline/skia/SkiaMemoryTracer.h"
#include "renderstate/RenderState.h"
#include <GrContextOptions.h>
#include <SkExecutor.h>
+#include <SkGraphics.h>
#include <gui/Surface.h>
#include <math.h>
#include <set>
@@ -149,7 +151,12 @@
mGrContext->freeGpuResources();
break;
case TrimMemoryMode::UiHidden:
- mGrContext->purgeUnlockedResources(mMaxResourceBytes - mBackgroundResourceBytes, true);
+ // Here we purge all the unlocked scratch resources and then toggle the resources cache
+ // limits between the background and max amounts. This causes the unlocked resources
+ // that have persistent data to be purged in LRU order.
+ mGrContext->purgeUnlockedResources(true);
+ mGrContext->setResourceCacheLimits(mMaxResources, mBackgroundResourceBytes);
+ mGrContext->setResourceCacheLimits(mMaxResources, mMaxResourceBytes);
break;
}
}
@@ -159,7 +166,10 @@
return;
}
mGrContext->flush();
- mGrContext->purgeResourcesNotUsedInMs(std::chrono::seconds(30));
+ // Here we purge all the unlocked scratch resources (leaving those resources w/ persistent data)
+ // and then purge those w/ persistent data based on age.
+ mGrContext->purgeUnlockedResources(true);
+ mGrContext->purgeResourcesNotUsedInMs(std::chrono::seconds(10));
}
sp<skiapipeline::VectorDrawableAtlas> CacheManager::acquireVectorDrawableAtlas() {
@@ -178,12 +188,29 @@
return;
}
- size_t bytesCached;
- mGrContext->getResourceCacheUsage(nullptr, &bytesCached);
+ log.appendFormat("Font Cache (CPU):\n");
+ log.appendFormat(" Size: %.2f kB \n", SkGraphics::GetFontCacheUsed() / 1024.0f);
+ log.appendFormat(" Glyph Count: %d \n", SkGraphics::GetFontCacheCountUsed());
- log.appendFormat("Caches:\n");
+ log.appendFormat("CPU Caches:\n");
+ std::vector<skiapipeline::ResourcePair> cpuResourceMap = {
+ {"skia/sk_resource_cache/bitmap_", "Bitmaps"},
+ {"skia/sk_resource_cache/rrect-blur_", "Masks"},
+ {"skia/sk_resource_cache/rects-blur_", "Masks"},
+ {"skia/sk_resource_cache/tessellated", "Shadows"},
+ };
+ skiapipeline::SkiaMemoryTracer cpuTracer(cpuResourceMap, false);
+ SkGraphics::DumpMemoryStatistics(&cpuTracer);
+ cpuTracer.logOutput(log);
+
+ log.appendFormat("GPU Caches:\n");
+ skiapipeline::SkiaMemoryTracer gpuTracer("category", true);
+ mGrContext->dumpMemoryStatistics(&gpuTracer);
+ gpuTracer.logOutput(log);
+
+ log.appendFormat("Other Caches:\n");
log.appendFormat(" Current / Maximum\n");
- log.appendFormat(" VectorDrawableAtlas %6.2f kB / %6.2f kB (entries = %zu)\n", 0.0f, 0.0f,
+ log.appendFormat(" VectorDrawableAtlas %6.2f kB / %6.2f KB (entries = %zu)\n", 0.0f, 0.0f,
(size_t)0);
if (renderState) {
@@ -200,14 +227,12 @@
layer->getHeight());
layerMemoryTotal += layer->getWidth() * layer->getHeight() * 4;
}
- log.appendFormat(" Layers Total %6.2f kB (numLayers = %zu)\n",
+ log.appendFormat(" Layers Total %6.2f KB (numLayers = %zu)\n",
layerMemoryTotal / 1024.0f, renderState->mActiveLayers.size());
}
- log.appendFormat("Total memory usage:\n");
- log.appendFormat(" %zu bytes, %.2f MB (%.2f MB is purgeable)\n", bytesCached,
- bytesCached / 1024.0f / 1024.0f,
- mGrContext->getResourceCachePurgeableBytes() / 1024.0f / 1024.0f);
+ log.appendFormat("Total GPU memory usage:\n");
+ gpuTracer.logTotals(log);
}
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index d80a247..c2cc72a 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -49,6 +49,7 @@
class AnimationContext;
class DeferredLayerUpdater;
+class ErrorHandler;
class Layer;
class Rect;
class RenderState;
@@ -74,8 +75,10 @@
*
* @return true if the layer has been created or updated
*/
- bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator) {
- return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut);
+ bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator,
+ ErrorHandler* errorHandler) {
+ return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut,
+ errorHandler);
}
/**
diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h
index 246ab26..b1de497 100644
--- a/libs/hwui/renderthread/IRenderPipeline.h
+++ b/libs/hwui/renderthread/IRenderPipeline.h
@@ -31,6 +31,7 @@
namespace uirenderer {
class DeferredLayerUpdater;
+class ErrorHandler;
namespace renderthread {
@@ -68,7 +69,7 @@
const BakedOpRenderer::LightInfo& lightInfo) = 0;
virtual TaskManager* getTaskManager() = 0;
virtual bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
- bool wideColorGamut) = 0;
+ bool wideColorGamut, ErrorHandler* errorHandler) = 0;
virtual bool pinImages(std::vector<SkImage*>& mutableImages) = 0;
virtual bool pinImages(LsaVector<sk_sp<Bitmap>>& images) = 0;
virtual void unpinImages() = 0;
diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp
index f3103fd..876af47 100644
--- a/libs/hwui/renderthread/OpenGLPipeline.cpp
+++ b/libs/hwui/renderthread/OpenGLPipeline.cpp
@@ -23,6 +23,7 @@
#include "OpenGLReadback.h"
#include "ProfileRenderer.h"
#include "renderstate/RenderState.h"
+#include "TreeInfo.h"
#include <cutils/properties.h>
#include <strings.h>
@@ -202,7 +203,8 @@
bool OpenGLPipeline::createOrUpdateLayer(RenderNode* node,
const DamageAccumulator& damageAccumulator,
- bool wideColorGamut) {
+ bool wideColorGamut,
+ ErrorHandler* errorHandler) {
RenderState& renderState = mRenderThread.renderState();
OffscreenBufferPool& layerPool = renderState.layerPool();
bool transformUpdateNeeded = false;
@@ -228,6 +230,22 @@
node->getLayer()->setWindowTransform(windowTransform);
}
+ if (!node->hasLayer()) {
+ Caches::getInstance().dumpMemoryUsage();
+ if (errorHandler) {
+ std::ostringstream err;
+ err << "Unable to create layer for " << node->getName();
+ const int maxTextureSize = Caches::getInstance().maxTextureSize;
+ if (node->getWidth() > maxTextureSize || node->getHeight() > maxTextureSize) {
+ err << ", size " << node->getWidth() << "x" << node->getHeight()
+ << " exceeds max size " << maxTextureSize;
+ } else {
+ err << ", see logcat for more info";
+ }
+ errorHandler->onError(err.str());
+ }
+ }
+
return transformUpdateNeeded;
}
diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h
index 118007c..9859e93 100644
--- a/libs/hwui/renderthread/OpenGLPipeline.h
+++ b/libs/hwui/renderthread/OpenGLPipeline.h
@@ -53,7 +53,7 @@
const BakedOpRenderer::LightInfo& lightInfo) override;
TaskManager* getTaskManager() override;
bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
- bool wideColorGamut) override;
+ bool wideColorGamut, ErrorHandler* errorHandler) override;
bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; }
bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override;
void unpinImages() override;
diff --git a/libs/hwui/tests/unit/CacheManagerTests.cpp b/libs/hwui/tests/unit/CacheManagerTests.cpp
index b1106f0..c235715 100644
--- a/libs/hwui/tests/unit/CacheManagerTests.cpp
+++ b/libs/hwui/tests/unit/CacheManagerTests.cpp
@@ -20,6 +20,8 @@
#include "renderthread/EglManager.h"
#include "tests/common/TestUtils.h"
+#include <SkImagePriv.h>
+
using namespace android;
using namespace android::uirenderer;
using namespace android::uirenderer::renderthread;
@@ -49,7 +51,12 @@
surfaces.push_back(surface);
}
- ASSERT_TRUE(1 < surfaces.size());
+ // create an image and pin it so that we have something with a unique key in the cache
+ sk_sp<Bitmap> bitmap =
+ Bitmap::allocateHeapBitmap(SkImageInfo::MakeA8(displayInfo.w, displayInfo.h));
+ sk_sp<SkColorFilter> filter;
+ sk_sp<SkImage> image = bitmap->makeImage(&filter);
+ ASSERT_TRUE(SkImage_pinAsTexture(image.get(), grContext));
// attempt to trim all memory while we still hold strong refs
renderThread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
@@ -61,11 +68,14 @@
surfaces[i].reset();
}
+ // unpin the image which should add a unique purgeable key to the cache
+ SkImage_unpinAsTexture(image.get(), grContext);
+
// verify that we have enough purgeable bytes
const size_t purgeableBytes = grContext->getResourceCachePurgeableBytes();
ASSERT_TRUE(renderThread.cacheManager().getBackgroundCacheSize() < purgeableBytes);
- // UI hidden and make sure only some got purged
+ // UI hidden and make sure only some got purged (unique should remain)
renderThread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
ASSERT_TRUE(0 < grContext->getResourceCachePurgeableBytes());
ASSERT_TRUE(renderThread.cacheManager().getBackgroundCacheSize() > getCacheUsage(grContext));
diff --git a/libs/hwui/tests/unit/VectorDrawableTests.cpp b/libs/hwui/tests/unit/VectorDrawableTests.cpp
index e7496f7..02f740c 100644
--- a/libs/hwui/tests/unit/VectorDrawableTests.cpp
+++ b/libs/hwui/tests/unit/VectorDrawableTests.cpp
@@ -242,7 +242,8 @@
{"\n \t z", true}, // Valid path data with leading spaces
{"1-2e34567", false}, // Not starting with a verb and ill-formatted float
{"f 4 5", false}, // Invalid verb
- {"\r ", false} // Empty string
+ {"\r ", false}, // Empty string
+ {"L1,0 L1,1 L0,1 z M1000", false} // Not enough floats following verb M.
};
static bool hasSameVerbs(const PathData& from, const PathData& to) {
diff --git a/libs/incident/proto/android/privacy.proto b/libs/incident/proto/android/privacy.proto
index f29f57f..1ef36df 100644
--- a/libs/incident/proto/android/privacy.proto
+++ b/libs/incident/proto/android/privacy.proto
@@ -16,13 +16,13 @@
syntax = "proto2";
-option java_package = "android";
+package android;
+
+option java_package = "com.android.incident";
option java_multiple_files = true;
import "google/protobuf/descriptor.proto";
-package android;
-
enum Destination {
// Fields or messages annotated with DEST_LOCAL must never be
// extracted from the device automatically. They can be accessed
diff --git a/libs/protoutil/include/android/util/EncodedBuffer.h b/libs/protoutil/include/android/util/EncodedBuffer.h
index bf698d4..c84de4c 100644
--- a/libs/protoutil/include/android/util/EncodedBuffer.h
+++ b/libs/protoutil/include/android/util/EncodedBuffer.h
@@ -23,8 +23,6 @@
namespace android {
namespace util {
-using namespace std;
-
/**
* A stream of bytes containing a read pointer and a write pointer,
* backed by a set of fixed-size buffers. There are write functions for the
@@ -217,7 +215,7 @@
private:
size_t mChunkSize;
- vector<uint8_t*> mBuffers;
+ std::vector<uint8_t*> mBuffers;
Pointer mWp;
Pointer mEp;
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h
index 43ac1ec..e17f48b 100644
--- a/libs/protoutil/include/android/util/ProtoOutputStream.h
+++ b/libs/protoutil/include/android/util/ProtoOutputStream.h
@@ -137,8 +137,8 @@
EncodedBuffer mBuffer;
size_t mCopyBegin;
bool mCompact;
- int mDepth;
- int mObjectId;
+ uint32_t mDepth;
+ uint32_t mObjectId;
uint64_t mExpectedObjectToken;
inline void writeDoubleImpl(uint32_t id, double val);
diff --git a/libs/protoutil/include/android/util/protobuf.h b/libs/protoutil/include/android/util/protobuf.h
index ca45e26..4b49ced 100644
--- a/libs/protoutil/include/android/util/protobuf.h
+++ b/libs/protoutil/include/android/util/protobuf.h
@@ -22,8 +22,6 @@
namespace android {
namespace util {
-using namespace std;
-
const int FIELD_ID_SHIFT = 3;
const uint8_t WIRE_TYPE_MASK = (1 << FIELD_ID_SHIFT) - 1;
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index a040bd2..22b9709 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -15,6 +15,8 @@
*/
#define LOG_TAG "libprotoutil"
+#include <inttypes.h>
+
#include <android/util/protobuf.h>
#include <android/util/ProtoOutputStream.h>
#include <cutils/log.h>
@@ -28,7 +30,7 @@
mCompact(false),
mDepth(0),
mObjectId(0),
- mExpectedObjectToken(0ULL)
+ mExpectedObjectToken(UINT64_C(-1))
{
}
@@ -45,7 +47,7 @@
mCompact = false;
mDepth = 0;
mObjectId = 0;
- mExpectedObjectToken = 0ULL;
+ mExpectedObjectToken = UINT64_C(-1);
}
bool
@@ -173,7 +175,7 @@
}
bool
-ProtoOutputStream::write(uint64_t fieldId, string val)
+ProtoOutputStream::write(uint64_t fieldId, std::string val)
{
if (mCompact) return false;
const uint32_t id = (uint32_t)fieldId;
@@ -215,48 +217,48 @@
* - 3 bits, max value 7, max value needed 5
* Bit 60 - true if the object is repeated
* Bits 59-51 - depth (For error checking)
- * - 9 bits, max value 512, when checking, value is masked (if we really
- * are more than 512 levels deep)
+ * - 9 bits, max value 511, when checking, value is masked (if we really
+ * are more than 511 levels deep)
* Bits 32-50 - objectId (For error checking)
- * - 19 bits, max value 524,288. that's a lot of objects. IDs will wrap
+ * - 19 bits, max value 524,287. that's a lot of objects. IDs will wrap
* because of the overflow, and only the tokens are compared.
* Bits 0-31 - offset of the first size field in the buffer.
*/
-uint64_t
-makeToken(int tagSize, bool repeated, int depth, int objectId, int sizePos) {
- return ((0x07L & (uint64_t)tagSize) << 61)
- | (repeated ? (1LL << 60) : 0)
- | (0x01ffL & (uint64_t)depth) << 51
- | (0x07ffffL & (uint64_t)objectId) << 32
- | (0x0ffffffffL & (uint64_t)sizePos);
+static uint64_t
+makeToken(uint32_t tagSize, bool repeated, uint32_t depth, uint32_t objectId, size_t sizePos) {
+ return ((UINT64_C(0x07) & (uint64_t)tagSize) << 61)
+ | (repeated ? (UINT64_C(1) << 60) : 0)
+ | (UINT64_C(0x01ff) & (uint64_t)depth) << 51
+ | (UINT64_C(0x07ffff) & (uint64_t)objectId) << 32
+ | (UINT64_C(0x0ffffffff) & (uint64_t)sizePos);
}
/**
* Get the encoded tag size from the token.
*/
-static int getTagSizeFromToken(uint64_t token) {
- return (int)(0x7 & (token >> 61));
+static uint32_t getTagSizeFromToken(uint64_t token) {
+ return 0x7 & (token >> 61);
}
/**
* Get the nesting depth of startObject calls from the token.
*/
-static int getDepthFromToken(uint64_t token) {
- return (int)(0x01ff & (token >> 51));
+static uint32_t getDepthFromToken(uint64_t token) {
+ return 0x01ff & (token >> 51);
}
/**
* Get the location of the childRawSize (the first 32 bit size field) in this object.
*/
-static int getSizePosFromToken(uint64_t token) {
- return (int)token;
+static uint32_t getSizePosFromToken(uint64_t token) {
+ return (uint32_t)token;
}
uint64_t
ProtoOutputStream::start(uint64_t fieldId)
{
if ((fieldId & FIELD_TYPE_MASK) != FIELD_TYPE_MESSAGE) {
- ALOGE("Can't call start for non-message type field: 0x%llx", (long long)fieldId);
+ ALOGE("Can't call start for non-message type field: 0x%" PRIx64, fieldId);
return 0;
}
@@ -278,18 +280,18 @@
ProtoOutputStream::end(uint64_t token)
{
if (token != mExpectedObjectToken) {
- ALOGE("Unexpected token: 0x%llx, should be 0x%llx", (long long)token, (long long)mExpectedObjectToken);
+ ALOGE("Unexpected token: 0x%" PRIx64 ", should be 0x%" PRIx64, token, mExpectedObjectToken);
return;
}
- int depth = getDepthFromToken(token);
+ uint32_t depth = getDepthFromToken(token);
if (depth != (mDepth & 0x01ff)) {
- ALOGE("Unexpected depth: %d, should be %d", depth, mDepth);
+ ALOGE("Unexpected depth: %" PRIu32 ", should be %" PRIu32, depth, mDepth);
return;
}
mDepth--;
- int sizePos = getSizePosFromToken(token);
+ uint32_t sizePos = getSizePosFromToken(token);
// number of bytes written in this start-end session.
int childRawSize = mBuffer.wp()->pos() - sizePos - 8;
@@ -317,7 +319,7 @@
ProtoOutputStream::compact() {
if (mCompact) return true;
if (mDepth != 0) {
- ALOGE("Can't compact when depth(%d) is not zero. Missing calls to end.", mDepth);
+ ALOGE("Can't compact when depth(%" PRIu32 ") is not zero. Missing calls to end.", mDepth);
return false;
}
// record the size of the original buffer.
@@ -458,7 +460,10 @@
size_t
ProtoOutputStream::size()
{
- compact();
+ if (!compact()) {
+ ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
+ // TODO: handle this error
+ }
return mBuffer.size();
}
@@ -492,7 +497,10 @@
EncodedBuffer::iterator
ProtoOutputStream::data()
{
- compact();
+ if (!compact()) {
+ ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
+ // TODO: handle this error
+ }
return mBuffer.begin();
}
diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
index 98e67c2..3643ca4 100644
--- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
+++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
@@ -224,7 +224,9 @@
s.append("GNSS_KPI_END").append("\n");
GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats();
if (stats != null) {
- s.append("Power Metrics").append('\n');
+ s.append("Power Metrics").append("\n");
+ s.append(" Time on battery (min): "
+ + stats.getLoggingDurationMs() / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n");
long[] t = stats.getTimeInGpsSignalQualityLevel();
if (t != null && t.length == NUM_GPS_SIGNAL_QUALITY_LEVELS) {
s.append(" Amount of time (while on battery) Top 4 Avg CN0 > " +
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 86dfc9c..ca895fc 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -226,11 +226,10 @@
}
/**
- * @hide
* @return The "address" string of the device. This generally contains device-specific
* parameters.
*/
- public String getAddress() {
+ public @NonNull String getAddress() {
return mPort.address();
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index e408a11..aeef215 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -4596,8 +4596,7 @@
private static boolean checkTypes(AudioDevicePort port) {
return AudioDeviceInfo.convertInternalDeviceToDeviceType(port.type()) !=
- AudioDeviceInfo.TYPE_UNKNOWN &&
- port.type() != AudioSystem.DEVICE_IN_BACK_MIC;
+ AudioDeviceInfo.TYPE_UNKNOWN;
}
/**
diff --git a/media/java/android/media/ClosedCaptionRenderer.java b/media/java/android/media/ClosedCaptionRenderer.java
index cc7722a..66759e5 100644
--- a/media/java/android/media/ClosedCaptionRenderer.java
+++ b/media/java/android/media/ClosedCaptionRenderer.java
@@ -59,7 +59,7 @@
public boolean supports(MediaFormat format) {
if (format.containsKey(MediaFormat.KEY_MIME)) {
String mimeType = format.getString(MediaFormat.KEY_MIME);
- return MediaPlayer.MEDIA_MIMETYPE_TEXT_CEA_608.equals(mimeType);
+ return MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType);
}
return false;
}
@@ -67,7 +67,7 @@
@Override
public SubtitleTrack createTrack(MediaFormat format) {
String mimeType = format.getString(MediaFormat.KEY_MIME);
- if (MediaPlayer.MEDIA_MIMETYPE_TEXT_CEA_608.equals(mimeType)) {
+ if (MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType)) {
if (mCCWidget == null) {
mCCWidget = new Cea608CCWidget(mContext);
}
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 9175416..bc0e43b 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -3226,9 +3226,18 @@
if (stripOffsetsAttribute != null && stripByteCountsAttribute != null) {
long[] stripOffsets =
- (long[]) stripOffsetsAttribute.getValue(mExifByteOrder);
+ convertToLongArray(stripOffsetsAttribute.getValue(mExifByteOrder));
long[] stripByteCounts =
- (long[]) stripByteCountsAttribute.getValue(mExifByteOrder);
+ convertToLongArray(stripByteCountsAttribute.getValue(mExifByteOrder));
+
+ if (stripOffsets == null) {
+ Log.w(TAG, "stripOffsets should not be null.");
+ return;
+ }
+ if (stripByteCounts == null) {
+ Log.w(TAG, "stripByteCounts should not be null.");
+ return;
+ }
// Set thumbnail byte array data for non-consecutive strip bytes
byte[] totalStripBytes =
@@ -4025,4 +4034,22 @@
}
return false;
}
+
+ /**
+ * Convert given int[] to long[]. If long[] is given, just return it.
+ * Return null for other types of input.
+ */
+ private static long[] convertToLongArray(Object inputObj) {
+ if (inputObj instanceof int[]) {
+ int[] input = (int[]) inputObj;
+ long[] result = new long[input.length];
+ for (int i = 0; i < input.length; i++) {
+ result[i] = input[i];
+ }
+ return result;
+ } else if (inputObj instanceof long[]) {
+ return (long[]) inputObj;
+ }
+ return null;
+ }
}
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 56edace..72d52d3 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -727,18 +727,7 @@
return false;
}
- if (format == ImageFormat.PRIVATE) {
- // Usage need to be either USAGE0_GPU_SAMPLED_IMAGE or USAGE0_VIDEO_ENCODE or combined.
- boolean isAllowed = (usage == HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE);
- isAllowed = isAllowed || (usage == HardwareBuffer.USAGE_VIDEO_ENCODE);
- isAllowed = isAllowed || (usage ==
- (HardwareBuffer.USAGE_VIDEO_ENCODE | HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE));
- return isAllowed;
- } else {
- // Usage need to make the buffer CPU readable for explicit format.
- return ((usage == HardwareBuffer.USAGE_CPU_READ_RARELY) ||
- (usage == HardwareBuffer.USAGE_CPU_READ_OFTEN));
- }
+ return true;
}
/**
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index 17002aa..591f33f 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -25,9 +25,7 @@
import android.content.Context;
import android.media.MediaPlaylistAgent.RepeatMode;
import android.media.MediaPlaylistAgent.ShuffleMode;
-import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
-import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.ErrorCode;
import android.media.session.MediaSessionManager;
@@ -56,7 +54,7 @@
* When controlling {@link MediaSessionService2}, the {@link MediaController2} would be
* available only if the session service allows this controller by
* {@link MediaSession2.SessionCallback#onConnect(MediaSession2, ControllerInfo)} for the service.
- * Wait {@link ControllerCallback#onConnected(MediaController2, CommandGroup)} or
+ * Wait {@link ControllerCallback#onConnected(MediaController2, SessionCommandGroup2)} or
* {@link ControllerCallback#onDisconnected(MediaController2)} for the result.
* <p>
* A controller can be created through token from {@link MediaSessionManager} if you hold the
@@ -83,7 +81,7 @@
* @param allowedCommands commands that's allowed by the session.
*/
public void onConnected(@NonNull MediaController2 controller,
- @NonNull CommandGroup allowedCommands) { }
+ @NonNull SessionCommandGroup2 allowedCommands) { }
/**
* Called when the session refuses the controller or the controller is disconnected from
@@ -102,7 +100,8 @@
* Called when the session set the custom layout through the
* {@link MediaSession2#setCustomLayout(ControllerInfo, List)}.
* <p>
- * Can be called before {@link #onConnected(MediaController2, CommandGroup)} is called.
+ * Can be called before {@link #onConnected(MediaController2, SessionCommandGroup2)} is
+ * called.
*
* @param controller the controller for this event
* @param layout
@@ -126,7 +125,7 @@
* @param commands newly allowed commands
*/
public void onAllowedCommandsChanged(@NonNull MediaController2 controller,
- @NonNull CommandGroup commands) { }
+ @NonNull SessionCommandGroup2 commands) { }
/**
* Called when the session sent a custom command.
@@ -137,7 +136,7 @@
* @param receiver
*/
public void onCustomCommand(@NonNull MediaController2 controller,
- @NonNull Command command, @Nullable Bundle args,
+ @NonNull SessionCommand2 command, @Nullable Bundle args,
@Nullable ResultReceiver receiver) { }
/**
@@ -149,16 +148,6 @@
public void onPlayerStateChanged(@NonNull MediaController2 controller, int state) { }
/**
- * Called when the player's position is changed
- *
- * @param controller the controller for this event
- * @param eventTimeMs timestamp when the position information is sent from the session
- * @param positionMs position in millis
- */
- public void onPositionChanged(@NonNull MediaController2 controller,
- long eventTimeMs, long positionMs) { }
-
- /**
* Called when playback speed is changed.
*
* @param controller the controller for this event
@@ -180,6 +169,14 @@
@NonNull MediaItem2 item, @MediaPlayerBase.BuffState int state) { }
/**
+ * Called to indicate that seeking is completed.
+ *
+ * @param controller the controller for this event.
+ * @param position the previous seeking request.
+ */
+ public void onSeekCompleted(@NonNull MediaController2 controller, long position) { }
+
+ /**
* Called when a error from
*
* @param controller the controller for this event
@@ -197,7 +194,6 @@
*
* @param controller the controller for this event
* @param item new item
- * @see #onPositionChanged(MediaController2, long, long)
* @see #onBufferingStateChanged(MediaController2, MediaItem2, int)
*/
// TODO(jaewan): Use this (b/74316764)
@@ -423,16 +419,14 @@
}
/**
- * Start fast forwarding. If playback is already fast forwarding this
- * may increase the rate.
+ * Fast forwards playback. If playback is already fast forwarding this may increase the rate.
*/
public void fastForward() {
mProvider.fastForward_impl();
}
/**
- * Start rewinding. If playback is already rewinding this may increase
- * the rate.
+ * Rewinds playback. If playback is already rewinding this may increase the rate.
*/
public void rewind() {
mProvider.rewind_impl();
@@ -689,7 +683,7 @@
* @param args optional argument
* @param cb optional result receiver
*/
- public void sendCustomCommand(@NonNull Command command, @Nullable Bundle args,
+ public void sendCustomCommand(@NonNull SessionCommand2 command, @Nullable Bundle args,
@Nullable ResultReceiver cb) {
mProvider.sendCustomCommand_impl(command, args, cb);
}
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index e0c567b..7ac1529 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -654,9 +654,11 @@
* ID is returned.
*
* @param level the new security level, one of
- * {@link #SW_SECURE_CRYPTO}, {@link #SW_SECURE_DECODE},
- * {@link #HW_SECURE_CRYPTO}, {@link #HW_SECURE_DECODE} or
- * {@link #HW_SECURE_ALL}.
+ * {@link #SECURITY_LEVEL_SW_SECURE_CRYPTO},
+ * {@link #SECURITY_LEVEL_SW_SECURE_DECODE},
+ * {@link #SECURITY_LEVEL_HW_SECURE_CRYPTO},
+ * {@link #SECURITY_LEVEL_HW_SECURE_DECODE} or
+ * {@link #SECURITY_LEVEL_HW_SECURE_ALL}.
*
* @throws NotProvisionedException if provisioning is needed
* @throws ResourceBusyException if required resources are in use
@@ -703,7 +705,9 @@
public @interface KeyType {}
/**
- * Contains the opaque data an app uses to request keys from a license server
+ * Contains the opaque data an app uses to request keys from a license server.
+ * These request types may or may not be generated by a given plugin. Refer
+ * to plugin vendor documentation for more information.
*/
public static final class KeyRequest {
private byte[] mData;
@@ -728,8 +732,8 @@
public static final int REQUEST_TYPE_RELEASE = 2;
/**
- * Keys are already loaded. No license request is necessary, and no
- * key request data is returned.
+ * Keys are already loaded and are available for use. No license request is necessary, and
+ * no key request data is returned.
*/
public static final int REQUEST_TYPE_NONE = 3;
@@ -989,6 +993,9 @@
* active. The license server returns a secure stop release response
* message to the app which then deletes the secure stop from persistent
* memory using {@link #releaseSecureStops}.
+ * <p>
+ * Each secure stop has a unique ID that can be used to identify it during
+ * enumeration, access and removal.
* @return a list of all secure stops from secure persistent memory
*/
@NonNull
@@ -996,6 +1003,8 @@
/**
* Return a list of all secure stop IDs currently in persistent memory.
+ * The secure stop ID can be used to access or remove the corresponding
+ * secure stop.
*
* @return a list of secure stop IDs
*/
@@ -1004,6 +1013,7 @@
/**
* Access a specific secure stop given its secure stop ID.
+ * Each secure stop has a unique ID.
*
* @param ssid the ID of the secure stop to return
* @return the secure stop identified by ssid
@@ -1140,8 +1150,9 @@
* implementation.
*/
@Retention(RetentionPolicy.SOURCE)
- @IntDef({SECURITY_LEVEL_UNKNOWN, SW_SECURE_CRYPTO, SW_SECURE_DECODE,
- HW_SECURE_CRYPTO, HW_SECURE_DECODE, HW_SECURE_ALL})
+ @IntDef({SECURITY_LEVEL_UNKNOWN, SECURITY_LEVEL_SW_SECURE_CRYPTO,
+ SECURITY_LEVEL_SW_SECURE_DECODE, SECURITY_LEVEL_HW_SECURE_CRYPTO,
+ SECURITY_LEVEL_HW_SECURE_DECODE, SECURITY_LEVEL_HW_SECURE_ALL})
public @interface SecurityLevel {}
/**
@@ -1153,31 +1164,31 @@
/**
* DRM key management uses software-based whitebox crypto.
*/
- public static final int SW_SECURE_CRYPTO = 1;
+ public static final int SECURITY_LEVEL_SW_SECURE_CRYPTO = 1;
/**
* DRM key management and decoding use software-based whitebox crypto.
*/
- public static final int SW_SECURE_DECODE = 2;
+ public static final int SECURITY_LEVEL_SW_SECURE_DECODE = 2;
/**
* DRM key management and crypto operations are performed within a hardware
* backed trusted execution environment.
*/
- public static final int HW_SECURE_CRYPTO = 3;
+ public static final int SECURITY_LEVEL_HW_SECURE_CRYPTO = 3;
/**
* DRM key management, crypto operations and decoding of content are
* performed within a hardware backed trusted execution environment.
*/
- public static final int HW_SECURE_DECODE = 4;
+ public static final int SECURITY_LEVEL_HW_SECURE_DECODE = 4;
/**
* DRM key management, crypto operations, decoding of content and all
* handling of the media (compressed and uncompressed) is handled within a
* hardware backed trusted execution environment.
*/
- public static final int HW_SECURE_ALL = 5;
+ public static final int SECURITY_LEVEL_HW_SECURE_ALL = 5;
/**
* The maximum security level supported by the device. This is the default
@@ -1203,9 +1214,9 @@
* @param sessionId the session to query.
* <p>
* @return one of {@link #SECURITY_LEVEL_UNKNOWN},
- * {@link #SW_SECURE_CRYPTO}, {@link #SW_SECURE_DECODE},
- * {@link #HW_SECURE_CRYPTO}, {@link #HW_SECURE_DECODE} or
- * {@link #HW_SECURE_ALL}.
+ * {@link #SECURITY_LEVEL_SW_SECURE_CRYPTO}, {@link #SECURITY_LEVEL_SW_SECURE_DECODE},
+ * {@link #SECURITY_LEVEL_HW_SECURE_CRYPTO}, {@link #SECURITY_LEVEL_HW_SECURE_DECODE} or
+ * {@link #SECURITY_LEVEL_HW_SECURE_ALL}.
*/
@SecurityLevel
public native int getSecurityLevel(@NonNull byte[] sessionId);
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index 3bfbcc2..384326f 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -174,10 +174,20 @@
public static final String MIMETYPE_TEXT_VTT = "text/vtt";
/**
+ * MIME type for SubRip (SRT) container.
+ */
+ public static final String MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+
+ /**
* MIME type for CEA-608 closed caption data.
*/
public static final String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
+ /**
+ * MIME type for CEA-708 closed caption data.
+ */
+ public static final String MIMETYPE_TEXT_CEA_708 = "text/cea-708";
+
private Map<String, Object> mMap;
/**
diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java
index 1967a1c..423a1fd 100644
--- a/media/java/android/media/MediaItem2.java
+++ b/media/java/android/media/MediaItem2.java
@@ -19,7 +19,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.Context;
import android.media.update.ApiLoader;
import android.media.update.MediaItem2Provider;
import android.os.Bundle;
@@ -81,8 +80,8 @@
return mProvider.toBundle_impl();
}
- public static MediaItem2 fromBundle(Context context, Bundle bundle) {
- return ApiLoader.getProvider().fromBundle_MediaItem2(context, bundle);
+ public static MediaItem2 fromBundle(Bundle bundle) {
+ return ApiLoader.getProvider().fromBundle_MediaItem2(bundle);
}
public String toString() {
@@ -161,11 +160,10 @@
/**
* Constructor for {@link Builder}
*
- * @param context
* @param flags
*/
- public Builder(@NonNull Context context, @Flags int flags) {
- mProvider = ApiLoader.getProvider().createMediaItem2Builder(context, this, flags);
+ public Builder(@Flags int flags) {
+ mProvider = ApiLoader.getProvider().createMediaItem2Builder(this, flags);
}
/**
diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java
index 034d17e..f29d386 100644
--- a/media/java/android/media/MediaLibraryService2.java
+++ b/media/java/android/media/MediaLibraryService2.java
@@ -20,7 +20,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
-import android.content.Context;
import android.media.MediaLibraryService2.MediaLibrarySession.Builder;
import android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback;
import android.media.MediaSession2.ControllerInfo;
@@ -74,8 +73,8 @@
* Callback for the {@link MediaLibrarySession}.
*/
public static class MediaLibrarySessionCallback extends MediaSession2.SessionCallback {
- public MediaLibrarySessionCallback(@NonNull Context context) {
- super(context);
+ public MediaLibrarySessionCallback() {
+ super();
}
/**
@@ -401,10 +400,9 @@
* @param rootId The root id for browsing.
* @param extras Any extras about the library service.
*/
- public LibraryRoot(@NonNull Context context,
- @NonNull String rootId, @Nullable Bundle extras) {
+ public LibraryRoot(@NonNull String rootId, @Nullable Bundle extras) {
mProvider = ApiLoader.getProvider().createMediaLibraryService2LibraryRoot(
- context, this, rootId, extras);
+ this, rootId, extras);
}
/**
diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java
index 59dd8cb..7b03ae0 100644
--- a/media/java/android/media/MediaMetadata2.java
+++ b/media/java/android/media/MediaMetadata2.java
@@ -19,7 +19,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
-import android.content.Context;
import android.graphics.Bitmap;
import android.media.update.ApiLoader;
import android.media.update.MediaMetadata2Provider;
@@ -657,13 +656,11 @@
* Creates the {@link MediaMetadata2} from the bundle that previously returned by
* {@link #toBundle()}.
*
- * @param context context
* @param bundle bundle for the metadata
* @return a new MediaMetadata2
*/
- public static @NonNull MediaMetadata2 fromBundle(@NonNull Context context,
- @Nullable Bundle bundle) {
- return ApiLoader.getProvider().fromBundle_MediaMetadata2(context, bundle);
+ public static @NonNull MediaMetadata2 fromBundle(@Nullable Bundle bundle) {
+ return ApiLoader.getProvider().fromBundle_MediaMetadata2(bundle);
}
/**
@@ -677,8 +674,8 @@
* Create an empty Builder. Any field that should be included in the
* {@link MediaMetadata2} must be added.
*/
- public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this);
+ public Builder() {
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(this);
}
/**
@@ -688,8 +685,8 @@
*
* @param source
*/
- public Builder(@NonNull Context context, @NonNull MediaMetadata2 source) {
- mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this, source);
+ public Builder(@NonNull MediaMetadata2 source) {
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(this, source);
}
/**
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index fe5e822..aef31b1 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2416,7 +2416,7 @@
* Gets the track type.
* @return TrackType which indicates if the track is video, audio, timed text.
*/
- public int getTrackType() {
+ public @TrackType int getTrackType() {
return mTrackType;
}
@@ -2450,6 +2450,19 @@
public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4;
public static final int MEDIA_TRACK_TYPE_METADATA = 5;
+ /** @hide */
+ @IntDef(flag = false, prefix = "MEDIA_TRACK_TYPE", value = {
+ MEDIA_TRACK_TYPE_UNKNOWN,
+ MEDIA_TRACK_TYPE_VIDEO,
+ MEDIA_TRACK_TYPE_AUDIO,
+ MEDIA_TRACK_TYPE_TIMEDTEXT,
+ MEDIA_TRACK_TYPE_SUBTITLE,
+ MEDIA_TRACK_TYPE_METADATA }
+ )
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TrackType {}
+
+
final int mTrackType;
final MediaFormat mFormat;
@@ -2600,26 +2613,30 @@
*/
/**
* MIME type for SubRip (SRT) container. Used in addTimedTextSource APIs.
+ * @deprecated use {@link MediaFormat#MIMETYPE_TEXT_SUBRIP}
*/
- public static final String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+ public static final String MEDIA_MIMETYPE_TEXT_SUBRIP = MediaFormat.MIMETYPE_TEXT_SUBRIP;
/**
* MIME type for WebVTT subtitle data.
* @hide
+ * @deprecated
*/
- public static final String MEDIA_MIMETYPE_TEXT_VTT = "text/vtt";
+ public static final String MEDIA_MIMETYPE_TEXT_VTT = MediaFormat.MIMETYPE_TEXT_VTT;
/**
* MIME type for CEA-608 closed caption data.
* @hide
+ * @deprecated
*/
- public static final String MEDIA_MIMETYPE_TEXT_CEA_608 = "text/cea-608";
+ public static final String MEDIA_MIMETYPE_TEXT_CEA_608 = MediaFormat.MIMETYPE_TEXT_CEA_608;
/**
* MIME type for CEA-708 closed caption data.
* @hide
+ * @deprecated
*/
- public static final String MEDIA_MIMETYPE_TEXT_CEA_708 = "text/cea-708";
+ public static final String MEDIA_MIMETYPE_TEXT_CEA_708 = MediaFormat.MIMETYPE_TEXT_CEA_708;
/*
* A helper function to check if the mime type is supported by media framework.
@@ -3108,7 +3125,7 @@
* this function is called.
* </p>
* <p>
- * Currently, only timed text tracks or audio tracks can be selected via this method.
+ * Currently, only timed text, subtitle or audio tracks can be selected via this method.
* In addition, the support for selecting an audio track at runtime is pretty limited
* in that an audio track can only be selected in the <em>Prepared</em> state.
* </p>
@@ -3795,29 +3812,158 @@
private OnTimedTextListener mOnTimedTextListener;
/**
- * Interface definition of a callback to be invoked when a
- * track has data available.
- *
- * @hide
+ * Interface definition of a callback to be invoked when a player subtitle track has new
+ * subtitle data available.
+ * See the {@link MediaPlayer#setOnSubtitleDataListener(OnSubtitleDataListener, Handler)}
+ * method for the description of which track will report data through this listener.
*/
- public interface OnSubtitleDataListener
- {
- public void onSubtitleData(MediaPlayer mp, SubtitleData data);
+ public interface OnSubtitleDataListener {
+ /**
+ * Method called when new subtitle data is available
+ * @param mp the player that reports the new subtitle data
+ * @param data the subtitle data
+ */
+ public void onSubtitleData(@NonNull MediaPlayer mp, @NonNull SubtitleData data);
}
/**
- * Register a callback to be invoked when a track has data available.
- *
- * @param listener the callback that will be run
- *
- * @hide
+ * Sets the listener to be invoked when a subtitle track has new data available.
+ * The subtitle data comes from a subtitle track previously selected with
+ * {@link #selectTrack(int)}. Use {@link #getTrackInfo()} to determine which tracks are
+ * subtitles (of type {@link TrackInfo#MEDIA_TRACK_TYPE_SUBTITLE}), Subtitle track encodings
+ * can be determined by {@link TrackInfo#getFormat()}).<br>
+ * See {@link SubtitleData} for an example of querying subtitle encoding.
+ * @param listener the listener called when new data is available
+ * @param handler the {@link Handler} that receives the listener events
*/
- public void setOnSubtitleDataListener(OnSubtitleDataListener listener)
+ public void setOnSubtitleDataListener(@NonNull OnSubtitleDataListener listener,
+ @NonNull Handler handler) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Illegal null listener");
+ }
+ if (handler == null) {
+ throw new IllegalArgumentException("Illegal null handler");
+ }
+ setOnSubtitleDataListenerInt(listener, handler);
+ }
+ /**
+ * Sets the listener to be invoked when a subtitle track has new data available.
+ * The subtitle data comes from a subtitle track previously selected with
+ * {@link #selectTrack(int)}. Use {@link #getTrackInfo()} to determine which tracks are
+ * subtitles (of type {@link TrackInfo#MEDIA_TRACK_TYPE_SUBTITLE}), Subtitle track encodings
+ * can be determined by {@link TrackInfo#getFormat()}).<br>
+ * See {@link SubtitleData} for an example of querying subtitle encoding.<br>
+ * The listener will be called on the same thread as the one in which the MediaPlayer was
+ * created.
+ * @param listener the listener called when new data is available
+ */
+ public void setOnSubtitleDataListener(@NonNull OnSubtitleDataListener listener)
{
- mOnSubtitleDataListener = listener;
+ if (listener == null) {
+ throw new IllegalArgumentException("Illegal null listener");
+ }
+ setOnSubtitleDataListenerInt(listener, null);
+ }
+
+ /**
+ * Clears the listener previously set with
+ * {@link #setOnSubtitleDataListener(OnSubtitleDataListener)} or
+ * {@link #setOnSubtitleDataListener(OnSubtitleDataListener, Handler)}.
+ */
+ public void clearOnSubtitleDataListener() {
+ setOnSubtitleDataListenerInt(null, null);
+ }
+
+ private void setOnSubtitleDataListenerInt(
+ @Nullable OnSubtitleDataListener listener, @Nullable Handler handler) {
+ synchronized (this) {
+ mOnSubtitleDataListener = listener;
+ mOnSubtitleDataHandler = handler;
+ }
}
private OnSubtitleDataListener mOnSubtitleDataListener;
+ private Handler mOnSubtitleDataHandler;
+
+ /**
+ * Interface definition of a callback to be invoked when discontinuity in the normal progression
+ * of the media time is detected.
+ * The "normal progression" of media time is defined as the expected increase of the playback
+ * position when playing media, relative to the playback speed (for instance every second, media
+ * time increases by two seconds when playing at 2x).<br>
+ * Discontinuities are encountered in the following cases:
+ * <ul>
+ * <li>when the player is starved for data and cannot play anymore</li>
+ * <li>when the player encounters a playback error</li>
+ * <li>when the a seek operation starts, and when it's completed</li>
+ * <li>when the playback speed changes</li>
+ * <li>when the playback state changes</li>
+ * <li>when the player is reset</li>
+ * </ul>
+ * See the
+ * {@link MediaPlayer#setOnMediaTimeDiscontinuityListener(OnMediaTimeDiscontinuityListener, Handler)}
+ * method to set a listener for these events.
+ */
+ public interface OnMediaTimeDiscontinuityListener {
+ /**
+ * Called to indicate a time discontinuity has occured.
+ * @param mp the MediaPlayer for which the discontinuity has occured.
+ * @param mts the timestamp that correlates media time, system time and clock rate,
+ * or {@link MediaTimestamp#TIMESTAMP_UNKNOWN} in an error case.
+ */
+ public void onMediaTimeDiscontinuity(@NonNull MediaPlayer mp, @NonNull MediaTimestamp mts);
+ }
+
+ /**
+ * Sets the listener to be invoked when a media time discontinuity is encountered.
+ * @param listener the listener called after a discontinuity
+ * @param handler the {@link Handler} that receives the listener events
+ */
+ public void setOnMediaTimeDiscontinuityListener(
+ @NonNull OnMediaTimeDiscontinuityListener listener, @NonNull Handler handler) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Illegal null listener");
+ }
+ if (handler == null) {
+ throw new IllegalArgumentException("Illegal null handler");
+ }
+ setOnMediaTimeDiscontinuityListenerInt(listener, handler);
+ }
+
+ /**
+ * Sets the listener to be invoked when a media time discontinuity is encountered.
+ * The listener will be called on the same thread as the one in which the MediaPlayer was
+ * created.
+ * @param listener the listener called after a discontinuity
+ */
+ public void setOnMediaTimeDiscontinuityListener(
+ @NonNull OnMediaTimeDiscontinuityListener listener)
+ {
+ if (listener == null) {
+ throw new IllegalArgumentException("Illegal null listener");
+ }
+ setOnMediaTimeDiscontinuityListenerInt(listener, null);
+ }
+
+ /**
+ * Clears the listener previously set with
+ * {@link #setOnMediaTimeDiscontinuityListener(OnMediaTimeDiscontinuityListener)}
+ * or {@link #setOnMediaTimeDiscontinuityListener(OnMediaTimeDiscontinuityListener, Handler)}
+ */
+ public void clearOnMediaTimeDiscontinuityListener() {
+ setOnMediaTimeDiscontinuityListenerInt(null, null);
+ }
+
+ private void setOnMediaTimeDiscontinuityListenerInt(
+ @Nullable OnMediaTimeDiscontinuityListener listener, @Nullable Handler handler) {
+ synchronized (this) {
+ mOnMediaTimeDiscontinuityListener = listener;
+ mOnMediaTimeDiscontinuityHandler = handler;
+ }
+ }
+
+ private OnMediaTimeDiscontinuityListener mOnMediaTimeDiscontinuityListener;
+ private Handler mOnMediaTimeDiscontinuityHandler;
/**
* Interface definition of a callback to be invoked when a
@@ -3953,8 +4099,8 @@
/** The player was started because it was used as the next player for another
* player, which just completed playback.
+ * @see android.media.MediaPlayer#setNextMediaPlayer(MediaPlayer)
* @see android.media.MediaPlayer.OnInfoListener
- * @hide
*/
public static final int MEDIA_INFO_STARTED_AS_NEXT = 2;
diff --git a/media/java/android/media/MediaPlayerBase.java b/media/java/android/media/MediaPlayerBase.java
index 5c08f19..a426552 100644
--- a/media/java/android/media/MediaPlayerBase.java
+++ b/media/java/android/media/MediaPlayerBase.java
@@ -130,33 +130,6 @@
*/
public abstract void seekTo(long pos);
- /**
- * Fast forwards playback. If playback is already fast forwarding this may increase the rate.
- * <p>
- * Default implementation sets the playback speed to the 2.0f
- * @see #setPlaybackSpeed(float)
- * @hide
- */
- // TODO(jaewan): Unhide (b/74724709)
- public void fastForward() {
- setPlaybackSpeed(2.0f);
- }
-
- /**
- * Rewinds playback. If playback is already rewinding this may increase the rate.
- * <p>
- * Default implementation sets the playback speed to the -1.0f if
- * {@link #isReversePlaybackSupported()} returns {@code true}.
- * @see #setPlaybackSpeed(float)
- * @hide
- */
- // TODO(jaewan): Unhide (b/74724709)
- public void rewind() {
- if (isReversePlaybackSupported()) {
- setPlaybackSpeed(-1.0f);
- }
- }
-
public static final long UNKNOWN_TIME = -1;
/**
@@ -340,10 +313,19 @@
/**
* Called to indicate that the playback speed has changed.
- * @param mpb the player that is buffering
+ * @param mpb the player that has changed the playback speed.
* @param speed the new playback speed.
*/
public void onPlaybackSpeedChanged(@NonNull MediaPlayerBase mpb, float speed) { }
+
+ /**
+ * Called to indicate that {@link #seekTo(long)} is completed.
+ *
+ * @param mpb the player that has completed seeking.
+ * @param position the previous seeking request.
+ * @see #seekTo(long)
+ */
+ public void onSeekCompleted(@NonNull MediaPlayerBase mpb, long position) { }
}
}
diff --git a/media/java/android/media/MediaPlaylistAgent.java b/media/java/android/media/MediaPlaylistAgent.java
index f339229..88f37e7 100644
--- a/media/java/android/media/MediaPlaylistAgent.java
+++ b/media/java/android/media/MediaPlaylistAgent.java
@@ -20,7 +20,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.Context;
import android.media.update.ApiLoader;
import android.media.update.MediaPlaylistAgentProvider;
@@ -148,8 +147,8 @@
@RepeatMode int repeatMode) { }
}
- public MediaPlaylistAgent(@NonNull Context context) {
- mProvider = ApiLoader.getProvider().createMediaPlaylistAgent(context, this);
+ public MediaPlaylistAgent() {
+ mProvider = ApiLoader.getProvider().createMediaPlaylistAgent(this);
}
/**
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 2033c59..2b3c2b4 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -33,8 +33,6 @@
import android.media.update.MediaSession2Provider;
import android.media.update.MediaSession2Provider.BuilderBaseProvider;
import android.media.update.MediaSession2Provider.CommandButtonProvider;
-import android.media.update.MediaSession2Provider.CommandGroupProvider;
-import android.media.update.MediaSession2Provider.CommandProvider;
import android.media.update.MediaSession2Provider.ControllerInfoProvider;
import android.media.update.ProviderCreator;
import android.net.Uri;
@@ -45,7 +43,6 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.Executor;
/**
@@ -85,255 +82,6 @@
private final MediaSession2Provider mProvider;
/**
- * Command code for the custom command which can be defined by string action in the
- * {@link Command}.
- */
- public static final int COMMAND_CODE_CUSTOM = 0;
-
- /**
- * Command code for {@link MediaController2#play()}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_PLAY = 1;
-
- /**
- * Command code for {@link MediaController2#pause()}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_PAUSE = 2;
-
- /**
- * Command code for {@link MediaController2#stop()}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_STOP = 3;
-
- /**
- * Command code for {@link MediaController2#skipToNextItem()}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the {@link SessionCallback#onCommandRequest(
- * MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SKIP_NEXT_ITEM = 4;
-
- /**
- * Command code for {@link MediaController2#skipToPreviousItem()}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the {@link SessionCallback#onCommandRequest(
- * MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SKIP_PREV_ITEM = 5;
-
- /**
- * Command code for {@link MediaController2#prepare()}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6;
-
- /**
- * Command code for {@link MediaController2#fastForward()}.
- * <p>
- * This is transport control command. Command would be sent directly to the player if the
- * session doesn't reject the request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_FAST_FORWARD = 7;
-
- /**
- * Command code for {@link MediaController2#rewind()}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_REWIND = 8;
-
- /**
- * Command code for {@link MediaController2#seekTo(long)}.
- * <p>
- * Command would be sent directly to the player if the session doesn't reject the request
- * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9;
-
- /**
- * Command code for both {@link MediaController2#setVolumeTo(int, int)}.
- * <p>
- * Command would set the device volume or send to the volume provider directly if the session
- * doesn't reject the request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_SET_VOLUME = 10;
-
- /**
- * Command code for both {@link MediaController2#adjustVolume(int, int)}.
- * <p>
- * Command would adjust the device volume or send to the volume provider directly if the session
- * doesn't reject the request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYBACK_ADJUST_VOLUME = 11;
-
- /**
- * Command code for {@link MediaController2#skipToPlaylistItem(MediaItem2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM = 12;
-
- /**
- * Command code for {@link MediaController2#setShuffleMode(int)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE = 13;
-
- /**
- * Command code for {@link MediaController2#setRepeatMode(int)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE = 14;
-
- /**
- * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_ADD_ITEM = 15;
-
- /**
- * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_REMOVE_ITEM = 16;
-
- /**
- * Command code for {@link MediaController2#replacePlaylistItem(int, MediaItem2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_REPLACE_ITEM = 17;
-
- /**
- * Command code for {@link MediaController2#getPlaylist()}. This will expose metadata
- * information to the controller.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18;
-
- /**
- * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19;
-
- /**
- * Command code for {@link MediaController2#getPlaylistMetadata()}. This will expose
- * metadata information to the controller.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_GET_LIST_METADATA = 20;
-
- /**
- * Command code for {@link MediaController2#updatePlaylistMetadata(MediaMetadata2)}.
- * <p>
- * Command would be sent directly to the playlist agent if the session doesn't reject the
- * request through the
- * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
- */
- public static final int COMMAND_CODE_PLAYLIST_SET_LIST_METADATA = 21;
-
- /**
- * Command code for {@link MediaController2#playFromMediaId(String, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID = 22;
-
- /**
- * Command code for {@link MediaController2#playFromUri(Uri, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PLAY_FROM_URI = 23;
-
- /**
- * Command code for {@link MediaController2#playFromSearch(String, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PLAY_FROM_SEARCH = 24;
-
- /**
- * Command code for {@link MediaController2#prepareFromMediaId(String, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID = 25;
-
- /**
- * Command code for {@link MediaController2#prepareFromUri(Uri, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PREPARE_FROM_URI = 26;
-
- /**
- * Command code for {@link MediaController2#prepareFromSearch(String, Bundle)}.
- */
- public static final int COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH = 27;
-
- /**
- * Command code for {@link MediaController2#setRating(String, Rating2)}.
- * @hide
- */
- public static final int COMMAND_CODE_SESSION_SET_RATING = 28;
-
- /**
- * Command code for {@link android.media.MediaLibraryService2.MediaLibrarySession} specific
- * functions. With or without this, a {@link MediaSession2} that isn't
- * {@link android.media.MediaLibraryService2.MediaLibrarySession} would automatically reject
- * the calls.
- *
- * @see android.media.MediaLibraryService2.MediaLibrarySession
- * @see MediaBrowser2
- * @hide
- */
- // TODO(jaewan): Remove
- public static final int COMMAND_CODE_BROWSER = 29;
-
- // TODO(jaewan): Add javadoc
- public static final int COMMAND_CODE_LIBRARY_GET_CHILDREN = 29;
- public static final int COMMAND_CODE_LIBRARY_GET_ITEM = 30;
- public static final int COMMAND_CODE_LIBRARY_GET_LIBRARY_ROOT = 31;
- public static final int COMMAND_CODE_LIBRARY_GET_SEARCH_RESULT = 32;
- public static final int COMMAND_CODE_LIBRARY_SEARCH = 33;
- public static final int COMMAND_CODE_LIBRARY_SUBSCRIBE = 34;
- public static final int COMMAND_CODE_LIBRARY_UNSUBSCRIBE = 35;
-
- /**
* @hide
*/
@IntDef({ERROR_CODE_UNKNOWN_ERROR, ERROR_CODE_APP_ERROR, ERROR_CODE_NOT_SUPPORTED,
@@ -436,157 +184,6 @@
}
/**
- * Define a command that a {@link MediaController2} can send to a {@link MediaSession2}.
- * <p>
- * If {@link #getCommandCode()} isn't {@link #COMMAND_CODE_CUSTOM}), it's predefined command.
- * If {@link #getCommandCode()} is {@link #COMMAND_CODE_CUSTOM}), it's custom command and
- * {@link #getCustomCommand()} shouldn't be {@code null}.
- */
- public static final class Command {
- private final CommandProvider mProvider;
-
- public Command(@NonNull Context context, int commandCode) {
- mProvider = ApiLoader.getProvider().createMediaSession2Command(
- this, commandCode, null, null);
- }
-
- public Command(@NonNull Context context, @NonNull String action, @Nullable Bundle extras) {
- if (action == null) {
- throw new IllegalArgumentException("action shouldn't be null");
- }
- mProvider = ApiLoader.getProvider().createMediaSession2Command(
- this, COMMAND_CODE_CUSTOM, action, extras);
- }
-
- /**
- * @hide
- */
- public CommandProvider getProvider() {
- return mProvider;
- }
-
- public int getCommandCode() {
- return mProvider.getCommandCode_impl();
- }
-
- public @Nullable String getCustomCommand() {
- return mProvider.getCustomCommand_impl();
- }
-
- public @Nullable Bundle getExtras() {
- return mProvider.getExtras_impl();
- }
-
- /**
- * @return a new Bundle instance from the Command
- * @hide
- */
- public Bundle toBundle() {
- return mProvider.toBundle_impl();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Command)) {
- return false;
- }
- return mProvider.equals_impl(((Command) obj).mProvider);
- }
-
- @Override
- public int hashCode() {
- return mProvider.hashCode_impl();
- }
-
- /**
- * @return a new Command instance from the Bundle
- * @hide
- */
- public static Command fromBundle(@NonNull Context context, @NonNull Bundle command) {
- return ApiLoader.getProvider().fromBundle_MediaSession2Command(context, command);
- }
- }
-
- /**
- * Represent set of {@link Command}.
- */
- public static final class CommandGroup {
- private final CommandGroupProvider mProvider;
-
- public CommandGroup(@NonNull Context context) {
- mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
- context, this, null);
- }
-
- public CommandGroup(@NonNull Context context, @Nullable CommandGroup others) {
- mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
- context, this, others);
- }
-
- /**
- * @hide
- */
- public CommandGroup(@NonNull CommandGroupProvider provider) {
- mProvider = provider;
- }
-
- public void addCommand(@NonNull Command command) {
- mProvider.addCommand_impl(command);
- }
-
- public void addCommand(int commandCode) {
- // TODO(jaewna): Implement
- }
-
- public void addAllPredefinedCommands() {
- mProvider.addAllPredefinedCommands_impl();
- }
-
- public void removeCommand(@NonNull Command command) {
- mProvider.removeCommand_impl(command);
- }
-
- public void removeCommand(int commandCode) {
- // TODO(jaewan): Implement.
- }
-
- public boolean hasCommand(@NonNull Command command) {
- return mProvider.hasCommand_impl(command);
- }
-
- public boolean hasCommand(int code) {
- return mProvider.hasCommand_impl(code);
- }
-
- public @NonNull Set<Command> getCommands() {
- return mProvider.getCommands_impl();
- }
-
- /**
- * @hide
- */
- public @NonNull CommandGroupProvider getProvider() {
- return mProvider;
- }
-
- /**
- * @return new bundle from the CommandGroup
- * @hide
- */
- public @NonNull Bundle toBundle() {
- return mProvider.toBundle_impl();
- }
-
- /**
- * @return new instance of CommandGroup from the bundle
- * @hide
- */
- public static @Nullable CommandGroup fromBundle(Context context, Bundle commands) {
- return ApiLoader.getProvider().fromBundle_MediaSession2CommandGroup(context, commands);
- }
- }
-
- /**
* Callback to be called for all incoming commands from {@link MediaController2}s.
* <p>
* If it's not set, the session will accept all controllers and all incoming commands by
@@ -594,15 +191,6 @@
*/
// TODO(jaewan): Move this to updatable for default implementation (b/74091963)
public static abstract class SessionCallback {
- private final Context mContext;
-
- public SessionCallback(@NonNull Context context) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- mContext = context;
- }
-
/**
* Called when a controller is created for this session. Return allowed commands for
* controller. By default it allows all connection requests and commands.
@@ -615,9 +203,9 @@
* @param controller controller information.
* @return allowed commands. Can be {@code null} to reject connection.
*/
- public @Nullable CommandGroup onConnect(@NonNull MediaSession2 session,
+ public @Nullable SessionCommandGroup2 onConnect(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller) {
- CommandGroup commands = new CommandGroup(mContext);
+ SessionCommandGroup2 commands = new SessionCommandGroup2();
commands.addAllPredefinedCommands();
return commands;
}
@@ -639,23 +227,23 @@
* @param controller controller information.
* @param command a command. This method will be called for every single command.
* @return {@code true} if you want to accept incoming command. {@code false} otherwise.
- * @see #COMMAND_CODE_PLAYBACK_PLAY
- * @see #COMMAND_CODE_PLAYBACK_PAUSE
- * @see #COMMAND_CODE_PLAYBACK_STOP
- * @see #COMMAND_CODE_PLAYLIST_SKIP_NEXT_ITEM
- * @see #COMMAND_CODE_PLAYLIST_SKIP_PREV_ITEM
- * @see #COMMAND_CODE_PLAYBACK_PREPARE
- * @see #COMMAND_CODE_PLAYBACK_FAST_FORWARD
- * @see #COMMAND_CODE_PLAYBACK_REWIND
- * @see #COMMAND_CODE_PLAYBACK_SEEK_TO
- * @see #COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM
- * @see #COMMAND_CODE_PLAYLIST_ADD_ITEM
- * @see #COMMAND_CODE_PLAYLIST_REMOVE_ITEM
- * @see #COMMAND_CODE_PLAYLIST_GET_LIST
- * @see #COMMAND_CODE_PLAYBACK_SET_VOLUME
+ * @see SessionCommand2#COMMAND_CODE_PLAYBACK_PLAY
+ * @see SessionCommand2#COMMAND_CODE_PLAYBACK_PAUSE
+ * @see SessionCommand2#COMMAND_CODE_PLAYBACK_STOP
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_SKIP_NEXT_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_SKIP_PREV_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYBACK_PREPARE
+ * @see SessionCommand2#COMMAND_CODE_SESSION_FAST_FORWARD
+ * @see SessionCommand2#COMMAND_CODE_SESSION_REWIND
+ * @see SessionCommand2#COMMAND_CODE_PLAYBACK_SEEK_TO
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_ADD_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_REMOVE_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_GET_LIST
+ * @see SessionCommand2#COMMAND_CODE_SET_VOLUME
*/
public boolean onCommandRequest(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller, @NonNull Command command) {
+ @NonNull ControllerInfo controller, @NonNull SessionCommand2 command) {
return true;
}
@@ -678,7 +266,7 @@
/**
* Called when a controller sent a custom command through
- * {@link MediaController2#sendCustomCommand(Command, Bundle, ResultReceiver)}.
+ * {@link MediaController2#sendCustomCommand(SessionCommand2, Bundle, ResultReceiver)}.
*
* @param session the session for this event
* @param controller controller information
@@ -687,7 +275,7 @@
* @param cb optional result receiver
*/
public void onCustomCommand(@NonNull MediaSession2 session,
- @NonNull ControllerInfo controller, @NonNull Command customCommand,
+ @NonNull ControllerInfo controller, @NonNull SessionCommand2 customCommand,
@Nullable Bundle args, @Nullable ResultReceiver cb) { }
/**
@@ -698,7 +286,7 @@
* @param controller controller information
* @param mediaId media id
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID
*/
public void onPlayFromMediaId(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull String mediaId,
@@ -715,7 +303,7 @@
* @param controller controller information
* @param query query string. Can be empty to indicate any suggested media
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PLAY_FROM_SEARCH
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PLAY_FROM_SEARCH
*/
public void onPlayFromSearch(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull String query,
@@ -729,7 +317,7 @@
* @param controller controller information
* @param uri uri
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PLAY_FROM_URI
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PLAY_FROM_URI
*/
public void onPlayFromUri(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull Uri uri,
@@ -753,7 +341,7 @@
* @param controller controller information
* @param mediaId media id to prepare
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID
*/
public void onPrepareFromMediaId(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull String mediaId,
@@ -777,7 +365,7 @@
* @param controller controller information
* @param query query string. Can be empty to indicate any suggested media
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH
*/
public void onPrepareFromSearch(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull String query,
@@ -801,12 +389,26 @@
* @param controller controller information
* @param uri uri
* @param extras optional extra bundle
- * @see #COMMAND_CODE_SESSION_PREPARE_FROM_URI
+ * @see SessionCommand2#COMMAND_CODE_SESSION_PREPARE_FROM_URI
*/
public void onPrepareFromUri(@NonNull MediaSession2 session,
@NonNull ControllerInfo controller, @NonNull Uri uri, @Nullable Bundle extras) { }
/**
+ * Called when a controller called {@link MediaController2#fastForward()}
+ *
+ * @param session the session for this event
+ */
+ public void onFastForward(@NonNull MediaSession2 session) { }
+
+ /**
+ * Called when a controller called {@link MediaController2#rewind()}
+ *
+ * @param session the session for this event
+ */
+ public void onRewind(@NonNull MediaSession2 session) { }
+
+ /**
* Called when the player's current playing item is changed
* <p>
* When it's called, you should invalidate previous playback information and wait for later
@@ -861,6 +463,17 @@
@NonNull MediaPlayerBase player, float speed) { }
/**
+ * Called to indicate that {@link #seekTo(long)} is completed.
+ *
+ * @param session the session for this event.
+ * @param mpb the player that has completed seeking.
+ * @param position the previous seeking request.
+ * @see #seekTo(long)
+ */
+ public void onSeekCompleted(@NonNull MediaSession2 session, @NonNull MediaPlayerBase mpb,
+ long position) { }
+
+ /**
* Called when a playlist is changed from the {@link MediaPlaylistAgent}.
* <p>
* This is called when the underlying agent has called
@@ -1146,7 +759,7 @@
}
/**
- * Button for a {@link Command} that will be shown by the controller.
+ * Button for a {@link SessionCommand2} that will be shown by the controller.
* <p>
* It's up to the controller's decision to respect or ignore this customization request.
*/
@@ -1166,7 +779,8 @@
*
* @return command or {@code null}
*/
- public @Nullable Command getCommand() {
+ public @Nullable
+ SessionCommand2 getCommand() {
return mProvider.getCommand_impl();
}
@@ -1221,12 +835,11 @@
public static final class Builder {
private final CommandButtonProvider.BuilderProvider mProvider;
- public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider().createMediaSession2CommandButtonBuilder(
- context, this);
+ public Builder() {
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandButtonBuilder(this);
}
- public @NonNull Builder setCommand(@Nullable Command command) {
+ public @NonNull Builder setCommand(@Nullable SessionCommand2 command) {
return mProvider.setCommand_impl(command);
}
@@ -1363,7 +976,8 @@
* expanded row: layout[5] layout[6] layout[7] layout[8] layout[9]
* main row: layout[3] layout[1] layout[0] layout[2] layout[4]
* <p>
- * This API can be called in the {@link SessionCallback#onConnect(MediaSession2, ControllerInfo)}.
+ * This API can be called in the {@link SessionCallback#onConnect(
+ * MediaSession2, ControllerInfo)}.
*
* @param controller controller to specify layout.
* @param layout ordered list of layout.
@@ -1380,7 +994,7 @@
* @param commands new allowed commands
*/
public void setAllowedCommands(@NonNull ControllerInfo controller,
- @NonNull CommandGroup commands) {
+ @NonNull SessionCommandGroup2 commands) {
mProvider.setAllowedCommands_impl(controller, commands);
}
@@ -1390,7 +1004,7 @@
* @param command a command
* @param args optional argument
*/
- public void sendCustomCommand(@NonNull Command command, @Nullable Bundle args) {
+ public void sendCustomCommand(@NonNull SessionCommand2 command, @Nullable Bundle args) {
mProvider.sendCustomCommand_impl(command, args);
}
@@ -1401,8 +1015,9 @@
* @param args optional argument
* @param receiver result receiver for the session
*/
- public void sendCustomCommand(@NonNull ControllerInfo controller, @NonNull Command command,
- @Nullable Bundle args, @Nullable ResultReceiver receiver) {
+ public void sendCustomCommand(@NonNull ControllerInfo controller,
+ @NonNull SessionCommand2 command, @Nullable Bundle args,
+ @Nullable ResultReceiver receiver) {
// Equivalent to the MediaController.sendCustomCommand(Action action, ResultReceiver r);
mProvider.sendCustomCommand_impl(controller, command, args, receiver);
}
@@ -1448,20 +1063,6 @@
}
/**
- * Fast forwards playback. If playback is already fast forwarding this may increase the rate.
- */
- public void fastForward() {
- mProvider.fastForward_impl();
- }
-
- /**
- * Rewinds playback. If playback is already rewinding this may increase the rate.
- */
- public void rewind() {
- mProvider.rewind_impl();
- }
-
- /**
* Move to a new location in the media stream.
*
* @param pos Position to move to, in milliseconds.
@@ -1562,7 +1163,8 @@
* <li>{@link MediaItem2} specified by {@link #setPlaylist(List, MediaMetadata2)} doesn't
* have {@link DataSourceDesc}</li>
* <li>{@link MediaController2#addPlaylistItem(int, MediaItem2)} is called and accepted
- * by {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)}.
+ * by {@link SessionCallback#onCommandRequest(
+ * MediaSession2, ControllerInfo, SessionCommand2)}.
* In that case, an item would be added automatically without the data source.</li>
* </ul>
* <p>
@@ -1574,9 +1176,9 @@
* @param helper a data source missing helper.
* @throws IllegalStateException when the helper is set when the playlist agent is set
* @see #setPlaylist(List, MediaMetadata2)
- * @see SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, Command)
- * @see #COMMAND_CODE_PLAYLIST_ADD_ITEM
- * @see #COMMAND_CODE_PLAYLIST_REPLACE_ITEM
+ * @see SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_ADD_ITEM
+ * @see SessionCommand2#COMMAND_CODE_PLAYLIST_REPLACE_ITEM
*/
public void setOnDataSourceMissingHelper(@NonNull OnDataSourceMissingHelper helper) {
mProvider.setOnDataSourceMissingHelper_impl(helper);
diff --git a/media/java/android/media/MediaSessionService2.java b/media/java/android/media/MediaSessionService2.java
index 85ac9b2..6c3a4bf 100644
--- a/media/java/android/media/MediaSessionService2.java
+++ b/media/java/android/media/MediaSessionService2.java
@@ -21,7 +21,6 @@
import android.annotation.Nullable;
import android.app.Notification;
import android.app.Service;
-import android.content.Context;
import android.content.Intent;
import android.media.MediaSession2.ControllerInfo;
import android.media.update.ApiLoader;
@@ -213,16 +212,14 @@
/**
* Default constructor
*
- * @param context context
* @param notificationId notification id to be used for
* {@link android.app.NotificationManager#notify(int, Notification)}.
* @param notification a notification to make session service foreground service. Media
* style notification is recommended here.
*/
- public MediaNotification(@NonNull Context context,
- int notificationId, @NonNull Notification notification) {
+ public MediaNotification(int notificationId, @NonNull Notification notification) {
mProvider = ApiLoader.getProvider().createMediaSessionService2MediaNotification(
- context, this, notificationId, notification);
+ this, notificationId, notification);
}
public int getNotificationId() {
diff --git a/media/java/android/media/MediaTimestamp.java b/media/java/android/media/MediaTimestamp.java
index 5ea6bbe..938dd14 100644
--- a/media/java/android/media/MediaTimestamp.java
+++ b/media/java/android/media/MediaTimestamp.java
@@ -37,6 +37,11 @@
public final class MediaTimestamp
{
/**
+ * An unknown media timestamp value
+ */
+ public static final MediaTimestamp TIMESTAMP_UNKNOWN = new MediaTimestamp(-1, -1, 0.0f);
+
+ /**
* Get the media time of the anchor in microseconds.
*/
public long getAnchorMediaTimeUs() {
@@ -82,4 +87,15 @@
nanoTime = 0;
clockRate = 1.0f;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+
+ final MediaTimestamp that = (MediaTimestamp) obj;
+ return (this.mediaTimeUs == that.mediaTimeUs)
+ && (this.nanoTime == that.nanoTime)
+ && (this.clockRate == that.clockRate);
+ }
}
diff --git a/media/java/android/media/MicrophoneInfo.java b/media/java/android/media/MicrophoneInfo.java
index 004efea..d6399a4 100644
--- a/media/java/android/media/MicrophoneInfo.java
+++ b/media/java/android/media/MicrophoneInfo.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.util.Pair;
import java.lang.annotation.Retention;
@@ -224,12 +225,11 @@
}
/**
- * @hide
* Returns The "address" string of the microphone that corresponds to the
* address returned by {@link AudioDeviceInfo#getAddress()}
* @return the address of the microphone
*/
- public String getAddress() {
+ public @NonNull String getAddress() {
return mAddress;
}
diff --git a/media/java/android/media/Rating2.java b/media/java/android/media/Rating2.java
index 5f7a334..9213190 100644
--- a/media/java/android/media/Rating2.java
+++ b/media/java/android/media/Rating2.java
@@ -19,7 +19,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.IntDef;
-import android.content.Context;
import android.media.update.ApiLoader;
import android.media.update.Rating2Provider;
import android.os.Bundle;
@@ -29,6 +28,7 @@
import java.lang.annotation.RetentionPolicy;
/**
+ * @hide
* A class to encapsulate rating information used as content metadata.
* A rating is defined by its rating style (see {@link #RATING_HEART},
* {@link #RATING_THUMB_UP_DOWN}, {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
@@ -126,12 +126,11 @@
/**
* Create an instance from bundle object, previoulsy created by {@link #toBundle()}
*
- * @param context context
* @param bundle bundle
* @return new Rating2 instance or {@code null} for error
*/
- public static Rating2 fromBundle(@NonNull Context context, @Nullable Bundle bundle) {
- return ApiLoader.getProvider().fromBundle_Rating2(context, bundle);
+ public static Rating2 fromBundle(@Nullable Bundle bundle) {
+ return ApiLoader.getProvider().fromBundle_Rating2(bundle);
}
/**
@@ -146,39 +145,35 @@
* Return a Rating2 instance with no rating.
* Create and return a new Rating2 instance with no rating known for the given
* rating style.
- * @param context context
* @param ratingStyle one of {@link #RATING_HEART}, {@link #RATING_THUMB_UP_DOWN},
* {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS},
* or {@link #RATING_PERCENTAGE}.
* @return null if an invalid rating style is passed, a new Rating2 instance otherwise.
*/
- public static @Nullable Rating2 newUnratedRating(@NonNull Context context,
- @Style int ratingStyle) {
- return ApiLoader.getProvider().newUnratedRating_Rating2(context, ratingStyle);
+ public static @Nullable Rating2 newUnratedRating(@Style int ratingStyle) {
+ return ApiLoader.getProvider().newUnratedRating_Rating2(ratingStyle);
}
/**
* Return a Rating2 instance with a heart-based rating.
* Create and return a new Rating2 instance with a rating style of {@link #RATING_HEART},
* and a heart-based rating.
- * @param context context
* @param hasHeart true for a "heart selected" rating, false for "heart unselected".
* @return a new Rating2 instance.
*/
- public static @Nullable Rating2 newHeartRating(@NonNull Context context, boolean hasHeart) {
- return ApiLoader.getProvider().newHeartRating_Rating2(context, hasHeart);
+ public static @Nullable Rating2 newHeartRating(boolean hasHeart) {
+ return ApiLoader.getProvider().newHeartRating_Rating2(hasHeart);
}
/**
* Return a Rating2 instance with a thumb-based rating.
* Create and return a new Rating2 instance with a {@link #RATING_THUMB_UP_DOWN}
* rating style, and a "thumb up" or "thumb down" rating.
- * @param context context
* @param thumbIsUp true for a "thumb up" rating, false for "thumb down".
* @return a new Rating2 instance.
*/
- public static @Nullable Rating2 newThumbRating(@NonNull Context context, boolean thumbIsUp) {
- return ApiLoader.getProvider().newThumbRating_Rating2(context, thumbIsUp);
+ public static @Nullable Rating2 newThumbRating(boolean thumbIsUp) {
+ return ApiLoader.getProvider().newThumbRating_Rating2(thumbIsUp);
}
/**
@@ -186,7 +181,6 @@
* Create and return a new Rating2 instance with one of the star-base rating styles
* and the given integer or fractional number of stars. Non integer values can for instance
* be used to represent an average rating value, which might not be an integer number of stars.
- * @param context context
* @param starRatingStyle one of {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
* {@link #RATING_5_STARS}.
* @param starRating a number ranging from 0.0f to 3.0f, 4.0f or 5.0f according to
@@ -194,26 +188,25 @@
* @return null if the rating style is invalid, or the rating is out of range,
* a new Rating2 instance otherwise.
*/
- public static @Nullable Rating2 newStarRating(@NonNull Context context,
+ public static @Nullable Rating2 newStarRating(
@StarStyle int starRatingStyle, float starRating) {
- return ApiLoader.getProvider().newStarRating_Rating2(context, starRatingStyle, starRating);
+ return ApiLoader.getProvider().newStarRating_Rating2(starRatingStyle, starRating);
}
/**
* Return a Rating2 instance with a percentage-based rating.
* Create and return a new Rating2 instance with a {@link #RATING_PERCENTAGE}
* rating style, and a rating of the given percentage.
- * @param context context
* @param percent the value of the rating
* @return null if the rating is out of range, a new Rating2 instance otherwise.
*/
- public static @Nullable Rating2 newPercentageRating(@NonNull Context context, float percent) {
- return ApiLoader.getProvider().newPercentageRating_Rating2(context, percent);
+ public static @Nullable Rating2 newPercentageRating(float percent) {
+ return ApiLoader.getProvider().newPercentageRating_Rating2(percent);
}
/**
* Return whether there is a rating value available.
- * @return true if the instance was not created with {@link #newUnratedRating(Context, int)}.
+ * @return true if the instance was not created with {@link #newUnratedRating(int)}.
*/
public boolean isRated() {
return mProvider.isRated_impl();
diff --git a/media/java/android/media/SessionCommand2.java b/media/java/android/media/SessionCommand2.java
new file mode 100644
index 0000000..fe86a3a
--- /dev/null
+++ b/media/java/android/media/SessionCommand2.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.media.update.ApiLoader;
+import android.media.update.MediaSession2Provider;
+import android.media.MediaSession2.ControllerInfo;
+import android.media.MediaSession2.SessionCallback;
+import android.net.Uri;
+import android.os.Bundle;
+
+import java.util.List;
+
+/**
+ * @hide
+ * Define a command that a {@link MediaController2} can send to a {@link MediaSession2}.
+ * <p>
+ * If {@link #getCommandCode()} isn't {@link #COMMAND_CODE_CUSTOM}), it's predefined command.
+ * If {@link #getCommandCode()} is {@link #COMMAND_CODE_CUSTOM}), it's custom command and
+ * {@link #getCustomCommand()} shouldn't be {@code null}.
+ */
+public final class SessionCommand2 {
+ /**
+ * Command code for the custom command which can be defined by string action in the
+ * {@link SessionCommand2}.
+ */
+ public static final int COMMAND_CODE_CUSTOM = 0;
+
+ /**
+ * Command code for {@link MediaController2#play()}.
+ * <p>
+ * Command would be sent directly to the player if the session doesn't reject the request
+ * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo,
+ * SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYBACK_PLAY = 1;
+
+ /**
+ * Command code for {@link MediaController2#pause()}.
+ * <p>
+ * Command would be sent directly to the player if the session doesn't reject the request
+ * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo,
+ * SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYBACK_PAUSE = 2;
+
+ /**
+ * Command code for {@link MediaController2#stop()}.
+ * <p>
+ * Command would be sent directly to the player if the session doesn't reject the request
+ * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo,
+ * SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYBACK_STOP = 3;
+
+ /**
+ * Command code for {@link MediaController2#skipToNextItem()}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the {@link SessionCallback#onCommandRequest(
+ * MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SKIP_NEXT_ITEM = 4;
+
+ /**
+ * Command code for {@link MediaController2#skipToPreviousItem()}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the {@link SessionCallback#onCommandRequest(
+ * MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SKIP_PREV_ITEM = 5;
+
+ /**
+ * Command code for {@link MediaController2#prepare()}.
+ * <p>
+ * Command would be sent directly to the player if the session doesn't reject the request
+ * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo,
+ * SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6;
+
+ /**
+ * Command code for {@link MediaController2#fastForward()}.
+ */
+ public static final int COMMAND_CODE_SESSION_FAST_FORWARD = 7;
+
+ /**
+ * Command code for {@link MediaController2#rewind()}.
+ */
+ public static final int COMMAND_CODE_SESSION_REWIND = 8;
+
+ /**
+ * Command code for {@link MediaController2#seekTo(long)}.
+ * <p>
+ * Command would be sent directly to the player if the session doesn't reject the request
+ * through the {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo,
+ * SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9;
+
+ /**
+ * Command code for both {@link MediaController2#setVolumeTo(int, int)}.
+ * <p>
+ * Command would set the device volume or send to the volume provider directly if the session
+ * doesn't reject the request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_SET_VOLUME = 10;
+
+ /**
+ * Command code for both {@link MediaController2#adjustVolume(int, int)}.
+ * <p>
+ * Command would adjust the device volume or send to the volume provider directly if the session
+ * doesn't reject the request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_ADJUST_VOLUME = 11;
+
+ /**
+ * Command code for {@link MediaController2#skipToPlaylistItem(MediaItem2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM = 12;
+
+ /**
+ * Command code for {@link MediaController2#setShuffleMode(int)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE = 13;
+
+ /**
+ * Command code for {@link MediaController2#setRepeatMode(int)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE = 14;
+
+ /**
+ * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_ADD_ITEM = 15;
+
+ /**
+ * Command code for {@link MediaController2#addPlaylistItem(int, MediaItem2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_REMOVE_ITEM = 16;
+
+ /**
+ * Command code for {@link MediaController2#replacePlaylistItem(int, MediaItem2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_REPLACE_ITEM = 17;
+
+ /**
+ * Command code for {@link MediaController2#getPlaylist()}. This will expose metadata
+ * information to the controller.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18;
+
+ /**
+ * Command code for {@link MediaController2#setPlaylist(List, MediaMetadata2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19;
+
+ /**
+ * Command code for {@link MediaController2#getPlaylistMetadata()}. This will expose
+ * metadata information to the controller.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_GET_LIST_METADATA = 20;
+
+ /**
+ * Command code for {@link MediaController2#updatePlaylistMetadata(MediaMetadata2)}.
+ * <p>
+ * Command would be sent directly to the playlist agent if the session doesn't reject the
+ * request through the
+ * {@link SessionCallback#onCommandRequest(MediaSession2, ControllerInfo, SessionCommand2)}.
+ */
+ public static final int COMMAND_CODE_PLAYLIST_SET_LIST_METADATA = 21;
+
+ /**
+ * Command code for {@link MediaController2#playFromMediaId(String, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID = 22;
+
+ /**
+ * Command code for {@link MediaController2#playFromUri(Uri, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PLAY_FROM_URI = 23;
+
+ /**
+ * Command code for {@link MediaController2#playFromSearch(String, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PLAY_FROM_SEARCH = 24;
+
+ /**
+ * Command code for {@link MediaController2#prepareFromMediaId(String, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID = 25;
+
+ /**
+ * Command code for {@link MediaController2#prepareFromUri(Uri, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PREPARE_FROM_URI = 26;
+
+ /**
+ * Command code for {@link MediaController2#prepareFromSearch(String, Bundle)}.
+ */
+ public static final int COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH = 27;
+
+ /**
+ * Command code for {@link MediaController2#setRating(String, Rating2)}.
+ */
+ public static final int COMMAND_CODE_SESSION_SET_RATING = 28;
+
+ // TODO(jaewan): Add javadoc
+ public static final int COMMAND_CODE_LIBRARY_GET_CHILDREN = 29;
+ public static final int COMMAND_CODE_LIBRARY_GET_ITEM = 30;
+ public static final int COMMAND_CODE_LIBRARY_GET_LIBRARY_ROOT = 31;
+ public static final int COMMAND_CODE_LIBRARY_GET_SEARCH_RESULT = 32;
+ public static final int COMMAND_CODE_LIBRARY_SEARCH = 33;
+ public static final int COMMAND_CODE_LIBRARY_SUBSCRIBE = 34;
+ public static final int COMMAND_CODE_LIBRARY_UNSUBSCRIBE = 35;
+
+ // TODO(jaewan): Rename and move provider
+ private final MediaSession2Provider.CommandProvider mProvider;
+
+ public SessionCommand2(int commandCode) {
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, commandCode, null, null);
+ }
+
+ public SessionCommand2(@NonNull String action, @Nullable Bundle extras) {
+ if (action == null) {
+ throw new IllegalArgumentException("action shouldn't be null");
+ }
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, COMMAND_CODE_CUSTOM, action, extras);
+ }
+
+ /**
+ * @hide
+ */
+ public MediaSession2Provider.CommandProvider getProvider() {
+ return mProvider;
+ }
+
+ public int getCommandCode() {
+ return mProvider.getCommandCode_impl();
+ }
+
+ public @Nullable String getCustomCommand() {
+ return mProvider.getCustomCommand_impl();
+ }
+
+ public @Nullable Bundle getExtras() {
+ return mProvider.getExtras_impl();
+ }
+
+ /**
+ * @return a new Bundle instance from the Command
+ * @hide
+ */
+ public Bundle toBundle() {
+ return mProvider.toBundle_impl();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SessionCommand2)) {
+ return false;
+ }
+ return mProvider.equals_impl(((SessionCommand2) obj).mProvider);
+ }
+
+ @Override
+ public int hashCode() {
+ return mProvider.hashCode_impl();
+ }
+
+ /**
+ * @return a new Command instance from the Bundle
+ * @hide
+ */
+ public static SessionCommand2 fromBundle(@NonNull Bundle command) {
+ return ApiLoader.getProvider().fromBundle_MediaSession2Command(command);
+ }
+}
diff --git a/media/java/android/media/SessionCommandGroup2.java b/media/java/android/media/SessionCommandGroup2.java
new file mode 100644
index 0000000..399765e
--- /dev/null
+++ b/media/java/android/media/SessionCommandGroup2.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.media.update.ApiLoader;
+import android.media.update.MediaSession2Provider;
+import android.os.Bundle;
+
+import java.util.Set;
+
+/**
+ * @hide
+ * Represent set of {@link SessionCommand2}.
+ */
+public final class SessionCommandGroup2 {
+ // TODO(jaewan): Rename and move provider
+ private final MediaSession2Provider.CommandGroupProvider mProvider;
+
+ public SessionCommandGroup2() {
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(this, null);
+ }
+
+ public SessionCommandGroup2(@Nullable SessionCommandGroup2 others) {
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(this, others);
+ }
+
+ /**
+ * @hide
+ */
+ public SessionCommandGroup2(@NonNull MediaSession2Provider.CommandGroupProvider provider) {
+ mProvider = provider;
+ }
+
+ public void addCommand(@NonNull SessionCommand2 command) {
+ mProvider.addCommand_impl(command);
+ }
+
+ public void addCommand(int commandCode) {
+ // TODO(jaewna): Implement
+ }
+
+ public void addAllPredefinedCommands() {
+ mProvider.addAllPredefinedCommands_impl();
+ }
+
+ public void removeCommand(@NonNull SessionCommand2 command) {
+ mProvider.removeCommand_impl(command);
+ }
+
+ public void removeCommand(int commandCode) {
+ // TODO(jaewan): Implement.
+ }
+
+ public boolean hasCommand(@NonNull SessionCommand2 command) {
+ return mProvider.hasCommand_impl(command);
+ }
+
+ public boolean hasCommand(int code) {
+ return mProvider.hasCommand_impl(code);
+ }
+
+ public @NonNull
+ Set<SessionCommand2> getCommands() {
+ return mProvider.getCommands_impl();
+ }
+
+ /**
+ * @hide
+ */
+ public @NonNull MediaSession2Provider.CommandGroupProvider getProvider() {
+ return mProvider;
+ }
+
+ /**
+ * @return new bundle from the CommandGroup
+ * @hide
+ */
+ public @NonNull Bundle toBundle() {
+ return mProvider.toBundle_impl();
+ }
+
+ /**
+ * @return new instance of CommandGroup from the bundle
+ * @hide
+ */
+ public static @Nullable SessionCommandGroup2 fromBundle(Bundle commands) {
+ return ApiLoader.getProvider().fromBundle_MediaSession2CommandGroup(commands);
+ }
+}
diff --git a/media/java/android/media/SessionToken2.java b/media/java/android/media/SessionToken2.java
index f088be3..bf2d445 100644
--- a/media/java/android/media/SessionToken2.java
+++ b/media/java/android/media/SessionToken2.java
@@ -150,8 +150,8 @@
* @param bundle
* @return
*/
- public static SessionToken2 fromBundle(@NonNull Context context, @NonNull Bundle bundle) {
- return ApiLoader.getProvider().fromBundle_SessionToken2(context, bundle);
+ public static SessionToken2 fromBundle(@NonNull Bundle bundle) {
+ return ApiLoader.getProvider().fromBundle_SessionToken2(bundle);
}
/**
diff --git a/media/java/android/media/SubtitleData.java b/media/java/android/media/SubtitleData.java
index 3e6f6f9..9797828 100644
--- a/media/java/android/media/SubtitleData.java
+++ b/media/java/android/media/SubtitleData.java
@@ -16,26 +16,50 @@
package android.media;
+import android.annotation.NonNull;
import android.os.Parcel;
/**
- * @hide
- *
- * Class to hold the subtitle track's data, including:
+ * Class encapsulating subtitle data, as received through the
+ * {@link MediaPlayer.OnSubtitleDataListener} interface.
+ * The subtitle data includes:
* <ul>
- * <li> Track index</li>
- * <li> Start time (in microseconds) of the data</li>
- * <li> Duration (in microseconds) of the data</li>
- * <li> A byte-array of the data</li>
+ * <li> the track index</li>
+ * <li> the start time (in microseconds) of the data</li>
+ * <li> the duration (in microseconds) of the data</li>
+ * <li> the actual data.</li>
* </ul>
- *
- * <p> To receive the subtitle data, applications need to do the following:
- *
- * <ul>
- * <li> Select a track of type MEDIA_TRACK_TYPE_SUBTITLE with {@link MediaPlayer.selectTrack(int)</li>
- * <li> Implement the {@link MediaPlayer.OnSubtitleDataListener} interface</li>
- * <li> Register the {@link MediaPlayer.OnSubtitleDataListener} callback on a MediaPlayer object</li>
- * </ul>
+ * The data is stored in a byte-array, and is encoded in one of the supported in-band
+ * subtitle formats. The subtitle encoding is determined by the MIME type of the
+ * {@link MediaPlayer.TrackInfo} of the subtitle track, one of
+ * {@link MediaFormat#MIMETYPE_TEXT_CEA_608}, {@link MediaFormat#MIMETYPE_TEXT_CEA_708},
+ * {@link MediaFormat#MIMETYPE_TEXT_VTT}.
+ * <p>
+ * Here is an example of iterating over the tracks of a {@link MediaPlayer}, and checking which
+ * encoding is used for the subtitle tracks:
+ * <p>
+ * <pre class="prettyprint">
+ * MediaPlayer mp = new MediaPlayer();
+ * mp.setDataSource(myContentLocation);
+ * mp.prepare(); // synchronous prepare, ready to use when method returns
+ * final TrackInfo[] trackInfos = mp.getTrackInfo();
+ * for (TrackInfo info : trackInfo) {
+ * if (info.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
+ * final String mime = info.getFormat().getString(MediaFormat.KEY_MIME);
+ * if (MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mime) {
+ * // subtitle encoding is CEA 608
+ * } else if (MediaFormat.MIMETYPE_TEXT_CEA_708.equals(mime) {
+ * // subtitle encoding is CEA 708
+ * } else if (MediaFormat.MIMETYPE_TEXT_VTT.equals(mime) {
+ * // subtitle encoding is WebVTT
+ * }
+ * }
+ * }
+ * </pre>
+ * <p>
+ * See
+ * {@link MediaPlayer#setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener, android.os.Handler)}
+ * to receive subtitle data from a MediaPlayer object.
*
* @see android.media.MediaPlayer
*/
@@ -48,25 +72,47 @@
private long mDurationUs;
private byte[] mData;
+ /** @hide */
public SubtitleData(Parcel parcel) {
if (!parseParcel(parcel)) {
throw new IllegalArgumentException("parseParcel() fails");
}
}
+ /**
+ * Returns the index of the MediaPlayer track which contains this subtitle data.
+ * @return an index in the array returned by {@link MediaPlayer#getTrackInfo()}.
+ */
public int getTrackIndex() {
return mTrackIndex;
}
+ /**
+ * Returns the media time at which the subtitle should be displayed, expressed in microseconds.
+ * @return the display start time for the subtitle
+ */
public long getStartTimeUs() {
return mStartTimeUs;
}
+ /**
+ * Returns the duration in microsecond during which the subtitle should be displayed.
+ * @return the display duration for the subtitle
+ */
public long getDurationUs() {
return mDurationUs;
}
- public byte[] getData() {
+ /**
+ * Returns the encoded data for the subtitle content.
+ * Encoding format depends on the subtitle type, refer to
+ * <a href="https://en.wikipedia.org/wiki/CEA-708">CEA 708</a>,
+ * <a href="https://en.wikipedia.org/wiki/EIA-608">CEA/EIA 608</a> and
+ * <a href="https://www.w3.org/TR/webvtt1/">WebVTT</a>, defined by the MIME type
+ * of the subtitle track.
+ * @return the encoded subtitle data
+ */
+ public @NonNull byte[] getData() {
return mData;
}
diff --git a/media/java/android/media/VolumeProvider2.java b/media/java/android/media/VolumeProvider2.java
index 2d96d096..1a4608f 100644
--- a/media/java/android/media/VolumeProvider2.java
+++ b/media/java/android/media/VolumeProvider2.java
@@ -18,7 +18,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.content.Context;
import android.media.update.ApiLoader;
import android.media.update.VolumeProvider2Provider;
@@ -75,10 +74,9 @@
* @param maxVolume The maximum allowed volume.
* @param currentVolume The current volume on the output.
*/
- public VolumeProvider2(@NonNull Context context, @ControlType int controlType,
- int maxVolume, int currentVolume) {
+ public VolumeProvider2(@ControlType int controlType, int maxVolume, int currentVolume) {
mProvider = ApiLoader.getProvider().createVolumeProvider2(
- context, this, controlType, maxVolume, currentVolume);
+ this, controlType, maxVolume, currentVolume);
}
/**
diff --git a/media/java/android/media/audiofx/DynamicsProcessing.java b/media/java/android/media/audiofx/DynamicsProcessing.java
index d09c9a8..4c17ae1 100644
--- a/media/java/android/media/audiofx/DynamicsProcessing.java
+++ b/media/java/android/media/audiofx/DynamicsProcessing.java
@@ -16,10 +16,11 @@
package android.media.audiofx;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.media.AudioTrack;
import android.media.MediaPlayer;
import android.media.audiofx.AudioEffect;
-import android.media.audiofx.DynamicsProcessing.Settings;
import android.util.Log;
import java.nio.ByteBuffer;
@@ -90,66 +91,18 @@
private final static String TAG = "DynamicsProcessing";
- /**
- * Config object used to initialize and change effect parameters at runtime.
- */
- private Config mConfig = null;
-
-
// These parameter constants must be synchronized with those in
// /system/media/audio_effects/include/audio_effects/effect_dynamicsprocessing.h
-
- private static final int PARAM_GET_CHANNEL_COUNT = 0x0;
- private static final int PARAM_EQ_BAND_COUNT = 0x1;
- private static final int PARAM_MBC_BAND_COUNT = 0x2;
- private static final int PARAM_INPUT_GAIN = 0x3;
- private static final int PARAM_PRE_EQ_ENABLED = 0x10;
- private static final int PARAM_PRE_EQ_BAND_ENABLED = 0x11;
- private static final int PARAM_PRE_EQ_BAND_FREQUENCY = 0x12;
- private static final int PARAM_PRE_EQ_BAND_GAIN = 0x13;
- private static final int PARAM_EQ_FREQUENCY_RANGE = 0x22;
- private static final int PARAM_EQ_GAIN_RANGE = 0x23;
- private static final int PARAM_MBC_ENABLED = 0x30;
- private static final int PARAM_MBC_BAND_ENABLED = 0x31;
- private static final int PARAM_MBC_BAND_FREQUENCY = 0x32;
- private static final int PARAM_MBC_BAND_ATTACK_TIME = 0x33;
- private static final int PARAM_MBC_BAND_RELEASE_TIME = 0x34;
- private static final int PARAM_MBC_BAND_RATIO = 0x35;
- private static final int PARAM_MBC_BAND_THRESHOLD = 0x36;
- private static final int PARAM_MBC_BAND_KNEE_WIDTH = 0x37;
- private static final int PARAM_MBC_BAND_NOISE_GATE_THRESHOLD = 0x38;
- private static final int PARAM_MBC_BAND_EXPANDER_RATIO = 0x39;
- private static final int PARAM_MBC_BAND_GAIN_PRE = 0x3A;
- private static final int PARAM_MBC_BAND_GAIN_POST = 0x3B;
- private static final int PARAM_MBC_FREQUENCY_RANGE = 0x42;
- private static final int PARAM_MBC_ATTACK_TIME_RANGE = 0x43;
- private static final int PARAM_MBC_RELEASE_TIME_RANGE = 0x44;
- private static final int PARAM_MBC_RATIO_RANGE = 0x45;
- private static final int PARAM_MBC_THRESHOLD_RANGE = 0x46;
- private static final int PARAM_MBC_KNEE_WIDTH_RANGE = 0x47;
- private static final int PARAM_MBC_NOISE_GATE_THRESHOLD_RANGE = 0x48;
- private static final int PARAM_MBC_EXPANDER_RATIO_RANGE = 0x49;
- private static final int PARAM_MBC_GAIN_RANGE = 0x4A;
- private static final int PARAM_POST_EQ_ENABLED = 0x50;
- private static final int PARAM_POST_EQ_BAND_ENABLED = 0x51;
- private static final int PARAM_POST_EQ_BAND_FREQUENCY = 0x52;
- private static final int PARAM_POST_EQ_BAND_GAIN = 0x53;
- private static final int PARAM_LIMITER_ENABLED = 0x60;
- private static final int PARAM_LIMITER_LINK_GROUP = 0x61;
- private static final int PARAM_LIMITER_ATTACK_TIME = 0x62;
- private static final int PARAM_LIMITER_RELEASE_TIME = 0x63;
- private static final int PARAM_LIMITER_RATIO = 0x64;
- private static final int PARAM_LIMITER_THRESHOLD = 0x65;
- private static final int PARAM_LIMITER_GAIN_POST = 0x66;
- private static final int PARAM_LIMITER_ATTACK_TIME_RANGE = 0x72;
- private static final int PARAM_LIMITER_RELEASE_TIME_RANGE = 0x73;
- private static final int PARAM_LIMITER_RATIO_RANGE = 0x74;
- private static final int PARAM_LIMITER_THRESHOLD_RANGE = 0x75;
- private static final int PARAM_LIMITER_GAIN_RANGE = 0x76;
- private static final int PARAM_VARIANT = 0x100;
- private static final int PARAM_VARIANT_DESCRIPTION = 0x101;
- private static final int PARAM_VARIANT_COUNT = 0x102;
- private static final int PARAM_SET_ENGINE_ARCHITECTURE = 0x200;
+ private static final int PARAM_GET_CHANNEL_COUNT = 0x10;
+ private static final int PARAM_INPUT_GAIN = 0x20;
+ private static final int PARAM_ENGINE_ARCHITECTURE = 0x30;
+ private static final int PARAM_PRE_EQ = 0x40;
+ private static final int PARAM_PRE_EQ_BAND = 0x45;
+ private static final int PARAM_MBC = 0x50;
+ private static final int PARAM_MBC_BAND = 0x55;
+ private static final int PARAM_POST_EQ = 0x60;
+ private static final int PARAM_POST_EQ_BAND = 0x65;
+ private static final int PARAM_LIMITER = 0x70;
/**
* Index of variant that favors frequency resolution. Frequency domain based implementation.
@@ -226,12 +179,13 @@
* Config object that suits your needs. A null cfg parameter will create and use a default
* configuration for the effect
*/
- public DynamicsProcessing(int priority, int audioSession, Config cfg) {
+ public DynamicsProcessing(int priority, int audioSession, @Nullable Config cfg) {
super(EFFECT_TYPE_DYNAMICS_PROCESSING, EFFECT_TYPE_NULL, priority, audioSession);
if (audioSession == 0) {
Log.w(TAG, "WARNING: attaching a DynamicsProcessing to global output mix is"
+ "deprecated!");
}
+ final Config config;
mChannelCount = getChannelCount();
if (cfg == null) {
//create a default configuration and effect, with the number of channels this effect has
@@ -239,21 +193,33 @@
new DynamicsProcessing.Config.Builder(
CONFIG_DEFAULT_VARIANT,
mChannelCount,
- true /*use preEQ*/, 6 /*pre eq bands*/,
- true /*use mbc*/, 6 /*mbc bands*/,
- true /*use postEQ*/, 6 /*postEq bands*/,
- true /*use Limiter*/);
- mConfig = builder.build();
+ CONFIG_DEFAULT_USE_PREEQ,
+ CONFIG_DEFAULT_PREEQ_BANDS,
+ CONFIG_DEFAULT_USE_MBC,
+ CONFIG_DEFAULT_MBC_BANDS,
+ CONFIG_DEFAULT_USE_POSTEQ,
+ CONFIG_DEFAULT_POSTEQ_BANDS,
+ CONFIG_DEFAULT_USE_LIMITER);
+ config = builder.build();
} else {
- //validate channels are ok. decide what to do: replicate channels if more, or fail, or
- mConfig = new DynamicsProcessing.Config(mChannelCount, cfg);
+ //validate channels are ok. decide what to do: replicate channels if more
+ config = new DynamicsProcessing.Config(mChannelCount, cfg);
}
- setEngineArchitecture(mConfig.getVariant(),
- mConfig.isPreEqInUse(), mConfig.getPreEqBandCount(),
- mConfig.isMbcInUse(), mConfig.getMbcBandCount(),
- mConfig.isPostEqInUse(), mConfig.getPostEqBandCount(),
- mConfig.isLimiterInUse());
+ //configure engine
+ setEngineArchitecture(config.getVariant(),
+ config.getPreferredFrameDuration(),
+ config.isPreEqInUse(),
+ config.getPreEqBandCount(),
+ config.isMbcInUse(),
+ config.getMbcBandCount(),
+ config.isPostEqInUse(),
+ config.getPostEqBandCount(),
+ config.isLimiterInUse());
+ //update all the parameters
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ updateEngineChannelByChannelIndex(ch, config.getChannelByChannelIndex(ch));
+ }
}
/**
@@ -261,11 +227,51 @@
* @return Config Current Config object used to setup this DynamicsProcessing effect.
*/
public Config getConfig() {
- return mConfig;
+ //Query engine architecture to create config object
+ Number[] params = { PARAM_ENGINE_ARCHITECTURE };
+ Number[] values = { 0 /*0 variant */,
+ 0.0f /* 1 preferredFrameDuration */,
+ 0 /*2 preEqInUse */,
+ 0 /*3 preEqBandCount */,
+ 0 /*4 mbcInUse */,
+ 0 /*5 mbcBandCount*/,
+ 0 /*6 postEqInUse */,
+ 0 /*7 postEqBandCount */,
+ 0 /*8 limiterInUse */};
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+ byteArrayToNumberArray(valueBytes, values);
+ DynamicsProcessing.Config.Builder builder =
+ new DynamicsProcessing.Config.Builder(
+ values[0].intValue(),
+ mChannelCount,
+ values[2].intValue() > 0 /*use preEQ*/,
+ values[3].intValue() /*pre eq bands*/,
+ values[4].intValue() > 0 /*use mbc*/,
+ values[5].intValue() /*mbc bands*/,
+ values[6].intValue() > 0 /*use postEQ*/,
+ values[7].intValue()/*postEq bands*/,
+ values[8].intValue() > 0 /*use Limiter*/).
+ setPreferredFrameDuration(values[1].floatValue());
+ Config config = builder.build();
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ Channel channel = queryEngineByChannelIndex(ch);
+ config.setChannelTo(ch, channel);
+ }
+ return config;
}
- private static final int CONFIG_DEFAULT_VARIANT = 0; //favor frequency
+ private static final int CONFIG_DEFAULT_VARIANT = VARIANT_FAVOR_FREQUENCY_RESOLUTION;
+ private static final boolean CONFIG_DEFAULT_USE_PREEQ = true;
+ private static final int CONFIG_DEFAULT_PREEQ_BANDS = 6;
+ private static final boolean CONFIG_DEFAULT_USE_MBC = true;
+ private static final int CONFIG_DEFAULT_MBC_BANDS = 6;
+ private static final boolean CONFIG_DEFAULT_USE_POSTEQ = true;
+ private static final int CONFIG_DEFAULT_POSTEQ_BANDS = 6;
+ private static final boolean CONFIG_DEFAULT_USE_LIMITER = true;
+
private static final float CHANNEL_DEFAULT_INPUT_GAIN = 0; // dB
private static final float CONFIG_PREFERRED_FRAME_DURATION_MS = 10.0f; //milliseconds
@@ -1276,7 +1282,7 @@
mChannel = new Channel[mChannelCount];
//check if channelconfig is null or has less channels than channel count.
//options: fill the missing with default options.
- // or fail?
+ // or fail?
for (int ch = 0; ch < mChannelCount; ch++) {
if (ch < channel.length) {
mChannel[ch] = new Channel(channel[ch]); //copy create
@@ -1331,7 +1337,7 @@
* Class constructor for Config
* @param cfg Configuration object copy constructor
*/
- public Config(Config cfg) {
+ public Config(@NonNull Config cfg) {
this(cfg.mChannelCount, cfg);
}
@@ -1763,138 +1769,115 @@
}
//=== CHANNEL
public Channel getChannelByChannelIndex(int channelIndex) {
- return mConfig.getChannelByChannelIndex(channelIndex);
+ return queryEngineByChannelIndex(channelIndex);
}
public void setChannelTo(int channelIndex, Channel channel) {
- mConfig.setChannelTo(channelIndex, channel);
+ updateEngineChannelByChannelIndex(channelIndex, channel);
}
public void setAllChannelsTo(Channel channel) {
- mConfig.setAllChannelsTo(channel);
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setChannelTo(ch, channel);
+ }
}
//=== channel params
public float getInputGainByChannelIndex(int channelIndex) {
- //TODO: return info from engine instead of cached config
- return mConfig.getInputGainByChannelIndex(channelIndex);
+ return getTwoFloat(PARAM_INPUT_GAIN, channelIndex);
}
public void setInputGainbyChannel(int channelIndex, float inputGain) {
- mConfig.setInputGainByChannelIndex(channelIndex, inputGain);
- //TODO: communicate change to engine
+ setTwoFloat(PARAM_INPUT_GAIN, channelIndex, inputGain);
}
public void setInputGainAllChannelsTo(float inputGain) {
- mConfig.setInputGainAllChannelsTo(inputGain);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setInputGainbyChannel(ch, inputGain);
+ }
}
//=== PreEQ
public Eq getPreEqByChannelIndex(int channelIndex) {
- //TODO: return info from engine instead of cached config
- return mConfig.getPreEqByChannelIndex(channelIndex);
+ return queryEngineEqByChannelIndex(PARAM_PRE_EQ, channelIndex);
}
-
public void setPreEqByChannelIndex(int channelIndex, Eq preEq) {
- mConfig.setPreEqByChannelIndex(channelIndex, preEq);
- //TODO: communicate change to engine
+ updateEngineEqByChannelIndex(PARAM_PRE_EQ, channelIndex, preEq);
}
-
public void setPreEqAllChannelsTo(Eq preEq) {
- mConfig.setPreEqAllChannelsTo(preEq);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setPreEqByChannelIndex(ch, preEq);
+ }
}
-
public EqBand getPreEqBandByChannelIndex(int channelIndex, int band) {
- //TODO: return info from engine instead of cached config
- return mConfig.getPreEqBandByChannelIndex(channelIndex, band);
+ return queryEngineEqBandByChannelIndex(PARAM_PRE_EQ_BAND, channelIndex, band);
}
-
public void setPreEqBandByChannelIndex(int channelIndex, int band, EqBand preEqBand) {
- mConfig.setPreEqBandByChannelIndex(channelIndex, band, preEqBand);
- //TODO: communicate change to engine
+ updateEngineEqBandByChannelIndex(PARAM_PRE_EQ_BAND, channelIndex, band, preEqBand);
}
-
public void setPreEqBandAllChannelsTo(int band, EqBand preEqBand) {
- mConfig.setPreEqBandAllChannelsTo(band, preEqBand);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setPreEqBandByChannelIndex(ch, band, preEqBand);
+ }
}
//=== MBC
public Mbc getMbcByChannelIndex(int channelIndex) {
- //TODO: return info from engine instead of cached config
- return mConfig.getMbcByChannelIndex(channelIndex);
+ return queryEngineMbcByChannelIndex(channelIndex);
}
-
public void setMbcByChannelIndex(int channelIndex, Mbc mbc) {
- mConfig.setMbcByChannelIndex(channelIndex, mbc);
- //TODO: communicate change to engine
+ updateEngineMbcByChannelIndex(channelIndex, mbc);
}
-
public void setMbcAllChannelsTo(Mbc mbc) {
- mConfig.setMbcAllChannelsTo(mbc);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setMbcByChannelIndex(ch, mbc);
+ }
}
-
public MbcBand getMbcBandByChannelIndex(int channelIndex, int band) {
- //TODO: return info from engine instead of cached config
- return mConfig.getMbcBandByChannelIndex(channelIndex, band);
+ return queryEngineMbcBandByChannelIndex(channelIndex, band);
}
-
public void setMbcBandByChannelIndex(int channelIndex, int band, MbcBand mbcBand) {
- mConfig.setMbcBandByChannelIndex(channelIndex, band, mbcBand);
- //TODO: communicate change to engine
+ updateEngineMbcBandByChannelIndex(channelIndex, band, mbcBand);
}
-
public void setMbcBandAllChannelsTo(int band, MbcBand mbcBand) {
- mConfig.setMbcBandAllChannelsTo(band, mbcBand);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setMbcBandByChannelIndex(ch, band, mbcBand);
+ }
}
//== PostEq
public Eq getPostEqByChannelIndex(int channelIndex) {
- //TODO: return info from engine instead of cached config
- return mConfig.getPostEqByChannelIndex(channelIndex);
+ return queryEngineEqByChannelIndex(PARAM_POST_EQ, channelIndex);
}
-
public void setPostEqByChannelIndex(int channelIndex, Eq postEq) {
- mConfig.setPostEqByChannelIndex(channelIndex, postEq);
- //TODO: communicate change to engine
+ updateEngineEqByChannelIndex(PARAM_POST_EQ, channelIndex, postEq);
}
-
public void setPostEqAllChannelsTo(Eq postEq) {
- mConfig.setPostEqAllChannelsTo(postEq);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setPostEqByChannelIndex(ch, postEq);
+ }
}
-
public EqBand getPostEqBandByChannelIndex(int channelIndex, int band) {
- //TODO: return info from engine instead of cached config
- return mConfig.getPostEqBandByChannelIndex(channelIndex, band);
+ return queryEngineEqBandByChannelIndex(PARAM_POST_EQ_BAND, channelIndex, band);
}
-
public void setPostEqBandByChannelIndex(int channelIndex, int band, EqBand postEqBand) {
- mConfig.setPostEqBandByChannelIndex(channelIndex, band, postEqBand);
- //TODO: communicate change to engine
+ updateEngineEqBandByChannelIndex(PARAM_POST_EQ_BAND, channelIndex, band, postEqBand);
}
-
public void setPostEqBandAllChannelsTo(int band, EqBand postEqBand) {
- mConfig.setPostEqBandAllChannelsTo(band, postEqBand);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setPostEqBandByChannelIndex(ch, band, postEqBand);
+ }
}
//==== Limiter
public Limiter getLimiterByChannelIndex(int channelIndex) {
- //TODO: return info from engine instead of cached config
- return mConfig.getLimiterByChannelIndex(channelIndex);
+ return queryEngineLimiterByChannelIndex(channelIndex);
}
-
public void setLimiterByChannelIndex(int channelIndex, Limiter limiter) {
- mConfig.setLimiterByChannelIndex(channelIndex, limiter);
- //TODO: communicate change to engine
+ updateEngineLimiterByChannelIndex(channelIndex, limiter);
}
-
public void setLimiterAllChannelsTo(Limiter limiter) {
- mConfig.setLimiterAllChannelsTo(limiter);
- //TODO: communicate change to engine
+ for (int ch = 0; ch < mChannelCount; ch++) {
+ setLimiterByChannelIndex(ch, limiter);
+ }
}
/**
@@ -1905,165 +1888,327 @@
return getOneInt(PARAM_GET_CHANNEL_COUNT);
}
- private void setEngineArchitecture(int variant, boolean preEqInUse, int preEqBandCount,
- boolean mbcInUse, int mbcBandCount, boolean postEqInUse, int postEqBandCount,
- boolean limiterInUse) {
- int[] values = { variant, (preEqInUse ? 1 : 0), preEqBandCount,
- (mbcInUse ? 1 : 0), mbcBandCount, (postEqInUse ? 1 : 0), postEqBandCount,
+ //=== Engine calls
+ private void setEngineArchitecture(int variant, float preferredFrameDuration,
+ boolean preEqInUse, int preEqBandCount, boolean mbcInUse, int mbcBandCount,
+ boolean postEqInUse, int postEqBandCount, boolean limiterInUse) {
+
+ Number[] params = { PARAM_ENGINE_ARCHITECTURE };
+ Number[] values = { variant /* variant */,
+ preferredFrameDuration,
+ (preEqInUse ? 1 : 0),
+ preEqBandCount,
+ (mbcInUse ? 1 : 0),
+ mbcBandCount,
+ (postEqInUse ? 1 : 0),
+ postEqBandCount,
(limiterInUse ? 1 : 0)};
- //TODO: enable later setIntArray(PARAM_SET_ENGINE_ARCHITECTURE, values);
+ setNumberArray(params, values);
+ }
+
+ private void updateEngineEqBandByChannelIndex(int param, int channelIndex, int bandIndex,
+ @NonNull EqBand eqBand) {
+ Number[] params = {param,
+ channelIndex,
+ bandIndex};
+ Number[] values = {(eqBand.isEnabled() ? 1 : 0),
+ eqBand.getCutoffFrequency(),
+ eqBand.getGain()};
+ setNumberArray(params, values);
+ }
+ private Eq queryEngineEqByChannelIndex(int param, int channelIndex) {
+
+ Number[] params = {param == PARAM_PRE_EQ ? PARAM_PRE_EQ : PARAM_POST_EQ,
+ channelIndex};
+ Number[] values = {0 /*0 in use */,
+ 0 /*1 enabled*/,
+ 0 /*2 band count */};
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+ byteArrayToNumberArray(valueBytes, values);
+ int bandCount = values[2].intValue();
+ Eq eq = new Eq(values[0].intValue() > 0 /* in use */,
+ values[1].intValue() > 0 /* enabled */,
+ bandCount /*band count*/);
+ for (int b = 0; b < bandCount; b++) {
+ EqBand eqBand = queryEngineEqBandByChannelIndex(param == PARAM_PRE_EQ ?
+ PARAM_PRE_EQ_BAND : PARAM_POST_EQ_BAND, channelIndex, b);
+ eq.setBand(b, eqBand);
+ }
+ return eq;
+ }
+ private EqBand queryEngineEqBandByChannelIndex(int param, int channelIndex, int bandIndex) {
+ Number[] params = {param,
+ channelIndex,
+ bandIndex};
+ Number[] values = {0 /*0 enabled*/,
+ 0.0f /*1 cutoffFrequency */,
+ 0.0f /*2 gain */};
+
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+
+ byteArrayToNumberArray(valueBytes, values);
+
+ return new EqBand(values[0].intValue() > 0 /* enabled */,
+ values[1].floatValue() /* cutoffFrequency */,
+ values[2].floatValue() /* gain*/);
+ }
+ private void updateEngineEqByChannelIndex(int param, int channelIndex, @NonNull Eq eq) {
+ int bandCount = eq.getBandCount();
+ Number[] params = {param,
+ channelIndex};
+ Number[] values = { (eq.isInUse() ? 1 : 0),
+ (eq.isEnabled() ? 1 : 0),
+ bandCount};
+ setNumberArray(params, values);
+ for (int b = 0; b < bandCount; b++) {
+ EqBand eqBand = eq.getBand(b);
+ updateEngineEqBandByChannelIndex(param == PARAM_PRE_EQ ?
+ PARAM_PRE_EQ_BAND : PARAM_POST_EQ_BAND, channelIndex, b, eqBand);
+ }
+ }
+
+ private Mbc queryEngineMbcByChannelIndex(int channelIndex) {
+ Number[] params = {PARAM_MBC,
+ channelIndex};
+ Number[] values = {0 /*0 in use */,
+ 0 /*1 enabled*/,
+ 0 /*2 band count */};
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+ byteArrayToNumberArray(valueBytes, values);
+ int bandCount = values[2].intValue();
+ Mbc mbc = new Mbc(values[0].intValue() > 0 /* in use */,
+ values[1].intValue() > 0 /* enabled */,
+ bandCount /*band count*/);
+ for (int b = 0; b < bandCount; b++) {
+ MbcBand mbcBand = queryEngineMbcBandByChannelIndex(channelIndex, b);
+ mbc.setBand(b, mbcBand);
+ }
+ return mbc;
+ }
+ private MbcBand queryEngineMbcBandByChannelIndex(int channelIndex, int bandIndex) {
+ Number[] params = {PARAM_MBC_BAND,
+ channelIndex,
+ bandIndex};
+ Number[] values = {0 /*0 enabled */,
+ 0.0f /*1 cutoffFrequency */,
+ 0.0f /*2 AttackTime */,
+ 0.0f /*3 ReleaseTime */,
+ 0.0f /*4 Ratio */,
+ 0.0f /*5 Threshold */,
+ 0.0f /*6 KneeWidth */,
+ 0.0f /*7 NoiseGateThreshold */,
+ 0.0f /*8 ExpanderRatio */,
+ 0.0f /*9 PreGain */,
+ 0.0f /*10 PostGain*/};
+
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+
+ byteArrayToNumberArray(valueBytes, values);
+
+ return new MbcBand(values[0].intValue() > 0 /* enabled */,
+ values[1].floatValue() /* cutoffFrequency */,
+ values[2].floatValue()/*2 AttackTime */,
+ values[3].floatValue()/*3 ReleaseTime */,
+ values[4].floatValue()/*4 Ratio */,
+ values[5].floatValue()/*5 Threshold */,
+ values[6].floatValue()/*6 KneeWidth */,
+ values[7].floatValue()/*7 NoiseGateThreshold */,
+ values[8].floatValue()/*8 ExpanderRatio */,
+ values[9].floatValue()/*9 PreGain */,
+ values[10].floatValue()/*10 PostGain*/);
+ }
+ private void updateEngineMbcBandByChannelIndex(int channelIndex, int bandIndex,
+ @NonNull MbcBand mbcBand) {
+ Number[] params = { PARAM_MBC_BAND,
+ channelIndex,
+ bandIndex};
+ Number[] values = {(mbcBand.isEnabled() ? 1 : 0),
+ mbcBand.getCutoffFrequency(),
+ mbcBand.getAttackTime(),
+ mbcBand.getReleaseTime(),
+ mbcBand.getRatio(),
+ mbcBand.getThreshold(),
+ mbcBand.getKneeWidth(),
+ mbcBand.getNoiseGateThreshold(),
+ mbcBand.getExpanderRatio(),
+ mbcBand.getPreGain(),
+ mbcBand.getPostGain()};
+ setNumberArray(params, values);
+ }
+
+ private void updateEngineMbcByChannelIndex(int channelIndex, @NonNull Mbc mbc) {
+ int bandCount = mbc.getBandCount();
+ Number[] params = { PARAM_MBC,
+ channelIndex};
+ Number[] values = {(mbc.isInUse() ? 1 : 0),
+ (mbc.isEnabled() ? 1 : 0),
+ bandCount};
+ setNumberArray(params, values);
+ for (int b = 0; b < bandCount; b++) {
+ MbcBand mbcBand = mbc.getBand(b);
+ updateEngineMbcBandByChannelIndex(channelIndex, b, mbcBand);
+ }
+ }
+
+ private void updateEngineLimiterByChannelIndex(int channelIndex, @NonNull Limiter limiter) {
+ Number[] params = { PARAM_LIMITER,
+ channelIndex};
+ Number[] values = {(limiter.isInUse() ? 1 : 0),
+ (limiter.isEnabled() ? 1 : 0),
+ limiter.getLinkGroup(),
+ limiter.getAttackTime(),
+ limiter.getReleaseTime(),
+ limiter.getRatio(),
+ limiter.getThreshold(),
+ limiter.getPostGain()};
+ setNumberArray(params, values);
+ }
+
+ private Limiter queryEngineLimiterByChannelIndex(int channelIndex) {
+ Number[] params = {PARAM_LIMITER,
+ channelIndex};
+ Number[] values = {0 /*0 in use (int)*/,
+ 0 /*1 enabled (int)*/,
+ 0 /*2 link group (int)*/,
+ 0.0f /*3 attack time (float)*/,
+ 0.0f /*4 release time (float)*/,
+ 0.0f /*5 ratio (float)*/,
+ 0.0f /*6 threshold (float)*/,
+ 0.0f /*7 post gain(float)*/};
+
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values); //just interest in the byte size.
+ getParameter(paramBytes, valueBytes);
+ byteArrayToNumberArray(valueBytes, values);
+
+ return new Limiter(values[0].intValue() > 0 /*in use*/,
+ values[1].intValue() > 0 /*enabled*/,
+ values[2].intValue() /*linkGroup*/,
+ values[3].floatValue() /*attackTime*/,
+ values[4].floatValue() /*releaseTime*/,
+ values[5].floatValue() /*ratio*/,
+ values[6].floatValue() /*threshold*/,
+ values[7].floatValue() /*postGain*/);
+ }
+
+ private Channel queryEngineByChannelIndex(int channelIndex) {
+ float inputGain = getTwoFloat(PARAM_INPUT_GAIN, channelIndex);
+ Eq preEq = queryEngineEqByChannelIndex(PARAM_PRE_EQ, channelIndex);
+ Mbc mbc = queryEngineMbcByChannelIndex(channelIndex);
+ Eq postEq = queryEngineEqByChannelIndex(PARAM_POST_EQ, channelIndex);
+ Limiter limiter = queryEngineLimiterByChannelIndex(channelIndex);
+
+ Channel channel = new Channel(inputGain,
+ preEq.isInUse(), preEq.getBandCount(),
+ mbc.isInUse(), mbc.getBandCount(),
+ postEq.isInUse(), postEq.getBandCount(),
+ limiter.isInUse());
+ channel.setInputGain(inputGain);
+ channel.setPreEq(preEq);
+ channel.setMbc(mbc);
+ channel.setPostEq(postEq);
+ channel.setLimiter(limiter);
+ return channel;
+ }
+
+ private void updateEngineChannelByChannelIndex(int channelIndex, @NonNull Channel channel) {
+ //send things with as few calls as possible
+ setTwoFloat(PARAM_INPUT_GAIN, channelIndex, channel.getInputGain());
+ Eq preEq = channel.getPreEq();
+ updateEngineEqByChannelIndex(PARAM_PRE_EQ, channelIndex, preEq);
+ Mbc mbc = channel.getMbc();
+ updateEngineMbcByChannelIndex(channelIndex, mbc);
+ Eq postEq = channel.getPostEq();
+ updateEngineEqByChannelIndex(PARAM_POST_EQ, channelIndex, postEq);
+ Limiter limiter = channel.getLimiter();
+ updateEngineLimiterByChannelIndex(channelIndex, limiter);
}
//****** convenience methods:
//
- private int getOneInt(int paramGet) {
- int[] param = new int[1];
- int[] result = new int[1];
+ private int getOneInt(int param) {
+ final int[] params = { param };
+ final int[] result = new int[1];
- param[0] = paramGet;
- checkStatus(getParameter(param, result));
+ checkStatus(getParameter(params, result));
return result[0];
}
- private int getTwoInt(int paramGet, int paramA) {
- int[] param = new int[2];
- int[] result = new int[1];
+ private void setTwoFloat(int param, int paramA, float valueSet) {
+ final int[] params = { param, paramA };
+ final byte[] value;
- param[0] = paramGet;
- param[1] = paramA;
- checkStatus(getParameter(param, result));
- return result[0];
- }
-
- private int getThreeInt(int paramGet, int paramA, int paramB) {
- //have to use bytearrays, with more than 2 parameters.
- byte[] paramBytes = concatArrays(intToByteArray(paramGet),
- intToByteArray(paramA),
- intToByteArray(paramB));
- byte[] resultBytes = new byte[4]; //single int
-
- checkStatus(getParameter(paramBytes, resultBytes));
-
- return byteArrayToInt(resultBytes);
- }
-
- private void setOneInt(int paramSet, int valueSet) {
- int[] param = new int[1];
- int[] value = new int[1];
-
- param[0] = paramSet;
- value[0] = valueSet;
- checkStatus(setParameter(param, value));
- }
-
- private void setTwoInt(int paramSet, int paramA, int valueSet) {
- int[] param = new int[2];
- int[] value = new int[1];
-
- param[0] = paramSet;
- param[1] = paramA;
- value[0] = valueSet;
- checkStatus(setParameter(param, value));
- }
-
- private void setThreeInt(int paramSet, int paramA, int paramB, int valueSet) {
- //have to use bytearrays, with more than 2 parameters.
- byte[] paramBytes = concatArrays(intToByteArray(paramSet),
- intToByteArray(paramA),
- intToByteArray(paramB));
- byte[] valueBytes = intToByteArray(valueSet);
-
- checkStatus(setParameter(paramBytes, valueBytes));
- }
-
- private void setOneFloat(int paramSet, float valueSet) {
- int[] param = new int[1];
- byte[] value;
-
- param[0] = paramSet;
value = floatToByteArray(valueSet);
- checkStatus(setParameter(param, value));
+ checkStatus(setParameter(params, value));
}
- private void setTwoFloat(int paramSet, int paramA, float valueSet) {
- int[] param = new int[2];
- byte[] value;
-
- param[0] = paramSet;
- param[1] = paramA;
- value = floatToByteArray(valueSet);
- checkStatus(setParameter(param, value));
- }
-
- private void setThreeFloat(int paramSet, int paramA, int paramB, float valueSet) {
- //have to use bytearrays, with more than 2 parameters.
- byte[] paramBytes = concatArrays(intToByteArray(paramSet),
- intToByteArray(paramA),
- intToByteArray(paramB));
- byte[] valueBytes = floatToByteArray(valueSet);
-
- checkStatus(setParameter(paramBytes, valueBytes));
- }
- private byte[] intArrayToByteArray(int[] values) {
- int expectedBytes = values.length * 4;
+ private byte[] numberArrayToByteArray(Number[] values) {
+ int expectedBytes = 0;
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] instanceof Integer) {
+ expectedBytes += Integer.BYTES;
+ } else if (values[i] instanceof Float) {
+ expectedBytes += Float.BYTES;
+ } else {
+ throw new IllegalArgumentException("unknown value type " +
+ values[i].getClass());
+ }
+ }
ByteBuffer converter = ByteBuffer.allocate(expectedBytes);
converter.order(ByteOrder.nativeOrder());
- for (int k = 0; k < values.length; k++) {
- converter.putFloat(values[k]);
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] instanceof Integer) {
+ converter.putInt(values[i].intValue());
+ } else if (values[i] instanceof Float) {
+ converter.putFloat(values[i].floatValue());
+ }
}
return converter.array();
}
- private void setIntArray(int paramSet, int[] paramArray) {
- //have to use bytearrays, with more than 2 parameters.
- byte[] paramBytes = intToByteArray(paramSet);
- byte[] valueBytes = intArrayToByteArray(paramArray);
+ private void byteArrayToNumberArray(byte[] valuesIn, Number[] valuesOut) {
+ int inIndex = 0;
+ int outIndex = 0;
+ while (inIndex < valuesIn.length && outIndex < valuesOut.length) {
+ if (valuesOut[outIndex] instanceof Integer) {
+ valuesOut[outIndex++] = byteArrayToInt(valuesIn, inIndex);
+ inIndex += Integer.BYTES;
+ } else if (valuesOut[outIndex] instanceof Float) {
+ valuesOut[outIndex++] = byteArrayToFloat(valuesIn, inIndex);
+ inIndex += Float.BYTES;
+ } else {
+ throw new IllegalArgumentException("can't convert " +
+ valuesOut[outIndex].getClass());
+ }
+ }
+ if (outIndex != valuesOut.length) {
+ throw new IllegalArgumentException("only converted " + outIndex +
+ " values out of "+ valuesOut.length + " expected");
+ }
+ }
+
+ private void setNumberArray(Number[] params, Number[] values) {
+ byte[] paramBytes = numberArrayToByteArray(params);
+ byte[] valueBytes = numberArrayToByteArray(values);
checkStatus(setParameter(paramBytes, valueBytes));
}
- private float getOneFloat(int paramGet) {
- int[] param = new int[1];
- byte[] result = new byte[4];
+ private float getTwoFloat(int param, int paramA) {
+ final int[] params = { param, paramA };
+ final byte[] result = new byte[4];
- param[0] = paramGet;
- checkStatus(getParameter(param, result));
+ checkStatus(getParameter(params, result));
return byteArrayToFloat(result);
}
- private float getTwoFloat(int paramGet, int paramA) {
- int[] param = new int[2];
- byte[] result = new byte[4];
-
- param[0] = paramGet;
- param[1] = paramA;
- checkStatus(getParameter(param, result));
- return byteArrayToFloat(result);
- }
-
- private float getThreeFloat(int paramGet, int paramA, int paramB) {
- //have to use bytearrays, with more than 2 parameters.
- byte[] paramBytes = concatArrays(intToByteArray(paramGet),
- intToByteArray(paramA),
- intToByteArray(paramB));
- byte[] resultBytes = new byte[4]; //single float
-
- checkStatus(getParameter(paramBytes, resultBytes));
-
- return byteArrayToFloat(resultBytes);
- }
-
- private float[] getOneFloatArray(int paramGet, int expectedSize) {
- int[] param = new int[1];
- byte[] result = new byte[4 * expectedSize];
-
- param[0] = paramGet;
- checkStatus(getParameter(param, result));
- float[] returnArray = new float[expectedSize];
- for (int k = 0; k < expectedSize; k++) {
- returnArray[k] = byteArrayToFloat(result, 4 * k);
- }
- return returnArray;
- }
/**
* @hide
* The OnParameterChangeListener interface defines a method called by the DynamicsProcessing
diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl
index 3affee5c0..bd0019f 100644
--- a/media/java/android/media/session/ISession.aidl
+++ b/media/java/android/media/session/ISession.aidl
@@ -50,6 +50,4 @@
void setPlaybackToLocal(in AudioAttributes attributes);
void setPlaybackToRemote(int control, int max);
void setCurrentVolume(int currentVolume);
-
- String getCallingPackage();
}
diff --git a/media/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl
index 893bd3c..9634c7f 100644
--- a/media/java/android/media/session/ISessionCallback.aidl
+++ b/media/java/android/media/session/ISessionCallback.aidl
@@ -25,30 +25,33 @@
* @hide
*/
oneway interface ISessionCallback {
- void onCommand(String command, in Bundle args, in ResultReceiver cb);
- void onMediaButton(in Intent mediaButtonIntent, int sequenceNumber, in ResultReceiver cb);
+ void onCommand(String packageName, int pid, int uid, String command, in Bundle args,
+ in ResultReceiver cb);
+ void onMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent,
+ int sequenceNumber, in ResultReceiver cb);
// These callbacks are for the TransportPerformer
- void onPrepare();
- void onPrepareFromMediaId(String mediaId, in Bundle extras);
- void onPrepareFromSearch(String query, in Bundle extras);
- void onPrepareFromUri(in Uri uri, in Bundle extras);
- void onPlay();
- void onPlayFromMediaId(String mediaId, in Bundle extras);
- void onPlayFromSearch(String query, in Bundle extras);
- void onPlayFromUri(in Uri uri, in Bundle extras);
- void onSkipToTrack(long id);
- void onPause();
- void onStop();
- void onNext();
- void onPrevious();
- void onFastForward();
- void onRewind();
- void onSeekTo(long pos);
- void onRate(in Rating rating);
- void onCustomAction(String action, in Bundle args);
+ void onPrepare(String packageName, int pid, int uid);
+ void onPrepareFromMediaId(String packageName, int pid, int uid, String mediaId,
+ in Bundle extras);
+ void onPrepareFromSearch(String packageName, int pid, int uid, String query, in Bundle extras);
+ void onPrepareFromUri(String packageName, int pid, int uid, in Uri uri, in Bundle extras);
+ void onPlay(String packageName, int pid, int uid);
+ void onPlayFromMediaId(String packageName, int pid, int uid, String mediaId, in Bundle extras);
+ void onPlayFromSearch(String packageName, int pid, int uid, String query, in Bundle extras);
+ void onPlayFromUri(String packageName, int pid, int uid, in Uri uri, in Bundle extras);
+ void onSkipToTrack(String packageName, int pid, int uid, long id);
+ void onPause(String packageName, int pid, int uid);
+ void onStop(String packageName, int pid, int uid);
+ void onNext(String packageName, int pid, int uid);
+ void onPrevious(String packageName, int pid, int uid);
+ void onFastForward(String packageName, int pid, int uid);
+ void onRewind(String packageName, int pid, int uid);
+ void onSeekTo(String packageName, int pid, int uid, long pos);
+ void onRate(String packageName, int pid, int uid, in Rating rating);
+ void onCustomAction(String packageName, int pid, int uid, String action, in Bundle args);
// These callbacks are for volume handling
- void onAdjustVolume(int direction);
- void onSetVolumeTo(int value);
+ void onAdjustVolume(String packageName, int pid, int uid, int direction);
+ void onSetVolumeTo(String packageName, int pid, int uid, int value);
}
diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl
index 249bcdc..06f5863 100644
--- a/media/java/android/media/session/ISessionController.aidl
+++ b/media/java/android/media/session/ISessionController.aidl
@@ -36,8 +36,8 @@
* @hide
*/
interface ISessionController {
- void sendCommand(String command, in Bundle args, in ResultReceiver cb);
- boolean sendMediaButton(in KeyEvent mediaButton);
+ void sendCommand(String packageName, String command, in Bundle args, in ResultReceiver cb);
+ boolean sendMediaButton(String packageName, in KeyEvent mediaButton);
void registerCallbackListener(in ISessionControllerCallback cb);
void unregisterCallbackListener(in ISessionControllerCallback cb);
boolean isTransportControlEnabled();
@@ -46,28 +46,28 @@
PendingIntent getLaunchPendingIntent();
long getFlags();
ParcelableVolumeInfo getVolumeAttributes();
- void adjustVolume(int direction, int flags, String packageName);
- void setVolumeTo(int value, int flags, String packageName);
+ void adjustVolume(String packageName, int direction, int flags);
+ void setVolumeTo(String packageName, int value, int flags);
// These commands are for the TransportControls
- void prepare();
- void prepareFromMediaId(String mediaId, in Bundle extras);
- void prepareFromSearch(String string, in Bundle extras);
- void prepareFromUri(in Uri uri, in Bundle extras);
- void play();
- void playFromMediaId(String mediaId, in Bundle extras);
- void playFromSearch(String string, in Bundle extras);
- void playFromUri(in Uri uri, in Bundle extras);
- void skipToQueueItem(long id);
- void pause();
- void stop();
- void next();
- void previous();
- void fastForward();
- void rewind();
- void seekTo(long pos);
- void rate(in Rating rating);
- void sendCustomAction(String action, in Bundle args);
+ void prepare(String packageName);
+ void prepareFromMediaId(String packageName, String mediaId, in Bundle extras);
+ void prepareFromSearch(String packageName, String string, in Bundle extras);
+ void prepareFromUri(String packageName, in Uri uri, in Bundle extras);
+ void play(String packageName);
+ void playFromMediaId(String packageName, String mediaId, in Bundle extras);
+ void playFromSearch(String packageName, String string, in Bundle extras);
+ void playFromUri(String packageName, in Uri uri, in Bundle extras);
+ void skipToQueueItem(String packageName, long id);
+ void pause(String packageName);
+ void stop(String packageName);
+ void next(String packageName);
+ void previous(String packageName);
+ void fastForward(String packageName);
+ void rewind(String packageName);
+ void seekTo(String packageName, long pos);
+ void rate(String packageName, in Rating rating);
+ void sendCustomAction(String packageName, String action, in Bundle args);
MediaMetadata getMetadata();
PlaybackState getPlaybackState();
ParceledListSlice getQueue();
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 622900f..f16804c 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -133,7 +133,7 @@
return false;
}
try {
- return mSessionBinder.sendMediaButton(keyEvent);
+ return mSessionBinder.sendMediaButton(mContext.getPackageName(), keyEvent);
} catch (RemoteException e) {
// System is dead. =(
}
@@ -301,7 +301,7 @@
*/
public void setVolumeTo(int value, int flags) {
try {
- mSessionBinder.setVolumeTo(value, flags, mContext.getPackageName());
+ mSessionBinder.setVolumeTo(mContext.getPackageName(), value, flags);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling setVolumeTo.", e);
}
@@ -322,7 +322,7 @@
*/
public void adjustVolume(int direction, int flags) {
try {
- mSessionBinder.adjustVolume(direction, flags, mContext.getPackageName());
+ mSessionBinder.adjustVolume(mContext.getPackageName(), direction, flags);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling adjustVolumeBy.", e);
}
@@ -388,7 +388,7 @@
throw new IllegalArgumentException("command cannot be null or empty");
}
try {
- mSessionBinder.sendCommand(command, args, cb);
+ mSessionBinder.sendCommand(mContext.getPackageName(), command, args, cb);
} catch (RemoteException e) {
Log.d(TAG, "Dead object in sendCommand.", e);
}
@@ -600,7 +600,7 @@
*/
public void prepare() {
try {
- mSessionBinder.prepare();
+ mSessionBinder.prepare(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare.", e);
}
@@ -624,7 +624,7 @@
"You must specify a non-empty String for prepareFromMediaId.");
}
try {
- mSessionBinder.prepareFromMediaId(mediaId, extras);
+ mSessionBinder.prepareFromMediaId(mContext.getPackageName(), mediaId, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + mediaId + ").", e);
}
@@ -650,7 +650,7 @@
query = "";
}
try {
- mSessionBinder.prepareFromSearch(query, extras);
+ mSessionBinder.prepareFromSearch(mContext.getPackageName(), query, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + query + ").", e);
}
@@ -674,7 +674,7 @@
"You must specify a non-empty Uri for prepareFromUri.");
}
try {
- mSessionBinder.prepareFromUri(uri, extras);
+ mSessionBinder.prepareFromUri(mContext.getPackageName(), uri, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling prepare(" + uri + ").", e);
}
@@ -685,7 +685,7 @@
*/
public void play() {
try {
- mSessionBinder.play();
+ mSessionBinder.play(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play.", e);
}
@@ -704,7 +704,7 @@
"You must specify a non-empty String for playFromMediaId.");
}
try {
- mSessionBinder.playFromMediaId(mediaId, extras);
+ mSessionBinder.playFromMediaId(mContext.getPackageName(), mediaId, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + mediaId + ").", e);
}
@@ -726,7 +726,7 @@
query = "";
}
try {
- mSessionBinder.playFromSearch(query, extras);
+ mSessionBinder.playFromSearch(mContext.getPackageName(), query, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + query + ").", e);
}
@@ -745,7 +745,7 @@
"You must specify a non-empty Uri for playFromUri.");
}
try {
- mSessionBinder.playFromUri(uri, extras);
+ mSessionBinder.playFromUri(mContext.getPackageName(), uri, extras);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling play(" + uri + ").", e);
}
@@ -757,7 +757,7 @@
*/
public void skipToQueueItem(long id) {
try {
- mSessionBinder.skipToQueueItem(id);
+ mSessionBinder.skipToQueueItem(mContext.getPackageName(), id);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling skipToItem(" + id + ").", e);
}
@@ -769,7 +769,7 @@
*/
public void pause() {
try {
- mSessionBinder.pause();
+ mSessionBinder.pause(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling pause.", e);
}
@@ -781,7 +781,7 @@
*/
public void stop() {
try {
- mSessionBinder.stop();
+ mSessionBinder.stop(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling stop.", e);
}
@@ -794,7 +794,7 @@
*/
public void seekTo(long pos) {
try {
- mSessionBinder.seekTo(pos);
+ mSessionBinder.seekTo(mContext.getPackageName(), pos);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling seekTo.", e);
}
@@ -806,7 +806,7 @@
*/
public void fastForward() {
try {
- mSessionBinder.fastForward();
+ mSessionBinder.fastForward(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling fastForward.", e);
}
@@ -817,7 +817,7 @@
*/
public void skipToNext() {
try {
- mSessionBinder.next();
+ mSessionBinder.next(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling next.", e);
}
@@ -829,7 +829,7 @@
*/
public void rewind() {
try {
- mSessionBinder.rewind();
+ mSessionBinder.rewind(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling rewind.", e);
}
@@ -840,7 +840,7 @@
*/
public void skipToPrevious() {
try {
- mSessionBinder.previous();
+ mSessionBinder.previous(mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling previous.", e);
}
@@ -855,7 +855,7 @@
*/
public void setRating(Rating rating) {
try {
- mSessionBinder.rate(rating);
+ mSessionBinder.rate(mContext.getPackageName(), rating);
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling rate.", e);
}
@@ -890,7 +890,7 @@
throw new IllegalArgumentException("CustomAction cannot be null.");
}
try {
- mSessionBinder.sendCustomAction(action, args);
+ mSessionBinder.sendCustomAction(mContext.getPackageName(), action, args);
} catch (RemoteException e) {
Log.d(TAG, "Dead object in sendCustomAction.", e);
}
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index b8d01c4..5e8b8ca 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -39,6 +39,7 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.UserHandle;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
import android.service.media.MediaBrowserService;
import android.text.TextUtils;
import android.util.Log;
@@ -103,6 +104,16 @@
*/
public static final int FLAG_EXCLUSIVE_GLOBAL_PRIORITY = 1 << 16;
+ /**
+ * @hide
+ */
+ public static final int INVALID_UID = -1;
+
+ /**
+ * @hide
+ */
+ public static final int INVALID_PID = -1;
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, value = {
@@ -501,6 +512,22 @@
}
/**
+ * Gets the controller information who sent the current request.
+ * <p>
+ * Note: This is only valid while in a request callback, such as {@link Callback#onPlay}.
+ *
+ * @throws IllegalStateException If this method is called outside of {@link Callback} methods.
+ * @see MediaSessionManager#isTrustedForMediaControl(RemoteUserInfo)
+ */
+ public final @NonNull RemoteUserInfo getCurrentControllerInfo() {
+ if (mCallback == null || mCallback.mCurrentControllerInfo == null) {
+ throw new IllegalStateException(
+ "This should be called inside of MediaSession.Callback methods");
+ }
+ return mCallback.mCurrentControllerInfo;
+ }
+
+ /**
* Notify the system that the remote volume changed.
*
* @param provider The provider that is handling volume changes.
@@ -528,16 +555,14 @@
* @hide
*/
public String getCallingPackage() {
- try {
- return mBinder.getCallingPackage();
- } catch (RemoteException e) {
- Log.wtf(TAG, "Dead object in getCallingPackage.", e);
+ if (mCallback != null) {
+ return mCallback.mCurrentControllerInfo.getPackageName();
}
return null;
}
- private void dispatchPrepare() {
- postToCallback(CallbackMessageHandler.MSG_PREPARE);
+ private void dispatchPrepare(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_PREPARE, null, extras);
}
private void dispatchPrepareFromMediaId(String mediaId, Bundle extras) {
@@ -552,8 +577,8 @@
postToCallback(CallbackMessageHandler.MSG_PREPARE_URI, uri, extras);
}
- private void dispatchPlay() {
- postToCallback(CallbackMessageHandler.MSG_PLAY);
+ private void dispatchPlay(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_PLAY, null, extras);
}
private void dispatchPlayFromMediaId(String mediaId, Bundle extras) {
@@ -568,69 +593,61 @@
postToCallback(CallbackMessageHandler.MSG_PLAY_URI, uri, extras);
}
- private void dispatchSkipToItem(long id) {
- postToCallback(CallbackMessageHandler.MSG_SKIP_TO_ITEM, id);
+ private void dispatchSkipToItem(long id, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_SKIP_TO_ITEM, id, extras);
}
- private void dispatchPause() {
- postToCallback(CallbackMessageHandler.MSG_PAUSE);
+ private void dispatchPause(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_PAUSE, null, extras);
}
- private void dispatchStop() {
- postToCallback(CallbackMessageHandler.MSG_STOP);
+ private void dispatchStop(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_STOP, null, extras);
}
- private void dispatchNext() {
- postToCallback(CallbackMessageHandler.MSG_NEXT);
+ private void dispatchNext(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_NEXT, null, extras);
}
- private void dispatchPrevious() {
- postToCallback(CallbackMessageHandler.MSG_PREVIOUS);
+ private void dispatchPrevious(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_PREVIOUS, null, extras);
}
- private void dispatchFastForward() {
- postToCallback(CallbackMessageHandler.MSG_FAST_FORWARD);
+ private void dispatchFastForward(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_FAST_FORWARD, null, extras);
}
- private void dispatchRewind() {
- postToCallback(CallbackMessageHandler.MSG_REWIND);
+ private void dispatchRewind(Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_REWIND, null, extras);
}
- private void dispatchSeekTo(long pos) {
- postToCallback(CallbackMessageHandler.MSG_SEEK_TO, pos);
+ private void dispatchSeekTo(long pos, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_SEEK_TO, pos, extras);
}
- private void dispatchRate(Rating rating) {
- postToCallback(CallbackMessageHandler.MSG_RATE, rating);
+ private void dispatchRate(Rating rating, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_RATE, rating, extras);
}
- private void dispatchCustomAction(String action, Bundle args) {
- postToCallback(CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args);
+ private void dispatchCustomAction(String action, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_CUSTOM_ACTION, action, extras);
}
- private void dispatchMediaButton(Intent mediaButtonIntent) {
- postToCallback(CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent);
+ private void dispatchMediaButton(Intent mediaButtonIntent, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent, extras);
}
- private void dispatchAdjustVolume(int direction) {
- postToCallback(CallbackMessageHandler.MSG_ADJUST_VOLUME, direction);
+ private void dispatchAdjustVolume(int direction, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_ADJUST_VOLUME, direction, extras);
}
- private void dispatchSetVolumeTo(int volume) {
- postToCallback(CallbackMessageHandler.MSG_SET_VOLUME, volume);
+ private void dispatchSetVolumeTo(int volume, Bundle extras) {
+ postToCallback(CallbackMessageHandler.MSG_SET_VOLUME, volume, extras);
}
- private void postToCallback(int what) {
- postToCallback(what, null);
- }
-
- private void postCommand(String command, Bundle args, ResultReceiver resultCb) {
+ private void postCommand(String command, Bundle args, ResultReceiver resultCb, Bundle extras) {
Command cmd = new Command(command, args, resultCb);
- postToCallback(CallbackMessageHandler.MSG_COMMAND, cmd);
- }
-
- private void postToCallback(int what, Object obj) {
- postToCallback(what, obj, null);
+ postToCallback(CallbackMessageHandler.MSG_COMMAND, cmd, extras);
}
private void postToCallback(int what, Object obj, Bundle extras) {
@@ -734,9 +751,13 @@
* and the system. A callback may be set using {@link #setCallback}.
*/
public abstract static class Callback {
+
private MediaSession mSession;
private CallbackMessageHandler mHandler;
private boolean mMediaPlayPauseKeyPending;
+ private String mCallingPackage;
+ private int mCallingPid;
+ private int mCallingUid;
public Callback() {
}
@@ -1023,24 +1044,26 @@
private WeakReference<MediaSession> mMediaSession;
public CallbackStub(MediaSession session) {
- mMediaSession = new WeakReference<MediaSession>(session);
+ mMediaSession = new WeakReference<>(session);
}
@Override
- public void onCommand(String command, Bundle args, ResultReceiver cb) {
+ public void onCommand(String packageName, int pid, int uid, String command, Bundle args,
+ ResultReceiver cb) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.postCommand(command, args, cb);
+ session.postCommand(command, args, cb, createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onMediaButton(Intent mediaButtonIntent, int sequenceNumber,
- ResultReceiver cb) {
+ public void onMediaButton(String packageName, int pid, int uid, Intent mediaButtonIntent,
+ int sequenceNumber, ResultReceiver cb) {
MediaSession session = mMediaSession.get();
try {
if (session != null) {
- session.dispatchMediaButton(mediaButtonIntent);
+ session.dispatchMediaButton(
+ mediaButtonIntent, createExtraBundle(packageName, pid, uid));
}
} finally {
if (cb != null) {
@@ -1050,165 +1073,191 @@
}
@Override
- public void onPrepare() {
+ public void onPrepare(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPrepare();
+ session.dispatchPrepare(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onPrepareFromMediaId(String mediaId, Bundle extras) {
+ public void onPrepareFromMediaId(String packageName, int pid, int uid, String mediaId,
+ Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPrepareFromMediaId(mediaId, extras);
+ session.dispatchPrepareFromMediaId(
+ mediaId, createExtraBundle(packageName, pid, uid, extras));
}
}
@Override
- public void onPrepareFromSearch(String query, Bundle extras) {
+ public void onPrepareFromSearch(String packageName, int pid, int uid, String query,
+ Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPrepareFromSearch(query, extras);
+ session.dispatchPrepareFromSearch(
+ query, createExtraBundle(packageName, pid, uid, extras));
}
}
@Override
- public void onPrepareFromUri(Uri uri, Bundle extras) {
+ public void onPrepareFromUri(String packageName, int pid, int uid, Uri uri, Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPrepareFromUri(uri, extras);
+ session.dispatchPrepareFromUri(uri,
+ createExtraBundle(packageName, pid, uid, extras));
}
}
@Override
- public void onPlay() {
+ public void onPlay(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPlay();
+ session.dispatchPlay(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onPlayFromMediaId(String mediaId, Bundle extras) {
+ public void onPlayFromMediaId(String packageName, int pid, int uid, String mediaId,
+ Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPlayFromMediaId(mediaId, extras);
+ session.dispatchPlayFromMediaId(
+ mediaId, createExtraBundle(packageName, pid, uid, extras));
}
}
@Override
- public void onPlayFromSearch(String query, Bundle extras) {
+ public void onPlayFromSearch(String packageName, int pid, int uid, String query,
+ Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPlayFromSearch(query, extras);
+ session.dispatchPlayFromSearch(query, createExtraBundle(packageName, pid, uid,
+ extras));
}
}
@Override
- public void onPlayFromUri(Uri uri, Bundle extras) {
+ public void onPlayFromUri(String packageName, int pid, int uid, Uri uri, Bundle extras) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPlayFromUri(uri, extras);
+ session.dispatchPlayFromUri(uri, createExtraBundle(packageName, pid, uid, extras));
}
}
@Override
- public void onSkipToTrack(long id) {
+ public void onSkipToTrack(String packageName, int pid, int uid, long id) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchSkipToItem(id);
+ session.dispatchSkipToItem(id, createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onPause() {
+ public void onPause(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPause();
+ session.dispatchPause(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onStop() {
+ public void onStop(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchStop();
+ session.dispatchStop(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onNext() {
+ public void onNext(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchNext();
+ session.dispatchNext(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onPrevious() {
+ public void onPrevious(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchPrevious();
+ session.dispatchPrevious(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onFastForward() {
+ public void onFastForward(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchFastForward();
+ session.dispatchFastForward(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onRewind() {
+ public void onRewind(String packageName, int pid, int uid) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchRewind();
+ session.dispatchRewind(createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onSeekTo(long pos) {
+ public void onSeekTo(String packageName, int pid, int uid, long pos) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchSeekTo(pos);
+ session.dispatchSeekTo(pos, createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onRate(Rating rating) {
+ public void onRate(String packageName, int pid, int uid, Rating rating) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchRate(rating);
+ session.dispatchRate(rating, createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onCustomAction(String action, Bundle args) {
+ public void onCustomAction(String packageName, int pid, int uid, String action,
+ Bundle args) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchCustomAction(action, args);
+ session.dispatchCustomAction(
+ action, createExtraBundle(packageName, pid, uid, args));
}
}
@Override
- public void onAdjustVolume(int direction) {
+ public void onAdjustVolume(String packageName, int pid, int uid, int direction) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchAdjustVolume(direction);
+ session.dispatchAdjustVolume(direction, createExtraBundle(packageName, pid, uid));
}
}
@Override
- public void onSetVolumeTo(int value) {
+ public void onSetVolumeTo(String packageName, int pid, int uid, int value) {
MediaSession session = mMediaSession.get();
if (session != null) {
- session.dispatchSetVolumeTo(value);
+ session.dispatchSetVolumeTo(value, createExtraBundle(packageName, pid, uid));
}
}
+ private Bundle createExtraBundle(String packageName, int pid, int uid) {
+ return createExtraBundle(packageName, pid, uid, null);
+ }
+
+ private Bundle createExtraBundle(String packageName, int pid, int uid,
+ Bundle originalBundle) {
+ Bundle bundle = new Bundle();
+ bundle.putString(CallbackMessageHandler.EXTRA_KEY_CALLING_PACKAGE, packageName);
+ bundle.putInt(CallbackMessageHandler.EXTRA_KEY_CALLING_PID, pid);
+ bundle.putInt(CallbackMessageHandler.EXTRA_KEY_CALLING_UID, uid);
+ if (originalBundle != null) {
+ bundle.putBundle(CallbackMessageHandler.EXTRA_KEY_ORIGINAL_BUNDLE, originalBundle);
+ }
+ return bundle;
+ }
}
/**
@@ -1272,7 +1321,8 @@
return 0;
}
- public static final Creator<MediaSession.QueueItem> CREATOR = new Creator<MediaSession.QueueItem>() {
+ public static final Creator<MediaSession.QueueItem> CREATOR =
+ new Creator<MediaSession.QueueItem>() {
@Override
public MediaSession.QueueItem createFromParcel(Parcel p) {
@@ -1329,6 +1379,15 @@
private class CallbackMessageHandler extends Handler {
+ private static final String EXTRA_KEY_CALLING_PACKAGE =
+ "android.media.session.extra.CALLING_PACKAGE";
+ private static final String EXTRA_KEY_CALLING_PID =
+ "android.media.session.extra.CALLING_PID";
+ private static final String EXTRA_KEY_CALLING_UID =
+ "android.media.session.extra.CALLING_UID";
+ private static final String EXTRA_KEY_ORIGINAL_BUNDLE =
+ "android.media.session.extra.ORIGINAL_BUNDLE";
+
private static final int MSG_COMMAND = 1;
private static final int MSG_MEDIA_BUTTON = 2;
private static final int MSG_PREPARE = 3;
@@ -1355,6 +1414,8 @@
private MediaSession.Callback mCallback;
+ private RemoteUserInfo mCurrentControllerInfo;
+
public CallbackMessageHandler(Looper looper, MediaSession.Callback callback) {
super(looper, null, true);
mCallback = callback;
@@ -1367,21 +1428,17 @@
msg.sendToTarget();
}
- public void post(int what, Object obj) {
- obtainMessage(what, obj).sendToTarget();
- }
-
- public void post(int what) {
- post(what, null);
- }
-
- public void post(int what, Object obj, int arg1) {
- obtainMessage(what, arg1, 0, obj).sendToTarget();
- }
-
@Override
public void handleMessage(Message msg) {
VolumeProvider vp;
+ Bundle bundle = msg.getData();
+ Bundle originalBundle = bundle.getBundle(EXTRA_KEY_ORIGINAL_BUNDLE);
+
+ mCurrentControllerInfo = new RemoteUserInfo(
+ bundle.getString(EXTRA_KEY_CALLING_PACKAGE),
+ bundle.getInt(EXTRA_KEY_CALLING_PID, INVALID_PID),
+ bundle.getInt(EXTRA_KEY_CALLING_UID, INVALID_UID));
+
switch (msg.what) {
case MSG_COMMAND:
Command cmd = (Command) msg.obj;
@@ -1394,25 +1451,25 @@
mCallback.onPrepare();
break;
case MSG_PREPARE_MEDIA_ID:
- mCallback.onPrepareFromMediaId((String) msg.obj, msg.getData());
+ mCallback.onPrepareFromMediaId((String) msg.obj, originalBundle);
break;
case MSG_PREPARE_SEARCH:
- mCallback.onPrepareFromSearch((String) msg.obj, msg.getData());
+ mCallback.onPrepareFromSearch((String) msg.obj, originalBundle);
break;
case MSG_PREPARE_URI:
- mCallback.onPrepareFromUri((Uri) msg.obj, msg.getData());
+ mCallback.onPrepareFromUri((Uri) msg.obj, originalBundle);
break;
case MSG_PLAY:
mCallback.onPlay();
break;
case MSG_PLAY_MEDIA_ID:
- mCallback.onPlayFromMediaId((String) msg.obj, msg.getData());
+ mCallback.onPlayFromMediaId((String) msg.obj, originalBundle);
break;
case MSG_PLAY_SEARCH:
- mCallback.onPlayFromSearch((String) msg.obj, msg.getData());
+ mCallback.onPlayFromSearch((String) msg.obj, originalBundle);
break;
case MSG_PLAY_URI:
- mCallback.onPlayFromUri((Uri) msg.obj, msg.getData());
+ mCallback.onPlayFromUri((Uri) msg.obj, originalBundle);
break;
case MSG_SKIP_TO_ITEM:
mCallback.onSkipToQueueItem((Long) msg.obj);
@@ -1442,7 +1499,7 @@
mCallback.onSetRating((Rating) msg.obj);
break;
case MSG_CUSTOM_ACTION:
- mCallback.onCustomAction((String) msg.obj, msg.getData());
+ mCallback.onCustomAction((String) msg.obj, originalBundle);
break;
case MSG_ADJUST_VOLUME:
synchronized (mLock) {
@@ -1464,6 +1521,7 @@
mCallback.handleMediaPlayPauseKeySingleTapIfPending();
break;
}
+ mCurrentControllerInfo = null;
}
}
}
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index b7f4998..519af1b 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -37,7 +37,9 @@
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.service.media.MediaBrowserService;
import android.service.notification.NotificationListenerService;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.view.KeyEvent;
@@ -340,19 +342,20 @@
}
/**
- * Returns whether the api
+ * Returns whether the app is trusted.
+ * <p>
+ * An app is trusted if the app holds the android.Manifest.permission.MEDIA_CONTENT_CONTROL
+ * permission or has an enabled notification listener.
*
- * @param packageName packageName
- * @param pid pid of the app
- * @param uid uid of the app
- * @hide
+ * @param userInfo The remote user info
*/
- public boolean isTrusted(@NonNull String packageName, int pid, int uid) {
- if (packageName == null) {
+ public boolean isTrustedForMediaControl(RemoteUserInfo userInfo) {
+ if (userInfo.getPackageName() == null) {
return false;
}
try {
- return mService.isTrusted(packageName, pid, uid);
+ return mService.isTrusted(
+ userInfo.getPackageName(), userInfo.getPid(), userInfo.getUid());
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
}
@@ -407,7 +410,7 @@
List<Bundle> bundles = mService.getSessionTokens(
/* activeSessionOnly */ true, /* sessionServiceOnly */ false,
mContext.getPackageName());
- return toTokenList(mContext, bundles);
+ return toTokenList(bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
return Collections.emptyList();
@@ -430,7 +433,7 @@
List<Bundle> bundles = mService.getSessionTokens(
/* activeSessionOnly */ false, /* sessionServiceOnly */ true,
mContext.getPackageName());
- return toTokenList(mContext, bundles);
+ return toTokenList(bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
return Collections.emptyList();
@@ -455,7 +458,7 @@
List<Bundle> bundles = mService.getSessionTokens(
/* activeSessionOnly */ false, /* sessionServiceOnly */ false,
mContext.getPackageName());
- return toTokenList(mContext, bundles);
+ return toTokenList(bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
return Collections.emptyList();
@@ -540,11 +543,11 @@
}
}
- private static List<SessionToken2> toTokenList(Context context, List<Bundle> bundles) {
+ private static List<SessionToken2> toTokenList(List<Bundle> bundles) {
List<SessionToken2> tokens = new ArrayList<>();
if (bundles != null) {
for (int i = 0; i < bundles.size(); i++) {
- SessionToken2 token = SessionToken2.fromBundle(context, bundles.get(i));
+ SessionToken2 token = SessionToken2.fromBundle(bundles.get(i));
if (token != null) {
tokens.add(token);
}
@@ -763,6 +766,56 @@
public abstract void onAddressedPlayerChanged(ComponentName mediaButtonReceiver);
}
+ /**
+ * Information of a remote user of {@link MediaSession} or {@link MediaBrowserService}.
+ * This can be used to decide whether the remote user is trusted app.
+ *
+ * @see #isTrustedForMediaControl(RemoteUserInfo)
+ */
+ public static final class RemoteUserInfo {
+ private String mPackageName;
+ private int mPid;
+ private int mUid;
+
+ public RemoteUserInfo(String packageName, int pid, int uid) {
+ mPackageName = packageName;
+ mPid = pid;
+ mUid = uid;
+ }
+
+ /**
+ * @return package name of the controller
+ */
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * @return pid of the controller
+ */
+ public int getPid() {
+ return mPid;
+ }
+
+ /**
+ * @return uid of the controller
+ */
+ public int getUid() {
+ return mUid;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof RemoteUserInfo)) {
+ return false;
+ }
+ RemoteUserInfo otherUserInfo = (RemoteUserInfo) obj;
+ return TextUtils.equals(mPackageName, otherUserInfo.mPackageName)
+ && mPid == otherUserInfo.mPid
+ && mUid == otherUserInfo.mUid;
+ }
+ }
+
private static final class SessionsChangedWrapper {
private Context mContext;
private OnActiveSessionsChangedListener mListener;
@@ -829,7 +882,7 @@
final Context context = mContext;
final OnSessionTokensChangedListener listener = mListener;
if (context != null && listener != null) {
- listener.onSessionTokensChanged(toTokenList(context, bundles));
+ listener.onSessionTokensChanged(toTokenList(bundles));
}
});
}
diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java
index 213897d..7234f7b 100644
--- a/media/java/android/media/update/MediaController2Provider.java
+++ b/media/java/android/media/update/MediaController2Provider.java
@@ -21,7 +21,7 @@
import android.media.MediaController2.PlaybackInfo;
import android.media.MediaItem2;
import android.media.MediaMetadata2;
-import android.media.MediaSession2.Command;
+import android.media.SessionCommand2;
import android.media.Rating2;
import android.media.SessionToken2;
import android.net.Uri;
@@ -52,9 +52,11 @@
void playFromSearch_impl(String query, Bundle extras);
void playFromUri_impl(Uri uri, Bundle extras);
void playFromMediaId_impl(String mediaId, Bundle extras);
+ void fastForward_impl();
+ void rewind_impl();
void setRating_impl(String mediaId, Rating2 rating);
- void sendCustomCommand_impl(Command command, Bundle args, ResultReceiver cb);
+ void sendCustomCommand_impl(SessionCommand2 command, Bundle args, ResultReceiver cb);
List<MediaItem2> getPlaylist_impl();
void setPlaylist_impl(List<MediaItem2> list, MediaMetadata2 metadata);
MediaMetadata2 getPlaylistMetadata_impl();
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index 5a1db3e..4751348 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -23,10 +23,10 @@
import android.media.MediaPlayerBase;
import android.media.MediaPlaylistAgent;
import android.media.MediaSession2;
-import android.media.MediaSession2.Command;
+import android.media.SessionCommand2;
import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.CommandButton.Builder;
-import android.media.MediaSession2.CommandGroup;
+import android.media.SessionCommandGroup2;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.OnDataSourceMissingHelper;
import android.media.MediaSession2.SessionCallback;
@@ -55,10 +55,10 @@
List<ControllerInfo> getConnectedControllers_impl();
void setCustomLayout_impl(ControllerInfo controller, List<CommandButton> layout);
void setAudioFocusRequest_impl(AudioFocusRequest afr);
- void setAllowedCommands_impl(ControllerInfo controller, CommandGroup commands);
- void sendCustomCommand_impl(ControllerInfo controller, Command command, Bundle args,
+ void setAllowedCommands_impl(ControllerInfo controller, SessionCommandGroup2 commands);
+ void sendCustomCommand_impl(ControllerInfo controller, SessionCommand2 command, Bundle args,
ResultReceiver receiver);
- void sendCustomCommand_impl(Command command, Bundle args);
+ void sendCustomCommand_impl(SessionCommand2 command, Bundle args);
void addPlaylistItem_impl(int index, MediaItem2 item);
void removePlaylistItem_impl(MediaItem2 item);
void replacePlaylistItem_impl(int index, MediaItem2 item);
@@ -72,6 +72,7 @@
void setOnDataSourceMissingHelper_impl(OnDataSourceMissingHelper helper);
void clearOnDataSourceMissingHelper_impl();
+ // TODO(jaewan): Rename and move provider
interface CommandProvider {
int getCommandCode_impl();
String getCustomCommand_impl();
@@ -82,25 +83,26 @@
int hashCode_impl();
}
+ // TODO(jaewan): Rename and move provider
interface CommandGroupProvider {
- void addCommand_impl(Command command);
+ void addCommand_impl(SessionCommand2 command);
void addAllPredefinedCommands_impl();
- void removeCommand_impl(Command command);
- boolean hasCommand_impl(Command command);
+ void removeCommand_impl(SessionCommand2 command);
+ boolean hasCommand_impl(SessionCommand2 command);
boolean hasCommand_impl(int code);
- Set<Command> getCommands_impl();
+ Set<SessionCommand2> getCommands_impl();
Bundle toBundle_impl();
}
interface CommandButtonProvider {
- Command getCommand_impl();
+ SessionCommand2 getCommand_impl();
int getIconResId_impl();
String getDisplayName_impl();
Bundle getExtras_impl();
boolean isEnabled_impl();
interface BuilderProvider {
- Builder setCommand_impl(Command command);
+ Builder setCommand_impl(SessionCommand2 command);
Builder setIconResId_impl(int resId);
Builder setDisplayName_impl(String displayName);
Builder setEnabled_impl(boolean enabled);
diff --git a/media/java/android/media/update/StaticProvider.java b/media/java/android/media/update/StaticProvider.java
index 1c0e255..8687b80 100644
--- a/media/java/android/media/update/StaticProvider.java
+++ b/media/java/android/media/update/StaticProvider.java
@@ -35,6 +35,8 @@
import android.media.MediaSessionService2;
import android.media.MediaSessionService2.MediaNotification;
import android.media.Rating2;
+import android.media.SessionCommand2;
+import android.media.SessionCommandGroup2;
import android.media.SessionToken2;
import android.media.VolumeProvider2;
import android.media.update.MediaLibraryService2Provider.LibraryRootProvider;
@@ -67,16 +69,16 @@
ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes);
- CommandProvider createMediaSession2Command(MediaSession2.Command instance,
+ CommandProvider createMediaSession2Command(SessionCommand2 instance,
int commandCode, String action, Bundle extra);
- MediaSession2.Command fromBundle_MediaSession2Command(Context context, Bundle bundle);
- CommandGroupProvider createMediaSession2CommandGroup(Context context,
- MediaSession2.CommandGroup instance, MediaSession2.CommandGroup others);
- MediaSession2.CommandGroup fromBundle_MediaSession2CommandGroup(Context context, Bundle bundle);
+ SessionCommand2 fromBundle_MediaSession2Command(Bundle bundle);
+ CommandGroupProvider createMediaSession2CommandGroup(SessionCommandGroup2 instance,
+ SessionCommandGroup2 others);
+ SessionCommandGroup2 fromBundle_MediaSession2CommandGroup(Bundle bundle);
ControllerInfoProvider createMediaSession2ControllerInfo(Context context,
MediaSession2.ControllerInfo instance, int uid, int pid,
String packageName, IInterface callback);
- CommandButtonProvider.BuilderProvider createMediaSession2CommandButtonBuilder(Context context,
+ CommandButtonProvider.BuilderProvider createMediaSession2CommandButtonBuilder(
MediaSession2.CommandButton.Builder instance);
BuilderBaseProvider<MediaSession2, SessionCallback> createMediaSession2Builder(
Context context, MediaSession2.Builder instance);
@@ -88,7 +90,7 @@
SessionToken2 token, Executor executor, BrowserCallback callback);
MediaSessionService2Provider createMediaSessionService2(MediaSessionService2 instance);
- MediaNotificationProvider createMediaSessionService2MediaNotification(Context context,
+ MediaNotificationProvider createMediaSessionService2MediaNotification(
MediaNotification mediaNotification, int notificationId, Notification notification);
MediaSessionService2Provider createMediaLibraryService2(MediaLibraryService2 instance);
@@ -96,33 +98,32 @@
createMediaLibraryService2Builder(
MediaLibraryService2 service, MediaLibrarySession.Builder instance,
Executor callbackExecutor, MediaLibrarySessionCallback callback);
- LibraryRootProvider createMediaLibraryService2LibraryRoot(Context context, LibraryRoot instance,
- String rootId, Bundle extras);
+ LibraryRootProvider createMediaLibraryService2LibraryRoot(LibraryRoot instance, String rootId,
+ Bundle extras);
SessionToken2Provider createSessionToken2(Context context, SessionToken2 instance,
String packageName, String serviceName, int uid);
- SessionToken2 fromBundle_SessionToken2(Context context, Bundle bundle);
+ SessionToken2 fromBundle_SessionToken2(Bundle bundle);
- MediaItem2Provider.BuilderProvider createMediaItem2Builder(
- Context context, MediaItem2.Builder instance, int flags);
- MediaItem2 fromBundle_MediaItem2(Context context, Bundle bundle);
+ MediaItem2Provider.BuilderProvider createMediaItem2Builder(MediaItem2.Builder instance,
+ int flags);
+ MediaItem2 fromBundle_MediaItem2(Bundle bundle);
- VolumeProvider2Provider createVolumeProvider2(Context context, VolumeProvider2 instance,
- int controlType, int maxVolume, int currentVolume);
+ VolumeProvider2Provider createVolumeProvider2(VolumeProvider2 instance, int controlType,
+ int maxVolume, int currentVolume);
- MediaMetadata2 fromBundle_MediaMetadata2(Context context, Bundle bundle);
+ MediaMetadata2 fromBundle_MediaMetadata2(Bundle bundle);
MediaMetadata2Provider.BuilderProvider createMediaMetadata2Builder(
- Context context, MediaMetadata2.Builder instance);
+ MediaMetadata2.Builder instance);
MediaMetadata2Provider.BuilderProvider createMediaMetadata2Builder(
- Context context, MediaMetadata2.Builder instance, MediaMetadata2 source);
+ MediaMetadata2.Builder instance, MediaMetadata2 source);
- Rating2 newUnratedRating_Rating2(Context context, int ratingStyle);
- Rating2 fromBundle_Rating2(Context context, Bundle bundle);
- Rating2 newHeartRating_Rating2(Context context, boolean hasHeart);
- Rating2 newThumbRating_Rating2(Context context, boolean thumbIsUp);
- Rating2 newStarRating_Rating2(Context context, int starRatingStyle, float starRating);
- Rating2 newPercentageRating_Rating2(Context context, float percent);
+ Rating2 newUnratedRating_Rating2(int ratingStyle);
+ Rating2 fromBundle_Rating2(Bundle bundle);
+ Rating2 newHeartRating_Rating2(boolean hasHeart);
+ Rating2 newThumbRating_Rating2(boolean thumbIsUp);
+ Rating2 newStarRating_Rating2(int starRatingStyle, float starRating);
+ Rating2 newPercentageRating_Rating2(float percent);
- MediaPlaylistAgentProvider createMediaPlaylistAgent(Context context,
- MediaPlaylistAgent instance);
+ MediaPlaylistAgentProvider createMediaPlaylistAgent(MediaPlaylistAgent instance);
}
diff --git a/media/java/android/media/update/TransportControlProvider.java b/media/java/android/media/update/TransportControlProvider.java
index 03944d2..d89a88a 100644
--- a/media/java/android/media/update/TransportControlProvider.java
+++ b/media/java/android/media/update/TransportControlProvider.java
@@ -29,8 +29,6 @@
void skipToNextItem_impl();
void prepare_impl();
- void fastForward_impl();
- void rewind_impl();
void seekTo_impl(long pos);
void skipToPlaylistItem_impl(MediaItem2 item);
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index 32a00d5..7976f67 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -243,11 +243,11 @@
}
};
- public MtpDatabase(Context context, Context userContext, String volumeName,
+ public MtpDatabase(Context context, String volumeName,
String[] subDirectories) {
native_setup();
mContext = context;
- mMediaProvider = userContext.getContentResolver()
+ mMediaProvider = context.getContentResolver()
.acquireContentProviderClient(MediaStore.AUTHORITY);
mVolumeName = volumeName;
mObjectsUri = Files.getMtpObjectsUri(volumeName);
@@ -314,7 +314,9 @@
public void addStorage(StorageVolume storage) {
MtpStorage mtpStorage = mManager.addMtpStorage(storage);
mStorageMap.put(storage.getPath(), mtpStorage);
- mServer.addStorage(mtpStorage);
+ if (mServer != null) {
+ mServer.addStorage(mtpStorage);
+ }
}
public void removeStorage(StorageVolume storage) {
@@ -322,7 +324,9 @@
if (mtpStorage == null) {
return;
}
- mServer.removeStorage(mtpStorage);
+ if (mServer != null) {
+ mServer.removeStorage(mtpStorage);
+ }
mManager.removeMtpStorage(mtpStorage);
mStorageMap.remove(storage.getPath());
}
diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java
index f2b1106..8af5ff7 100644
--- a/media/java/android/mtp/MtpServer.java
+++ b/media/java/android/mtp/MtpServer.java
@@ -18,6 +18,8 @@
import com.android.internal.util.Preconditions;
+import java.io.FileDescriptor;
+
/**
* Java wrapper for MTP/PTP support as USB responder.
* {@hide}
@@ -34,6 +36,7 @@
public MtpServer(
MtpDatabase database,
+ FileDescriptor controlFd,
boolean usePtp,
Runnable onTerminate,
String deviceInfoManufacturer,
@@ -44,6 +47,7 @@
mOnTerminate = Preconditions.checkNotNull(onTerminate);
native_setup(
database,
+ controlFd,
usePtp,
deviceInfoManufacturer,
deviceInfoModel,
@@ -92,6 +96,7 @@
public static native final void native_configure(boolean usePtp);
private native final void native_setup(
MtpDatabase database,
+ FileDescriptor controlFd,
boolean usePtp,
String deviceInfoManufacturer,
String deviceInfoModel,
diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
index 4fc43ea..6d1bd45 100644
--- a/media/java/android/service/media/MediaBrowserService.java
+++ b/media/java/android/service/media/MediaBrowserService.java
@@ -31,6 +31,8 @@
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
+import android.media.session.MediaSessionManager;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -112,6 +114,8 @@
*/
private class ConnectionRecord implements IBinder.DeathRecipient {
String pkg;
+ int uid;
+ int pid;
Bundle rootHints;
IMediaBrowserServiceCallbacks callbacks;
BrowserRoot root;
@@ -199,6 +203,7 @@
public void connect(final String pkg, final Bundle rootHints,
final IMediaBrowserServiceCallbacks callbacks) {
+ final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
if (!isValidPackage(pkg, uid)) {
throw new IllegalArgumentException("Package/uid mismatch: uid=" + uid
@@ -215,9 +220,14 @@
final ConnectionRecord connection = new ConnectionRecord();
connection.pkg = pkg;
+ connection.pid = pid;
+ connection.uid = uid;
connection.rootHints = rootHints;
connection.callbacks = callbacks;
+
+ mCurConnection = connection;
connection.root = MediaBrowserService.this.onGetRoot(pkg, uid, rootHints);
+ mCurConnection = null;
// If they didn't return something, don't allow this client.
if (connection.root == null) {
@@ -505,21 +515,36 @@
* media browser service when connecting and retrieving the root id for browsing, or null if
* none. The contents of this bundle may affect the information returned when browsing.
*
- * @throws IllegalStateException If this method is called outside of {@link #onLoadChildren} or
- * {@link #onLoadItem}.
+ * @throws IllegalStateException If this method is called outside of {@link #onGetRoot} or
+ * {@link #onLoadChildren} or {@link #onLoadItem}.
* @see MediaBrowserService.BrowserRoot#EXTRA_RECENT
* @see MediaBrowserService.BrowserRoot#EXTRA_OFFLINE
* @see MediaBrowserService.BrowserRoot#EXTRA_SUGGESTED
*/
public final Bundle getBrowserRootHints() {
if (mCurConnection == null) {
- throw new IllegalStateException("This should be called inside of onLoadChildren or"
- + " onLoadItem methods");
+ throw new IllegalStateException("This should be called inside of onGetRoot or"
+ + " onLoadChildren or onLoadItem methods");
}
return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
}
/**
+ * Gets the browser information who sent the current request.
+ *
+ * @throws IllegalStateException If this method is called outside of {@link #onGetRoot} or
+ * {@link #onLoadChildren} or {@link #onLoadItem}.
+ * @see MediaSessionManager#isTrustedForMediaControl(RemoteUserInfo)
+ */
+ public final RemoteUserInfo getCurrentBrowserInfo() {
+ if (mCurConnection == null) {
+ throw new IllegalStateException("This should be called inside of onGetRoot or"
+ + " onLoadChildren or onLoadItem methods");
+ }
+ return new RemoteUserInfo(mCurConnection.pkg, mCurConnection.pid, mCurConnection.uid);
+ }
+
+ /**
* Notifies all connected media browsers that the children of
* the specified parent id have changed in some way.
* This will cause browsers to fetch subscribed content again.
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index 4c20f05..54541f0 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -729,15 +729,15 @@
GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_UNKNOWN", "I");
gSecurityLevels.kSecurityLevelUnknown = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "SW_SECURE_CRYPTO", "I");
+ GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_SW_SECURE_CRYPTO", "I");
gSecurityLevels.kSecurityLevelSwSecureCrypto = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "SW_SECURE_DECODE", "I");
+ GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_SW_SECURE_DECODE", "I");
gSecurityLevels.kSecurityLevelSwSecureDecode = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "HW_SECURE_CRYPTO", "I");
+ GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_HW_SECURE_CRYPTO", "I");
gSecurityLevels.kSecurityLevelHwSecureCrypto = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "HW_SECURE_DECODE", "I");
+ GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_HW_SECURE_DECODE", "I");
gSecurityLevels.kSecurityLevelHwSecureDecode = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "HW_SECURE_ALL", "I");
+ GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_HW_SECURE_ALL", "I");
gSecurityLevels.kSecurityLevelHwSecureAll = env->GetStaticIntField(clazz, field);
jmethodID getMaxSecurityLevel;
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 12d7440..4d8c96f 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "MtpDatabaseJNI"
#include "utils/Log.h"
+#include "utils/String8.h"
#include "android_media_Utils.h"
#include "mtp.h"
@@ -161,7 +162,7 @@
virtual void* getThumbnail(MtpObjectHandle handle, size_t& outThumbSize);
virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle,
- MtpString& outFilePath,
+ MtpStringBuffer& outFilePath,
int64_t& outFileLength,
MtpObjectFormat& outFormat);
virtual MtpResponseCode beginDeleteObject(MtpObjectHandle handle);
@@ -287,7 +288,7 @@
jint* handles = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(handles[i]);
+ list->push_back(handles[i]);
env->ReleaseIntArrayElements(array, handles, 0);
env->DeleteLocalRef(array);
@@ -316,7 +317,7 @@
jint* formats = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(formats[i]);
+ list->push_back(formats[i]);
env->ReleaseIntArrayElements(array, formats, 0);
env->DeleteLocalRef(array);
@@ -334,7 +335,7 @@
jint* formats = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(formats[i]);
+ list->push_back(formats[i]);
env->ReleaseIntArrayElements(array, formats, 0);
env->DeleteLocalRef(array);
@@ -352,7 +353,7 @@
jint* properties = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(properties[i]);
+ list->push_back(properties[i]);
env->ReleaseIntArrayElements(array, properties, 0);
env->DeleteLocalRef(array);
@@ -370,7 +371,7 @@
jint* properties = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(properties[i]);
+ list->push_back(properties[i]);
env->ReleaseIntArrayElements(array, properties, 0);
env->DeleteLocalRef(array);
@@ -826,7 +827,7 @@
MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle,
MtpObjectInfo& info) {
- MtpString path;
+ MtpStringBuffer path;
int64_t length;
MtpObjectFormat format;
@@ -861,8 +862,8 @@
info.mAssociationType = MTP_ASSOCIATION_TYPE_UNDEFINED;
jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
- MtpString temp(reinterpret_cast<char16_t*>(str));
- info.mName = strdup((const char *)temp);
+ MtpStringBuffer temp(str);
+ info.mName = strdup(temp);
env->ReleaseCharArrayElements(mStringBuffer, str, 0);
// read EXIF data for thumbnail information
@@ -901,9 +902,10 @@
case MTP_FORMAT_TIFF:
case MTP_FORMAT_TIFF_EP:
case MTP_FORMAT_DEFINED: {
- std::unique_ptr<FileStream> stream(new FileStream(path));
+ String8 temp(path);
+ std::unique_ptr<FileStream> stream(new FileStream(temp));
piex::PreviewImageData image_data;
- if (!GetExifFromRawImage(stream.get(), path, image_data)) {
+ if (!GetExifFromRawImage(stream.get(), temp, image_data)) {
// Couldn't parse EXIF data from a image file via piex.
break;
}
@@ -922,7 +924,7 @@
}
void* MtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) {
- MtpString path;
+ MtpStringBuffer path;
int64_t length;
MtpObjectFormat format;
void* result = NULL;
@@ -957,9 +959,10 @@
case MTP_FORMAT_TIFF:
case MTP_FORMAT_TIFF_EP:
case MTP_FORMAT_DEFINED: {
- std::unique_ptr<FileStream> stream(new FileStream(path));
+ String8 temp(path);
+ std::unique_ptr<FileStream> stream(new FileStream(temp));
piex::PreviewImageData image_data;
- if (!GetExifFromRawImage(stream.get(), path, image_data)) {
+ if (!GetExifFromRawImage(stream.get(), temp, image_data)) {
// Couldn't parse EXIF data from a image file via piex.
break;
}
@@ -992,7 +995,7 @@
}
MtpResponseCode MtpDatabase::getObjectFilePath(MtpObjectHandle handle,
- MtpString& outFilePath,
+ MtpStringBuffer& outFilePath,
int64_t& outFileLength,
MtpObjectFormat& outFormat) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
@@ -1004,8 +1007,7 @@
}
jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
- outFilePath.setTo(reinterpret_cast<char16_t*>(str),
- strlen16(reinterpret_cast<char16_t*>(str)));
+ outFilePath.set(str);
env->ReleaseCharArrayElements(mStringBuffer, str, 0);
jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0);
@@ -1146,7 +1148,7 @@
jint* handles = env->GetIntArrayElements(array, 0);
jsize length = env->GetArrayLength(array);
for (int i = 0; i < length; i++)
- list->push(handles[i]);
+ list->push_back(handles[i]);
env->ReleaseIntArrayElements(array, handles, 0);
env->DeleteLocalRef(array);
diff --git a/media/jni/android_mtp_MtpDevice.cpp b/media/jni/android_mtp_MtpDevice.cpp
index d42c39e..060eaf9 100644
--- a/media/jni/android_mtp_MtpDevice.cpp
+++ b/media/jni/android_mtp_MtpDevice.cpp
@@ -258,7 +258,7 @@
return NULL;
}
for (size_t i = 0; i < size; ++i) {
- elements[i] = deviceInfo->mOperations->itemAt(i);
+ elements[i] = static_cast<int>(deviceInfo->mOperations->at(i));
}
env->SetObjectField(info, field_deviceInfo_operationsSupported, operations.get());
}
@@ -274,7 +274,7 @@
return NULL;
}
for (size_t i = 0; i < size; ++i) {
- elements[i] = deviceInfo->mEvents->itemAt(i);
+ elements[i] = static_cast<int>(deviceInfo->mEvents->at(i));
}
env->SetObjectField(info, field_deviceInfo_eventsSupported, events.get());
}
@@ -296,7 +296,7 @@
int length = storageIDs->size();
jintArray array = env->NewIntArray(length);
// FIXME is this cast safe?
- env->SetIntArrayRegion(array, 0, length, (const jint *)storageIDs->array());
+ env->SetIntArrayRegion(array, 0, length, (const jint *)storageIDs->data());
delete storageIDs;
return array;
@@ -350,7 +350,7 @@
int length = handles->size();
jintArray array = env->NewIntArray(length);
// FIXME is this cast safe?
- env->SetIntArrayRegion(array, 0, length, (const jint *)handles->array());
+ env->SetIntArrayRegion(array, 0, length, (const jint *)handles->data());
delete handles;
return array;
diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp
index c76cebe..c60590a 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -55,27 +55,22 @@
return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext);
}
-static void android_mtp_configure(JNIEnv *, jobject, jboolean usePtp) {
- MtpServer::configure(usePtp);
-}
-
static void
-android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp,
- jstring deviceInfoManufacturer,
- jstring deviceInfoModel,
- jstring deviceInfoDeviceVersion,
- jstring deviceInfoSerialNumber)
+android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jobject jControlFd,
+ jboolean usePtp, jstring deviceInfoManufacturer, jstring deviceInfoModel,
+ jstring deviceInfoDeviceVersion, jstring deviceInfoSerialNumber)
{
const char *deviceInfoManufacturerStr = env->GetStringUTFChars(deviceInfoManufacturer, NULL);
const char *deviceInfoModelStr = env->GetStringUTFChars(deviceInfoModel, NULL);
const char *deviceInfoDeviceVersionStr = env->GetStringUTFChars(deviceInfoDeviceVersion, NULL);
const char *deviceInfoSerialNumberStr = env->GetStringUTFChars(deviceInfoSerialNumber, NULL);
- MtpServer* server = new MtpServer(getMtpDatabase(env, javaDatabase),
+ int controlFd = dup(jniGetFDFromFileDescriptor(env, jControlFd));
+ MtpServer* server = new MtpServer(getMtpDatabase(env, javaDatabase), controlFd,
usePtp,
- MtpString((deviceInfoManufacturerStr != NULL) ? deviceInfoManufacturerStr : ""),
- MtpString((deviceInfoModelStr != NULL) ? deviceInfoModelStr : ""),
- MtpString((deviceInfoDeviceVersionStr != NULL) ? deviceInfoDeviceVersionStr : ""),
- MtpString((deviceInfoSerialNumberStr != NULL) ? deviceInfoSerialNumberStr : ""));
+ (deviceInfoManufacturerStr != NULL) ? deviceInfoManufacturerStr : "",
+ (deviceInfoModelStr != NULL) ? deviceInfoModelStr : "",
+ (deviceInfoDeviceVersionStr != NULL) ? deviceInfoDeviceVersionStr : "",
+ (deviceInfoSerialNumberStr != NULL) ? deviceInfoSerialNumberStr : "");
if (deviceInfoManufacturerStr != NULL) {
env->ReleaseStringUTFChars(deviceInfoManufacturer, deviceInfoManufacturerStr);
}
@@ -201,8 +196,7 @@
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
- {"native_configure", "(Z)V", (void *)android_mtp_configure},
- {"native_setup", "(Landroid/mtp/MtpDatabase;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
+ {"native_setup", "(Landroid/mtp/MtpDatabase;Ljava/io/FileDescriptor;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
(void *)android_mtp_MtpServer_setup},
{"native_run", "()V", (void *)android_mtp_MtpServer_run},
{"native_cleanup", "()V", (void *)android_mtp_MtpServer_cleanup},
diff --git a/packages/CaptivePortalLogin/res/values-as/strings.xml b/packages/CaptivePortalLogin/res/values-as/strings.xml
index 6791d1b..94c3147 100644
--- a/packages/CaptivePortalLogin/res/values-as/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-as/strings.xml
@@ -4,13 +4,9 @@
<string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
<string name="action_use_network" msgid="6076184727448466030">"এই নেটৱৰ্কটো এইদৰে ব্যৱহাৰ কৰক"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটৱৰ্কটো ব্যৱহাৰ নকৰিব"</string>
- <!-- no translation found for action_bar_label (917235635415966620) -->
- <skip />
+ <string name="action_bar_label" msgid="917235635415966620">"নেটৱৰ্কত ছাইন ইন কৰক"</string>
<string name="action_bar_title" msgid="5645564790486983117">"%1$st ছাইন ইন কৰক"</string>
- <!-- no translation found for ssl_error_warning (6653188881418638872) -->
- <skip />
- <!-- no translation found for ssl_error_example (647898534624078900) -->
- <skip />
- <!-- no translation found for ssl_error_continue (6492718244923937110) -->
- <skip />
+ <string name="ssl_error_warning" msgid="6653188881418638872">"আপুনি সংযোগ কৰিবলৈ চেষ্টা কৰি থকা নেটৱৰ্কটোত সুৰক্ষাজনিত সমস্যা আছে।"</string>
+ <string name="ssl_error_example" msgid="647898534624078900">"উদাহৰণস্বৰূপে, আপোনাক দেখুওৱা লগ ইনৰ পৃষ্ঠাটো প্ৰতিষ্ঠানটোৰ নিজা নহ\'বও পাৰে।"</string>
+ <string name="ssl_error_continue" msgid="6492718244923937110">"তথাপি ব্ৰাউজাৰৰ জৰিয়তে অব্যাহত ৰাখক"</string>
</resources>
diff --git a/packages/CaptivePortalLogin/res/values-or/strings.xml b/packages/CaptivePortalLogin/res/values-or/strings.xml
index b7c8321..80074c3 100644
--- a/packages/CaptivePortalLogin/res/values-or/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-or/strings.xml
@@ -5,8 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ଏହି ନେଟ୍ୱର୍କ ଯେପରି ଅଛି, ସେହିପରି ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ଏହି ନେଟ୍ୱର୍କକୁ ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ"</string>
<string name="action_bar_label" msgid="917235635415966620">"ନେଟ୍ୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for action_bar_title (5645564790486983117) -->
- <skip />
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$sରେ ସାଇନ୍-ଇନ୍ କରନ୍ତୁ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ଆପଣ ଯୋଗ ଦେବାକୁ ଚେଷ୍ଟା କରୁଥିବା ନେଟ୍ୱର୍କର ସୁରକ୍ଷା ସମସ୍ୟା ଅଛି।"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ଉଦାହରଣସ୍ୱରୂପ, ଲଗଇନ୍ ପୃଷ୍ଠା ଦେଖାଯାଇଥିବା ସଂସ୍ଥାର ନହୋଇଥାଇପାରେ।"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ବ୍ରାଉଜର୍ ଜରିଆରେ ଯେମିତିବି ହେଉ ଜାରି ରଖନ୍ତୁ"</string>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 4db0034..dbdf5e16 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -35,6 +35,7 @@
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.widget.SwipeRefreshLayout;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.TypedValue;
@@ -42,6 +43,7 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.webkit.CookieManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
@@ -147,6 +149,7 @@
final WebView webview = getWebview();
webview.clearCache(true);
+ CookieManager.getInstance().setAcceptThirdPartyCookies(webview, true);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
@@ -529,7 +532,7 @@
private String getHeaderTitle() {
NetworkInfo info = mCm.getNetworkInfo(mNetwork);
- if (info == null) {
+ if (info == null || TextUtils.isEmpty(info.getExtraInfo())) {
return getString(R.string.action_bar_label);
}
NetworkCapabilities nc = mCm.getNetworkCapabilities(mNetwork);
diff --git a/packages/CarrierDefaultApp/res/values-eu/strings.xml b/packages/CarrierDefaultApp/res/values-eu/strings.xml
index abd0696..f98a192 100644
--- a/packages/CarrierDefaultApp/res/values-eu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-eu/strings.xml
@@ -9,7 +9,7 @@
<string name="no_data_notification_detail" msgid="3112125343857014825">"Jarri harremanetan %s operadorearekin"</string>
<string name="no_mobile_data_connection_title" msgid="7449525772416200578">"Ez dago datu-konexiorik"</string>
<string name="no_mobile_data_connection" msgid="544980465184147010">"Gehitu datuak eta ibiltaritza-plana %s bidez"</string>
- <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Datu mugikorren egoera"</string>
+ <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Datu-konexioaren egoera"</string>
<string name="action_bar_label" msgid="4290345990334377177">"Hasi saioa sare mugikorrean"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"Erabili nahi duzun sareak segurtasun-arazoak ditu."</string>
<string name="ssl_error_example" msgid="6188711843183058764">"Adibidez, baliteke saioa hasteko orria adierazitako erakundearena ez izatea."</string>
diff --git a/packages/CarrierDefaultApp/res/values-or/strings.xml b/packages/CarrierDefaultApp/res/values-or/strings.xml
new file mode 100644
index 0000000..fd51ed0
--- /dev/null
+++ b/packages/CarrierDefaultApp/res/values-or/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
+ <string name="android_system_label" msgid="2797790869522345065">"ମୋବାଇଲ୍ କେରିଅର୍"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"ମୋବାଇଲ୍ ଡାଟା ଶେଷ ହୋଇଯାଇଛି"</string>
+ <string name="no_data_notification_id" msgid="668400731803969521">"ଆପଣଙ୍କ ମୋବାଇଲ୍ ଡାଟା ନିଷ୍କ୍ରୀୟ କରାଯାଇଛି"</string>
+ <string name="portal_notification_detail" msgid="2295729385924660881">"%s ୱେବସାଇଟ୍ ଭିଜିଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"ଦୟାକରି ଆପଣଙ୍କ ସେବା ପ୍ରଦାନକାରୀ %sକୁ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"କୌଣସି ମୋବାଇଲ୍ ଡାଟା କନେକ୍ସନ୍ ନାହିଁ"</string>
+ <string name="no_mobile_data_connection" msgid="544980465184147010">"%s ଜରିଆରେ ଡାଟା କିମ୍ବା ରୋମିଙ୍ଗ ପ୍ଲାନ୍ ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"ମୋବାଇଲ୍ ଡାଟା ସ୍ଥିତି"</string>
+ <string name="action_bar_label" msgid="4290345990334377177">"ମୋବାଇଲ୍ ନେଟୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string>
+ <string name="ssl_error_warning" msgid="3127935140338254180">"ଆପଣ ଯୋଗ ଦେବାକୁ ଚେଷ୍ଟା କରୁଥିବା ନେଟୱର୍କର ସୁରକ୍ଷା ସମସ୍ୟା ଅଛି।"</string>
+ <string name="ssl_error_example" msgid="6188711843183058764">"ଉଦାହରଣସ୍ୱରୂପ, ଲଗଇନ୍ ପୃଷ୍ଠା ଦେଖାଯାଇଥିବା ସଂସ୍ଥାର ହୋଇନଥାଇପାରେ।"</string>
+ <string name="ssl_error_continue" msgid="1138548463994095584">"ବ୍ରାଉଜର୍ ଜରିଆରେ ଯେମିତିବି ହେଉ ଜାରି ରଖନ୍ତୁ"</string>
+</resources>
diff --git a/packages/ExtServices/src/android/ext/services/notification/ChannelImpressions.java b/packages/ExtServices/src/android/ext/services/notification/ChannelImpressions.java
index 4ad4b24..de2659f 100644
--- a/packages/ExtServices/src/android/ext/services/notification/ChannelImpressions.java
+++ b/packages/ExtServices/src/android/ext/services/notification/ChannelImpressions.java
@@ -30,7 +30,7 @@
private static final String TAG = "ExtAssistant.CI";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- static final double DISMISS_TO_VIEW_RATIO_LIMIT = .8;
+ static final double DISMISS_TO_VIEW_RATIO_LIMIT = .4;
static final int STREAK_LIMIT = 2;
static final String ATT_DISMISSALS = "dismisses";
static final String ATT_VIEWS = "views";
diff --git a/packages/ExternalStorageProvider/res/values-or/strings.xml b/packages/ExternalStorageProvider/res/values-or/strings.xml
index 034d8a4..5387dc7 100644
--- a/packages/ExternalStorageProvider/res/values-or/strings.xml
+++ b/packages/ExternalStorageProvider/res/values-or/strings.xml
@@ -17,8 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7123375275748530234">"ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string>
- <!-- no translation found for storage_description (8541974407321172792) -->
- <skip />
+ <string name="storage_description" msgid="8541974407321172792">"ଲୋକାଲ୍ ଷ୍ଟୋରେଜ୍"</string>
<string name="root_internal_storage" msgid="827844243068584127">"ଇଣ୍ଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string>
<string name="root_documents" msgid="4051252304075469250">"ଡକ୍ୟୁମେଣ୍ଟ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index eece5b7..cf69acc 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -41,8 +41,6 @@
<string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ଲିଥୁଆନିଆନ୍"</string>
<string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ସ୍ପାନିଶ୍ (ଲାଟିନ୍)"</string>
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ଲାଟିଭିଆନ୍"</string>
- <!-- no translation found for keyboard_layout_persian (3920643161015888527) -->
- <skip />
- <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) -->
- <skip />
+ <string name="keyboard_layout_persian" msgid="3920643161015888527">"ପାର୍ସିଆନ୍"</string>
+ <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ଆଜେର୍ବୈଜାନି"</string>
</resources>
diff --git a/packages/MtpDocumentsProvider/perf_tests/Android.mk b/packages/MtpDocumentsProvider/perf_tests/Android.mk
index 6504af1..e873157 100644
--- a/packages/MtpDocumentsProvider/perf_tests/Android.mk
+++ b/packages/MtpDocumentsProvider/perf_tests/Android.mk
@@ -8,5 +8,6 @@
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_INSTRUMENTATION_FOR := MtpDocumentsProvider
LOCAL_CERTIFICATE := media
+LOCAL_COMPATIBILITY_SUITE += device-tests
include $(BUILD_PACKAGE)
diff --git a/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml b/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml
new file mode 100644
index 0000000..8b7292b
--- /dev/null
+++ b/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs MtpDocumentsProviderPerfTests metric instrumentation.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-metric-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="MtpDocumentsProviderPerfTests.apk" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.mtp.perftests" />
+ </test>
+</configuration>
diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml
index 564802a..91beff6 100644
--- a/packages/PrintSpooler/res/layout/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml
@@ -42,7 +42,7 @@
android:layout_height="wrap_content"
android:layout_marginBottom="12dip"
android:src="@*android:drawable/ic_grayedout_printer"
- android:contentDescription="@string/print_searching_for_printers">
+ android:importantForAccessibility="no">
</ImageView>
<TextView
diff --git a/packages/PrintSpooler/res/values-as/strings.xml b/packages/PrintSpooler/res/values-as/strings.xml
index 0a95c84..ba4fd99 100644
--- a/packages/PrintSpooler/res/values-as/strings.xml
+++ b/packages/PrintSpooler/res/values-as/strings.xml
@@ -24,8 +24,7 @@
<string name="label_paper_size" msgid="908654383827777759">"কাগজৰ আকাৰ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"কাগজৰ আকাৰ:"</string>
<string name="label_color" msgid="1108690305218188969">"ৰং"</string>
- <!-- no translation found for label_duplex (5370037254347072243) -->
- <skip />
+ <string name="label_duplex" msgid="5370037254347072243">"পৃষ্ঠাখনৰ দুয়োফালে"</string>
<string name="label_orientation" msgid="2853142581990496477">"দিশ"</string>
<string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাসমূহ"</string>
<string name="destination_default_text" msgid="5422708056807065710">"প্ৰিণ্টাৰ বাছনি কৰক"</string>
@@ -56,7 +55,10 @@
<string name="print_add_printer" msgid="1088656468360653455">"প্ৰিণ্টাৰ যোগ কৰক"</string>
<string name="print_select_printer" msgid="7388760939873368698">"প্ৰিণ্টাৰ বাছনি কৰক"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"প্ৰিণ্টাৰ পাহৰি যাওক"</string>
- <!-- no translation found for print_search_result_count_utterance (6997663738361080868) -->
+ <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g>টা প্ৰিণ্টাৰ বিচাৰি পোৱা হৈছে</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>টা প্ৰিণ্টাৰ বিচাৰি পোৱা হৈছে</item>
+ </plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="printer_info_desc" msgid="7181988788991581654">"এই প্ৰিণ্টাৰটোৰ বিষয়ে অধিক তথ্য"</string>
<string name="notification_channel_progress" msgid="872788690775721436">"প্ৰিণ্ট হৈ থকা কামবোৰ"</string>
@@ -73,7 +75,10 @@
<string name="recommended_services_title" msgid="3799434882937956924">"অনুমোদিত সেৱাসমূহ"</string>
<string name="disabled_services_title" msgid="7313253167968363211">"অক্ষম কৰা সেৱাসমূহ"</string>
<string name="all_services_title" msgid="5578662754874906455">"সকলো সেৱা"</string>
- <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) -->
+ <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g>টা প্ৰিণ্টাৰ বিচাৰিবলৈ ইনষ্টল কৰক</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>টা প্ৰিণ্টাৰ বিচাৰিবলৈ ইনষ্টল কৰক</item>
+ </plurals>
<string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্ট কৰি থকা হৈছে"</string>
<string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> বাতিল কৰি থকা হৈছে"</string>
<string name="failed_notification_title_template" msgid="2256217208186530973">"প্ৰিণ্টাৰৰ আসোঁৱাহ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
index 8e12525..bf306ff 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -84,7 +84,7 @@
<string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression : « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »"</string>
<string name="blocked_notification_title_template" msgid="1175435827331588646">"Impression de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> » bloquée"</string>
<string name="cancel" msgid="4373674107267141885">"Annuler"</string>
- <string name="restart" msgid="2472034227037808749">"Recommencer"</string>
+ <string name="restart" msgid="2472034227037808749">"Redémarrer"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante"</string>
<string name="reason_unknown" msgid="5507940196503246139">"inconnu"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"Utiliser <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
diff --git a/packages/PrintSpooler/res/values-gu/strings.xml b/packages/PrintSpooler/res/values-gu/strings.xml
index 4d035da..aeeff16 100644
--- a/packages/PrintSpooler/res/values-gu/strings.xml
+++ b/packages/PrintSpooler/res/values-gu/strings.xml
@@ -61,8 +61,8 @@
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="printer_info_desc" msgid="7181988788991581654">"આ પ્રિન્ટર વિશે વધુ માહિતી"</string>
- <string name="notification_channel_progress" msgid="872788690775721436">"ચાલી રહેલા છાપવાનાં કાર્યો"</string>
- <string name="notification_channel_failure" msgid="9042250774797916414">"નિષ્ફળ થયેલ છાપવાના કાર્યો"</string>
+ <string name="notification_channel_progress" msgid="872788690775721436">"ચાલી રહેલા છાપવાનાં Tasks"</string>
+ <string name="notification_channel_failure" msgid="9042250774797916414">"નિષ્ફળ થયેલ છાપવાના Tasks"</string>
<string name="could_not_create_file" msgid="3425025039427448443">"ફાઇલ બનાવી શક્યાં નથી"</string>
<string name="print_services_disabled_toast" msgid="9089060734685174685">"કેટલીક છાપવાની સેવાઓ અક્ષમ કરેલ છે"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"પ્રિન્ટર્સ માટે શોધી રહ્યું છે"</string>
diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml
index d9328d0..7eeac87 100644
--- a/packages/PrintSpooler/res/values-or/strings.xml
+++ b/packages/PrintSpooler/res/values-or/strings.xml
@@ -61,31 +61,24 @@
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="printer_info_desc" msgid="7181988788991581654">"ଏହି ପ୍ରିଣ୍ଟର୍ ବିଷୟରେ ଅଧିକ ସୂଚନା"</string>
- <!-- no translation found for notification_channel_progress (872788690775721436) -->
- <skip />
- <!-- no translation found for notification_channel_failure (9042250774797916414) -->
- <skip />
+ <string name="notification_channel_progress" msgid="872788690775721436">"ଚାଲୁଥିବା ପ୍ରିଣ୍ଟ ଜବ୍"</string>
+ <string name="notification_channel_failure" msgid="9042250774797916414">"ବିଫଳ ହୋଇଥିବା ପ୍ରିଣ୍ଟ ଜବ୍"</string>
<string name="could_not_create_file" msgid="3425025039427448443">"ଫାଇଲ୍ ତିଆରି କରିହେଲା ନାହିଁ"</string>
- <!-- no translation found for print_services_disabled_toast (9089060734685174685) -->
- <skip />
+ <string name="print_services_disabled_toast" msgid="9089060734685174685">"କିଛି ପ୍ରିଣ୍ଟ ସର୍ଭିସ୍କୁ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"ପ୍ରିଣ୍ଟର୍ ଖୋଜାଯାଉଛି"</string>
<string name="print_no_print_services" msgid="8561247706423327966">"କୌଣସି ପ୍ରିଣ୍ଟ ସେବା ସକ୍ଷମ କରାଯାଇନାହିଁ"</string>
<string name="print_no_printers" msgid="4869403323900054866">"କୌଣସି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା ନାହିଁ"</string>
- <!-- no translation found for cannot_add_printer (7840348733668023106) -->
- <skip />
- <!-- no translation found for select_to_add_printers (3800709038689830974) -->
- <skip />
- <!-- no translation found for enable_print_service (3482815747043533842) -->
- <skip />
- <!-- no translation found for enabled_services_title (7036986099096582296) -->
- <skip />
- <!-- no translation found for recommended_services_title (3799434882937956924) -->
- <skip />
- <!-- no translation found for disabled_services_title (7313253167968363211) -->
- <skip />
- <!-- no translation found for all_services_title (5578662754874906455) -->
- <skip />
- <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) -->
+ <string name="cannot_add_printer" msgid="7840348733668023106">"ପ୍ରିଣ୍ଟର ଯୋଡ଼ିହେବ ନାହିଁ"</string>
+ <string name="select_to_add_printers" msgid="3800709038689830974">"ପ୍ରିଣ୍ଟର ଯୋଡ଼ିବାକୁ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="enable_print_service" msgid="3482815747043533842">"ସକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="enabled_services_title" msgid="7036986099096582296">"ସକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string>
+ <string name="recommended_services_title" msgid="3799434882937956924">"ସୁପାରିସ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string>
+ <string name="disabled_services_title" msgid="7313253167968363211">"ଅକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string>
+ <string name="all_services_title" msgid="5578662754874906455">"ସମସ୍ତ ସର୍ଭିସ୍"</string>
+ <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ଖୋଜିବା ପାଇଁ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ଖୋଜିବା ପାଇଁ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ</item>
+ </plurals>
<string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟ କରାଯାଉଛି"</string>
<string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> କ୍ୟାନ୍ସଲ୍ କରାଯାଉଛି"</string>
<string name="failed_notification_title_template" msgid="2256217208186530973">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟର୍ ତ୍ରୁଟି"</string>
@@ -113,7 +106,6 @@
<string name="print_error_default_message" msgid="8602678405502922346">"କାମ କଲାନାହିଁ, ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="print_error_retry" msgid="1426421728784259538">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="print_error_printer_unavailable" msgid="8985614415253203381">"ପ୍ରିଣ୍ଟର୍ ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ନାହିଁ।"</string>
- <!-- no translation found for print_cannot_load_page (6179560924492912009) -->
- <skip />
+ <string name="print_cannot_load_page" msgid="6179560924492912009">"ଝଲକ ଦେଖାଇହେବ ନାହିଁ"</string>
<string name="print_preparing_preview" msgid="3939930735671364712">"ଝଲକ ତିଆରି କରାଯାଉଛି…"</string>
</resources>
diff --git a/packages/SettingsLib/Android.mk b/packages/SettingsLib/Android.mk
index 859f86f..5a8be31 100644
--- a/packages/SettingsLib/Android.mk
+++ b/packages/SettingsLib/Android.mk
@@ -3,6 +3,8 @@
LOCAL_USE_AAPT2 := true
+LOCAL_AAPT2_ONLY := true
+
LOCAL_MODULE := SettingsLib
LOCAL_JAVA_LIBRARIES := \
diff --git a/packages/SettingsLib/common.mk b/packages/SettingsLib/common.mk
index 28f97d1..5de3a6e 100644
--- a/packages/SettingsLib/common.mk
+++ b/packages/SettingsLib/common.mk
@@ -13,7 +13,6 @@
# include frameworks/base/packages/SettingsLib/common.mk
#
-ifeq ($(LOCAL_USE_AAPT2),true)
LOCAL_STATIC_JAVA_LIBRARIES += \
android-support-annotations \
android-arch-lifecycle-common
@@ -26,45 +25,4 @@
android-support-v7-appcompat \
android-support-v14-preference \
SettingsLib
-else
-LOCAL_RESOURCE_DIR += $(call my-dir)/res
-
-## Include transitive dependencies below
-
-# Include support-v7-appcompat, if not already included
-ifeq (,$(findstring android-support-v7-appcompat,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/appcompat/res
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
-endif
-
-# Include support-v7-recyclerview, if not already included
-ifeq (,$(findstring android-support-v7-recyclerview,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/recyclerview/res
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
-endif
-
-# Include android-support-v7-preference, if not already included
-ifeq (,$(findstring android-support-v7-preference,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/preference/res
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.preference
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-preference
-endif
-
-# Include android-support-v14-preference, if not already included
-ifeq (,$(findstring android-support-v14-preference,$(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_AAPT_FLAGS += --extra-packages android.support.v14.preference
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v14-preference
-endif
-
-LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.settingslib
-
-LOCAL_STATIC_JAVA_LIBRARIES += \
- android-support-annotations \
- android-support-v4 \
- android-arch-lifecycle-runtime \
- android-arch-lifecycle-common \
- SettingsLib
-endif
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index e8a3cd8..bdc88fd 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Gekoppel via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Beskikbaar via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Gekoppel, geen internet nie"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Geen internet nie"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Aanmelding word vereis"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt is tydelik vol"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Gekoppel via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Beskikbaar via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Gekoppel (geen foon nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Gekoppel (geen media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Gekoppel (geen foon of media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktief, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktief"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-oudio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Foonoproepe"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Lêeroordrag"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Oorfoon"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Randinvoertoestel"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Bind tans linkergehoortoestel saam …"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Bind tans regtergehoortoestel saam …"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Links – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Regs – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batterykrag"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi af."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi is ontkoppel."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi een staaf."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Bly wakker"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skerm sal nooit slaap terwyl laai nie"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktiveer Bluetooth HCI-loerloglêer"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Vang alle Bluetooth HCI-pakette in \'n lêer vas"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Vang alle Bluetooth HCI-pakkette in \'n lêer vas (Wissel Bluetooth nadat jy hierdie instelling verander het)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-ontsluit"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Laat toe dat die selflaaiprogram ontsluit word"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Laat OEM-ontsluit toe?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-weergawe"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Kies Bluetooth AVRCP-weergawe"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-oudiokodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Kies Bluetooth-oudiokodek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth-oudiovoorbeeldkoers"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Kies Bluetooth-oudiokodek:\nVoorbeeldtempo"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth-oudiobisse per voorbeeld"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Kies Bluetooth-oudiokodek:\nBis per voorbeeld"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth-oudiokanaalmodus"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Kies Bluetooth-oudiokodek:\nKanaalmodus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth-oudio-LDAC-kodek: Speelgehalte"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Kies Bluetooth-oudio-LDAC-kodek:\nSpeelgehalte"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Stroming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Kies private DNS-modus"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Outomaties"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Gasheernaam van private DNS-verskaffer"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Voer gasheernaam van DNS-verskaffer in"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Kon nie koppel nie"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Wys opsies vir draadlose skermsertifisering"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Verewekansig MAC-adres wanneer daar aan Wi‑Fi-netwerke gekoppel word"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Beperk"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Onbeperk"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Loggerbuffer se groottes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Kies loggergroottes per logbuffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Maak logskrywer se aanhoudende berging skoon?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Ongeveer <xliff:g id="TIME">%1$s</xliff:g> oor gegrond op jou gebruik"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> oor op grond van jou gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> oor"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Sal waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Sal waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minder as <xliff:g id="THRESHOLD">%1$s</xliff:g> oor"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Minder as <xliff:g id="THRESHOLD">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Meer as <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Geregistreer"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nie geregistreer nie"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Onbeskikbaar"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC word ewekansig gemaak"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d toestelle is gekoppel</item>
<item quantity="one">%1$d toestel is gekoppel</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tydsduur"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vra elke keer"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Sopas"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 70107f3..4305a92 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"በ%1$s በኩል መገናኘት"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"በ%1$s በኩል የሚገኝ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ተገናኝቷል፣ ምንም በይነመረብ የለም"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"ምንም በይነመረብ የለም"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ወደ መለያ መግባት ያስፈልጋል"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"የመዳረሻ ነጥብ ለጊዜው ሞልቷል"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"በ%1$s በኩል ተገናኝቷል"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"በ%1$s በኩል የሚገኝ"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ተገናኝቷል (ምንም ስልክ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ተገናኝቷል (ምንም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ተገናኝቷል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ንቁ፣ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ንቁ"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"የማህደረ መረጃ ኦዲዮ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"የስልክ ጥሪዎች"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ፋይል ማስተላለፍ"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"የጆሮ ማዳመጫ"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"የግቤት መለዋወጫ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ብሉቱዝ"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ግራ አጋዥ መስሚያን በማጣመር ላይ…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ቀኝ አጋዥ መስሚያን በማጣመር ላይ…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ግራ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ቀኝ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ባትሪ"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ጠፍቷል።"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"የWifi ግንኙነት ተቋርጧል።"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"አንድ የWiFi አሞሌ።"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ነቅተህ ቆይ"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ማያኃይል በመሙላት ላይበፍፁም አይተኛም"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"የብሉቱዝ HCI ስለላ ምዝግብ ማስታወሻን ያንቁ"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"በአንድ ፋይል ውስጥ ያሉትን የብሉቱዝ HCI እሽጎች ይቅረጹ"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"በአንድ ፋይል ውስጥ ያሉት ሁሉንም የብሉቱዝ HCI ጥቅሎች ይቅረጹ (ይህን ቅንብር ከቀየሩ በኋላ ብሉቱዝን ይቀይሩ)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM መክፈቻ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"የማስነሻ ተሸካሚ እንዲከፈት ፍቀድ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"የOEM መክፈቻ ይፈቀድ?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"የብሉቱዝ AVRCP ስሪት"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"የብሉቱዝ AVRCP ስሪት ይምረጡ"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"የብሉቱዝ ኦዲዮ ኮዴክ"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"የብሉቱዝ ኦዲዮ ኮዴክ ይምረጡ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"የብሉቱዝ ኦዲዮ ናሙና ፍጥነት"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"የብሉቱዝ ኦዲዮ ኮዴክ ይምረጡ፦\nየናሙና ፍጥነት"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"የብሉቱዝ ኦዲዮ ቢት በናሙና"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"የብሉቱዝ ኦዲዮ ኮዴክ ይምረጡ፦\nቢት በናሙና"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"የብሉቱዝ ኦዲዮ ሰርጥ ሁነታ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"የብሉቱዝ ኦዲዮ ኮዴክ ይምረጡ፦\nየሰርጥ ሁነታ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"የብሉቱዝ ኦዲዮ LDAC ኮዴክ ይምረጡ፦ የመልሶ ማጫወት ጥራት"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"የብሉቱዝ ኦዲዮ LDAC ኮዴክ ይምረጡ፦\nየመልሶ ማጫወት ጥራት"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ዥረት፦ <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"የግል ዲኤንኤስ"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"የግል ዲኤንኤስ ሁነታ ይምረጡ"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ራስ-ሰር"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"የግል ዲኤንኤስ አቅራቢ አስተናጋጅ ስም"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"የዲኤንኤስ አቅራቢ አስተናጋጅ ስም ያስገቡ"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"መገናኘት አልተቻለም"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ከWi-Fi አውታረ መረቦች ጋር ሲገናኙ የማክ አድራሻን በዘፈቀደ ይስሩ"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"የሚለካ"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"ያልተለካ"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"የምዝግብ ማስታወሻ ያዥ መጠኖች"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"በአንድ ምዝግብ ማስታወሻ ቋጥ የሚኖረው የምዝግብ ማስታወሻ ያዥ መጠኖች ይምረጡ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"የምዝግብ ማስታወሻ ያዢ ቋሚ ማከማቻ ይጽዳ?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">%1$s</xliff:g> ገደማ ቀርቷል"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"በአጠቃቀምዎ (<xliff:g id="LEVEL">%2$s</xliff:g>) መሠረት <xliff:g id="TIME">%1$s</xliff:g> ገደማ ቀርቷል"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ቀርቷል"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"በአጠቃቀምዎ (<xliff:g id="LEVEL">%2$s</xliff:g>) መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"በአጠቃቀምዎ መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"እስከ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ድረስ መቆየት አለበት"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"ከ<xliff:g id="THRESHOLD">%1$s</xliff:g> ያነሰ ይቀራል"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"ከ<xliff:g id="THRESHOLD">%1$s</xliff:g> ያነሰ ይቀራል (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"ከ<xliff:g id="TIME_REMAINING">%1$s</xliff:g> በላይ ይቀራል (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"የተመዘገበ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"አልተመዘገበም"</string>
<string name="status_unavailable" msgid="7862009036663793314">"አይገኝም"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"ማክ በዘፈቀደ ይሰራል"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d መሣሪያዎች ተገናኝተዋል</item>
<item quantity="other">%1$d መሣሪያዎች ተገናኝተዋል</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"የቆይታ ጊዜ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ሁልጊዜ ጠይቅ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ልክ አሁን"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 20e245b..9c49cc8 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"تم الاتصال عبر %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"متوفرة عبر %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصلة ولكن بلا إنترنت"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"لا يتوفر اتصال إنترنت."</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"يلزم تسجيل الدخول"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"نقطة الدخول ممتلئة مؤقتًا"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"تم الاتصال عبر %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"متوفرة عبر %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"الجهاز متصل (من دون هاتف)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"الجهاز متصل (من دون وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"الجهاز متّصل (من دون هاتف أو وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"نشط، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"نشط"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"الإعدادات الصوتية للوسائط"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"المكالمات الهاتفية"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"نقل الملف"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"سماعة أذن"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"جهاز إدخال طرفي"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"بلوتوث"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"جارٍ إقران سماعة الأذن الطبية اليسرى…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"جارٍ إقران سماعة الأذن الطبية اليمنى…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"اليسرى - مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"اليمنى - مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"تم إيقاف Wi-Fi."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"تم قطع اتصال Wi-Fi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"إشارة Wi-Fi تتكون من شريط واحد."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"البقاء في الوضع النشط"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"لا يتم مطلقًا دخول الشاشة في وضع السكون أثناء الشحن"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"تمكين سجل تطفل بواجهة وحدة تحكم المضيف عبر بلوتوث"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"التقاط حزم واجهة وحدة تحكم المضيف في ملف عبر بلوتوث"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"التقاط جميع حزم واجهة وحدة تحكم المضيف (HCI) في أحد الملفات عبر البلوتوث (تبديل البلوتوث بعد تغيير هذا الإعداد)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"إلغاء قفل المصنّع الأصلي للجهاز"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"السماح بإلغاء قفل برنامج bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"هل تريد السماح بإلغاء قفل المصنّع الأصلي للجهاز؟"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"إصدار Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"اختيار إصدار Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ترميز صوت بلوتوث"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"اختيار برنامج الترميز لصوت البلوتوث"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"معدّل عيّنة صوت بلوتوث"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"اختيار برنامج ترميز صوت البلوتوث:\nمعدل العينة"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"وحدات البت لكل عيّنة في صوت بلوتوث"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"اختيار برنامج ترميز صوت البلوتوث:\nوحدات بت لكل عينة"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"وضع قناة صوت بلوتوث"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"اختيار برنامج ترميز صوت البلوتوث:\nوضع القناة"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"برنامج ترميز LDAC لصوت البلوتوث: جودة التشغيل"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"اختيار برنامج ترميز LDAC لصوت البلوتوث:\nجودة التشغيل"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"البث: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"نظام أسماء النطاقات الخاص"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"اختر وضع نظام أسماء النطاقات الخاص"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"آلي"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"اسم مضيف مزوّد نظام أسماء النطاقات الخاص"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"أدخل اسم مضيف مزوّد نظام أسماء النطاقات"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"تعذّر الاتصال"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"عرض خيارات شهادة عرض شاشة لاسلكي"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"اختيار عشوائي لعنوان MAC عند الاتصال بشبكات Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"بقياس"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"بدون قياس"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"أحجام ذاكرة التخزين المؤقت للتسجيل"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"حدد أحجامًا أكبر لكل ذاكرة تخزين مؤقت للتسجيل"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"هل تريد محو سعة التخزين الدائمة للمسجِّل؟"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"يتبقى <xliff:g id="TIME">%1$s</xliff:g> تقريبًا بناءً على استخدامك"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"يتبقى <xliff:g id="TIME">%1$s</xliff:g> تقريبًا، بناءً على استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"يتبقى <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"من المفترض أن يستمر شحن البطارية حوالي <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"من المفترض أن يستمر شحن البطارية حوالي <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك."</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"من المفترض أن يستمر شحن البطارية حوالي <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"من المفترض أن يستمر شحن البطارية حوالي <xliff:g id="TIME">%1$s</xliff:g>."</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"مُسجَّل"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"غير مُسجَّل"</string>
<string name="status_unavailable" msgid="7862009036663793314">"غير متاح"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"يتم اختيار عنوان MAC بشكل انتقائي."</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="zero">عدد الأجهزة المتصلة %1$d</item>
<item quantity="two">عدد الأجهزة المتصلة %1$d</item>
@@ -447,6 +459,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"يوم <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"المدة"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"الطلب في كل مرة"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"للتو"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index d44ce40..763a0eb 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ মাধ্যমেদি সংযোগ কৰা হৈছে"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$sৰ যোগেৰে সংযোজিত"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
@@ -53,24 +57,21 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন কৰা হ’ল"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"সংযোগ কৰি থকা হৈছে…"</string>
- <!-- no translation found for bluetooth_connected (5427152882755735944) -->
- <skip />
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> সংযোগ কৰা হ\'ল"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"যোৰা লগোৱা হৈছে…"</string>
- <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"সংযোগ কৰা হ\'ল (ফ\'ন নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"সংযোগ কৰা হ\'ল (মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"সংযোগ কৰা হ\'ল (বাৰ্তাত প্ৰৱেশাধিকাৰ নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"সংযোগ কৰা হ\'ল (কোনো ফ\'ন বা মিডিয়া নাই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"সংযোগ কৰা হ\'ল, বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"সংযোগ কৰা হ\'ল (ফ\'ন নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"সংযোগ কৰা হ\'ল (মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"সংযোগ কৰা হ\'ল (কোনো ফ\'ন বা মিডিয়া নাই), বেটাৰিৰ স্তৰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
<skip />
- <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
<skip />
- <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
- <skip />
- <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
<skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"মিডিয়াৰ অডিঅ’"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ফ\'ন কলসমূহ"</string>
@@ -84,10 +85,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ছিম প্ৰৱেশ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"এইচ্ছডি অডি\'অ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"এইচ্ছডি অডিঅ’"</string>
- <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) -->
- <skip />
- <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) -->
- <skip />
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"শ্ৰৱণ যন্ত্ৰ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"শ্ৰৱণ যন্ত্ৰৰ লগত সংযোগ কৰা হ\'ল"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিঅ’লৈ সংযোগ হৈছে"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিঅ\'ৰ লগত সংযোগ কৰা হ\'ল"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল ট্ৰান্সফাৰ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ আছে"</string>
@@ -104,8 +103,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ফ\'ন অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ফাইল স্থানান্তৰ কৰিবলৈ ব্যৱহাৰ কৰক"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ইনপুটৰ বাবে ব্যৱহাৰ কৰক"</string>
- <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) -->
- <skip />
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"শ্ৰৱণ যন্ত্ৰৰ বাবে ব্যৱহাৰ কৰক"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যোৰা লগাওক"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যোৰা লগাওক"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল কৰক"</string>
@@ -121,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"হেডফ\'ন"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ইনপুট সম্পৰ্কীয় বাহ্য় ডিভাইচ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ব্লুটুথ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"ৱাই-ফাই অফহৈ আছে।"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ৱাইফাই সংযোগ বিচ্ছিন্ন হৈ আছে।"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ৱাই-ফাই এদাল দণ্ড।"</string>
@@ -200,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"জাগ্ৰত কৰি ৰাখক"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীণ কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ব্লুটুথ HCI পেকেটসমূহ এটা ফাইলত ৰাখক"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"ঔইএম আনলক"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুটল\'ডাৰটো আনলক কৰিবলৈ অনুমতি দিয়ক"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ঔইএম আনলক কৰাৰ অনুমতি দিবনে?"</string>
@@ -211,8 +218,7 @@
<string name="debug_networking_category" msgid="7044075693643009662">"নেটৱৰ্কিং"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"বেতাঁৰ ডিছপ্লে প্ৰমাণীকৰণ"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক"</string>
- <!-- no translation found for wifi_connected_mac_randomization (3168165236877957767) -->
- <skip />
+ <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"সংযুক্ত MAC যাদৃচ্ছিকৰণ"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"ম\'বাইল ডেটা সদা-সক্ৰিয়"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string>
@@ -220,26 +226,35 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP সংস্কৰণ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP সংস্কৰণ বাছনি কৰক"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ব্লুটুথ অডিঅ’ ক’ডেক"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ব্লুটুথ অডিঅ’ ক’ডেক বাছনি কৰক"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ব্লুটুথ অডিঅ\' ছেম্পল ৰেইট"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nনমুনাৰ হাৰ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"প্ৰতি ছেম্পলত ব্লুটুথ অডিঅ\' বিটসমূহ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nবিট প্ৰতি নমুনা"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ব্লুটুথ অডিঅ\' চেনেল ম\'ড"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nচ্চেনেল ম\'ড"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ব্লুটুথ অডিঅ’ LDAC ক’ডেক: পৰিৱেশনৰ মান"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ব্লুটুথ LDAC ক\'ডেক বাছনি কৰক:\nপৰিৱেশনৰ মান"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ষ্ট্ৰীম কৰি থকা হৈছে: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ব্যক্তিগত DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ব্যক্তিগত DNS ম\'ড বাছনি কৰক"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"অফ"</string>
- <!-- no translation found for private_dns_mode_opportunistic (8314986739896927399) -->
- <skip />
+ <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"স্বয়ংক্ৰিয়"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ব্যক্তিগত ডিএনএছ প্ৰদানকাৰীৰ হোষ্টনাম"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ডিএনএছ সেৱা যোগানকাৰীৰ হ\'ষ্টনাম দিয়ক"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"বেতাঁৰ ডিছপ্লে প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string>
- <!-- no translation found for wifi_connected_mac_randomization_summary (1743059848752201485) -->
+ <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ৱাই-ফাই নেটৱৰ্কৰ লগত সংযোগ কৰি থকাৰ সময়ত MAC ঠিকনা যাদৃচ্ছিক কৰক"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
<skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"লগাৰৰ বাফাৰৰ আকাৰ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"প্ৰতিটো লগ বাফাৰত ল\'গাৰৰ আকাৰ বাছনি কৰক"</string>
@@ -319,10 +334,8 @@
<string name="immediately_destroy_activities" msgid="1579659389568133959">"কাৰ্যকলাপসমূহ নাৰাখিব"</string>
<string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ব্যৱহাৰকাৰী ওলোৱাৰ লগে লগে সকলো কাৰ্যকলাপ মচক"</string>
<string name="app_process_limit_title" msgid="4280600650253107163">"নেপথ্যত চলা প্ৰক্ৰিয়াৰ সীমা"</string>
- <!-- no translation found for show_all_anrs (4924885492787069007) -->
- <skip />
- <!-- no translation found for show_all_anrs_summary (6636514318275139826) -->
- <skip />
+ <string name="show_all_anrs" msgid="4924885492787069007">"নেপথ্য এএনআৰবোৰ দেখুৱাওক"</string>
+ <string name="show_all_anrs_summary" msgid="6636514318275139826">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই ডায়ল\'গ প্ৰদৰ্শন কৰক"</string>
<string name="show_notification_channel_warnings" msgid="1399948193466922683">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string>
<string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string>
@@ -347,12 +360,10 @@
<item msgid="8280754435979370728">"চকুৱে দেখা পোৱা ধৰণৰ প্ৰাকৃতিক ৰং"</item>
<item msgid="5363960654009010371">"ডিজিটেল সমলৰ বাবে ৰং অপ্টিমাইজ কৰা হৈছে"</item>
</string-array>
- <!-- no translation found for inactive_apps_title (9042996804461901648) -->
- <skip />
+ <string name="inactive_apps_title" msgid="9042996804461901648">"ষ্টেণ্ডবাইত থকা এপসমূহ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"নিষ্ক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
- <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
- <skip />
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"এপ্ ষ্টেণ্ডবাই অৱস্থাত আছে:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"চলিত সেৱা"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"ৱেবভিউ প্ৰয়োগ"</string>
@@ -375,40 +386,24 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই সুবিধাটো পৰীক্ষামূলক, সেয়ে ই কাৰ্যক্ষমতাৰ ওপৰত প্ৰভাৱ পেলাব পাৰে।"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
- <!-- no translation found for power_discharging_duration (6655472132189365839) -->
- <skip />
+ <string name="power_discharging_duration" msgid="6655472132189365839">"প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> সময় বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
- <!-- no translation found for power_discharging_duration_enhanced (5726302316642148671) -->
- <skip />
+ <string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"আপোনাৰ ব্যৱহাৰ (<xliff:g id="LEVEL">%2$s</xliff:g>)ক ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> সময় বাকী আছে"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> বাকী"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
- <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
- <skip />
- <!-- no translation found for power_remaining_less_than_duration (5751885147712659423) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (3176771815132876675) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8931654680569617380) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (1181059207608751924) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2606370266981054691) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (2918084807716859985) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (3090926004324573908) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7466484148515796216) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (603933521600231649) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>তকৈও কম সময় বাকী আছে"</string>
+ <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g>তকৈও কম সময় বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>তকৈও বেছি সময় বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8931654680569617380">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>তকৈও বেছি সময় বাকী আছে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="1181059207608751924">"ফ\'নটো সোনকালেই বন্ধ হ\'ব পাৰে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="2606370266981054691">"টেবলেটটো সোনকালেই বন্ধ হ\'ব পাৰে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="2918084807716859985">"ডিভাইচটো সোনকালেই বন্ধ হ\'ব পাৰে"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="3090926004324573908">"ফ\'নটো সোনকালেই বন্ধ হ\'ব পাৰে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"টেবলেটটো সোনকালেই বন্ধ হ\'ব পাৰে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"ডিভাইচটো সোনকালেই বন্ধ হ\'ব পাৰে (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"সম্পূৰ্ণকৈ চ্চাৰ্জ হ\'বলৈ <xliff:g id="TIME">%1$s</xliff:g> বাকী"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> সম্পূৰ্ণৰূপে চ্চাৰ্জ হোৱা পৰ্যন্ত"</string>
@@ -453,36 +448,25 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"পঞ্জীকৃত"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"পঞ্জীকৃত নহয়"</string>
<string name="status_unavailable" msgid="7862009036663793314">"উপলব্ধ নহয়"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
- <!-- no translation found for wifi_tether_connected_summary (3871603864314407780) -->
- <!-- no translation found for accessibility_manual_zen_more_time (1636187409258564291) -->
- <skip />
- <!-- no translation found for accessibility_manual_zen_less_time (6590887204171164991) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ক্ৰমানুসৰি ছেট কৰা হোৱা নাই"</string>
+ <plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
+ <item quantity="one">%1$dটা ডিভাইচ সংযোগ হ\'ল</item>
+ <item quantity="other">%1$dটা ডিভাইচ সংযোগ হ\'ল</item>
+ </plurals>
+ <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"অধিক সময়।"</string>
+ <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"কম সময়।"</string>
<string name="cancel" msgid="6859253417269739139">"বাতিল কৰক"</string>
<string name="okay" msgid="1997666393121016642">"ঠিক"</string>
- <!-- no translation found for zen_mode_enable_dialog_turn_on (8287824809739581837) -->
- <skip />
- <!-- no translation found for zen_mode_settings_turn_on_dialog_title (2297134204747331078) -->
- <skip />
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"অন কৰক"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"অসুবিধা নিদিব অন কৰক"</string>
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"কেতিয়াও নহয়"</string>
- <!-- no translation found for zen_interruption_level_priority (2078370238113347720) -->
- <skip />
- <!-- no translation found for zen_mode_and_condition (4927230238450354412) -->
- <skip />
- <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
- <skip />
- <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
- <skip />
- <!-- no translation found for alarm_template (4996153414057676512) -->
- <skip />
- <!-- no translation found for alarm_template_far (3779172822607461675) -->
- <skip />
- <!-- no translation found for zen_mode_duration_settings_title (229547412251222757) -->
- <skip />
- <!-- no translation found for zen_mode_duration_always_prompt_title (6478923750878945501) -->
- <skip />
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"কেৱল গুৰুত্বপূৰ্ণ"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব যদিহে তাৰ আগতে আপুনি এইটো অফ নকৰে"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
+ <string name="zen_mode_duration_settings_title" msgid="229547412251222757">"সময়ৰ পৰিসৰ"</string>
+ <string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্ৰতিবাৰতে সোধক"</string>
+ <string name="time_unit_just_now" msgid="6363336622778342422">"এই মাত্ৰ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index ce362ce..6ebb959 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s vasitəsilə qoşuludur"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s vasitəsilə əlçatandır"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Qoşuludur, internet yoxdur"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yoxdur"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Giriş tələb olunur"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Giriş nöqtəsi müvəqqəti olaraq doludur"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ilə qoşuludur"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s vasitəsilə əlçatandır"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Qoşuludur (telefon yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Qoşuludur (media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Qoşuludur (telefon və ya media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiv"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon zəngləri"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl transferi"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Qulaqlıq"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Daxiletmə periferiki"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Sol qulaqlıq birləşdirilir…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Sağ qulaqlıq birləşdirilir…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Sol - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Sağ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi sönülüdür."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi bağlantı kəsildi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi bir xətdir."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Oyaq qal"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Enereji doldurularkən ekran heç vaxt yuxu rejimində olmur"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI izləmə jurnalını aktivləşdir"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Bütün bluetooth HCI paketlərini fayla atın"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bütün Bluetooth HCI paketlərini faylda saxlayın (Bu ayarı dəyişdikdən sonra Bluetooth\'a keçin)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM kilidinin açılması"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Əməliyyat sistemi yükləyicisinin kilidinin açılmasına icazə ver"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM kilidinin açılmasına icazə verilsin?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Versiya"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP Versiyasını seçin"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth Audio Kodeki Seçin"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Nümunə Göstəricisi"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth Audio Kodekini Seçin:\nNümunə Dərəcəsi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Hər Nümunə Üçün Bluetooth Audio Bit"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth Audio Kodekini Seçin:\nHər Nümunə üçün Bit"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Kanal Rejimi"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth Audio Kodekini Seçin:\nKanal Rejimi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Kodeki:Oxutma Keyfiyyəti"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth Audio LDAC Kodek:\nOxutma Keyfiyyəti Seçin"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Canlı yayım: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Şəxsi DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Şəxsi DNS Rejimini Seçin"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Avtomatik"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Şəxsi DNS provayderinin host adı"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS provayderinin host adını daxil edin"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Qoşulmaq mümkün olmadı"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz displey sertifikatlaşması üçün seçimləri göstərir"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi şəbkələrinə qoşulan zaman ixtiyari MAC ünvanı seçin"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Ödənişli"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Limitsiz"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger bufer ölçüləri"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Hər jurnal buferinı Logger ölçüsü seçin"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Loqqerin davamlı yaddaşı silinsin?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"İstifadəyə əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"İstifadənizə <xliff:g id="LEVEL">%2$s</xliff:g> əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"İstifadəyə (<xliff:g id="LEVEL">%2$s</xliff:g>) əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"İstifadəyə əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Qalan vaxt <xliff:g id="THRESHOLD">%1$s</xliff:g> və daha azdır"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Qalan vaxt <xliff:g id="THRESHOLD">%1$s</xliff:g> və daha azdır (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Qalan vaxt <xliff:g id="TIME_REMAINING">%1$s</xliff:g> və daha çoxdur (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Qeydiyyatlı"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Qeydiyyatsız"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Əlçatmazdır"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ixtiyari olaraq seçildi"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d cihaz qoşuludur</item>
<item quantity="one">%1$d cihaz qoşuludur</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> olduqda"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Müddət"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Hər dəfə soruşun"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"İndicə"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 7dbf7b3..7631498 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupna je preko pristupne tačke %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Veza je uspostavljena, nema interneta"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema interneta"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Treba da se prijavite"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno zauzeta"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezano preko %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupno preko %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona ili medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivan, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivan"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medija"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos datoteke"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slušalice"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferni uređaj za unos"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Uparivanje levog slušnog aparata…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Uparivanje desnog slušnog aparata…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Levi – nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Desni – nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi je isključen."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi veza je prekinuta."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi signal ima jednu crtu."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ne zaključavaj"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran neće biti u režimu spavanja tokom punjenja"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogući snoop evidenciju za Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Snimi sve Bluetooth HCI pakete u datoteci"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimi sve Bluetooth HCI pakete u datoteci (Uključite/isključite Bluetooth kada promenite ovo podešavanje)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Otključavanje OEM-a"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dozvoli otključavanje funkcije za pokretanje"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li da dozvolite otključavanje proizvođača originalne opreme (OEM)?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzija Bluetooth AVRCP-a"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Izaberite verziju Bluetooth AVRCP-a"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth audio kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Izaberite Bluetooth audio kodek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorkovanja za Bluetooth audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Izaberite Bluetooth audio kodek:\nbrzina uzorkovanja"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bitova po uzorku za Bluetooth audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Izaberite Bluetooth audio kodek:\nbitova po uzorku"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Režim kanala za Bluetooth audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Izaberite Bluetooth audio kodek:\nrežim kanala"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth audio kodek LDAC: kvalitet reprodukcije"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Izaberite Bluetooth audio kodek LDAC:\nkvalitet reprodukcije"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Strimovanje: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privatni DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Izaberite režim privatnog DNS-a"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatski"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Ime hosta dobavljača usluge privatnog DNS-a"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Unesite ime hosta dobavljača usluge DNS-a"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Povezivanje nije uspelo"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Izaberi nasumičnu MAC adresu tokom povezivanja na Wi‑Fi mreže"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Sa ograničenjem"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Bez ograničenja"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Veličine bafera podataka u programu za evidentiranje"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Izaberite veličine po baferu evidencije"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Želite li da obrišete stalni memorijski prostor programa za evidentiranje?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Na osnovu potrošnje imate još otprilike <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Na osnovu korišćenja imate još približno <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Preostalo vreme: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrovan je"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nije registrovan"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nedostupno"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC adresa je nasumično izabrana"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Povezan je %1$d uređaj</item>
<item quantity="few">Povezana su %1$d uređaja</item>
@@ -444,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uvek pitaj"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sada"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f2efd7e..ee54231 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Даступна праз %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Падключана, без доступу да інтэрнэту"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пункт доступу часова заняты"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Падлучана праз %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Даступна праз %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў і аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аўдыё медыяпрылады"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Тэлефонныя выклікі"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Перадача файлаў"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Навушнікі"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Перыферыйная прылада ўводу"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi выключаны."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi адлучаны."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Адзiн слупок Wi-Fi."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Прадухіляць ад пераходу ў рэжым сну"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Экран ніколі не ўвайдзе ў рэжым сну падчас зарадкі"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Уключыць журнал адсочвання Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Захаваць усе пакеты bluetooth HCI у адным файле"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Захоўваць усе пакеты Bluetooth HCI у файле (пераключыце Bluetooth пасля змены гэтай налады)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Разблакіроўка OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дазволіць разблакіроўку загрузчыка"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дазволіць разблакіроўку OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версія Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Выбраць версію Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Кодэк Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Выбраць аўдыякодэк Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Частата дыскрэтызацыі Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Выбраць аўдыякодэк Bluetooth:\nчастата дыскрэтызацыі"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Біты на сэмпл для Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Выбраць аўдыякодэк Bluetooth:\nбіты на сэмпл"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Канальны рэжым Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Выбраць аўдыякодэк Bluetooth:\nканальны рэжым"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Аўдыякодэк Bluetooth LDAC: якасць прайгравання"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Выбраць аўдыякодэк Bluetooth LDAC:\nякасць прайгравання"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Перадача плынню: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Прыватная DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Выберыце рэжым прыватнай DNS"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Аўтаматычна"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Імя вузла аператара прыватнай DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Увядзіце імя вузла аператара DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Паказаць опцыі сертыфікацыі бесправаднога дысплея"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Падвыс. узровень дэтал-цыі журнала Wi‑Fi у залежн. ад SSID RSSI у Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Генерыраваць выпадковы MAC-адрас пры падключэнні да сетак Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Памеры буфера для сродку вядзення журнала"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Выберыце памеры сродку вядзення журнала для буфераў журнала"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ачысціць пастаяннае сховішча журнала?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Засталося каля <xliff:g id="TIME">%1$s</xliff:g> на аснове вашага выкарыстання"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць на <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Засталося <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Зараду хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Зараду хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Засталося менш за <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Узровень зараду батарэі: <xliff:g id="LEVEL">%2$s</xliff:g> (хопіць менш чым на <xliff:g id="THRESHOLD">%1$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Узровень зараду батарэі: <xliff:g id="LEVEL">%2$s</xliff:g> (хопіць больш чым на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Зарэгістраваны"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Не зарэгістраваны"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Адсутнічае"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Выпадковы MAC-адрас"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d прылада падключана</item>
<item quantity="few">%1$d прылады падключаны</item>
@@ -445,6 +469,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Працягласць"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Заўсёды пытацца"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Зараз"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 4b765d0..817a783 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Установена е връзка през „%1$s“"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Мрежата е достъпна през „%1$s“"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Установена е връзка – няма достъп до интернет"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Няма връзка с интернет"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Изисква се вход в профила"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точката за достъп временно е пълна"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Установена е връзка през %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Мрежата е достъпна през %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Свързано (без телефон), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Свързано (без мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Свързано (без телефон или мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Активно. Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Активно"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Мултимедийно аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонни обаждания"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Прехвърляне на файл"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Слушалки"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Периферен вход"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Слуховият апарат за ляво ухо се сдвоява…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Слуховият апарат за дясно ухо се сдвоява…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"За ляво ухо. Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"За дясно ухо. Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi е изключен."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Няма връзка с Wi-Fi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi е с една чертичка."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Да остане активен"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Екранът никога няма да е в спящ режим при зареждане"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Активиране на рег. файл за анализ за Bluetooth с протокола HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Заснемане на всички пакети за Bluetooth с протокола HCI във файла"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Всички пакети за комуникация през Bluetooth чрез HCI да се записват във файл (превключване на Bluetooth след промяна на тази настройка)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Отключване от OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Разрешаване на първонач. зареждащата прогр. да се откл."</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Да се разреши ли отключване от OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версия на AVRCP за Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Избиране на версия на AVRCP за Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Аудиокодек за Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Изберете аудиокодек за Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Честота на дискретизация за звука през Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Изберете аудиокодек за Bluetooth:\nЧестота на дискретизация"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Битове на дискрет за звука през Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Изберете аудиокодек за Bluetooth:\nБитове на дискрет"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Режим на канала на звука през Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Изберете аудиокодек за Bluetooth:\nРежим на канала"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Кодек за звука през Bluetooth с технологията LDAC: Качество на възпроизвеждане"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Изберете кодек за звука през Bluetooth с технологията LDAC:\nКачество на възпроизвеждане"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Поточно предаване: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Частен DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Изберете режим на частния DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматично"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Име на хоста на доставчика на частния DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Въведете името на хоста на DNS доставчика"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Не можа да се установи връзка"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показване на опциите за сертифициране на безжичния дисплей"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Рандомизиране на MAC адреса при свързване с Wi-Fi мрежи"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"С отчитане"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Без отчитане"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Размери на регистрац. буфери"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Размер на един рег. буфер: Избор"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Да се изчистят ли трайно съхраняваните регистрационни данни?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Още около <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Още около <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Оставащо време: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Остава/т по-малко от <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Остава/т по-малко от <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Остава/т повече от <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Регистрирано"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Не е регистрирано"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Няма данни"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC адресът е рандомизиран"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d устройства са свързани</item>
<item quantity="one">%1$d устройство е свързано</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"в/ъв <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Времетраене"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Да се пита винаги"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Току-що"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index f6e22b4..35f82e5 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে সংযুক্ত হয়েছে"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযুক্ত, ইন্টারনেট নেই"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"এই মুহূর্তে অ্যাক্সেস পয়েন্টের কোনও কানেকশন ফাঁকা নেই"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s এর মাধ্যমে সংযুক্ত হয়েছে"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s এর মাধ্যমে পাওয়া যাচ্ছে"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"কানেক্ট করা আছে (ফোনের অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"কানেক্ট করা আছে (মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"কানেক্ট করা আছে (ফোনের বা মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"মিডিয়া অডিও"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ফোন কল"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ফাইল স্থানান্তর"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"হেডফোন"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"পেরিফেরাল ইনপুট"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ব্লুটুথ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"ওয়াই ফাই বন্ধ৷"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ওয়াই ফাই এর সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ওয়াই ফাই এ একটি দণ্ড৷"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"জাগিয়ে রাখুন"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"চার্জ হওয়ার স্ক্রীন কখনই নিদ্রা মোডে যাবে না"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ লগ সক্ষম করুন"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"একটি ফাইলে সব bluetooth HCI প্যাকেট ক্যাপচার করুন"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM আনলক করা হচ্ছে"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুট-লোডার আনলক করার অনুমতি দিন"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM আনলক করার অনুমতি দিতে চান?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP ভার্সন"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP ভার্সন বেছে নিন"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ব্লুটুথ অডিও কোডেক"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ব্লুটুথ অডিও কোডেক বেছে নিন"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ব্লুটুথ অডিওর নমুনা হার"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ব্লুটুথ অডিও কোডেক বেছে নিন:\nস্যাম্পল রেট"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"নমুনা প্রতি ব্লুটুথ অডিও বিট"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ব্লুটুথ অডিও কোডেক বেছে নিন:\nবিটস পার স্যাম্পল"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ব্লুটুথ অডিও চ্যানেল মোড"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ব্লুটুথ অডিও কোডেক বেছে নিন:\nচ্যানেল মোড"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ব্লুটুথ অডিও LDAC কোডেক: প্লেব্যাক গুণমান"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ব্লুটুথ অডিও LDAC কোডেক বেছে নিন:\nপ্লেব্যাক গুণমান"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"স্ট্রিমিং: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ব্যক্তিগত ডিএনএস"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ব্যক্তিগত ডিএনএস মোড বেছে নিন"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"অটোমেটিক"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ব্যক্তিগত ডিএনএস প্রদানকারীর হোস্টনেম"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ডিএনএস প্রদানকারীর হোস্টনেম লিখুন"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করার সময় MAC অ্যাড্রেস র্যান্ডমাইজ করুন"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"লগার বাফারের আকারগুলি"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"লগ বাফার প্রতি অপেক্ষাকৃত বড় আকারগুলির বেছে নিন"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"লগারের স্টোরেজ সাফ করবেন?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">%1$s</xliff:g> বাকি"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"বর্তমান ব্যবহার অনুযায়ী আর আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> এর থেকেও কম বাকি আছে"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"আর <xliff:g id="THRESHOLD">%1$s</xliff:g>-এর কম চার্জ বাকি আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"আরও <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-এর বেশি চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"রেজিস্টার করা"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"রেজিস্টার করা নয়"</string>
<string name="status_unavailable" msgid="7862009036663793314">"অনুপলব্ধ"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC র্যান্ডমাইজ করা হয়েছে"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$dটি ডিভাইস সংযুক্ত</item>
<item quantity="other">%1$dটি ডিভাইস সংযুক্ত</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"তারিখ ও সময় <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"সময়কাল"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্রতিবার জিজ্ঞেস করা হবে"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"এখনই"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 172fb3c..3e51f16 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupan preko %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, nema interneta"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema internetske veze"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Potrebna je prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno puna"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezana koristeći %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupna koristeći %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona ili medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivan"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medija"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenošenje fajla"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slušalice"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Ulazni periferni uređaj"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Uparivanje lijevog slušnog aparata…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Uparivanje desnog slušnog aparata…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Lijevi - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Desni - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi isključen."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi nije povezan."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi jedna crtica."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ostani aktivan"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran neće prelaziti u stanje mirovanja tokom punjenja"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogući Bluetooth HCI snoop zapis"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Smjesti sve Bluetooth HCI pakete u datoteku"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimite sve Bluetooth HCI pakete u datoteku (uključite/isključite Bluetooth nakon promjene ove postavke)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM otključavanje"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dozvoli otključavanje bootloadera"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li dozvoliti OEM otključavanje?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP verzija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Odaberite Bluetooth AVRCP verziju"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Odaberite Bluetooth Audio kodek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorkovanja za Bluetooth audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Odaberite Bluetooth Audio kodek:\nBrzina uzorka"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth audio bitovi po uzorku"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Odaberite Bluetooth Audio kodek:\nBita po uzorku"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Način Bluetooth audio kanala"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Odaberite Bluetooth Audio kodek:\nNačin rada kanala"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC kodek: Kvalitet reprodukcije"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Odaberite Bluetooth Audio LDAC kodek:\nKvalitet reprodukcije"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Prijenos: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privatni DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Odaberite način rada privatnog DNS-a"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatski"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Naziv host računara privatnog DNS-a"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Unesite naziv host računara pružaoca DNS-a"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Povezivanje nije uspjelo"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži opcije za certifikaciju Bežičnog prikaza"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećajte nivo Wi-Fi zapisivanja, pokazati po SSID RSSI Wi-Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Nasumično odaberi MAC adresu prilikom povezivanja na Wi-Fi mreže"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"S naplatom"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Mreža bez ograničenja"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Veličine bafera za zapisnik"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Odaberite veličine za Logger prema međumemoriji evidencije"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Želite li izbrisati trajnu pohranu zapisivača?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Preostalo je još oko <xliff:g id="TIME">%1$s</xliff:g>, na osnovu vašeg korištenja"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Preostalo je još oko <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Imate još <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Trebala bi trajati do otprilike <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrirano"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nije registrirano"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nije dostupno"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC adresa je nasumično odabrana"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Povezan je %1$d uređaj</item>
<item quantity="few">Povezana su %1$duređaja</item>
@@ -444,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 56acc36..a5b92de 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connectada, sense Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punt d\'accés està temporalment ple"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connectat mitjançant %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible mitjançant %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon ni al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Àudio multimèdia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Trucades telefòniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferència del fitxer"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auricular"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Perifèric d\'entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desactivada."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconnectada."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Senyal Wi-Fi: una barra."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Pantalla activa"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla no entra mai en mode de repòs si el dispositiu està carregant-se"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activa registre cerca HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Captura tots els paquets HCI de Bluetooth en un fitxer"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Captura tots els paquets HCI de Bluetooth en un fitxer (activa el Bluetooth un cop hagis canviat aquesta opció)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueig d\'OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permet desbloquejar el bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permetre el desbloqueig d\'OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versió AVRCP de Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona la versió AVRCP de Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Còdec d\'àudio per Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selecciona el còdec d\'àudio per Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Velocitat de mostra d’àudio per Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selecciona el còdec d\'àudio per Bluetooth:\nFreqüència de mostratge"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits per mostra de l\'àudio per Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selecciona el còdec d\'àudio per Bluetooth:\nBits per mostra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Mode de canal de l\'àudio per Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selecciona el còdec d\'àudio per Bluetooth:\nMode de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Còdec LDAC d\'àudio per Bluetooth: qualitat de reproducció"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selecciona el còdec LDAC d\'àudio per Bluetooth:\nQualitat de reproducció"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"S\'està reproduint en temps real: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privat"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecciona el mode de DNS privat"</string>
@@ -223,17 +246,23 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automàtic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'amfitrió del proveïdor de DNS privat"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introdueix el nom d\'amfitrió del proveïdor de DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra les opcions de certificació de pantalla sense fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Augmenta nivell de registre Wi‑Fi i mostra\'l per SSID RSSI al Selector de Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Aleatoritza l\'adreça MAC quan estiguis connectat a una xarxa Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Mides memòria intermèdia Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Mida Logger per memòria intermèdia"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vols esborrar l\'emmagatzematge persistent del registrador?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"Quan deixem de supervisar amb el registrador persistent, hem d\'esborrar les dades del registrador que hi ha al teu dispositiu."</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"Emm. dades reg. persist. a disp."</string>
<string name="select_logpersist_dialog_title" msgid="4003400579973269060">"Selecciona memòries interm. de registre per emmag. de manera persistent al disp."</string>
- <string name="select_usb_configuration_title" msgid="2649938511506971843">"Selecciona configuració USB"</string>
- <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"Selecciona configuració USB"</string>
+ <string name="select_usb_configuration_title" msgid="2649938511506971843">"Selecciona configuració d\'USB"</string>
+ <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"Selecciona configuració d\'USB"</string>
<string name="allow_mock_location" msgid="2787962564578664888">"Ubicacions simulades"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"Permet les ubicacions simulades"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"Inspecció d\'atributs de visualització"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Temps restant inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Temps restant inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Temps restant superior a <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrat"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Sense registrar"</string>
<string name="status_unavailable" msgid="7862009036663793314">"No disponible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"L\'adreça MAC és aleatòria"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositius connectats</item>
<item quantity="one">%1$d dispositiu connectat</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durada"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pregunta sempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Ara mateix"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index cbad3ef..5c2037d 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Připojeno prostřednictvím %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupné prostřednictvím %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Připojeno, není k dispozici internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nejste připojeni k internetu"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Je vyžadováno přihlášení"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Přístupový bod je dočasně zaplněn"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Připojeno prostřednictvím %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupné prostřednictvím %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu a médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivní, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivní"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk médií"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonní hovory"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Přenos souborů"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Sluchátka"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferní vstupní zařízení"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Párování levého naslouchátka…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Párování pravého naslouchátka…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Levá strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Pravá strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterie"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Síť Wi-Fi je vypnuta."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Síť Wi-Fi je odpojena."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi – jedna čárka."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Nevypínat obrazovku"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Obrazovka se při nabíjení nepřepne do režimu spánku"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Povolit protokol Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Zachytit všechny pakety Bluetooth HCI do souboru"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zachytit všechny pakety Bluetooth HCI do souboru (po změně tohoto nastavení přepnout Bluetooth)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Odemknutí OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Povolit odemknutí zavaděče"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Povolit odemknutí OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verze profilu Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Vyberte verzi profilu Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio – kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Vyberte zvukový kodek Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio – vzorkovací frekvence"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Vyberte zvukový kodek Bluetooth:\nVzorkovací frekvence"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio – počet bitů na vzorek"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Vyberte zvukový kodek Bluetooth:\nPočet bitů na vzorek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio – režim kanálu"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Vyberte zvukový kodek Bluetooth:\nRežim kanálu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodek Bluetooth Audio LDAC: Kvalita přehrávání"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Vyberte kodek Bluetooth Audio LDAC:\nKvalita přehrávání"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streamování: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Soukromé DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Vyberte soukromý režim DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaticky"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Název hostitele poskytovatele soukromého DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Zadejte název hostitele poskytovatele DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nelze se připojit"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobrazit možnosti certifikace bezdrátového displeje"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Při připojení k sítím Wi-Fi používat náhodnou adresu MAC"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Měřená"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Neměřená"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Vyrovnávací paměť protokol. nástroje"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Velikost vyrovnávací paměti protokol. nástroje"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vymazat trvalé úložiště protokolovacího nástroje?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Při vašem obvyklém využití zbývá asi <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) zbývá asi <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zbývající čas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Při vašem obvyklém využití vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Zbývá více než <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrováno"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Neregistrováno"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Není k dispozici"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Adresa MAC je vybrána náhodně"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="few">Připojena %1$d zařízení</item>
<item quantity="many">Připojeno %1$d zařízení</item>
@@ -445,6 +457,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trvání"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pokaždé se zeptat"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Právě teď"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 33f09cb..7a693b5 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilsluttet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgængelig via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilsluttet – intet internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Adgangspunktet er midlertidigt fuldt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tilsluttet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tilgængelig via %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon eller medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonopkald"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverførsel"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hovedtelefoner"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Eksterne inputenheder"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi er slået fra."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi er afbrudt."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi har én bjælke."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Lås ikke"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skærmen går ikke i dvale under opladning"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivér Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Gem alle Bluetooth HCI-pakker i en fil"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Gem alle Bluetooth HCI-pakker i en fil (slå Bluetooth fra og til igen, når du har ændret denne indstilling)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-oplåsning"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillad, at startindlæseren låses op"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vil du tillade OEM-oplåsning?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Vælg AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-lydcodec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Vælg codec for Bluetooth-lyd"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Eksempelfrekvens for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Vælg codec for Bluetooth-lyd:\nSamplingfrekvens"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bit pr. eksempel for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Vælg codec for Bluetooth-lyd:\nBits pr. sampling"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Kanaltilstand for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Vælg codec for Bluetooth-lyd:\nKanaltilstand"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"LDAC-codec for Bluetooth-lyd: Afspilningskvalitet"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Vælg LDAC-codec for Bluetooth-lyd:\nAfspilningskvalitet"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streamer: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privat DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Vælg privat DNS-tilstand"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname for privat DNS-udbyder"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Angiv hostname for DNS-udbyder"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis valgmuligheder for certificering af trådløs skærm"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Brug en tilfældig MAC-adresse, når der oprettes forbindelse til Wi‑Fi-netværk"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Størrelser for Logger-buffer"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Vælg Logger-størrelser pr. logbuffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vil du rydde det permanente lager for logger?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Der er ca. <xliff:g id="TIME">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Ca. <xliff:g id="TIME">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> tilbage"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Der er mindre end <xliff:g id="THRESHOLD">%1$s</xliff:g> tilbage"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Der er mindre end <xliff:g id="THRESHOLD">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Der er mere end <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registreret"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ikke registreret"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Utilgængelig"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-adressen er tilfældig"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d enhed er tilsluttet</item>
<item quantity="other">%1$d enheder er tilsluttet</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varighed"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spørg hver gang"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Lige nu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index a704850..b7eb02a 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Über %1$s verbunden"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Verfügbar über %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbunden, kein Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Zugangspunkt vorübergehend voll belegt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Über %1$s verbunden"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Verfügbar über %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Telefon-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (weder Telefon- noch Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medien-Audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonanrufe"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dateiübertragung"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kopfhörer"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Eingabeperipherie"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"WLAN: aus"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"WLAN getrennt"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WLAN: ein Balken"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Aktiv lassen"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Display wird beim Laden nie in den Ruhezustand versetzt"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI-Snoop-Protokoll aktivieren"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Alle Bluetooth HCI-Pakete in einer Datei erfassen"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth HCI-Pakete in einer Datei erfassen (Wenn diese Einstellung geändert wurde, muss Bluetooth umgeschaltet werden)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-Entsperrung"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-Entsperrung zulassen"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-Entsperrung zulassen?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP-Version auswählen"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-Audio-Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth-Audio-Codec auswählen"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth-Audio-Abtastrate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth-Audio-Codec auswählen:\nAbtastrate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth-Audio/Bits pro Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth-Audio-Codec auswählen:\nBits pro Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modus des Bluetooth-Audiokanals"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth-Audio-Codec auswählen:\nKanalmodus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth-Audio-LDAC-Codec: Wiedergabequalität"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth-Audio-LDAC-Codec auswählen:\nWiedergabequalität"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privates DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Privaten DNS-Modus auswählen"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisch"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname des privaten DNS-Anbieters"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Hostname des DNS-Anbieters eingeben"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Level für WLAN-Protokollierung erhöhen, in WiFi Picker pro SSID-RSSI anzeigen"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC-Adresse randomisieren, wenn WLAN-Verbindungen hergestellt werden"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger-Puffergrößen"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Größe pro Protokollpuffer wählen"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Speicher der dauerhaften Protokollierung löschen?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noch ca. <xliff:g id="TIME">%1$s</xliff:g>, basierend auf deiner Nutzung"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Noch ca. <xliff:g id="TIME">%1$s</xliff:g>, basierend auf deiner Nutzung (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Noch <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Weniger als <xliff:g id="THRESHOLD">%1$s</xliff:g> verbleibend"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Weniger als <xliff:g id="THRESHOLD">%1$s</xliff:g> verbleibend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mehr als <xliff:g id="TIME_REMAINING">%1$s</xliff:g> verbleibend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registriert"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nicht registriert"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nicht verfügbar"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-Adresse wird zufällig festgelegt"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d Geräte verbunden</item>
<item quantity="one">%1$d Gerät verbunden</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"am <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Dauer"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Jedes Mal fragen"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Gerade eben"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 53713f0..28798a7 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Συνδέθηκε μέσω %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Διαθέσιμο μέσω %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Συνδέθηκε, χωρίς σύνδεση στο διαδίκτυο"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Απαιτείται σύνδεση"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Το σημείο πρόσβασης είναι προσωρινά πλήρες"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Συνδέθηκε μέσω %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Διαθέσιμο μέσω %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Σε σύνδεση (χωρίς τηλέφωνο), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Σε σύνδεση (χωρίς μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Σε σύνδεση (χωρίς τηλέφωνο ή μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ενεργό, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ενεργό"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Ήχος πολυμέσων"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Τηλεφωνικές κλήσεις"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Μεταφορά αρχείου"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Ακουστικά"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Περιφερειακό εισόδου"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Σύζευξη αριστερού ακουστικού βοηθήματος…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Σύζευξη δεξιού ακουστικού βοηθήματος…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Αριστερά - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Δεξιά - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> μπαταρία"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ανενεργό."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Το Wi-Fi έχει αποσυνδεθεί."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Μία γραμμή Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Παραμονή σε λειτουργία"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Η οθόνη δεν θα μεταβαίνει ποτέ σε κατάσταση αδράνειας κατά τη φόρτιση"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ενερ/ση καταγρ. Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Καταγραφή όλων των πακέτων bluetooth HCI σε ένα αρχείο"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Καταγραφή όλων των πακέτων Bluetooth HCI σε ένα αρχείο (Εναλλαγή Bluetooth μετά την αλλαγή αυτής της ρύθμισης)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Ξεκλείδωμα OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Να επιτρέπεται το ξεκλείδωμα λειτουργίας εκκίνησης"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Να επιτρέπεται το ξεκλείδωμα OEM;"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Έκδοση AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Επιλογή έκδοσης AVRCP Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Κωδικοποιητής ήχου Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Επιλογή κωδικοποιητή ήχου Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Ρυθμός δειγματοληψίας ήχου Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Επιλογή κωδικοποιητή ήχου Bluetooth:\nΠοσοστό δείγματος"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bit ανά δείγμα ήχου Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Επιλογή κωδικοποιητή ήχου Bluetooth:\nBit ανά δείγμα"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Λειτουργία καναλιού ήχου Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Επιλογή κωδικοποιητή ήχου Bluetooth:\nΛειτουργία καναλιού"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Κωδικοποιητής LDAC ήχου Bluetooth: Ποιότητα αναπαραγωγής"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Επιλογή κωδικοποιητή LDAC ήχου Bluetooth:\nΠοιότητα αναπαραγωγής"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Ροή: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Ιδιωτικό DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Επιλέξτε τη λειτουργία ιδιωτικού DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Αυτόματα"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Όνομα κεντρικού υπολογιστή παρόχου DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Εισαγάγετε το όνομα κεντρικού υπολογιστή του παρόχου DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Δεν ήταν δυνατή η σύνδεση"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Τυχαιοποίηση διεύθυνσης MAC κατά τη σύνδεση σε δίκτυα Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Μέτρηση με βάση τη χρήση"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Χωρίς μέτρηση με βάση τη χρήση"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Μέγεθος αρχείων κατ/φής ανά προ/νή μνήμη αρχείου κατ/φής"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Διαγραφή αποθηκευτικού χώρου μόνιμων αρχείων καταγραφής;"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Απομένει/ουν περίπου <xliff:g id="TIME">%1$s</xliff:g> με βάση τη χρήση σας"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Απομένει/ουν περίπου <xliff:g id="TIME">%1$s</xliff:g>, ανάλογα με τη χρήση σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Απομένει/ουν <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Απομένει/ουν λιγότερo/α από <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Απομένει/ουν λιγότερo/α από <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Απομένουν περισσότερα/ες από <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Εγγεγραμμένη"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Μη εγγεγραμμένη"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Μη διαθέσιμο"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Η διεύθυνση MAC είναι τυχαία"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d συσκευές συνδέθηκαν</item>
<item quantity="one">%1$d συσκευή συνδέθηκε</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"το/τη(ν) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Διάρκεια"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Να ερωτώμαι κάθε φορά"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Μόλις τώρα"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 8ad2f89..018c33b 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Active"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pairing left hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pairing right hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Left – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Right – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi off."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi disconnected."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi one bar."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all Bluetooth HCI packets in a file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select private DNS mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Couldn\'t connect"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomise MAC address when connecting to Wi‑Fi networks"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Metered"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Unmetered"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string>
@@ -438,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 8ad2f89..018c33b 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Active"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pairing left hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pairing right hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Left – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Right – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi off."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi disconnected."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi one bar."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all Bluetooth HCI packets in a file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select private DNS mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Couldn\'t connect"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomise MAC address when connecting to Wi‑Fi networks"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Metered"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Unmetered"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string>
@@ -438,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 8ad2f89..018c33b 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Active"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pairing left hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pairing right hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Left – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Right – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi off."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi disconnected."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi one bar."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all Bluetooth HCI packets in a file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select private DNS mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Couldn\'t connect"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomise MAC address when connecting to Wi‑Fi networks"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Metered"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Unmetered"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string>
@@ -438,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 8ad2f89..018c33b 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Active"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pairing left hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pairing right hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Left – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Right – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi off."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi disconnected."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi one bar."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all Bluetooth HCI packets in a file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select private DNS mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Couldn\'t connect"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomise MAC address when connecting to Wi‑Fi networks"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Metered"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Unmetered"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string>
@@ -438,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 6cbb23d..02c0872 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"No internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign in required"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Active, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Active"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pairing left hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pairing right hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Left - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Right - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi off."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi disconnected."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi one bar."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all bluetooth HCI packets in a file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Private DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Select Private DNS Mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatic"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Private DNS provider hostname"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Enter hostname of DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Couldn\'t connect"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomize MAC address when connecting to Wi‑Fi networks"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Metered"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Unmetered"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string>
@@ -438,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 2a54c13..662ecda 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conexión a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectado pero sin conexión a Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punto de acceso está completo temporalmente"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conexión a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin teléfono ni archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi inhabilitado"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Una barra de Wi-Fi"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Permanecer activo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando."</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Registro de Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Captura todos los paquetes de Bluetooth HCI en un archivo."</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos los paquetes de Bluetooth HCI de un archivo (Activar o desactivar el Bluetooth después de cambiar esta opción)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que el cargador de inicio se desbloquee"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"¿Permitir desbloqueo de OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión de AVRCP del Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona la versión de AVRCP del Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec del audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Seleccionar códec del audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Frecuencia de muestreo del audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Seleccionar códec del audio Bluetooth:\nVelocidad de la muestra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por muestra del audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Seleccionar códec del audio Bluetooth:\nBits por muestra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal del audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Seleccionar códec del audio Bluetooth:\nModo de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Códec del audio Bluetooth LDAC: calidad de reproducción"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Seleccionar códec del audio Bluetooth LDAC:\nCalidad de reproducción"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Transmitiendo: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privado"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecciona el modo de DNS privado"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nombre de host del proveedor de DNS privado"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ingresa el nombre de host del proveedor de DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones de certificación de pantalla inalámbrica"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Seleccionar la dirección MAC de forma aleatoria cuando se establezca conexión con redes Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Selecciona el tamaño del Logger por búfer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"¿Borrar el almacenamiento persistente del registrador?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Aproximadamente <xliff:g id="TIME">%1$s</xliff:g> restantes en función del uso"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tiempo restante: <xliff:g id="TIME">%1$s</xliff:g> aproximadamente según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Sin registrar"</string>
<string name="status_unavailable" msgid="7862009036663793314">"No disponible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"La dirección MAC es aleatoria"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositivos conectados</item>
<item quantity="one">%1$d dispositivo conectado</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"el <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Recién"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index f4fb7f3..3647f43 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sin Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto de acceso temporalmente lleno"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin audio de teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin audio multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin audio de teléfono ni multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas de teléfono"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desactivado."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Una barra de Wi-Fi."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Pantalla activa"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla nunca entra en modo de suspensión si el dispositivo se está cargando"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Registro de búsqueda de HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturar todos los paquetes de Bluetooth HCI en un archivo"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos los paquetes de Bluetooth HCI de un archivo (Alternar la conexión Bluetooth después de cambiar esta opción)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir desbloquear el bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"¿Permitir desbloqueo de OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona la versión AVRCP del Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selecciona el códec de audio por Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Porcentaje de muestreo de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selecciona el códec de audio por Bluetooth:\nFrecuencia de muestreo"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits de audio por Bluetooth por muestra"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selecciona el códec de audio por Bluetooth:\nBits por muestra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selecciona el códec de audio por Bluetooth:\nModo de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Selecciona el códec LDAC por Bluetooth: calidad de reproducción"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selecciona el códec LDAC de audio por Bluetooth:\nCalidad de reproducción"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privado"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecciona el modo de DNS privado"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nombre de host de proveedor de DNS privado"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduce el nombre de host del proveedor de DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar el nivel de registro de Wi-Fi, mostrar por SSID RSSI en el selector Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Ordenar las direcciones MAC de forma aleatoria al conectarse a redes Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de registrador"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Elige el tamaño del Logger por búfer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"¿Borrar almacenamiento continuo del registrador?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Queda menos del <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Queda más del <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"No registrado"</string>
<string name="status_unavailable" msgid="7862009036663793314">"No disponible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"La dirección MAC es aleatoria"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositivos conectados</item>
<item quantity="one">%1$d dispositivo conectado</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Fecha: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Justo ahora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index de256af..0998679 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ühendatud üksuse %1$s kaudu"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Saadaval üksuse %1$s kaudu"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ühendatud, Interneti-ühendus puudub"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pääsupunkt on ajutiselt täis"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Ühendatud operaatori %1$s kaudu"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Saadaval operaatori %1$s kaudu"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ühendatud (telefoni pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ühendatud (meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ühendatud (telefoni ega meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Meedia heli"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonikõned"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failiedastus"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kõrvaklapid"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Sisestatud välisseade"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi on välja lülitatud."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"WiFi-ühendus on katkestatud."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi: üks pulk."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Jää sisselülitatuks"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekraan ei lähe kunagi laadimise ajal unerežiimi"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Luba Bluetoothi HCI jälgimise logi"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Hõiva kõik faili Bluetoothi HCI paketid"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Jäädvusta kõik failis olevad Bluetoothi HCI-paketid (pärast seade muutmist muutke Bluetoothi olekut)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-i avamine"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Luba buudilaadur avada"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Kas lubada OEM-i avamine?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetoothi AVRCP versioon"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Valige Bluetoothi AVRCP versioon"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetoothi heli kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Valige Bluetoothi helikodek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetoothi heli diskreetimissagedus"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Valige Bluetoothi helikodek:\ndiskreetimissagedus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetoothi heli bitte diskreedi kohta"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Valige Bluetoothi helikodek:\nbitte diskreetimise kohta"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetoothi heli kanalirežiim"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Valige Bluetoothi helikodek:\nkanalirežiim"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetoothi LDAC-helikodek: taasesituskvaliteet"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Valige Bluetoothi LDAC-helikodek:\ntaasesituskvaliteet"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Voogesitus: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privaatne DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Valige privaatse DNS-i režiim"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaatne"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Privaatse DNS-i teenusepakkuja hostinimi"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Sisestage DNS-i teenusepakkuja hostinimi"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Määra WiFi-võrkudega ühenduse loomisel juhuslik MAC-aadress"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Logija puhvri suurused"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Vali logija suur. logipuhvri kohta"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Kas kustutada logija püsivalt salvestatud andmed?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Teie kasutuse alusel on jäänud ligikaudu <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Teie kasutuse põhjal on jäänud umbes <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> on jäänud"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Peaks kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Peaks kestma kuni <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Jäänud on alla <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Jäänud on alla <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Jäänud on üle <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registreeritud"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ei ole registreeritud"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Pole saadaval"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-aadress on juhuslikuks muudetud"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d seadet on ühendatud</item>
<item quantity="one">%1$d seade on ühendatud</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"– <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kestus"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Küsi iga kord"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Äsja"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 1fd4639..2c98966 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s bidez konektatuta"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s bidez erabilgarri"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Konektatuta; ezin da atzitu Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Sarbide-puntua beteta dago aldi baterako"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s bidez konektatuta"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s bidez erabilgarri"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Konektatuta (telefonoaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Konektatuta (gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Konektatuta (telefonoaren edo gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Euskarriaren audioa"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono-deiak"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fitxategi-transferentzia"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Aurikularra"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Idazteko gailua"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth gailua"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Desaktibatuta dago Wi-Fi konexioa."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Deskonektatu egin da Wi-Fi konexioa."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi sarearen barra bat."</string>
@@ -150,7 +168,7 @@
<string name="tts_default_sample_string" msgid="4040835213373086322">"Hizketa-sintesiaren adibide bat da hau"</string>
<string name="tts_status_title" msgid="7268566550242584413">"Hizkuntza lehenetsiaren egoera"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> guztiz onartzen da."</string>
- <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> eskualde-ezarpenak sareko konexioa behar du"</string>
+ <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> lurralde-ezarpenak sareko konexioa behar du"</string>
<string name="tts_status_not_supported" msgid="4491154212762472495">"Ez da <xliff:g id="LOCALE">%1$s</xliff:g> onartzen"</string>
<string name="tts_status_checking" msgid="5339150797940483592">"Egiaztatzen…"</string>
<string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> motorraren ezarpenak"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Mantendu aktibo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Pantaila ez da inoiz inaktibo ezarriko kargatu bitartean"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Gaitu Bluetooth HCI miatze-erregistroa"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Bildu Bluetooth HCI pakete guztiak fitxategi batean"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bildu fitxategi bateko Bluetooth HCI pakete guztiak (aldatu Bluetooth konexioaren egoera ezarpen hau aldatu ondoren)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM desblokeoa"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Onartu abiarazlea desblokeatzea"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM desblokeoa onartu nahi duzu?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Hautatu Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth bidezko audioaren kodeka"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Hautatu Bluetooth audioaren kodeka"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth bidezko audioaren lagin-abiadura"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Hautatu Bluetooth audioaren LDAC kodeka:\nlaginaren abiadura"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth bidezko audioaren lagin bakoitzeko bit kopurua"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Hautatu Bluetooth audioaren kodeka:\nlagin bakoitzeko bitak"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth bidezko audioaren kanalaren modua"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Hautatu Bluetooth audioaren kodeka:\nkanal modua"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth audioaren LDAC kodeka: erreprodukzioaren kalitatea"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Hautatu Bluetooth audioaren LDAC kodeka:\nerreprodukzioaren kalitatea"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Igortzean: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS pribatua"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Hautatu DNS pribatuaren modua"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatikoa"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"DNS hornitzaile pribatuaren ostalari-izena"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Idatzi DNS hornitzailearen ostalari-izena"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Erakutsi hari gabeko bistaratze-egiaztapenaren aukerak"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago Wi-Fi sareetan saioa hasterakoan. Erakutsi sarearen identifikatzailea eta seinalearen indarra Wi‑Fi sareen hautagailuan."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Aukeratu ausaz MAC helbideak Wi‑Fi sareetara konektatzean"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Erregistroen buffer-tamainak"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Hautatu erregistroen buffer-tamainak"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Erregistro iraunkorraren biltegia garbitu nahi duzu?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"<xliff:g id="TIME">%1$s</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Erabilera kontuan izanda, <xliff:g id="TIME">%1$s</xliff:g> inguru gelditzen dira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> guztiz kargatu arte"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> baino gutxiago gelditzen dira"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> baino gutxiago gelditzen da (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> baino gehiago gelditzen da (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Erregistratuta"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Erregistratu gabe"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ez dago erabilgarri"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Ausaz aukeratutako MAC helbidea"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d gailu daude konektatuta</item>
<item quantity="one">%1$d gailu dago konektatuta</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Iraupena"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Galdetu beti"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Oraintxe"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 140ce4b..9635019 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"متصل از طریق %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"در دسترس از طریق %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصل، بدون اینترنت"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"عدم دسترسی به اینترنت"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ورود به سیستم لازم است"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ظرفیت نقطه دسترسی موقتاً تکمیل شده است"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"متصل ازطریق %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"در دسترس ازطریق %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"متصل (بدون تلفن)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"متصل (بدون رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"متصل (بدون تلفن یا رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"فعال، <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"فعال"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"رسانه صوتی"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"تماسهای تلفنی"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"انتقال فایل"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"هدفون"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ورودی محیطی"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"بلوتوث"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"درحال مرتبطسازی با سمعک چپ…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"درحال مرتبطسازی با سمعک راست…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"چپ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"راست - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> شارژ باتری"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi‑Fi خاموش است."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi قطع شد."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"یک نوار برای Wi‑Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"بیدار ماندن"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"صفحه هرگز در حین شارژ شدن به حالت خواب نمیرود"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"فعال کردن گزارش تجسس Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ذخیره تمامی بستههای HCI بلوتوث در یک فایل"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ضبط همه بستههای HCI بلوتوثها در یک فایل (بعد از تغییر این تنظیم، بلوتوث را روشن/خاموش کنید)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"بازکردن سازنده تجهیزات اصلی"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"اجازه دهید قفل بوتلودر باز شود"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"بازکردن سازنده تجهیزات اصلی مجاز (OEM) است؟"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"نسخه AVRCP بلوتوث"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"انتخاب نسخه AVRCP بلوتوث"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"کدک بلوتوث صوتی"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"انتخاب کدک صوتی بلوتوث"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"سرعت نمونه بلوتوث صوتی"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"انتخاب کدک صوتی بلوتوث:\nنرخ نمونه"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"بیتهای بلوتوث صوتی در هر نمونه"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"انتخاب کدک صوتی بلوتوث:\nبیت در نمونه"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"حالت کانال بلوتوث صوتی"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"انتخاب کدک صوتی بلوتوث:\nحالت کانال"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"کدک LDAC صوتی بلوتوث: کیفیت پخش"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"انتخاب کدک LDAC صوتی بلوتوث:\nکیفیت پخش"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"پخش جریانی: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS خصوصی"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"حالت DNS خصوصی را انتخاب کنید"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"خودکار"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"نام میزبان ارائهدهنده DNS خصوصی"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"نام میزبان ارائهدهنده DNS خصوصی را وارد کنید"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"متصل نشد"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"نمایش گزینهها برای گواهینامه نمایش بیسیم"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"افزایش سطح گزارشگیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخابکننده Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"تصادفی کردن نشانی MAC هنگام اتصال به شبکههای Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"کنتوردار"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"بدون کنتور"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"اندازههای حافظه موقت ثبتکننده"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"انتخاب اندازه ثبتکننده در حافظه موقت ثبت"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"حافظه دائم ثبتکننده پاک شود؟"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"براساس میزان مصرف شما، <xliff:g id="TIME">%1$s</xliff:g> باقیمانده است"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"بسته به مصرفتان، حدوداً <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) شارژ باقی است"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> باقی مانده"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"با توجه به میزان مصرفتان (<xliff:g id="LEVEL">%2$s</xliff:g>)، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"باتوجه به میزان مصرفتان، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) شارژ داشته باشید"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"کمتر از <xliff:g id="THRESHOLD">%1$s</xliff:g> باقی مانده"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"کمتر از <xliff:g id="THRESHOLD">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"بیش از <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"ثبتشده"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ثبت نشده است"</string>
<string name="status_unavailable" msgid="7862009036663793314">"در دسترس نیست"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"ویژگی تصادفیسازی MAC فعال است"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d دستگاه متصل</item>
<item quantity="other">%1$d دستگاه متصل</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"روز <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"مدت"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"هربار پرسیده شود"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"هماکنون"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 3f1d036..fe85a6c 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Yhdistetty seuraavan kautta: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Käytettävissä seuraavan kautta: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Yhdistetty, ei internetyhteyttä"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Yhteyspiste tilapäisesti täynnä"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Yhdistetty, verkko: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Käytettävissä, verkko: %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Yhdistetty (ei puhelimen ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Yhdistetty (ei median ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Yhdistetty (ei puhelimen tai median ääntä), akun varaustaso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Median ääni"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Puhelut"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Tiedostonsiirto"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kuulokkeet"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Syöttölisälaite"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi pois käytöstä"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Ei Wi-Fi-yhteyttä"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-signaali – yksi palkki"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Pysy käynnissä"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Näyttö ei sammu puhelimen latautuessa"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ota Bluetoothin HCI-tarkkailuloki käyttöön"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Tallenna kaikki Bluetoothin HCl-paketit tiedostoon"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tallenna kaikki Bluetoothin HCl-paketit tiedostoon (ota Bluetooth käyttöön tämän asetuksen muuttamisen jälkeen)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM:n lukituksen avaus"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Salli käynnistysohjelman lukituksen avaaminen"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Sallitaanko OEM:n lukituksen avaus?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetoothin AVRCP-versio"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Valitse Bluetoothin AVRCP-versio"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-äänen koodekki"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Valitse Bluetooth-äänen koodekki"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth-ääninäytteen siirtonopeus"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Valitse Bluetooth-äänen koodekki:\nSiirtonopeus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth-äänen bittiä/näyte-arvo"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Valitse Bluetooth-äänen koodekki:\nBittiä/näyte"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth-äänen kanavatila"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Valitse Bluetooth-äänen koodekki:\nKanavatila"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth-äänen LDAC-koodekki: Toiston laatu"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Valitse Bluetooth-äänen LDAC-koodekki:\nToiston laatu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Striimaus: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Yksityinen DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Valitse yksityinen DNS-tila"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaattinen"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Yksityisen DNS-tarjoajan isäntänimi"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Anna isäntänimi tai DNS-tarjoaja."</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Näytä langattoman näytön sertifiointiin liittyvät asetukset"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Käytä satunnaista MAC-osoitetta, kun yhdistät Wi-Fi-verkkoon"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Lokipuskurien koot"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Valitse puskurikohtaiset lokikoot"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Tyhjennetäänkö lokityökalun pysyvä tallennustila?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noin <xliff:g id="TIME">%1$s</xliff:g> jäljellä käytön perusteella"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Noin <xliff:g id="TIME">%1$s</xliff:g> jäljellä käyttösi perusteella (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> jäljellä"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Varaus loppuu noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Varaus loppuu noin <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Alle <xliff:g id="THRESHOLD">%1$s</xliff:g> jäljellä"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Alle <xliff:g id="THRESHOLD">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Yli <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Rekisteröity"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ei rekisteröity"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ei käytettävissä"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-osoite satunnaistetaan"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d laitetta liitetty</item>
<item quantity="one">%1$d laite liitetty</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kesto"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Kysy aina"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Äsken"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index e3d7896..270a868 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté par %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Accessible par %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Le point d\'accès est temporairement plein"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connecté par %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Accessible par %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Paramètres audio du support"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Écouteurs"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Périphérique d\'entrée"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi désactivé."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi déconnecté."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi : une barre."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Rester activé"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"L\'écran ne se met jamais en veille lors du chargement"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activer le journal HCI Snoop Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturer tous les paquets HCI Bluetooth dans un fichier"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"Déverrouillage par le fabricant"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Autoriser le déverrouillage du fichier d\'amorce"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permettre le déverrouillage par le fabricant?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Version du profil Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Sélectionner la version du profil Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Sélectionner le codec audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taux d\'échantillonnage pour l\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Sélectionner le codec audio Bluetooth :\nTaux d\'échantillonnage"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits par échantillon pour l\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Sélectionner le codec audio Bluetooth :\nBits par échantillon"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Mode de canal pour l\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Sélectionner le codec audio Bluetooth :\nMode de chaîne"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec audio Bluetooth LDAC : qualité de lecture"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Sélectionner le codec audio Bluetooth LDAC :\nQualité de lecture"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Diffusion : <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privé"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Sélectionnez le mode DNS privé"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Entrez le nom d\'hôte du fournisseur DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options pour la certification d\'affichage sans fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Sélectionner l\'adresse MAC de manière aléatoire lors de la connexion aux réseaux Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Tailles des mémoires tampons d\'enregistreur"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Tailles enreg. par tampon journal"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Supprimer les données de l\'enregistreur?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre usage"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Enregistré"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Non enregistré"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Non accessible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Les adresses MAC sont randomisées"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d appareil connecté</item>
<item quantity="other">%1$d appareils connectés</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durée"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 2fa0364..6712813 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Point d\'accès temporairement plein"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connecté via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponible via %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Multimédia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Casque audio"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Périphérique d\'entrée"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi désactivé"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi déconnecté"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Signal Wi-Fi faible"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Rester activé"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"L\'écran ne se met jamais en veille lors du chargement."</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activer journaux HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Enregistrer tous les paquets HCI Bluetooth dans un fichier"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Enregistrer tous les paquets HCI Bluetooth dans un fichier (Activez/désactivez le Bluetooth après avoir modifié ce paramètre.)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Déverrouillage OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Autoriser le déverrouillage du chargeur d\'amorçage"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Autoriser le déverrouillage OEM ?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Version Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Sélectionner la version Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Sélectionner le codec audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taux d\'échantillonnage audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Sélectionner le codec audio Bluetooth :\nTaux d\'échantillonnage"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Nombre de bits par échantillon pour l\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Sélectionner le codec audio Bluetooth :\nBits par échantillon"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Mode de chaîne de l\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Sélectionner le codec audio Bluetooth :\nMode de chaîne"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec audio Bluetooth LDAC : qualité de lecture"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Sélectionner le codec audio Bluetooth LDAC :\nQualité de lecture"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Diffusion : <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privé"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Sélectionner le mode DNS privé"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Saisissez le nom d\'hôte du fournisseur DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options de la certification de l\'affichage sans fil"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler plus infos Wi-Fi, afficher par RSSI de SSID dans outil sélection Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Sélectionner l\'adresse MAC de manière aléatoire lors de la connexion aux réseaux Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Tailles mémoires tampons enregistr."</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Tailles enreg. par tampon journal"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Effacer l\'espace de stockage persistant de l\'enregistreur ?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de l\'utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de l\'utilisation"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Enregistré"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Non enregistré"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Non disponible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"La sélection des adresses MAC est aléatoire"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d appareil connecté</item>
<item quantity="other">%1$d appareils connectés</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durée"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 995658d..bacea23 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dispoñible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sen Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Non hai conexión a Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É obrigatorio iniciar sesión"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"O punto de acceso está temporalmente cheo"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dispoñible a través de %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono nin audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Dispositivo activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Activo"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de ficheiros"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Sincronizando audiófono esquerdo…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Sincronizando audiófono dereito…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Dereito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi desactivada."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi desconectada."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Unha barra de wifi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Pantalla activa"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"A pantalla nunca estará en modo de suspensión durante a carga"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activar rexistro de busca HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturar todos os paquetes HCI Bluetooth nun ficheiro"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Captura todos os paquetes HCI Bluetooth nun ficheiro (activa/desactiva o Bluetooth despois de cambiar esta opción de configuración)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo do OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que se desbloqueo o cargador de inicio"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Queres permitir o desbloqueo do OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP de Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona a versión AVRCP de Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Seleccionar códec de audio por Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taxa de mostraxe de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Seleccionar códec de audio por Bluetooth:\nfrecuencia de mostraxe"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por mostra de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Seleccionar códec de audio por Bluetooth:\nbits por mostra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canle de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Seleccionar códec de audio por Bluetooth:\nmodo de canle"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Códec LDAC de audio por Bluetooth: calidade de reprodución"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Seleccionar códec LDAC de audio por Bluetooth:\ncalidade de reprodución"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Reprodución en tempo real: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privado"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecciona o modo de DNS privado"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome de host de provedor de DNS privado"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduce o nome de host de provedor de DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Non se puido conectar"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opcións para o certificado de visualización sen fíos"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nivel de rexistro da wifi, mostrar por SSID RSSI no selector de wifi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Selecciona aleatoriamente o enderezo MAC cando te conectes a redes wifi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"De pago por consumo"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Sen pago por consumo"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de rexistrador"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Seleccionar tamaños por búfer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Queres borrar o almacenamento continuo do rexistrador?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo restante aproximado en función do uso: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tempo restante aproximado en función do uso: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tempo restante inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Tempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Tempo restante: máis de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Rexistrado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Non rexistrado"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Non dispoñible"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"O enderezo MAC é aleatorio"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositivos conectados</item>
<item quantity="one">%1$d dispositivo conectado</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"na seguinte data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar sempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 5522a74..8972930 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s દ્વારા ઉપલબ્ધ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"કનેક્ટ કર્યું, કોઈ ઇન્ટરનેટ નથી"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ઍક્સેસ પૉઇન્ટ અસ્થાયીરૂપે ભરાયેલ છે"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s દ્વારા ઉપલબ્ધ"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન અથવા મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"મીડિયા ઑડિઓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ફોન કૉલ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ફાઇલ સ્થાનાંતરણ"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"હેડફોન"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ઇનપુટ પેરિફેરલ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"બ્લૂટૂથ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi બંધ."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi ડિસ્કનેક્ટ થયું."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi એક બાર."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"સક્રિય રાખો"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ચાર્જિંગ દરમિયાન સ્ક્રીન ક્યારેય નિષ્ક્રિય થશે નહીં"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"બ્લૂટૂથ HCI સ્નૂપ લૉગ સક્ષમ કરો"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ફાઇલમાં તમામ બ્લૂટૂથ HCI પૅકેટ્સ કેપ્ચર કરો"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM અનલૉકિંગ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"બુટલોડર અનલૉક કરવાની મંજૂરી આપો"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ને અનલૉક કરવાની મંજૂરી આપીએ?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"બ્લૂટૂથ AVRCP સંસ્કરણ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"બ્લૂટૂથ AVRCP સંસ્કરણ પસંદ કરો"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"બ્લૂટૂથ ઑડિઓ કોડેક"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"બ્લૂટૂથ ઑડિઓ નમૂના દર"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો:\nનમૂના દર"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"નમૂના દીઠ બ્લૂટૂથ ઑડિઓ બિટ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"બ્લૂટૂથ ઑડિઓ કોડેક પસંદ કરો:\nનમૂના દીઠ બિટ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"બ્લૂટૂથ ઑડિઓ ચેનલ મોડ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"બ્લૂટૂથ ઑડિઓ કોડેક પસંદ કરો:\nચૅનલ મોડ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક: પ્લેબૅક ગુણવત્તા"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો:\nપ્લેબૅક ગુણવત્તા"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"સ્ટ્રીમિંગ: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ખાનગી DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ખાનગી DNS મોડને પસંદ કરો"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"આપમેળે"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ખાનગી DNS પ્રદાતા હોસ્ટનું નામ"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS પ્રદાતાના હોસ્ટનું નામ દાખલ કરો"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"વાઇ-ફાઇ નેટવર્ક સાથે જ્યારે કનેક્ટ કરી રહ્યાં હોય ત્યારે MAC ઍડ્રેસને રેન્ડમાઇઝ કરો"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"લોગર બફર કદ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"લૉગ દીઠ લૉગર કદ બફર પસંદ કરો"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"લૉગર નિરંતર સ્ટોરેજ સાફ કરીએ?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"તમારા વપરાશનાં આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> બાકી છે"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> બાકી"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> કરતાં ઓછો સમય બાકી છે"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> કરતાં ઓછો સમય બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> કરતાં વધુ સમય બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"રજિસ્ટર કરેલ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"રજિસ્ટર કરેલ નથી"</string>
<string name="status_unavailable" msgid="7862009036663793314">"અનુપલબ્ધ"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MACને રેન્ડમ કરેલ છે"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d ઉપકરણ કનેક્ટ કર્યું</item>
<item quantity="other">%1$d ઉપકરણો કનેક્ટ કર્યા</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> વાગ્યે"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"અવધિ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"દર વખતે પૂછો"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"હમણાં જ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 13047fd..296da2d 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्ट हो गया है, लेकिन इंटरनेट नहीं है"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस प्वाइंट फ़िलहाल भरा हुआ है"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s के ज़रिए कनेक्ट"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s के ज़रिए उपलब्ध"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"जुड़ गया (मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडियो"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फ़ोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फ़ाइल स्थानांतरण"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"हेडफ़ोन"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"इनपुट पेरिफ़ेरल"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ब्लूटूथ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"वाई-फ़ाई बंद है."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"वाई-फ़ाई डिसकनेक्ट है."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"वाई-फ़ाई का एक बार है."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"स्क्रीन को चालू रखें"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज करते समय स्क्रीन कभी भी कम बैटरी मोड में नहीं जाएगी"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग चालू करें"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"फ़ाइल के सभी ब्लूटूथ HCI पैकेट कैप्चर करें"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करना"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर को अनलाॅक किए जाने की अनुमति दें"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करने की अनुमति दें?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP वर्शन"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटूथ AVRCP वर्शन चुनें"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ब्लूटूथ ऑडियो कोडेक"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ब्लूटूथ ऑडियो कोडेक चुनें"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ब्लूटूथ ऑडियो नमूना दर"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ब्लूटूथ ऑडियो कोडेक चुनें:\nनमूना दर"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ब्लूटूथ ऑडियो बिट प्रति नमूना"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ब्लूटूथ ऑडियो कोडेक चुनें:\nबिट प्रति नमूना"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ब्लूटूथ ऑडियो चैनल मोड"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लूटूथ ऑडियो कोडेक चुनें:\nचैनल मोड"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लूटूथ ऑडियो LDAC कोडेक: प्लेबैक क्वालिटी"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लूटूथ ऑडियो LDAC कोडेक चुनें:\nप्लेबैक क्वालिटी"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"चलाया जा रहा है: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"निजी DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"निजी DNS मोड चुनें"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"अपने आप"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"निजी DNS सेवा देने वाले का होस्टनाम"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS सेवा देने वाले का होस्टनाम डालें"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस दिखाई देने के लिए प्रमाणन विकल्प दिखाएं"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाई-फ़ाई प्रवेश स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"वाई-फ़ाई से जुड़ते समय अलग-अलग एमएसी पते इस्तेमाल करें"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"लॉगर बफ़र आकार"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"प्रति लॉग बफ़र लॉगर आकार चुनें"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"लॉगर सतत मेमोरी साफ़ करें?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"आपके उपयोग के आधार पर लगभग <xliff:g id="TIME">%1$s</xliff:g> का समय बचा है"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> में खत्म हो जाएगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> शेष"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम समय बचा है"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा चलने लायक बैटरी बची है (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"रजिस्टर है"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"रजिस्टर नहीं है"</string>
<string name="status_unavailable" msgid="7862009036663793314">"अनुपलब्ध"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"एमएसी पता रैंडम पर सेट है"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d डिवाइस जुड़े हैं</item>
<item quantity="other">%1$d डिवाइस जुड़े हैं</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"अलार्म <xliff:g id="WHEN">%1$s</xliff:g> को बजेगा"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"अवधि"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"हर बार पूछें"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"अभी-अभी"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 97298bb..8f4cff8 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupno putem %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, bez interneta"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna je točka privremeno puna"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Povezano putem mreže %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupno putem mreže %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona i medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medijski zvuk"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prijenos datoteke"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slušalice"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferni uređaj za unos"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi je isključen."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi je isključen."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi signal ima jedan stupac."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ne pokreći mirovanje"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Zaslon nikad neće prijeći u mirovanje tijekom punjenja"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Zapisi za Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Snimi sve Bluetooth HCI pakete u datoteci"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimi sve Bluetooth HCI pakete u datoteci (uključite/isključite Bluetooth nakon promjene te postavke)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM otključavanje"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Neka kôd za pokretanje sustava bude otključan"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li dopustiti OEM otključavanje?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzija AVRCP-a za Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Odaberite verziju AVRCP-a za Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Kodek za Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Odaberi kodek za Bluetooth Audio"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorka za Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Odaberi kodek za Bluetooth Audio:\nbrzina uzorkovanja"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bitovi po uzorku za Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Odaberi kodek za Bluetooth Audio:\nbitovi po uzorku"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Način kanala za Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Odaberi kodek za Bluetooth Audio:\nnačin kanala"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodek za Bluetooth Audio LDAC: kvaliteta reprodukcije"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Odaberi kodek za Bluetooth Audio LDAC:\nkvaliteta reprodukcije"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Strujanje: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privatni DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Odaberite način privatnog DNS-a"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatski"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Naziv hosta davatelja usluge privatnog DNS-a"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Unesite naziv hosta davatelja usluge DNS-a"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaži opcije za certifikaciju bežičnog prikaza"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Nasumično odaberi MAC adresu pri povezivanju s Wi-Fi mrežama"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Veličine međuspremnika zapisnika"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Odaberite veličinu međuspremnika zapisnika"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Želite li izbrisati trajnu pohranu zapisivača?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Još <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrirano"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nije registrirano"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nije dostupno"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC adresa određena je nasumično"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Povezan je %1$d uređaj</item>
<item quantity="few">Povezana su %1$d uređaja</item>
@@ -444,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sad"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 0b27780..2c31478 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Csatlakozva a következőn keresztül: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Elérhető a következőn keresztül: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Csatlakozva, nincs internet-hozzáférés"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"A hozzáférési pont átmenetileg megtelt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Csatlakozva a következőn keresztül: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Elérhető a következőn keresztül: %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Csatlakoztatva (telefonhang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Csatlakoztatva (médiahang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Csatlakoztatva (nincs telefon- és médiahang); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Média audió"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonhívások"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fájlátvitel"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Fejhallgató"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Beviteli periféria"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi kikapcsolva."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Nincs Wi-Fi-kapcsolat."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-jel: egy sáv."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Nem kapcsolódik ki"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"A képernyő soha nem kapcsol ki töltés során"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop napló engedélyezése"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Az összes Bluetooth HCI-csomag rögzítése egy fájlban"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Az összes Bluetooth HCI-csomag rögzítése egy fájlban (Bluetooth bekapcsolása a beállítás módosítása után)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-feloldás"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"A rendszerbetöltő feloldásának engedélyezése"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Engedélyezi az OEM-feloldást?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"A Bluetooth AVRCP-verziója"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"A Bluetooth AVRCP-verziójának kiválasztása"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth hang – Kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth hangkodek kiválasztása"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth hang – mintavételezési gyakoriság"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth hangkodek kiválasztása:\nmintavételi gyakoriság"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth hang – bit/minta"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth hangkodek kiválasztása:\nbit/minta"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth hang – Csatornamód"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth hangkodek kiválasztása:\ncsatornamód"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth LDAC hangkodek: lejátszási minőség"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth LDAC hangkodek kiválasztása:\nlejátszási minőség"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streamelés: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privát DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"„Privát DNS” mód kiválasztása"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatikus"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Privát DNS-szolgáltató gazdagépneve"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Adja meg a DNS-szolgáltató gazdagépnevét"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC-cím véletlenszerű generálása Wi‑Fi-hálózatra való csatlakozáskor"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Naplózási puffer mérete"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Naplózási pufferméret kiválasztása"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Törli a naplózó program állandó tárhelyét?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Körülbelül <xliff:g id="TIME">%1$s</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"A használat alapján nagyjából <xliff:g id="TIME">%1$s</xliff:g> maradt (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> van hátra"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Kevesebb mint <xliff:g id="THRESHOLD">%1$s</xliff:g> van hátra"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Kevesebb mint <xliff:g id="THRESHOLD">%1$s</xliff:g> van hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Kevesebb mint <xliff:g id="TIME_REMAINING">%1$s</xliff:g> van hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Regisztrált"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nem regisztrált"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nem érhető el"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"A MAC-cím generálása véletlenszerű."</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d eszköz csatlakozik</item>
<item quantity="one">%1$d eszköz csatlakozik</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ezen a napon: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Időtartam"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Mindig kérdezzen rá"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Az imént"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index bf7f492..de2cfc9 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Կապակցված է %1$s-ի միջոցով"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Հասանելի է %1$s-ի միջոցով"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Միացված է, սակայն ինտերնետ կապ չկա"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Հասանելիության կետը ժամանակավորապես լիքն է"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Միացված է %1$s-ի միջոցով"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Հասանելի է %1$s-ի միջոցով"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Միացված է (հեռախոս չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Միացված է (մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Միացված է (հեռախոս կամ մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Մեդիա աուդիո"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Հեռախոսազանգեր"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Ֆայլերի փոխանցում"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Ականջակալ"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Մուտքի արտաքին սարքեր"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi-ն անջատված է:"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi-ը կապակցված չէ:"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-ի ուժգնությունը՝ մեկ գիծ:"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Մնալ արթուն"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Էկրանը երբեք չի քնի լիցքավորման ընթացքում"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Միացնել Bluetooth HCI snoop log-ը"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Կորզել բոլոր bluetooth HCI փաթեթները մի ֆայլում"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Բոլոր Bluetooth HCI փաթեթները պահել մեկ ֆայլում (այս կարգավորումը փոխելուց հետո անհրաժեշտ է վերագործարկել Bluetooth-ը)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ապակողպում"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Թույլ տալ սկզբնաբեռնման բեռնիչի ապակողպումը"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Թույլատրե՞լ OEM ապակողպումը:"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP տարբերակը"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Ընտրել Bluetooth AVRCP տարբերակը"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth աուդիո կոդեկ"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Ընտրեք Bluetooth աուդիո կոդեկը"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth աուդիոյի Ընդհատավորման հաճախականությունը"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Ընտրեք Bluetooth աուդիո կոդեկը՝\nընդհատավորման հաճախականություն"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth աուդիո, բիթ / նմուշ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Ընտրեք Bluetooth աուդիո կոդեկը՝\nբիթ/նմուշ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth աուդիո կապուղու ռեժիմը"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Ընտրեք Bluetooth աուդիո կոդեկը՝\nկապուղու ռեժիմ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth աուդիո LDAC կոդեկ՝ նվագարկման որակ"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Ընտրեք Bluetooth աուդիո LDAC կոդեկը՝\nնվագարկման որակ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Հեռարձակում՝ <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Անհատական DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Ընտրեք անհատական DNS սերվերի ռեժիմը"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Ավտոմատ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Անհատական DNS ծառայության մատակարարի խնամորդի անունը"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Մուտքագրեք DNS ծառայության մատակարարի խնամորդի անունը"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ցույց տալ անլար էկրանի հավաստագրման ընտրանքները"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Պատահականորեն ընտրել MAC հասցեն Wi-Fi ցանցերին միանալիս"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Տեղեկամատյանի պահնակի չափերը"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Ընտրեք տեղեկամատյանի չափը մեկ պահնակի համար"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ջնջե՞լ մատյանի մշտական հիշողությունը:"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Մնացել է մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ օգտագործման եղանակից կախված"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) կբավարարի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Մնացել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Լիցքը պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Լիցքը պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Մնացել է <xliff:g id="THRESHOLD">%1$s</xliff:g>-ից պակաս"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Մնացել է <xliff:g id="THRESHOLD">%1$s</xliff:g>-ից պակաս (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Մնացել է ավելի քան <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Գրանցված է"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Գրանցված չէ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Անհասանելի"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC հասցեն պատահականորեն է փոխվում"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Միացված է %1$d սարք</item>
<item quantity="other">Միացված է %1$d սարք</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Տևողություն"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Հարցնել ամեն անգամ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Հենց նոր"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 4bf0790..eb611ac 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Terhubung melalui %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tersambung, tidak ada internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Tidak ada internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Perlu login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh untuk sementara"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tersambung melalui %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Terhubung (tanpa ponsel), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Terhubung (tanpa media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Terhubung (tanpa ponsel atau media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktif, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktif"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Panggilan telepon"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfer file"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferal Masukan"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Menyambungkan alat bantu dengar sebelah kiri…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Menyambungkan alat bantu dengar sebelah kanan…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kiri - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kanan - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi tidak aktif."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi tidak tersambung."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi satu baris."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Tetap terjaga"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Layar tidak akan redup selama mengisi daya"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktifkan log pengintaian HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Tangkap semua paket HCI bluetooth di dalam file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Mengambil semua paket HCI Bluetooth dalam satu file (Aktifkan Bluetooth setelah mengubah setelan ini)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Buka kunci OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Izinkan bootloader dibuka kuncinya"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Izinkan buka kunci OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Pilih Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Pilih Codec Audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Frekuensi Sampel Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Pilih Codec Audio Bluetooth:\nFrekuensi Sampel"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bit Per Sampel Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Pilih Codec Audio Bluetooth:\nBit Per Sampel"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Mode Channel Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Pilih Codec Audio Bluetooth:\nMode Channel"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec LDAC Audio Bluetooth: Kualitas Pemutaran"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Pilih Codec LDAC Audio Bluetooth:\nKualitas Pemutaran"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS Pribadi"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Pilih Mode DNS Pribadi"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Otomatis"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname penyedia DNS pribadi"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Masukkan hostname penyedia DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Tidak dapat terhubung"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Acak alamat MAC saat menghubungkan ke jaringan Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Berbayar"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Tidak berbayar"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Ukuran penyangga pencatat log"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Ukuran Pencatat Log per penyangga log"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Hapus penyimpanan tetap pencatat log?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kira-kira <xliff:g id="TIME">%1$s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tersisa kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> tersisa"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Terdaftar"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Tidak terdaftar"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Tidak Tersedia"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC diacak"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d perangkat terhubung</item>
<item quantity="one">%1$d perangkat terhubung</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durasi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Selalu tanya"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Baru saja"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 913f2f8..337fa89 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tengt í gegnum %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Í boði í gegnum %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tengt, enginn netaðgangur"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Aðgangsstaður tímabundið fullur"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tengt í gegnum %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Í boði í gegnum %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Tengt (enginn sími), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Tengt (ekkert efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Tengt (enginn sími eða efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Hljóð efnis"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Símtöl"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Skráaflutningur"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Heyrnartól"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Jaðartæki með inntak"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Slökkt á Wi-Fi."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi ótengt."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: Eitt strik."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Vaka"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skjárinn fer aldrei í hvíld við hleðslu"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Gera HCI-snuðraraskrá Bluetooth virka"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Fanga alla HCI-pakka Bluetooth í skrá"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Fanga alla HCI-pakka Bluetooth í skrá (Velja skal Bluetooth eftir að þessari stillingu er breytt)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Opnun framleiðanda"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Leyfa opnun ræsiforritsins"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Leyfa opnun framleiðanda?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-útgáfa"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Velja Bluetooth AVRCP-útgáfu"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth hljóðkóðari"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Velja Bluetooth-hljóðkóðara"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth hljóðtökutíðni"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Velja hljóðkóðara Bluetooth:\ntökutíðni"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth hljóðbitar í úrtaki"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Velja hljóðkóðara Bluetooth:\nbitar í úrtaki"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Hljóðrásarstilling Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Velja hljóðkóðara Bluetooth:\nstilling rásar"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth LDAC-hljóðkóðari: gæði spilunar"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Velja Bluetooth LDAC-hljóðkóðara:\ngæði spilunar"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streymi: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Lokað DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Velja lokaða DNS-stillingu"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Sjálfvirkt"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hýsilheiti lokaðrar DNS-veitu"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Slá inn hýsilheiti DNS-veitu"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Sýna valkosti fyrir vottun þráðlausra skjáa"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Velja MAC-vistfang af handahófi þegar tengst er við Wi‑Fi net"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Annálsritastærðir biðminna"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Veldu annálsritastærðir á biðminni"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Hreinsa varanlega geymslu annálsrita?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"U.þ.b. <xliff:g id="TIME">%1$s</xliff:g> eftir miðað við notkun þína"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Um það bil <xliff:g id="TIME">%1$s</xliff:g> eftir miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> eftir"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minna en <xliff:g id="THRESHOLD">%1$s</xliff:g> eftir"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Minna en <xliff:g id="THRESHOLD">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Meira en <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Skráð"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ekki skráð"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ekki tiltækt"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-vistfang er valið af handahófi"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d tæki tengt</item>
<item quantity="other">%1$d tæki tengd</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"á/í <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Lengd"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spyrja í hvert skipti"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Rétt í þessu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 6627618..d2f5ff1 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Collegato tramite %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibile tramite %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connesso, senza Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto di accesso momentaneamente al completo"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Connesso tramite %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponibile tramite %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono escluso), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono o contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimediale"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonate"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Trasferimento file"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Cuffie"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferica di immissione"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi non attivo."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Rete Wi-Fi scollegata."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: una barra."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Rimani attivo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Lo schermo non va mai in stand-by se sotto carica"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Attiva log di esame HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Acquisisci tutti i pacchetti HCI Bluetooth in un file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Acquisisci tutti i pacchetti HCI Bluetooth in un file (attiva/disattiva il Bluetooth dopo aver modificato questa impostazione)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Sblocco OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Consenti lo sblocco del bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Consentire lo sblocco OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versione Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Seleziona versione Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Seleziona il codec audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Frequenza di campionamento audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Seleziona il codec audio Bluetooth:\nFrequenza di campionamento"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bit per campione dell\'audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Seleziona il codec audio Bluetooth:\nBit per campione"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modalità canale audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Seleziona il codec audio Bluetooth:\nModalità canale"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec LDAC audio Bluetooth: qualità di riproduzione"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Seleziona il codec LDAC audio Bluetooth:\nQualità di riproduzione"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privato"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Seleziona modalità DNS privato"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatico"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome host del provider DNS privato"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Inserisci il nome host del provider DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opzioni per la certificazione display wireless"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumenta il livello di registrazione Wi-Fi, mostrando il SSID RSSI nel selettore Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Seleziona indirizzo MAC casuale con reti Wi-Fi collegate"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Dimensioni buffer Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Seleziona dimensioni Logger per buffer log"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Cancellare i dati nello spazio di archiviazione permanente del logger?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tempo rimanente in base al tuo utilizzo (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo rimanente: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tempo rimanente: meno di <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Tempo rimanente: meno di <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Tempo rimanente: più di <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrato"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Non registrato"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Non disponibile"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Selezione casuale dell\'indirizzo MAC"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositivi connessi</item>
<item quantity="one">%1$d dispositivo connesso</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"il giorno <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durata"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Chiedi ogni volta"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Adesso"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 0822493..666ca76 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"מחובר דרך %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"זמינה דרך %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"מחובר. אין אינטרנט"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"נקודת הגישה מלאה באופן זמני"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"מחובר לרשת של %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"זמינה דרך %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"מחובר (ללא טלפון), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"מחובר (ללא מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"מחובר (ללא טלפון או מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"אודיו של מדיה"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"שיחות טלפון"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"העברת קבצים"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"אוזנייה"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ציוד קלט היקפי"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi כבוי."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi מנותק."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"פס אחד של Wi-Fi."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"השאר פועל"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"המסך לעולם לא יהיה במצב שינה במהלך טעינה"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"הפעלת Snoop Log של Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"אחד את כל חבילות Bluetooth HCI בקובץ"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"ביטול נעילה של OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"אפשר ביטול של נעילת מנהל האתחול"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"האם לאפשר ביטול נעילה של OEM (יצרן ציוד מקורי)?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth גרסה AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"בחר Bluetooth גרסה AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec אודיו ל-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"בחירת Codec אודיו ל-Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"קצב דגימה של אודיו ל-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"בחירת Codec אודיו ל-Bluetooth:\nקצב דגימה"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"מספר סיביות לדגימה באודיו ל-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"בחירת codec אודיו ל-Bluetooth:\nסיביות לדגימה"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"מצב של ערוץ אודיו ל-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"בחירת codec אודיו ל-Bluetooth:\nמצב ערוץ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec אודיו LDAC ל-Bluetooth: איכות נגינה"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"בחירת Codec אודיו LDAC ל-Bluetooth:\nאיכות נגינה"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"סטרימינג: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS פרטי"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"צריך לבחור במצב DNS פרטי"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"באופן אוטומטי"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"שם מארח של ספק DNS פרטי"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"צריך להזין את שם המארח של ספק DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"הצג אפשרויות עבור אישור של תצוגת WiFi"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"יצירת כתובת MAC אקראית בהתחברות לרשתות Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"גדלי מאגר של יומן רישום"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"בחר גדלים של יוצר יומן לכל מאגר יומן"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"האם למחוק את אחסון המתעד המתמיד?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">%1$s</xliff:g>, בקירוב"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"נותרו בערך <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"נותרו <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"נותרו פחות מ-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"נותרו פחות מ-<xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"נותרו יותר מ-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"רשום"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"לא רשום"</string>
<string name="status_unavailable" msgid="7862009036663793314">"לא זמין"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC נמצא במצב אקראי"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="two">%1$d מכשירים מחוברים</item>
<item quantity="many">%1$d מכשירים מחוברים</item>
@@ -445,6 +470,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ב-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"משך"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"שאל בכל פעם"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"הרגע"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 200cf8b..6422103 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s経由で接続"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s経由で使用可能"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"接続済み、インターネット接続なし"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"アクセス ポイントが一時的にいっぱいです"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s 経由で接続済み"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s 経由で使用可能"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"接続済み(電話なし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"接続済み(メディアなし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"接続済み(電話、メディアなし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"メディアの音声"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"電話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ファイル転送"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ヘッドフォン"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"入力用周辺機器"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-FiはOFFです。"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fiが切断されました。"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fiはレベル1です。"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"スリープモードにしない"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"充電中に画面をスリープにしない"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCIスヌープログをON"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Bluetooth HCIパケットをすべてファイルにキャプチャする"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bluetooth HCI パケットをすべてファイルにキャプチャする(この設定を変更した場合は Bluetooth を切り替えてください)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEMロック解除"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ブートローダーによるロック解除を許可する"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEMロック解除の許可"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP バージョン"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP バージョンを選択する"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth オーディオ コーデック"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth オーディオ コーデックを選択"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth オーディオ サンプルレート"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth オーディオ コーデックを選択:\nサンプルレート"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"サンプルあたりの Bluetooth オーディオ ビット"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth オーディオ コーデックを選択:\nサンプルあたりのビット"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth オーディオ チャンネル モード"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth オーディオ コーデックを選択:\nチャンネル モード"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth オーディオ LDAC コーデック: 再生音質"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth オーディオ LDAC コーデックを選択:\n再生音質"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ストリーミング: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"プライベート DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"プライベート DNS モードを選択"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"自動"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"プライベート DNS プロバイダのホスト名"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS プロバイダのホスト名を入力"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ワイヤレスディスプレイ認証のオプションを表示"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fiログレベルを上げて、Wi-Fi選択ツールでSSID RSSIごとに表示します"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi ネットワーク接続時の MAC アドレスのランダム化"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ログバッファのサイズ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"各ログバッファのログサイズを選択"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ログの永続ストレージを消去しますか?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"残り時間: 約 <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"残り時間: 約 <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g>(残り時間)"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"残り時間: <xliff:g id="THRESHOLD">%1$s</xliff:g>未満"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"残り時間: <xliff:g id="THRESHOLD">%1$s</xliff:g>未満(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>以上(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -424,8 +449,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"登録済み"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"未登録"</string>
<string name="status_unavailable" msgid="7862009036663793314">"不明"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC はランダムに設定されます"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d 台の端末が接続されています</item>
<item quantity="one">%1$d 台の端末が接続されています</item>
@@ -445,6 +469,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"期間"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"毎回確認"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"たった今"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index a80ffb1..d6271f0 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ით დაკავშირებული"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"ხელმისაწვდომია %1$s-ით"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"დაკავშირებულია, ინტერნეტის გარეშე"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"წვდომის წერტილი დროებით გადატვირთულია"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-ით დაკავშირებული"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"ხელმისაწვდომია %1$s-ით"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"დაკავშირებულია (ტელეფონი არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"დაკავშირებულია (მედია არ არის). ბატარეა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"დაკავშირებულია (ტელეფონი ან მედია არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"მედია აუდიო"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"სატელეფონო ზარები"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ფაილების გადაცემა"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ყურსასმენი"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"შეყვანის პერიფერიული მოწყობილობა"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi გამორთულია."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"WiFi არ არის დაკავშირებული."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi სიგნალი ერთ ზოლზეა."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"არ დაიძინო"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"დატენვისას ეკრანი არ დაიძინებს"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop ჟურნალის ჩართვა"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ყველა bluetooth HCI პაკეტის ფაილში ჩაწერა"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ყველა Bluetooth HCI პაკეტის ფაილში ჩაწერა (ამ პარამეტრის ჩართვის შემდეგ Bluetooth უნდა გადართოთ)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM განბლოკვა"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ნება დართოს განბლოკოს ჩამტვირთველმა"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"მისცეს ნება OEM განბლოკვას?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth-ის AVRCP-ის ვერსია"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"აირჩიეთ Bluetooth-ის AVRCP-ის ვერსია"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth აუდიოს კოდეკი"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"აირჩიეთ Bluetooth აუდიოს კოდეკი"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth აუდიოს დისკრეტიზაციის სიხშირე"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"აირჩიეთ Bluetooth აუდიოს კოდეკის\nდისკრეტიზაციის სიხშირე"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth აუდიოს ბიტების რაოდენობა ნიმუშზე"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"აირჩიეთ Bluetooth აუდიოს კოდეკის\nბიტების რაოდენობა ნიმუშზე"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth აუდიოს არხის რეჟიმი"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"აირჩიეთ Bluetooth აუდიოს კოდეკის\nარხის რეჟიმი"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth აუდიოს LDAC კოდეკის დაკვრის ხარისხი"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"აირჩიეთ Bluetooth აუდიოს LDAC კოდეკის\nდაკვრის ხარისხი"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"სტრიმინგი: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"პირადი DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"აირჩიეთ პირადი DNS რეჟიმი"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ავტომატური"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"პირადი DNS პროვაიდერის სერვერის სახელი"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"შეიყვანეთ DNS პროვაიდერის სერვერის სახელი"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC მისამართის შემთხვევითობა ჩაირთოს, როცა Wi‑Fi-ქსელებთან დაკავშირება ხდება"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ჟურნალიზაციის ბუფერის ზომები"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"აირჩიეთ ჟურნ. ზომა / ჟურნ. ბუფერზე"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"გსურთ მუდმივი ჟურნალირების მეხსიერების გასუფთავება?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"დარჩა დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"იმუშავებს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"დარჩენილია <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, მოხმარების გათვალისწინებით"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"დარჩენილია <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"დარჩენილია <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები დრო (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი დრო (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"რეგისტრირებული"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"არარეგისტრირებული"</string>
<string name="status_unavailable" msgid="7862009036663793314">"მიუწვდომელია"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-ის მიმდევრობა არეულია"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">დაკავშირებულია %1$d მოწყობილობა</item>
<item quantity="one">დაკავშირებულია %1$d მოწყობილობა</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ხანგრძლივობა"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ყოველთვის მკითხეთ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ახლახან"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index efcb072..f80421f 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s арқылы қосылған"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s арқылы қолжетімді"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Қосылған, интернет жоқ"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Кіру нүктесі уақытша бос емес"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s арқылы қосылды"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s арқылы қолжетімді"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Жалғанды (телефонсыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Жалғанды (аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Жалғанды (телефонсыз не аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Meдиа аудиосы"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефон қоңыраулары"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл жіберу"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Құлақаспап"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Кіріс құралы"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi өшірулі."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi ажыратылған."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi сигналы — бір жолақ."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ояу тұру"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Зарядтау кезінде экран ұйықтамайды"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop тіркелімін қосу"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Барлық bluetooth HCI жинақтарын файлға сақтау"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Барлық Bluetooth HCI жинақтарын файлға сақтау (бұл параметр өзгергеннен кейін Bluetooth функциясын қосыңыз)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM бекітпесін ашу"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Жүктеуші бекітпесін ашуға рұқсат ету"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM бекітпесін ашуға рұқсат ету керек пе?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP нұсқасы"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP нұсқасын таңдау"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth аудимазмұн кодегі"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth аудиокодегін таңдау"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth аудиомазмұны бойынша үлгі жиілігі"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth аудиокодегін таңдау:\nдискреттеу жылдамдығы"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth аудиомазмұны бойынша әр үлгіге келетін биттер саны"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth аудиокодегін таңдау:\nбит/үлгі"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth аудиомазмұны бойынша арна режимі"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth аудиокодегін таңдау:\nарна режимі"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth LDAC аудиокодегі: ойнату сапасы"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth LDAC аудиокодегін таңдау:\nойнату сапасы"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Трансляция: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Жеке DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Жеке DNS режимін таңдаңыз"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматты"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Жеке DNS провайдерінің хост атауы"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS провайдерінің хост атауын енгізіңіз"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Сымсыз дисплей растау опцияларын көрсету"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi жур. тір. дең. арт., Wi‑Fi желісін таңдағышта әр SSID RSSI бойынша көрсету"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi желісіне қосылу кезінде MAC мекенжайларын еркін таңдау"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Журналға тіркеуші буферінің өлшемдері"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Әр журнал буфері үшін журналға тіркеуші өлшемдерін таңдау"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Тіркеуіштің тұрақты жадын тазарту керек пе?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Пайдалану негізінде шамамен <xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) уақытқа жетеді"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> шамасынан аз қалды"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> шамасынан аз қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> шамасынан көп уақыт қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Тіркелген"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Тіркелмеген"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Қол жетімсіз"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC еркін таңдауға қойылды"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d құрылғы қосылды</item>
<item quantity="one">%1$d құрылғы қосылды</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Уақыты: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ұзақтығы"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Әрдайым сұрау"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Дәл қазір"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index dee37e8..09f28bc 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"បានភ្ជាប់តាមរយៈ %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"មានតាមរយៈ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"បានភ្ជាប់ ប៉ុន្តែគ្មានអ៊ីនធឺណិតទេ"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ចំណុចចូលប្រើពេញជាបណ្តោះអាសន្ន"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"បានភ្ជាប់តាមរយៈ %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"មានតាមរយៈ %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"បានភ្ជាប់ (គ្មានទូរសព្ទទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"បានភ្ជាប់ (គ្មានមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"បានភ្ជាប់ (គ្មានទូរសព្ទ ឬមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"សំឡេងមេឌៀ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ការហៅទូរសព្ទ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ផ្ទេរឯកសារ"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"កាស"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ធាតុបញ្ចូលបន្ថែម"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ប៊្លូធូស"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"បានបិទ Wifi"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"បានផ្តាច់ Wifi"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi មួយកាំ"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"កុំបិទអេក្រង់"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"អេក្រង់នឹងមិនដេកពេលបញ្ចូលថ្ម"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"បើកកំណត់ហេតុ HCI snoop ប៊្លូធូស"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ចាប់យកកញ្ចប់ HCI ប៊្លូធូស ទាំងអស់នៅក្នុងឯកសារ"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ចាប់យកកញ្ចប់ HCI ប៊្លូធូសទាំងអស់នៅក្នុងឯកសារ (បិទ/បើកប៊្លូធូស បន្ទាប់ពីប្តូរការកំណត់នេះ)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"ការដោះសោ OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"អនុញ្ញាតឲ្យដោះសោកម្មវិធីចាប់ផ្តើមប្រព័ន្ធ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"អនុញ្ញាតការដោះសោ OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"កំណែប្ល៊ូធូស AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ជ្រើសរើសកំណែប្ល៊ូធូស AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"កូឌិកសំឡេងប៊្លូធូស"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ជ្រើសរើសកូឌិកសំឡេងប៊្លូធូស"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"អត្រាគំរូសំឡេងប៊្លូធូស"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ជ្រើសរើសកូឌិកសំឡេងប៊្លូធូស៖\nអត្រាគំរូ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"កម្រិតប៊ីតក្នុងមួយគំរូនៃសំឡេងប៊្លូធូស"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ជ្រើសរើសកូឌិកសំឡេងប៊្លូធូស៖\nកម្រិតប៊ីតក្នុងមួយគំរូ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"មុខងាររលកសញ្ញាសំឡេងប៊្លូធូស"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ជ្រើសរើសកូឌិកសំឡេងប៊្លូធូស៖\nប្រភេទសំឡេង"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"កូឌិកប្រភេទ LDAC នៃសំឡេងប៊្លូធូស៖ គុណភាពចាក់សំឡេង"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ជ្រើសរើសកូឌិកប្រភេទ LDAC នៃសំឡេងប៊្លូធូស៖\nគុណភាពចាក់សំឡេង"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"កំពុងចាក់៖ <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS ឯកជន"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ជ្រើសរើសមុខងារ DNS ឯកជន"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ស្វ័យប្រវត្តិ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ឈ្មោះម៉ាស៊ីនក្រុមហ៊ុនផ្ដល់សេវា DNS ឯកជន"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"បញ្ចូលឈ្មោះម៉ាស៊ីនរបស់ក្រុមហ៊ុនផ្ដល់សេវា DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"បង្ហាញជម្រើសសម្រាប់វិញ្ញាបនបត្របង្ហាញឥតខ្សែ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"បង្កើនកម្រិតកំណត់ហេតុវ៉ាយហ្វាយបង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសវ៉ាយហ្វាយ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ជ្រើសរើសអាសយដ្ឋាន MAC ដោយចៃដន្យ នៅពេលភ្ជាប់បណ្តាញ Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ទំហំ buffer របស់ Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ជ្រើសទំហំ Logger per log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ជម្រះទំហំផ្ទុក logger ដែលប្រើបានយូរឬ?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"សល់ប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"នៅសល់ប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"នៅសល់ <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"នៅសល់តិចជាង <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"នៅសល់តិចជាង <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"នៅសល់ច្រើនជាង <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"បានចុះឈ្មោះ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"មិនបានចុះឈ្មោះ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"មិនមាន"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ត្រូវបានជ្រើសរើសដោយចៃដន្យ"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">បានភ្ជាប់ឧបករណ៍ %1$d</item>
<item quantity="one">បានភ្ជាប់ឧបករណ៍ %1$d</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"នៅថ្ងៃ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"រយៈពេល"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"សួរគ្រប់ពេល"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"អម្បាញ់មិញ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 10236b8..65273c7 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ, ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ಸೈನ್ ಇನ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ಪ್ರವೇಶ ಕೇಂದ್ರ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ಸಕ್ರಿಯ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ಸಕ್ರಿಯ"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ಮಾಧ್ಯಮ ಆಡಿಯೋ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ಫೋನ್ ಕರೆಗಳು"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ಫೈಲ್ ವರ್ಗಾವಣೆ"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ಹೆಡ್ಫೋನ್"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ಪೆರಿಪೆರಲ್ ಇನ್ಪುಟ್"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ಬ್ಲೂಟೂತ್"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ಎಡ ಶ್ರವಣ ಸಾಧನವನ್ನು ಜೋಡಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ಬಲ ಶ್ರವಣ ಸಾಧನವನ್ನು ಜೋಡಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ಎಡ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ಬಲ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ಬ್ಯಾಟರಿ"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"ವೈಫೈ ಆಫ್."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ವೈಫೈ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ವೈಫೈ ಒಂದು ಪಟ್ಟಿ."</string>
@@ -188,7 +197,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ಎಚ್ಚರವಾಗಿರು"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ಪರದೆಯು ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ಬ್ಲೂಟೂತ್ HCI ಸ್ನೂಪ್ಲಾಗ್"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ಫೈಲ್ನಲ್ಲಿ ಎಲ್ಲ ಬ್ಲೂಟೂತ್ HCI ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ಬೂಟ್ಲೋಡರ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ಅನುಮತಿಸಿ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
@@ -207,15 +217,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ಬ್ಲೂಟೂತ್ AVRCP ಆವೃತ್ತಿ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ಬ್ಲೂಟೂತ್ AVRCP ಆವೃತ್ತಿಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಕೋಡೆಕ್"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ ಕೋಡೆಕ್ ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಮಾದರಿ ದರ"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಕೋಡೆಕ್:\nಮಾದರಿ ದರ ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ ಬಿಟ್ಸ್ನ ಪ್ರತಿ ಮಾದರಿ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಕೋಡೆಕ್:\nಬಿಟ್ಸ್ ಪ್ರತಿ ಮಾದರಿ ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಚಾನೆಲ್ ಮೋಡ್"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೋ ಕೋಡೆಕ್:\nಚಾನೆಲ್ ಮೋಡ್ ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ LDAC ಕೋಡೆಕ್: ಪ್ಲೇಬ್ಯಾಕ್ ಗುಣಮಟ್ಟ"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ LDAC ಕೋಡೆಕ್:\nಪ್ಲೇಬ್ಯಾಕ್ ಗುಣಮಟ್ಟ ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ಸ್ಟ್ರೀಮಿಂಗ್: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ಖಾಸಗಿ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ಖಾಸಗಿ DNS ಮೋಡ್ ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -223,9 +238,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ಸ್ವಯಂಚಾಲಿತ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ಖಾಸಗಿ DNS ಪೂರೈಕೆದಾರರ ಹೋಸ್ಟ್ಹೆಸರು"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ಪೂರೈಕೆದಾರರ ಹೋಸ್ಟ್ಹೆಸರನ್ನು ನಮೂದಿಸಿ"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ವೈರ್ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಸಂಪರ್ಕಿಸುವಾಗ MAC ವಿಳಾಸವನ್ನು ಯಾದೃಚ್ಛಿಕಗೊಳಿಸಿ"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"ಲಾಗರ್ ಬಫರ್ ಗಾತ್ರಗಳು"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ಪ್ರತಿ ಲಾಗ್ ಬಫರ್ಗೆ ಲಾಗರ್ ಗಾತ್ರಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ಶಾಶ್ವತವಾಗಿರುವ ಸಂಗ್ರಹಣೆ ಲಾಗರ್ ಅನ್ನು ತೆರವುಗೊಳಿಸುವುದೇ?"</string>
@@ -360,14 +378,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"ನಿಮ್ಮ ಬಳಕೆಯ <xliff:g id="LEVEL">%2$s</xliff:g> ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ನಿಮ್ಮ ಬಳಕೆ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ನಿಮ್ಮ ಬಳಕೆ ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"<xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ ಸಮಯ ಉಳಿದಿದೆ"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ಕ್ಕಿಂತ ಕಡಿಮೆ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಬಾಕಿ"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಕ್ಕಿಂತ ಹೆಚ್ಚು (<xliff:g id="LEVEL">%2$s</xliff:g>) ಬಾಕಿ"</string>
@@ -422,8 +436,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"ನೋಂದಾಯಿಸಲಾಗಿದೆ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ನೋಂದಾಯಿಸಲಾಗಿಲ್ಲ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"ಲಭ್ಯವಿಲ್ಲ"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ಯಾದೃಚ್ಛಿಕವಾಗಿದೆ"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d ಸಾಧನಗಳನ್ನು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</item>
<item quantity="other">%1$d ಸಾಧನಗಳನ್ನು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</item>
@@ -443,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ಕ್ಕೆ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ಅವಧಿ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ಇದೀಗ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index b6b2f56..cae1535 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s을(를) 통해 연결됨"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s을(를) 통해 사용 가능"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"연결됨, 인터넷 사용 불가"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"액세스 포인트가 일시적으로 가득 참"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s을(를) 통해 연결됨"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s을(를) 통해 사용 가능"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"연결됨(전화 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"연결됨(미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"연결됨(전화 또는 미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"미디어 오디오"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"전화 통화"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"파일 전송"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"헤드폰"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"입력 주변기기"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"블루투스"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi가 꺼져 있습니다."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi 연결이 끊어졌습니다."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi 신호 막대가 한 개입니다."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"화면 켜짐 상태 유지"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"충전하는 동안 화면이 꺼지지 않음"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"블루투스 HCI 스누프 로그 사용"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"모든 블루투스 HCI 패킷을 하나의 파일에 캡처"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"모든 블루투스 HCI 패킷을 하나의 파일에 캡처(설정 변경 후 블루투스 전환)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 잠금 해제"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"부트로더 잠금 해제 허용"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM 잠금 해제를 허용하시겠습니까?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"블루투스 AVRCP 버전"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"블루투스 AVRCP 버전 선택"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"블루투스 오디오 코덱"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"블루투스 오디오 코덱 선택"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"블루투스 오디오 샘플링 비율"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"블루투스 오디오 코덱 선택:\n샘플링 비율"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"블루투스 오디오 샘플당 비트"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"블루투스 오디오 코덱 선택:\n샘플당 비트"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"블루투스 오디오 채널 모드"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"블루투스 오디오 코덱 선택:\n채널 모드"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"블루투스 오디오 LDAC 코덱: 재생 품질"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"블루투스 오디오 LDAC 코덱 선택:\n재생 품질"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"스트리밍: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"비공개 DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"비공개 DNS 모드 선택"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"자동"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"비공개 DNS 제공업체 호스트 이름"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS 제공업체의 호스트 이름 입력"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"무선 디스플레이 인증서 옵션 표시"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시합니다."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi 네트워크에 연결할 때 MAC 주소 임의 선택"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"로거 버퍼 크기"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"로그 버퍼당 로거 크기 선택"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"로거 영구 저장소를 삭제하시겠습니까?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"내 사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"내 사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> 미만 남음"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> 미만 남음(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> 이상 남음(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"등록됨"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"등록되지 않음"</string>
<string name="status_unavailable" msgid="7862009036663793314">"사용할 수 없음"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC가 임의 선택됨"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">기기 %1$d개 연결됨</item>
<item quantity="one">기기 %1$d개 연결됨</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"일시: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"지속 시간"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"항상 확인"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"조금 전"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 13174bc..65689f1 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s аркылуу жеткиликтүү"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s аркылуу жеткиликтүү"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Туташып турат, Интернет жок"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Туташуу түйүнү убактылуу толуп калды"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s аркылуу туташты"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s аркылуу иштейт"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Туташып турат (телефониясыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Туташып турат (медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Туташып турат (телефониясыз же медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефон чалуулар"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл алмашуу"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Кулакчын"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Дайындарды киргизүүчү сырткы түзмөк"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi өчүк."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi туташуусу жок."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi: бир таякча."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ойгоо туруу"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Кубаттоо учурунда экран эч уктабайт"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI уруксатсыздарды каттоону иштетүү"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Бардык Bluetooth HCI пакеттерин бир файлга жазуу"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Файлдагы бардык Bluetooth HCI таңгактары алынсын (Бул жөндөөнү өзгөрткөндөн кийин Bluetooth\'ду өчүрүп-күйгүзүңүз)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM бөгөттөн чыгаруу"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Кайра жүктөгүчтү бөгөттөн чыгарууга уруксат берүү"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM бөгөттөн чыгарууга уруксатпы?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP версиясы"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP версиясын тандоо"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth аудио кодек"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth аудио кодегин тандаңыз"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth аудио үлгүсүнүн ылдамдыгы"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth аудио кодегин тандаңыз:\nҮлгү жыштыгы"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Бир үлгүдөгү Bluetooth аудио биттери"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth аудио кодегин тандаңыз:\nБир үлгүдөгү биттер"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth аудио каналынын режими"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth аудио кодегин тандаңыз:\nКанал режими"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth аудио LDAC кодеги: Ойнотуу сапаты"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth аудио LDAC кодегин тандаңыз:\nОйнотуу сапаты"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Трансляция: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Купуя DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Купуя DNS режимин тандаңыз"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматтык режим"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Купуя DNS түйүндүн аталышы"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS түйүндүн аталышын киргизиңиз"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Зымсыз дисплейди сертификатто мүмкүнчүлүктөрүн көргөзүү"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi Кармагычта Wi‑Fi протокол деңгээлин жогорулатуу жана ар бир SSID RSSI үчүн көрсөтүү."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi тармагына туташууда кокустан тандаган MAC дарегин колдонуу"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Каттагыч буферлеринин өлчөмдөрү"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Каттоо буфери үчүн Каттагычтын көлөмүн тандаңыз"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Таржымалдын туруктуу диски тазалансынбы?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Колдонушуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> калды"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) калды"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> калды"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> жетпеген убакыт калды"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> жетпеген убакыт калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ашыгыраак убакыт калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Катталган"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Катталган эмес"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Жеткиликсиз"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC дарегин кокустан тандоо иштетилген"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d түзмөк туташып турат</item>
<item quantity="one">%1$d түзмөк туташып турат</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Узактыгы"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ар дайым суралсын"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Азыр эле"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index b01defb..434c6e7 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"ເຊື່ອມຕໍ່ຜ່ານ %1$s ແລ້ວ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"ມີໃຫ້ຜ່ານ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ເຊື່ອມຕໍ່ແລ້ວ, ບໍ່ມີອິນເຕີເນັດ"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ຈຸດການເຂົ້າເຖິງເຕັມຊົ່ວຄາວ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"ເຊື່ອມຕໍ່ຜ່ານ %1$s ແລ້ວ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"ໃຊ້ໄດ້ຜ່ານ %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼື ມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ສຽງ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ການໂທ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ການໂອນຍ້າຍໄຟລ໌"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ຫູຟັງ"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ອຸປະກອນພ່ວງອິນພຸດ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi ປິດຢູ່."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ຕັດການເຊື່ອມຕໍ່ Wi-Fi ແລ້ວ."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ສັນຍານ Wi-Fi ນຶ່ງຂີດ."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ເປີດໜ້າຈໍຕະຫຼອດ"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ໜ້າຈໍຈະບໍ່ປິດໃນຂະນະທີ່ສາກໄຟຢູ່"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ເປີດໃຊ້ງານການຊອດແນມ Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ເກັບກຳທຸກແພັກເກັດໃນໄຟລ໌ bluetooth HCI"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"ການປົດລັອກ OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ອະນຸຍາດໃຫ້ປົດລັອກບູດໂຫຼດເດີ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ອະນຸຍາດການປົກລັອກ OEM ບໍ?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ເວີຊັນ Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ເລືອກເວີຊັນ Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS ສ່ວນຕົວ"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ເລືອກໂໝດ DNS ສ່ວນຕົວ"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ອັດຕະໂນມັດ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ຊື່ໂຮສຜູ້ໃຫ້ບໍລິການ DNS ສ່ວນຕົວ"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ລະບຸຊື່ໂຮສຂອງຜູ້ໃຫ້ບໍລິການ DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ເພີ່ມລະດັບການເກັບປະຫວັດ Wi‑Fi, ສະແດງຕໍ່ SSID RSSI ໃນ Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ສຸ່ມທີ່ຢູ່ MAC ເມື່ອເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ຂະໜາດບັບເຟີໂຕລັອກ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ເລືອກຂະໜາດລັອກຕໍ່ບັບເຟີ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ລຶບລ້າງບ່ອນຈັດເກັບຖາວອນຂອງຕົວບັນທຶກບໍ່?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ເຫຼືອອີກປະມານ <xliff:g id="TIME">%1$s</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"ເຫຼືອອີກປະມານ <xliff:g id="TIME">%1$s</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ຍັງເຫຼືອ <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"ຍັງເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"ລົງທະບຽນແລ້ວ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ບໍ່ໄດ້ລົງທະບຽນ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"ບໍ່ມີຂໍ້ມູນ"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC is randomized"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">ເຊື່ອມຕໍ່ %1$d ອຸປະກອນແລ້ວ</item>
<item quantity="one">ເຊື່ອມຕໍ່ %1$d ອຸປະກອນແລ້ວ</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ໄລຍະເວລາ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ຖາມທຸກເທື່ອ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ຕອນນີ້"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 0fc3916..66912f6 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Prisijungta naudojant „%1$s“"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Pasiekiama naudojant „%1$s“"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Prisijungta, nėra interneto"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nėra interneto ryšio"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Reikia prisijungti"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prieigos taškas laikinai visiškai užimtas"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Prisijungta naudojant „%1$s“"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Pasiekiama naudojant „%1$s“"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono ar medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktyvus, akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktyvus"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Laikmenos garsas"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono skambučiai"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failo perkėlimas"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Ausinės"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Išorinis įvesties įrenginys"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Siejamas kairysis klausos aparatas…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Siejamas dešinysis klausos aparatas…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kairė – akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Dešinė – akumuliatoriaus įkrova: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"„Wi-Fi“ išjungtas."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"„Wi-Fi“ atjungtas."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Viena „Wi-Fi“ signalo juosta."</string>
@@ -188,7 +197,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Veikti"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Kraunant ekranas niekada neveiks miego režimu"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Įgalinti „Bluetooth“ HCI šnipinėjimo žurnalą"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Užfiksuoti visus faile esančius „Bluetooth“ HCI paketus"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OĮG atrakinimas"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Leisti atrakinti oper. sistemos paleidimo progr."</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Leisti OĮG atrakinimą?"</string>
@@ -207,15 +217,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"„Bluetooth“ AVRCP versija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Pasirinkite „Bluetooth“ AVRCP versiją"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"„Bluetooth“ garso kodekas"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Pasirinkite „Bluetooth“ garso kodeką"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"„Bluetooth“ garso pavyzdžio dažnis"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Pasirinkite „Bluetooth“ garso kodekas:\nimties dydis"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"„Bluetooth“ garso įrašo bitų skaičius pavyzdyje"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Pasirinkite „Bluetooth“ garso kodeką:\nbitų skaičius viename pavyzdyje"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"„Bluetooth“ garso kanalo režimas"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Pasirinkite „Bluetooth“ garso kodeką:\n kanalo režimas"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"„Bluetooth“ garso LDAC kodekas: atkūrimo kokybė"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Pasirinkite „Bluetooth“ garso LDAC kodeką:\natkūrimo kokybė"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Srautinis perdavimas: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privatus DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Pasirinkite privataus DNS režimą"</string>
@@ -223,9 +238,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatinis"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Privataus DNS teikėjo prieglobos serverio pavadinimas"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Įveskite DNS teikėjo prieglobos serverio pavadinimą"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Prisijungti nepavyko"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Atsitiktinai parinkti MAC adresą prisijungiant prie „Wi‑Fi“ tinklų"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Matuojamas"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Neišmatuotas"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Registruotuvo buferio dydžiai"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Pasir. registr. dydž. žurn. bufer."</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Išvalyti nuolatinę registruotuvo saugyklą?"</string>
@@ -360,14 +378,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Liko maždaug <xliff:g id="TIME">%1$s</xliff:g>, atsižvelgiant į naudojimą"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Liko maždaug <xliff:g id="TIME">%1$s</xliff:g>, atsižvelgiant į naudojimą (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Liko <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Liko mažiau nei <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Liko mažiau nei <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Liko daugiau nei <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +436,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Užregistruota"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Neužregistruota"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Užimta"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC parinktas atsitiktine tvarka"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Prijungtas %1$d įrenginys</item>
<item quantity="few">Prijungti %1$d įrenginiai</item>
@@ -445,6 +458,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trukmė"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Klausti kaskart"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Ką tik"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index e22d44a..bdd1ac9 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Savienots, izmantojot %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Pieejams, izmantojot %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Savienojums izveidots, nav piekļuves internetam"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nav piekļuves internetam"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Nepieciešama pierakstīšanās"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Piekļuves punkts īslaicīgi ir pilns"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Savienojums izveidots, izmantojot %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Pieejams, izmantojot %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Savienojums izveidots <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (nav tālrunis), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Savienojums izveidots (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>) (nav multivide), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Savienojums izveidots (nav tālrunis vai multivide) (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktīvs, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktīvs"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Multivides audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Tālruņa zvani"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failu pārsūtīšana"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Austiņas"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Ievades ierīce"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Notiek kreisā dzirdes aparāta savienošana pārī…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Notiek labā dzirdes aparāta savienošana pārī…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Pa kreisi — akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Pa labi — akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi savienojums izslēgts"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi savienojums pārtraukts"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: viena josla"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Atstāt nomodā"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Uzlādes laikā ekrāns nekad nepārslēgsies miega režīmā"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Iespējot Bluetooth HCI analizētāja žurnālu"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Tvert visas Bluetooth HCI paketes failā"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tvert visas Bluetooth HCI paketes failā (pārslēgt Bluetooth pēc šī iestatījuma mainīšanas)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM atbloķēšana"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Atļaut palaišanas ielādētāja atbloķēšanu"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vai atļaut OEM atbloķēšanu?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP versija"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Atlasiet Bluetooth AVRCP versiju"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth audio kodeks"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Atlasīt Bluetooth audio kodeku"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth audio iztveršanas ātrums"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Atlasīt Bluetooth audio kodeku:\niztveršanas ātrums"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth audio bitu skaits iztvērumā"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Atlasīt Bluetooth audio kodeku:\nbitu skaits iztvērumā"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth audio kanāla režīms"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Atlasīt Bluetooth audio kodeku:\nkanāla režīms"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth audio LDAC kodeks: atskaņošanas kvalitāte"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Atlasīt Bluetooth audio LDAC kodeku:\natskaņošanas kvalitāte"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Straumēšana: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privāts DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Atlasiet privāta DNS režīmu"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automātiski"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Privātā DNS pakalpojumu sniedzēja saimniekdatora nosaukums"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ievadiet DNS pakalpojumu sniedzēja saimniekdatora nosaukumu"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nevarēja izveidot savienojumu."</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rādīt bezvadu attēlošanas sertifikācijas iespējas"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Izveidot nejaušas MAC adreses, izveidojot savienojumu ar Wi‑Fi tīkliem"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Maksas"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Bezmaksas"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Reģistrētāja buferu lielumi"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Atlasīt reģistrētāja bufera liel."</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vai notīrīt reģistrētāja pastāvīgo krātuvi?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Atlikušais laiks: aptuveni <xliff:g id="TIME">%1$s</xliff:g> (ņemot vērā lietojumu)"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Ņemot vērā lietojumu, atlikušais laiks: aptuveni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Atlicis: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ņemot vērā lietojumu (<xliff:g id="LEVEL">%2$s</xliff:g>), darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>."</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ņemot vērā lietojumu, darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Atlikušais laiks — mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Atlicis mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Atlicis vairāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Reģistrēts"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nav reģistrēts"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nepieejams"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ir atlasīts nejaušā secībā"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="zero">Pievienotas %1$d ierīces</item>
<item quantity="one">Pievienota %1$d ierīce</item>
@@ -444,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ilgums"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vaicāt katru reizi"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Tikko"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index c47083b..fa29adc 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Поврзано преку %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Достапно преку %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Поврзана, нема интернет"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернет"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потребно е најавување"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пристапната точка привремено е преоптоварена"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Поврзано преку %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Достапно преку %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон и аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Активен, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Активен"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аудио на медиуми"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонски повици"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Пренос на датотека"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Слушалка"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Периферен влез"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Се спарува лев апарат за слушање…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Се спарува десен апарат за слушање…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Лево - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Десно - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi е исклучено."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi е исклучено."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Една црта на Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Остани во активен режим"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Екранот никогаш нема да биде во режим на штедење додека се полни"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Овозможи Bluetooth HCI за евиденција на пресретнување пакети"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Сними ги сите Bluetooth HCI пакети во датотека"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сними ги сите Bluetooth HCI пакети во датотека (Вклучи Bluetooth откако ќе се смени поставкава)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Отклучување со OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволи да се отклучи подигнувачот"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дозволете отклучување со OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Верзија Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Изберете верзија Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Кодек за аудио преку Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Изберете кодек за аудио преку Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Стапка на семпл преку Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Изберете кодек за аудио преку Bluetooth:\nСтапка на примерок"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Аудио бит-по-семпл преку Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Изберете кодек за аудио преку Bluetooth:\nБитови/примерок"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Режим на канал за аудио преку Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Изберете кодек за аудио преку Bluetooth:\nРежим на канал"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Кодек за LDAC-аудио преку Bluetooth: квалитет на репродукција"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Изберете кодек за LDAC-аудио преку Bluetooth:\nКвалитет на репродукција"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Емитување: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Приватен DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Изберете режим на приватен DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматски"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Име на хост на оператор на приватен DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Внесете име на хост на операторот на DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Не може да се поврзе"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Покажи ги опциите за безжичен приказ на сертификат"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Користи MAC-адреса по случаен избор при поврзување на Wi‑Fi мрежи"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Со ограничен интернет"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Без ограничен интернет"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Величини на меѓумеморија на забележувач"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Величина/меѓумеморија на дневник"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Да се избрише постојаната меморија на дневникот?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Уште околу <xliff:g id="TIME">%1$s</xliff:g> според користењето"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Уште околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"уште <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Уште помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Уште помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Уште повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Регистриран"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Не е регистриран"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Недостапен"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-адресата е рандомизирана"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Поврзан е %1$d уред</item>
<item quantity="other">Поврзани се %1$d уреди</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Времетраење"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Секогаш прашувај"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Неодамнешни"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 5b33ba8..8972733 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s വഴി ലഭ്യം"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"കണക്റ്റ് ചെയ്തു, ഇന്റർനെറ്റ് ഇല്ല"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"ഇന്റർനെറ്റ് ഇല്ല"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"സൈൻ ഇൻ ചെയ്യേണ്ടത് ആവശ്യമാണ്"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ആക്സസ് പോയിന്റ് താൽക്കാലികമായി നിറഞ്ഞിരിക്കുന്നു"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s വഴി ലഭ്യം"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"കണക്റ്റ് ചെയ്തു (ഫോൺ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"കണക്റ്റ് ചെയ്തു (മീഡിയ ഇല്ല), ബാറ്ററി <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"കണക്റ്റ് ചെയ്തു (ഫോണോ മീഡിയയോ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"സജീവം, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"സജീവം"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"മീഡിയ ഓഡിയോ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ഫോണ് കോളുകൾ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ഫയൽ കൈമാറൽ"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ഹെഡ്ഫോൺ"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ഇൻപുട്ട് പെരിഫറൽ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ഇടത് വശത്തെ ശ്രവണ സഹായി ജോടിയാക്കുന്നു…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"വലത് വശത്തെ ശ്രവണ സഹായി ജോടിയാക്കുന്നു…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ഇടത് വശത്ത്- <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"വലത് വശത്ത് - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ബാറ്ററി"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"വൈഫൈ ഓഫാണ്."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"വൈഫൈ വിച്ഛേദിച്ചു."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"വൈഫൈ സിഗ്നൽ ഒരു ബാർ."</string>
@@ -188,7 +197,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"സജീവമായി തുടരുക"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ചാർജ്ജുചെയ്യുമ്പോൾ സ്ക്രീൻ ഒരിക്കലും സുഷുപ്തിയിലാകില്ല"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ബ്ലൂടൂത്ത് HCI സ്നൂപ്പ് ലോഗ് സജീവമാക്കൂ"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ഒരു ഫയലിൽ എല്ലാ ബ്ലൂടൂത്ത് HCI പാക്കറ്റുകളും ക്യാപ്ചർ ചെയ്യുക"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM അൺലോക്കുചെയ്യൽ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"അൺലോക്കാകാൻ ബൂട്ട്ലോഡറിനെ അനുവദിക്കുക"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM അൺലോക്കുചെയ്യൽ അനുവദിക്കണോ?"</string>
@@ -207,15 +217,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP പതിപ്പ്"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP പതിപ്പ് തിരഞ്ഞെടുക്കുക"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth ഓഡിയോ കോഡെക്"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth ഓഡിയോ കോഡെക് തിരഞ്ഞെടുക്കുക"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth ഓഡിയോ സാമ്പിൾ നിരക്ക്"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth ഓഡിയോ കോഡെക് തിരഞ്ഞെടുക്കുക:\nസാമ്പിൾ നിരക്ക്"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"പ്രതി സാമ്പിളിലെ Bluetooth ഓഡിയോ ബിറ്റ് നി"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth ഓഡിയോ കോഡെക് തിരഞ്ഞെടുക്കുക:\nബിറ്റ്/സാമ്പിൾ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth ഓഡിയോ ചാനൽ മോഡ്"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth ഓഡിയോ കോഡെക് തിരഞ്ഞെടുക്കുക:\nചാനൽ മോഡ്"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth ഓഡിയോ LDAC കോഡെക്: പ്ലേബാക്ക് നിലവാരം"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth ഓഡിയോ LDAC കോഡെക് തിരഞ്ഞെടുക്കുക:\nപ്ലേബാക്ക് നിലവാരം"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"സ്ട്രീമിംഗ്: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"സ്വകാര്യ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"സ്വകാര്യ DNS മോഡ് തിരഞ്ഞെടുക്കുക"</string>
@@ -223,9 +238,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"സ്വമേധയാ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"സ്വകാര്യ DNS ദാതാവിന്റെ ഹോസ്റ്റുനാമം"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ദാതാവിന്റെ ഹോസ്റ്റുനാമം നൽകുക"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"കണക്റ്റ് ചെയ്യാനായില്ല"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"വയർലെസ് ഡിസ്പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കുക"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"വൈഫൈ നെറ്റ്വർക്കുകളിലേക്ക് കണക്റ്റ് ചെയ്യുമ്പോൾ MAC വിലാസം ക്രമരഹിതമാക്കുക"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"മീറ്റർമാപകം"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"മീറ്റർമാപകമല്ലാത്തത്"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"ലോഗർ ബഫർ വലുപ്പം"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ഓരോ ലോഗ് ബഫറിനും വലുപ്പം തിരഞ്ഞെടുക്കൂ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ലോഗർ സ്ഥിര സ്റ്റോറേജ് മായ്ക്കണോ?"</string>
@@ -360,14 +378,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ്"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ്"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +436,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"രജിസ്റ്റർ ചെയ്തു"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"രജിസ്റ്റർ ചെയ്തിട്ടില്ല"</string>
<string name="status_unavailable" msgid="7862009036663793314">"ലഭ്യമല്ല"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC യാദൃച്ഛികമാക്കിയിരിക്കുന്നു"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്തു</item>
<item quantity="one">%1$d ഉപകരണം കണക്റ്റ് ചെയ്തു</item>
@@ -443,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ദൈർഘ്യം"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"എപ്പോഴും ചോദിക്കുക"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ഇപ്പോൾ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 14db713..bc1d2e7 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-р холбогдсон"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s-р боломжтой"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Холбогдсон хэдий ч интернет алга"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Хандах цэг түр хугацаанд дүүрсэн байна"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-р холбогдсон"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s-р боломжтой"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Холбогдсон (утас байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Холбогдсон (медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Холбогдсон (утас эсвэл медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Медиа аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Утасны дуудлага"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл дамжуулалт"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Чихэвч"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Нэмэлт оролт"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi унтраалттай байна."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi холбогдоогүй байна."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi сүлжээний дохио нэг баганатай байна."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Идэвхтэй байлгах"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Цэнэглэж байх үед дэлгэц хэзээ ч амрахгүй"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI снүүп логыг идэвхжүүлэх"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Файл доторх бүх блютүүт HCI пакетуудыг унших"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Файлд Bluetooth HCI-н бүх багцыг авах (Энэ тохиргоог өөрчилсний дараа Bluetooth-г унтраах/асаах)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM түгжээ тайлагч"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-н түгжээг тайлахыг зөвшөөрөх"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM түгжээ тайлагчийг зөвшөөрөх үү?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP хувилбар"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP хувилбарыг сонгох"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth аудио кодлогч"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth аудио кодлогч сонгох"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth аудио жишээний үнэлгээ"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth аудио кодлогч сонгох:\nЖишээний хэмжээ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Жишээ тутмын Bluetooth аудионы бит"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth аудио кодлогч сонгох:\nЖишээ бүрт бит"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth аудио сувгийн горим"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth аудио кодлогч сонгох:\nСувгийн горим"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Аудио LDAC Кодлогч: Тоглуулагчийн чанар"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth Аудио LDAC Кодлогч сонгох:\nТоглуулагчийн чанар"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Дамжуулж байна: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Хувийн DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Хувийн DNS Горимыг сонгох"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автомат"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Хувийн DNS-н үйлчилгээ үзүүлэгчийн хостын нэр"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS-н үйлчилгээ үзүүлэгчийн хостын нэрийг оруулах"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Утасгүй дэлгэцийн сертификатын сонголтыг харуулах"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi сүлжээнд холбогдох үедээ шинэ дурын (random) MAC хаяг үүсгэх"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Логгерын буферын хэмжээ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Лог буфер бүрт ногдох логгерын хэмжээг сонгоно уу"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Нэвтрэгчийн тогтмол санг устгах уу?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Таны хэрэглээнд тулгуурлан <xliff:g id="TIME">%1$s</xliff:g> орчмын хугацаа үлдсэн байна"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> үлдсэн"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Таны хэрэглээнд (<xliff:g id="LEVEL">%2$s</xliff:g>) тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-с бага хугацаа үлдсэн"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-с бага хугацаа үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-с их хугацаа үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Бүртгэсэн"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Бүртгээгүй"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Байхгүй"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC хаягийг үүсгэсэн"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d төхөөрөмж холбосон</item>
<item quantity="one">%1$d төхөөрөмж холбосон</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-д"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Хугацаа"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Тухай бүрт асуух"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Дөнгөж сая"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index d6ac653..64f745c 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s द्वारे कनेक्ट केले"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s द्वारे उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्ट केले, इंटरनेट नाही"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ने कनेक्ट केले"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ने उपलब्ध"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"कनेक्ट केले (फोन नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"कनेक्ट केले (मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"कनेक्ट केले (फोन किंवा मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडिओ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानांतरण"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"हेडफोन"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"इनपुट परिधीय"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ब्लूटूथ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"वाय फाय बंद."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"वाय फाय डिस्कनेक्ट झाले."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"वाय फाय एक बार."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"सक्रिय रहा"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज होत असताना स्क्रीन कधीही निष्क्रिय होणार नाही"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग सक्षम करा"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"सर्व ब्लूटूथ HCI पॅकेट एका फाईलमध्ये कॅप्चर करा"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करणे"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर अनलॉक करण्यासाठी अनुमती द्या"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करण्यास अनुमती द्यायची?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP आवृत्ती"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटूथ AVRCP आवृत्ती निवडा"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ब्लूटूथ ऑडिओ कोडेक"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ब्लूटूथ ऑडिओ कोडेक निवडा"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ब्लूटूथ ऑडिओ पॅटर्न दर"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ब्लूटूध ऑडिओ कोडेक निवडा:\nपॅटर्न दर"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"प्रति पॅटर्न ब्लूटूध ऑडिओ बिट"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ब्लूटूध ऑडिओ कोडेक निवडा:\nबिट प्रति पॅटर्न"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ब्लूटूथ ऑडिओ चॅनेल मोड"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लूटूथ ऑडिओ कोडेक निवडा:\nचॅनेल मोड"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लूटूथ ऑडिओ LDAC कोडेक: प्लेबॅक गुणवत्ता"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लूटूथ ऑडिओ LDAC कोडेक निवडा:\nप्लेबॅक गुणवत्ता"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"स्ट्रीमिंग: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"खाजगी DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"खाजगी DNS मोड निवडा"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"आपोआप"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"खाजगी DNS पुरवठादार होस्ट नाव"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS पुरवठादाराचे होस्टनाव टाका"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय सिलेक्टरमध्ये प्रति SSID RSSI दर्शवा"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"वाय-फाय नेटवर्कशी कनेक्ट करताना MAC अॅड्रेस रँडमाइझ करा"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"लॉगर बफर आकार"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"प्रति लॉग बफर लॉगर आकार निवडा"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"लॉगरवर सतत असणारा संचय साफ करायचा?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तुमच्या वापरानुसार अंदाजे <xliff:g id="TIME">%1$s</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"तुमच्या वापराच्या (<xliff:g id="LEVEL">%2$s</xliff:g>) आधारावर <xliff:g id="TIME">%1$s</xliff:g> शिल्लक आहे"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकेल (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> पेक्षा कमी शिल्लक आहे"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> पेक्षा कमी वेळ शिल्लक आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> पेक्षा जास्त वेळ शिल्लक आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"नोंदवलेले"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"नोंदवलेले नाही"</string>
<string name="status_unavailable" msgid="7862009036663793314">"अनुपलब्ध"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC रँडमाइझ केला आहे"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d डिव्हाइस कनेक्ट केले आहे</item>
<item quantity="other">%1$d डिव्हाइस कनेक्ट केली आहेत</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> रोजी"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"कालावधी"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक वेळी विचारा"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"आत्ताच"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7d2fb8a..7f8e73e 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Disambungkan melalui %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Disambungkan, tiada Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh buat sementara waktu"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Disambungkan melalui %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Disambungkan (tiada telefon), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Disambungkan (tiada media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Disambungkan (tiada telefon atau media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Panggilan telefon"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Pemindahan fail"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Fon kepala"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Persisian Input"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi dimatikan."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi diputuskan sambungannya."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi satu bar."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Tetap berjaga"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skrin tidak sekali-kali akan tidur semasa pengecasan"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Dayakan log intip HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Tangkap semua paket HCI bluetooth dalam fail"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tangkap semua paket HCI Bluetooth dalam fail (Togol Bluetooth selepas menukar tetapan ini)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Pembukaan kunci OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Benarkan pemuat but untuk dibuka kunci"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Benarkan pembukaan kunci OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Pilih Versi AVRCP Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Pilih Codec Audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Kadar Sampel Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Pilih Codec Audio Bluetooth:\nKadar Sampel"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bit Per Sampel Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Pilih Codec Audio Bluetooth:\nBit Per Sampel"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Mod Saluran Audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Pilih Codec Audio Bluetooth:\nMod Saluran"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec LDAC Audio Bluetooth: Kualiti Main Balik"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Pilih Codec LDAC Audio Bluetooth:\nKualiti Main Balik"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Penstriman: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS Peribadi"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Pilih Mod DNS Peribadi"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatik"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nama hos pembekal DNS peribadi"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Masukkan nama hos pembekal DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Rawakkan alamat MAC apabila menyambung ke rangkaian Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Saiz penimbal pengelog"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Pilih saiz Pengelog bagi setiap penimbal log"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Kosongkan storan gigih pengelog?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tinggal kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Tinggal kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> lagi"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tinggal kurang daripada <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Kurang daripada <xliff:g id="THRESHOLD">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Lebih daripada <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Berdaftar"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Tidak didaftarkan"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Tidak tersedia"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC dirawakkan"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d peranti disambungkan</item>
<item quantity="one">%1$d peranti disambungkan</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tempoh"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Tanya setiap kali"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Sebentar tadi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 1ee6414..1a80a06 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s မှတစ်ဆင့်ရနိုင်သည်"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ချိတ်ဆက်ထားသည်၊ အင်တာနက်မရှိ"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"အင်တာနက် မရှိပါ"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"လက်မှတ်ထိုးဝင်ရန် လိုအပ်သည်"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ကွန်ရက်ချိတ်ဆက်မှု ယာယီပြည့်နေသည်"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s မှတစ်ဆင့် ရနိုင်သည်"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ချိတ်ဆက်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ဖွင့်ထားသည်၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ဖွင့်ထားသည်"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"မီဒီယာ အသံ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ဖုန်းခေါ်ဆိုမှုများ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ဖိုင်လွဲပြောင်းခြင်း"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"နားကြပ်"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ချိတ်ဆက်အသုံးပြုရသည့် စက်ပစ္စည်းများ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ဘလူးတုသ်"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ဘယ်ဘက် နားကြီးကိရိယာကို တွဲချိတ်နေသည်…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ညာဘက် နားကြားကိရိယာကို တွဲချိတ်နေသည်…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ဘယ်ဘက် − ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ညာဘက် − ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ပိတ်ထားသည်"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi ချိတ်ဆက်ထားမှု မရှိပါ"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi ၁ ဘားရှိ"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ဖွင့်လျက်သား"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"အားသွင်းနေစဉ် ဖန်သားပြင်မှာဘယ်သောအခါမှ ပိတ်မည်မဟုတ်ပါ။"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ဘလူးတုသ် HCI snoop မှတ်တမ်းကို ဖွင့်ရန်။"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ဘလူးတုသ် HCI အစုလိုက်များကို ဖိုင်တစ်ခုတွင် ဖမ်းယူရန်"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ဖိုင်တစ်ခုတွင် ဘလူးတုသ် HCI အစုလိုက်များကို ဖမ်းယူရန် (ဤဆက်တင်ကို ပြောင်းပြီးသည့်အခါ ဘလူးတုသ် ဖွင့်/ပိတ် လုပ်ပါ)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM သော့ဖွင့်ခြင်း"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"အစပြုခြင်းကိရိယာအား သော့ဖွင့်ရန် ခွင့်ပြုမည်"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM သော့ဖွင့်ခြင်း ခွင့်ပြုမလား?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ဘလူးတုသ် AVRCP ဗားရှင်း"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ဘလူးတုသ် AVRCP ဗားရှင်းကို ရွေးပါ"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ဘလူးတုသ်အသံ ကိုးဒက်ခ်"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ဘလူးတုသ်အသံကိုးဒက်ခ်ကို ရွေးပါ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ဘလူးတုသ်အသံနမူနာနှုန်း"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ဘလူးတုသ်အသံ ကိုးဒက်ခ်ကို ရွေးပါ−\nနမူနာနှုန်း"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"နမူနာတစ်ခုစီတွင် ပါဝင်သော ဘလူးတုသ်အသံပမာဏ Bits"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ဘလူးတုသ်အသံ ကိုးဒက်ခ်ကို ရွေးပါ−\nနမူနာတစ်ခုချင်းအတွက် Bits"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ဘလူးတုသ်အသံချန်နယ်မုဒ်"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ဘလူးတုသ်အသံကိုးဒက်ခ်ကို ရွေးပါ−\nချန်နယ်မုဒ်"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ဘလူးတုသ်အသံ LDAC ကိုးဒက်ခ်− နားထောင်ရန် အရည်အသွေး"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ဘလူးတုသ်အသံ LDAC ကိုးဒက်ခ်ကို ရွေးပါ−\nနားထောင်ရန် အရည်အသွေး"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"တိုက်ရိုက်လွှင့်နေသည်− <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"သီးသန့် DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"သီးသန့် DNS မုဒ်ကို ရွေးပါ"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"အလိုအလျောက်"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"သီးသန့် DNS ပံ့ပိုးသူ၏ အင်တာနက်လက်ခံဝန်ဆောင်ပေးသူအမည်"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ဝန်ဆောင်မှုပေးသူ၏ အင်တာနက်လက်ခံဝန်ဆောင်ပေးသူအမည်ကို ထည့်ပါ"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ချိတ်ဆက်၍ မရပါ"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi ကွန်ရက်များသို့ ချိတ်ဆက်သည့်အခါ MAC လိပ်စာ ကျပန်းပြုလုပ်ခြင်း"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"မိမိအသုံးပြုမှုအလိုက် ကောက်ခံထားသည်"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"မိမိအသုံးပြုမှုအလိုက် ကောက်ခံခြင်းမရှိပါ"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"လော့ဂါး ဘာဖား ဆိုက်များ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"လော့ ဘာဖားတွက် လော့ဂါးဆိုက် ရွေး"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"မှတ်တမ်းထိန်းသိမ်းပေးသည့် သိုလှောင်ခန်းကို ရှင်းလင်းမလား။"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">%1$s</xliff:g> ခန့် ကျန်ပါသည်"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"သင်၏ အသုံးပြုမှု အပေါ် မူတည်၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ကျန်သည်"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"သင်၏ အသုံးပြုမှုအပေါ် အခြေခံ၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ခန့်သာ ကျန်တော့သည်"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> အောက်သာ ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျော် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"မှတ်ပုံတင်ထားသည်"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"မှတ်ပုံတင်မထားပါ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"မရရှိနိုင်ပါ။"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ကို ကျပန်းပေးထားသည်"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">စက် %1$d ခု ချိတ်ဆက်ထားသည်</item>
<item quantity="one">စက် %1$d ခု ချိတ်ဆက်ထားသည်</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> တွင်"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ကြာချိန်"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"အမြဲမေးပါ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ယခုလေးတင်"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 8ffa69a..cdb7448 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilkoblet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgjengelig via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilkoblet – ingen Internett-tilgang"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Tilgangspunktet er midlertidig fullt"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Tilkoblet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tilgjengelig via %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Koblet til (ingen telefon), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Koblet til (ingen medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Koblet til (ingen telefon eller medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtaler"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverføring"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Øretelefoner"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Inndata fra ytre utstyrsenheter"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi er av."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi er frakoblet."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-signal med én stolpe."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Forbli våken"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skjermen blir aldri svart under lading"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Slå på Bluetooth HCI snoop-logg"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Samle alle Bluetooth HCI-pakker i en fil"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Samle alle Bluetooth HCI-pakker i en fil (slå Bluetooth av/på etter at du har endret denne innstillingen)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-opplåsing"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillat at oppstartsinnlasteren låses opp"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vil du tillate OEM-opplåsing?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP-versjon"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Velg Bluetooth AVRCP-versjon"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Kodek for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Velg kodek for Bluetooth-lyd"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Samplefrekvens for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Velg kodek for Bluetooth-lyd:\nSamplefrekvens"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits per sample for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Velg lydkodek for Bluetooth:\nBits Per Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Kanalmodus for Bluetooth-lyd"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Velg lydkodek for Bluetooth:\nKanalmodus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"LDAC-kodek for Bluetooth-lyd: Avspillingskvalitet"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Velg LDAC-kodek for Bluetooth-lyd:\nAvspillingskvalitet"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Strømming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privat DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Velg Privat DNS-modus"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Vertsnavn for privat DNS-leverandør"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Skriv inn vertsnavnet til DNS-leverandøren"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis alternativer for sertifisering av trådløs skjerm"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Angi tilfeldig MAC-adresse når du kobler til Wi-Fi-nettverk"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Bufferstørrelser for logg"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Velg loggstørrelse per loggbuffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vil du tømme det varige logglageret?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> igjen basert på bruken din"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> gjenstår basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Mindre enn <xliff:g id="THRESHOLD">%1$s</xliff:g> gjenstår"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Mindre enn <xliff:g id="THRESHOLD">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mer enn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrert"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ikke registrert"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ikke tilgjengelig"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC velges tilfeldig"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d enheter er tilkoblet</item>
<item quantity="one">%1$d enhet er tilkoblet</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varighet"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spør hver gang"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Nå nettopp"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 668a5b6..0835c6c 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s मार्फत जडित"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s मार्फत उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"जडान गरियो तर इन्टरनेट छैन"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"पहुँचसम्बन्धी स्थान अस्थायी रूपमा भरिएको छ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s मार्फत जडान गरियो"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s मार्फत उपलब्ध"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"जडान गरियो (फोनबाहेेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"जडान गरियो (मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"जडान गरियो (फोन वा मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मिडिया अडियो"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कलहरू"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानान्तरण"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"हेडफोन"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"इनपुट सम्बन्धी बाह्य यन्त्र"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ब्लुटुथ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi बन्द।"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi जडान विच्छेद भयो।"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi एक पट्टि।"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"जागा रहनुहोस्"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज गर्ने बेलामा स्क्रिन कहिल्यै सुत्दैन।"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लुटुथ HCI snoop लग सक्षम पार्नुहोस्"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"सम्पूर्ण ब्लुटुथ HCI प्याकेटहरू एक फाइलमा कैद गर्नुहोस्"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलक गर्दै"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"अनलक हुन बूटलोडरलाई अनुमति दिनुहोस्"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलक गर्न अनुमति दिने?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लुटुथको AVRCP संस्करण"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लुटुथको AVRCP संस्करण चयन गर्नुहोस्"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ब्लुटुथ अडियोको कोडेक"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ब्लुटुथ अडियोको कोडेक चयन गर्नुहोस्"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ब्लुटुथ अडियोको नमूना दर"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ब्लुटुथ अडियोको कोडेक चयन गर्नुहोस्:\nनमूना दर"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"प्रति नमूना ब्लुटुथ अडियोका बिटहरू"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ब्लुटुथ अडियोको कोडेक चयन गर्नुहोस्:\n प्रति नमूना बिट"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ब्लुटुथ अडियो च्यानलको मोड"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लुटुथ अडियोको कोडेक चयन गर्नुहोस्:\nच्यानलको मोड"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लुटुथ अडियो LDAC कोडेक: प्लेब्याक गुणस्तर"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लुटुथ अडियो LDAC कोडेक चयन गर्नुहोस्:\nप्लेब्याक गुणस्तर"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"स्ट्रिमिङ: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"निजी DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"निजी DNS मोड चयन गर्नुहोस्"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"स्वचालित"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"निजी DNS प्रदायकको होस्टनाम"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS प्रदायकको होस्टनाम प्रविष्ट गर्नुहोस्"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi नेटवर्कहरूमा जडान गर्ने बेला MAC को ठेगाना अनियमित गर्नुहोस्"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"लगर बफर आकारहरू"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"लग बफर प्रति लगर आकार चयन गर्नुहोस्"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"लगरको निरन्तर भण्डारणलाई खाली गर्ने हो?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"तपाईंको प्रयोगका आधारमा <xliff:g id="TIME">%1$s</xliff:g> बाँकी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"बाँकी समय <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"ब्याट्री लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> भन्दा कम समय बाँकी छ"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> भन्दा कम समय बाँकी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> भन्दा बढी समय बाँकी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"दर्ता गरिएको"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"दर्ता नगरिएको"</string>
<string name="status_unavailable" msgid="7862009036663793314">"अनुपलब्ध"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC क्रमरहित छ"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d यन्त्रहरू जडान गरिए</item>
<item quantity="one">%1$d यन्त्र जडान गरियो</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"अवधि"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक पटक सोध्नुहोस्"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"अहिले भर्खरै"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index a41bab7..18d3a08 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Verbonden via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Beschikbaar via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbonden, geen internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt tijdelijk vol"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Verbonden via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Beschikbaar via %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon of media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefoongesprekken"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Bestandsoverdracht"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hoofdtelefoon"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Randapparaat voor invoer"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi: uitgeschakeld."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi-verbinding verbroken."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi: één streepje."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Stand-by"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Scherm gaat nooit uit tijdens het opladen"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Snoop-logbestand voor Bluetooth-HCI inschakelen"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Alle Bluetooth-HCI-pakketten tot één bestand samenvoegen"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth-HCI-pakketten tot één bestand samenvoegen (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-ontgrendeling"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Toestaan dat de bootloader wordt ontgrendeld"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-ontgrendeling toestaan?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth-AVRCP-versie"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth-AVRCP-versie selecteren"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-audiocodec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth-audiocodec selecteren"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bemonsteringsfrequentie (sample rate) van Bluetooth-audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth-audiocodec selecteren:\nbemonsteringsfrequentie"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits per sample voor Bluetooth-audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth-audiocodec selecteren:\nbit per sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Kanaalmodus voor Bluetooth-audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth-audiocodec selecteren:\nkanaalmodus"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"LDAC-codec voor Bluetooth-audio: afspeelkwaliteit"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"LDAC-codec voor Bluetooth-audio selecteren:\nafspeelkwaliteit"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privé-DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecteer de modus Privé-DNS"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisch"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostnaam van privé-DNS-provider"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Geef hostnaam van DNS-provider op"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Opties weergeven voor certificering van draadloze weergave"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Een willekeurig MAC-adres bij het maken van verbinding met wifi-netwerken"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Logger-buffergrootten"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Kies Logger-grootten per logbuffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Persistente loggeropslag wissen?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Nog ongeveer <xliff:g id="TIME">%1$s</xliff:g> over op basis van je gebruik"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Nog ongeveer <xliff:g id="TIME">%1$s</xliff:g> resterend op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> resterend"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Is nog genoeg voor ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Is nog genoeg voor ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Is nog genoeg voor ongeveer <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Is nog genoeg voor ongeveer <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minder dan <xliff:g id="THRESHOLD">%1$s</xliff:g> resterend"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Minder dan <xliff:g id="THRESHOLD">%1$s</xliff:g> resterend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Meer dan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Geregistreerd"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Niet geregistreerd"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Niet beschikbaar"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-adres is willekeurig"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d apparaten verbonden</item>
<item quantity="one">%1$d apparaat verbonden</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duur"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Altijd vragen"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Zojuist"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index b5936c2..d7b2dc9 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍ନେଟ୍ ନାହିଁ"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ସାମୟିକ ଭାବେ ପୂର୍ଣ୍ଣ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ସଂଯୁକ୍ତ ନାହିଁ (ଫୋନ୍ ନୁହେଁ), ବ୍ୟାଟେରୀ<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ସଂଯୁକ୍ତ ହେଲା (ମିଡିଆ ନୁହେଁ), ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ସଂଯୁକ୍ତ ହେଲା (ଫୋନ୍ କିମ୍ବା ମେଡିଆ ନୁହେଁ), ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ମିଡିଆ ଅଡିଓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ଫୋନ୍ କଲ୍ଗୁଡ଼ିକ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ହେଡ୍ଫୋନ୍"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ଇନ୍ପୁଟ୍ ଉପକରଣ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ବ୍ଲୁଟୂଥ୍"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"ୱାଇ-ଫାଇ ବନ୍ଦ।"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ୱାଇଫାଇ ବିଚ୍ଛିନ୍ନ କରାଗଲା।"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifiର 1 ବାର"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ଜାଗ୍ରତ ରଖନ୍ତୁ"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ବ୍ଲୁଟୁଥ୍ HCI ସ୍ନୁପ୍ ଲଗ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ଗୋଟିଏ ଫାଇଲ୍ରେ ସମସ୍ତ ବ୍ଲୁଟୂଥ୍ HCI ପ୍ୟାକେଟ୍ଗୁଡିକୁ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ଅନଲକ୍ କରିବା"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"bootloaderକୁ ଅନ୍ଲକ୍ ହେବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ଅନଲକ୍ କରିବା ଅନୁମତି ଦେବେ?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ସାମ୍ପଲ୍ ରେଟ୍"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ: \n ନମୁନା ଦର"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ନମୁନା ପିଛା ବ୍ଲୁଟୁଥ୍ ଅଡିଓ ବିଟ୍ସ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ବ୍ଲୁଟୂଥ ଅଡିଓ କୋଡେକ୍ ବାଛନ୍ତୁ:\nନମୂନା ପ୍ରତି ବିଟସ୍"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ଚ୍ୟାନେଲ୍ ମୋଡ୍"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ବ୍ଲୁଟୂଥ୍ ଅଡ଼ିଓ କୋଡେକ୍:\nଚାନେଲ୍ ମୋଡ୍ ବାଛନ୍ତୁ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ LDAC କୋଡେକ୍: ପ୍ଲେବ୍ୟାକ୍ ଗୁଣବତ୍ତା"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ LDAC କୋଡେକ୍ ବାଛନ୍ତୁ:\nପ୍ଲେବ୍ୟାକ୍ କ୍ୱାଲିଟୀ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ବ୍ୟକ୍ତିଗତ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍ ବାଛନ୍ତୁ"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ସ୍ଵଚାଳିତ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ବ୍ୟକ୍ତିଗତ DNS ପ୍ରଦାତା ହୋଷ୍ଟନାମ"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ୱେୟାରଲେସ୍ ପ୍ରଦର୍ଶନ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପଗୁଡିକ ଦେଖାନ୍ତୁ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କଗୁଡ଼ିକ ସହିତ କନେକ୍ଟ କରିବାବେଳେ MAC ଠିକଣାକୁ ରେଣ୍ଡୋମାଇଜ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ଲଗର୍ ବଫର୍ ଆକାରଗୁଡ଼ିକ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ଲଗ୍ ବଫର୍ ପିଛା ଲଗର୍ ଆକାରଗୁଡିକର ଚୟନ କରନ୍ତୁ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ଲଗର୍ ରୋଧି ଷ୍ଟୋରେଜ୍ ଖାଲି କରିବେ?"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 1d80e77..313413a 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਐਕਸੈੱਸ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਆਡੀਓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ਫ਼ੋਨ ਕਾਲਾਂ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ਹੈੱਡਫੋਨ"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ਇਨਪੁੱਟ ਪੈਰਿਫੈਰਲ"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ਬਲੂਟੁੱਥ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ਬੰਦ।"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi ਡਿਸਕਨੈਕਟ ਕੀਤਾ।"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi ਇੱਕ ਬਾਰ।"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"ਸਕਿਰਿਆ ਰੱਖੋ"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ਸਕ੍ਰੀਨ ਚਾਰਜਿੰਗ ਦੇ ਸਮੇਂ ਕਦੇ ਵੀ ਸਲੀਪ ਨਹੀਂ ਹੋਵੇਗੀ"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"ਬਲੂਟੁੱਥ HCI ਸਨੂਪ ਲੌਗ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ਇੱਕ ਫਾਈਲ ਵਿੱਚ ਸਾਰੇ bluetooth HCI ਪੈਕੇਟ ਕੈਪਚਰ ਕਰੋ"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਣਲਾਕ ਕਰਨਾ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ਬੂਟਲੋਡਰ ਨੂੰ ਅਣਲਾਕ ਕੀਤੇ ਜਾਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ਬਲੂਟੁੱਥ AVRCP ਵਰਜਨ ਚੁਣੋ"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ਬਲੂਟੁੱਥ ਆਡੀਓ ਨਮੂਨਾ ਦਰ"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਸੈਂਪਲ ਰੇਟ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ਪ੍ਰਤੀ ਨਮੂਨਾ ਬਲੂਟੁੱਥ ਆਡੀਓ ਬਿਟਾਂ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਬਿਟਾਂ ਪ੍ਰਤੀ ਨਮੂਨਾ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ਬਲੂਟੁੱਥ ਆਡੀਓ ਚੈਨਲ ਮੋਡ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕੋਡੇਕ ਚੁਣੋ:\nਚੈਨਲ ਮੋਡ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ਬਲੂਟੁੱਥ ਔਡੀਓ LDAC ਕੋਡੇਕ: ਪਲੇਬੈਕ ਗੁਣਵੱਤਾ"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ਬਲੂਟੁੱਥ ਔਡੀਓ LDAC ਕੋਡੇਕ ਚੁਣੋ:\nਪਲੇਬੈਕ ਗੁਣਵੱਤਾ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ਸਟ੍ਰੀਮਿੰਗ: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ਨਿੱਜੀ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ਨਿੱਜੀ DNS ਮੋਡ ਚੁਣੋ"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ਸਵੈਚਲਿਤ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ਨਿੱਜੀ DNS ਪ੍ਰਦਾਨਕ ਹੋਸਟਨਾਮ"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ਪ੍ਰਦਾਨਕ ਦਾ ਹੋਸਟਨਾਮ ਦਾਖਲ ਕਰੋ"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਨਾਲ ਕਨੈਕਟ ਹੋਣ \'ਤੇ MAC ਪਤਾ ਬੇਤਰਤੀਬਵਾਰ ਚੁਣੋ"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ਲੌਗਰ ਬਫ਼ਰ ਆਕਾਰ"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ਪ੍ਰਤੀ ਲੌਗ ਬਫ਼ਰ ਲੌਗਰ ਆਕਾਰ ਚੁਣੋ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ਕੀ ਲੌਗਰ ਪ੍ਰਸਿੱਸਟੈਂਟ ਸਟੋਰੇਜ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਹੈ?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"ਰਜਿਸਟਰ ਕੀਤੀ ਗਈ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
<string name="status_unavailable" msgid="7862009036663793314">"ਅਣਉਪਲਬਧ"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC ਬੇਤਰਤੀਬਾ ਹੈ"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ</item>
<item quantity="other">%1$d ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤੇ ਗਏ</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ਮਿਆਦ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ਹਰ ਵਾਰ ਪੁੱਛੋ"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ਹੁਣੇ ਹੀ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 1a6321c..3192719 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Połączono przez %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Połączono, brak internetu"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punkt dostępu jest tymczasowo zajęty"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Połączono przez: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostępna przez: %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Połączono (bez telefonu), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Połączono (bez multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Połączono (bez telefonu i multimediów), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Dźwięk multimediów"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Połączenia telefoniczne"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Przesyłanie pliku"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Słuchawki"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Peryferyjne urządzenie wejściowe"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi wyłączone."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi odłączone."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: jeden pasek."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Pozostaw ekran włączony"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran nie będzie gaszony podczas ładowania telefonu"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Włącz dziennik snoop Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Przechwyć wszystkie pakiety Bluetooth HCI do pliku"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Przechwyć wszystkie pakiety Bluetooth HCI do pliku (przełącz Bluetooth po zmianie tego ustawienia)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Zdjęcie blokady OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Zezwalaj na odblokowanie programu rozruchowego"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Zezwolić na zdjęcie blokady OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Wersja AVRCP Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Wybierz wersję AVRCP Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Kodek dźwięku Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Wybierz kodek dźwięku Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Dźwięk Bluetooth – współczynnik próbkowania"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Wybierz kodek dźwięku Bluetooth:\nwspółczynnik próbkowania"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Dźwięk Bluetooth – liczba bitów na próbkę"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Wybierz kodek dźwięku Bluetooth:\nliczba bitów na próbkę"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Dźwięk Bluetooth – tryb kanału"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Wybierz kodek dźwięku Bluetooth:\ntryb kanału"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodek dźwięku Bluetooth LDAC: jakość odtwarzania"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Wybierz kodek dźwięku Bluetooth LDAC:\njakość odtwarzania"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Strumieniowe przesyłanie danych: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Prywatny DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Wybierz tryb prywatnego DNS"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatyczny"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nazwa hosta dostawcy prywatnego DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Wpisz nazwę hosta dostawcy DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaż opcje certyfikacji wyświetlacza bezprzewodowego"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wygeneruj losowo adres MAC podczas łączenia z siecią Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Rozmiary bufora Rejestratora"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Wybierz rozmiary Rejestratora/bufor dziennika"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Wyczyścić pamięć trwałych dzienników?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Jeszcze około <xliff:g id="TIME">%1$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Na podstawie Twojego sposobu korzystania jeszcze około <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostało <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Na podstawie Twojego sposobu korzystania (<xliff:g id="LEVEL">%2$s</xliff:g>) jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Na podstawie Twojego sposobu korzystania jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Jeszcze około <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Pozostało mniej niż <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Pozostało mniej niż <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Pozostało ponad: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Zarejestrowane"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Niezarejestrowane"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Niedostępny"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Adres MAC jest randomizowany"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="few">%1$d urządzenia podłączone</item>
<item quantity="many">%1$d urządzeń podłączonych</item>
@@ -445,6 +469,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Czas"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Zawsze pytaj"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Przed chwilą"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index bdefad84..d8582ee 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ativo"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pareando aparelho auditivo esquerdo…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pareando aparelho auditivo direito…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desligado."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Uma barra de Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em inatividade enquanto estiver carregando."</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar log de rastreamento Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturar todos os pacotes Bluetooth HCI em um arquivo"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permitir desbloqueio de OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecionar versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selecionar codec de áudio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taxa de amostra do áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selecionar codec de áudio Bluetooth:\ntaxa de amostragem"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por amostra do áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selecionar codec de áudio Bluetooth:\nbits por amostra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selecionar codec de áudio Bluetooth:\nmodo de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec de áudio Bluetooth LDAC: qualidade de reprodução"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selecionar codec de áudio Bluetooth LDAC:\nqualidade de reprodução"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS particular"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecione o modo DNS particular"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome do host do provedor de DNS particular"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Informe o nome do host do provedor de DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Não foi possível conectar"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Escolher o endereço MAC de forma aleatória quando estiver conectado a redes Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Limitada"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Ilimitada"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamanhos de buffer de logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de log"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Limpar armazenamento de logger constante?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Não registrado"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Não disponível"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"O MAC é randomizado"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d dispositivo conectado</item>
<item quantity="other">%1$d dispositivos conectados</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index acd105d..99b769c 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ligado através de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível através de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ligado, sem Internet."</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário iniciar sessão"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Ligado através de %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível através de %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ligado (sem telemóvel), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ligado (sem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ligado (sem telemóvel nem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ativo"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio de multimédia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência do ficheiro"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auricular"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"A sincronizar aparelho auditivo do lado esquerdo…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"A sincronizar aparelho auditivo do lado direito…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Lado esquerdo – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Lado direito – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desativado."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desligado."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Uma barra de Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Manter ativo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"O ecrã nunca entrará em suspensão durante o carregamento"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registo de monit. Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturar todos os pacotes Bluetooth HCI num ficheiro"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI num ficheiro (ative/desative o Bluetooth após alterar esta definição)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir o desbloqueio do carregador de arranque"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Pretende permitir o desbloqueio de OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão de Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecionar versão de Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selecionar codec de áudio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taxa de amostragem de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selecionar codec de áudio Bluetooth:\nTaxa de amostragem"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por amostra de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selecionar codec de áudio Bluetooth:\nBits por amostra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selecionar codec de áudio de Bluetooth:\nModo de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec LDAC de áudio Bluetooth: qualidade de reprodução"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selecionar codec LDAC de áudio Bluetooth:\nQualidade de reprodução"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Transmissão em fluxo contínuo: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privado"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecionar modo DNS privado"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome de anfitrião do fornecedor DNS privado"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduza o nome de anfitrião do fornecedor DNS."</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Não foi possível ligar"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções da certificação de display sem fios"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Selecionar aleatoriamente o endereço MAC quando estabelecer ligação a redes Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Acesso limitado"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Acesso ilimitado"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamanhos da memória intermédia do registo"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Selec. tam. reg. p/ mem. int. reg."</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Pretende limpar o armazenamento persistente do registo?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Resta(m) cerca de <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Resta(m) cerca de <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Resta(m) <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização."</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g>."</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Resta(m) menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Resta(m) menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Resta(m) mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Não registado"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Indisponível"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"O MAC é aleatório."</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d dispositivos ligados</item>
<item quantity="one">%1$d dispositivo ligado</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"no(a) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index bdefad84..d8582ee 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ativo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ativo"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Pareando aparelho auditivo esquerdo…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Pareando aparelho auditivo direito…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Esquerdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Direito: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desligado."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Uma barra de Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em inatividade enquanto estiver carregando."</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar log de rastreamento Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capturar todos os pacotes Bluetooth HCI em um arquivo"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permitir desbloqueio de OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecionar versão do Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selecionar codec de áudio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taxa de amostra do áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selecionar codec de áudio Bluetooth:\ntaxa de amostragem"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por amostra do áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selecionar codec de áudio Bluetooth:\nbits por amostra"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal de áudio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selecionar codec de áudio Bluetooth:\nmodo de canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec de áudio Bluetooth LDAC: qualidade de reprodução"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selecionar codec de áudio Bluetooth LDAC:\nqualidade de reprodução"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS particular"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecione o modo DNS particular"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome do host do provedor de DNS particular"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Informe o nome do host do provedor de DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Não foi possível conectar"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Escolher o endereço MAC de forma aleatória quando estiver conectado a redes Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Limitada"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Ilimitada"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamanhos de buffer de logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de log"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Limpar armazenamento de logger constante?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrado"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Não registrado"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Não disponível"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"O MAC é randomizado"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d dispositivo conectado</item>
<item quantity="other">%1$d dispositivos conectados</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index e5912c6..f6352c06 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectată prin %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibilă prin %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectată, fără internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Fără conexiune la internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Trebuie să vă conectați"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punctul de acces este temporar plin"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Conectată prin %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Disponibilă prin %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectat (fără telefon), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectat (fără conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectat (fără telefon sau conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Activ, baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Activ"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Conținut media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Apeluri telefonice"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfer de fișiere"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Căști"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Dispozitiv periferic de intrare"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Se asociază aparatul auditiv stâng…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Se asociază aparatul auditiv drept…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Stâng - baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Drept - baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi dezactivat."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi deconectat."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Semnal Wi-Fi: o bară."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Activ permanent"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ecranul nu va fi inactiv pe durata încărcării"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activați jurnalul de examinare HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Înregistrați toate pachetele HCI Bluetooth într-un fișier"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Înregistrați toate pachetele HCI Bluetooth într-un fișier (Comutați Bluettoth după modificarea setării)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Deblocarea OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permiteți deblocarea bootloaderului"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permiteți deblocarea OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versiunea AVRCP pentru Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selectați versiunea AVRCP pentru Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Selectați codecul audio Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Rată de eșantionare audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Selectați codecul audio Bluetooth:\nrată de eșantionare"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Biți audio Bluetooth per eșantion"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Selectați codecul audio Bluetooth:\nbiți per eșantion"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modul canal audio Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Selectați codecul audio Bluetooth:\nmodul canal"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codecul LDAC audio pentru Bluetooth: calitatea redării"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Selectați codecul LDAC audio pentru Bluetooth:\ncalitatea redării"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Transmitere în flux: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privat"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selectați modul DNS privat"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automat"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Nume de gazdă al furnizorului de DNS privat"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduceți numele de gazdă al furnizorului de DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nu s-a putut conecta"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afișați opțiunile pentru certificarea Ecran wireless"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Afișează aleatoriu adresa MAC când te conectezi la rețele Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Contorizat"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Necontorizat"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Dimensiunile tamponului jurnalului"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Dimensiuni jurnal / tampon jurnal"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ștergeți stocarea permanentă a jurnalului?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"În baza utilizării, timpul aproximativ rămas este: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Timp rămas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Ar trebui să reziste până la <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Ar trebui să reziste până la <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"a mai rămas mai puțin de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"A mai rămas mai puțin de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"A mai rămas mai mult de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Înregistrat"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Neînregistrat"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Indisponibilă"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC este aleatoriu"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="few">%1$d dispozitive conectate</item>
<item quantity="other">%1$d de dispozitive conectate</item>
@@ -444,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durată"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Întreabă de fiecare dată"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Chiar acum"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index e9283f3..fdf8290 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Подключено к %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступно через %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Подключено, без доступа к Интернету"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"К точке доступа подключено слишком много устройств"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Подключено к %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступно через %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Подключено (кроме звонков), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Подключено (кроме аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Подключено (кроме звонков и аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Профиль A2DP"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Звонки"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Профиль OPP"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Наушники"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Периферийное устройство ввода"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi выключен"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi отключен"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: одно деление"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Не выключать экран"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Во время зарядки экран будет всегда включен"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Включить журнал HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Сохранять все пакеты HCI Bluetooth в файле"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сохранять все пакеты HCI Bluetooth в файле (перезапустите Bluetooth после изменения этой настройки)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Заводская разблокировка"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Разрешить разблокировку загрузчика ОС"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Разрешить заводскую разблокировку?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версия Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Выберите версию Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Аудиокодек для передачи через Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Аудиокодек для Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Частота дискретизации при передаче через Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Аудиокодек для Bluetooth:\nчастота дискретизации"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Глубина кодирования звука при передаче через Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Аудиокодек для Bluetooth:\nразрядность"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Режим аудиоканала Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Аудиокодек для Bluetooth:\nрежим канала"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Аудиокодек LDAC для Bluetooth: качество воспроизведения"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Аудиокодек LDAC для Bluetooth:\nкачество воспроизведения"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Потоковая передача: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Персональный DNS-сервер"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Выберите режим персонального DNS-сервера"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматический режим"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Имя хоста поставщика персонального DNS-сервера"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Введите имя хоста поставщика услуг DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показывать параметры сертификации беспроводных мониторов"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"При выборе Wi‑Fi указывать в журнале RSSI для каждого SSID"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Генерировать случайные MAC-адреса при подключении к сетям Wi-Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Размер буфера журнала"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Выберите размер буфера журнала"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Очистить постоянный диск журнала?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Осталось примерно <xliff:g id="TIME">%1$s</xliff:g> при текущем уровне использования"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно на <xliff:g id="TIME">%1$s</xliff:g> при текущем уровне расхода"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Осталось: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"При текущем уровне использования (<xliff:g id="LEVEL">%2$s</xliff:g>) заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"При текущем уровне использования заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Осталось менее <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Уровень заряда батареи: <xliff:g id="LEVEL">%2$s</xliff:g> (хватит менее чем на <xliff:g id="THRESHOLD">%1$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Уровень заряда батареи: <xliff:g id="LEVEL">%2$s</xliff:g> (хватит более чем на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Зарегистрирован"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Не зарегистрирован"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Недоступно"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Случайный MAC-адрес"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Подключено %1$d устройство</item>
<item quantity="few">Подключено %1$d устройства</item>
@@ -445,6 +469,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Длительность"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Всегда спрашивать"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Только что"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 865d05c..82bd3b3 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s හරහා සම්බන්ධ විය"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"සම්බන්ධයි, අන්තර්ජාලය නැත"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ප්රවේශ ලක්ෂ්ය තාවකාලිකව පිරී ඇත"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s හරහා සම්බන්ධ විය"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"සම්බන්ධිතයි (දුරකථනය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"සම්බන්ධිතයි (මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"සම්බන්ධිතයි (දුරකථනය හෝ මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"මාධ්ය ශ්රව්ය"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"දුරකථන ඇමතුම්"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ගොනු හුවමාරුව"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"හෙඩ්ෆෝන්"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ආදාන උපාංග"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"බ්ලූටූත්"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi අක්රියයි."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi සම්බන්ධ කර නොමැත."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi තීරු එකයි."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"අවදියෙන් සිටින්න"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ආරෝපණය වන අතර තුර තීරය නිද්රාවට නොයනු ඇත"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"බ්ලූටූත් HCI ස්නුප් ලොගය සබල කරන්න"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ගොනුවක් තුළ ඇති බ්ලූටූත් HCI පැකට්ටු සියල්ලම ග්රහණය කරගන්න"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ගොනුවක ඇති බ්ලූටූත් HCI පැකට්ටු සියල්ලම ග්රහණය කර ගන්න (මෙම සැකසීම වෙනස් කිරීමෙන් පසු බ්ලූටූත් ටොගල කරන්න)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM අඟුල ඇරීම"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"බුට්ලොඩරයට අගුළු ඇර තිබීමට ඉඩ දෙන්න"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM අඟුල ඇරීමට ඉඩ දෙන්න?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"බ්ලූටූත් AVRCP අනුවාදය"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"බ්ලූටූත් AVRCP අනුවාදය තෝරන්න"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"බ්ලූටූත් ශ්රව්ය Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"බ්ලූටූත් ශ්රව්ය කොඩෙක් තෝරන්න"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"බ්ලූටූත් ශ්රව්ය නියැදි අනුපාතය"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"බ්ලූටූත් ශ්රව්ය කොඩෙක් තෝරන්න:\nනියැදි අනුපාතය"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"නියැදියකට බ්ලූටූත් ශ්රව්ය බිටු"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"බ්ලූටූත් ශ්රව්ය කොඩෙක් තෝරන්න:\nනියැදියකට බිටු"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"බ්ලූටූත් ශ්රව්ය නාලිකා ප්රකාරය"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"බ්ලූටූත් ශ්රව්ය කොඩෙක් තෝරන්න:\nනාලිකා ප්රකාරය"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"බ්ලූටූත් ශ්රව්ය LDAC පසුධාවන ගුණත්වය"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"බ්ලූටූත් ශ්රව්ය LDAC කොඩෙක් තෝරන්න:\nපසුධාවන ගුණත්වය"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ප්රවාහ කරමින්: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"පුද්ගලික DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"පුද්ගලික DNS ප්රකාරය තෝරන්න"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ස්වයංක්රිය"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"පුද්ගලික DNS සැපයුම්කරු සත්කාරක නම"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS සැපයුම්කරුගේ සත්කාරක නම ඇතුළු කරන්න"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi ජාලවලට සම්බන්ධ වීමේදී MAC ලිපිනය සසම්භාවීකරණය"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"ලෝගයේ අන්තරාවක ප්රමාණය"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ලොග අන්තරාවකට ලෝගයේ ප්රමාණය තෝරන්න"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ලොගකරු නොනවතින ගබඩාව හිස් කරන්නද?"</string>
@@ -438,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>හිදී"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"කාල සීමාව"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"සෑම විටම ඉල්ලන්න"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"මේ දැන්"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 09dc508..fb12574 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Pripojené prostredníctvom %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"K dispozícii prostredníctvom %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Pripojené, žiadny internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Žiadny internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Vyžaduje sa prihlásenie"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prístupový bod je dočasne plný"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Pripojené prostredníctvom operátora %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"K dispozícii prostredníctvom operátora %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu), úroveň batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu a médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktívne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktívne"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medií"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonické hovory"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos súborov"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slúchadlá"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférne vstupné zariadenie"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Párovanie ľavej načúvacej pomôcky…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Párovanie pravej načúvacej pomôcky…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Ľavá strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Pravá strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batérie"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Sieť Wi‑Fi je vypnutá."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Sieť Wi‑Fi je odpojená."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Jedna čiarka signálu Wi‑Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Nevypínať obrazovku"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Obrazovka sa pri nabíjaní neprepne do režimu spánku"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Povoliť denník Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Zaznamenať všetky pakety Bluetooth HCI do súboru"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zachytiť všetky pakety Bluetooth HCI do súboru (po zmene tohto nastavenia prepnúť Bluetooth)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Odblokovať OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Povoliť odblokovanie ponuky bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Povoliť odblokovanie OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzia rozhrania Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Zvoľte verziu rozhrania Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio – kodek"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Vybrať kodek Bluetooth Audio"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio – vzorkovacia frekvencia"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Vybrať kodek Bluetooth Audio:\nVzorkovacia frekvencia"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio – počet bitov na vzorku"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Vybrať kodek Bluetooth Audio:\nPočet bitov na vzorku"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio – režim kanála"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Vybrať kodek Bluetooth Audio:\nRežim kanála"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodek LDAC Bluetooth Audio: Kvalita prehrávania"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Vybrať kodek LDAC Bluetooth Audio:\nKvalita prehrávania"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streamovanie: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Súkromné DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Výber súkromného režimu DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaticky"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Súkromný názov hostiteľa poskytovateľa DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Zadajte názov hostiteľa poskytovateľa DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nepodarilo sa pripojiť"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšiť úroveň denníkov Wi‑Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Randomizovať adresu MAC pri pripájaní k sieťam Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"S meraním dát"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Bez merania dát"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Vyrovnávacia pamäť nástroja denníkov"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Veľkosť vyrovnávacej pamäte nástroja denníkov"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vymazať trvalé úložisko zapisovača do denníka?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Zostáva približne <xliff:g id="TIME">%1$s</xliff:g> v závislosti od intenzity využitia"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Zostáva približne <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostávajúci čas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Mal by vydržať približne <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zostáva menej ako <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Zostáva menej ako <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Zostáva viac ako <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrované"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Neregistrované"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nie je k dispozícii"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Adresa MAC je náhodná"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="few">%1$d pripojené zariadenia</item>
<item quantity="many">%1$d pripojeného zariadenia</item>
@@ -445,6 +457,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trvanie"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vždy sa opýtať"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Teraz"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index e4aa7c0..a2ba646 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Vzpostavljena povezava prek: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Na voljo prek: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Vzpostavljena povezava, brez interneta"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Brez internetne povezave"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Zahtevana je prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Dostopna točka je trenutno zasedena"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Vzpostavljena povezava prek: %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Na voljo prek: %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (brez telefona), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (brez predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivna, akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivna"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvok predstavnosti"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski klici"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos datoteke"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slušalka"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Zunanja dodatna oprema"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Seznanjanje z levim slušnim pripomočkom …"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Seznanjanje z desnim slušnim pripomočkom …"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Levi – akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Desni – akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi je izklopljen."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Povezava Wi-Fi je prekinjena."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Ena črtica signala Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Brez zaklepanja"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Med polnjenjem se zaslon ne bo nikoli zaklenil"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogoči zajem dnevnika Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Zajemi vse pakete Bluetooth HCI v datoteko"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zajemi vse pakete Bluetooth HCI v datoteko (preklopi Bluetooth po spremembi te nastavitve)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Odklepanje OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dovoli odklepanje zagonskega nalagalnika"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite omogočiti odklepanje OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Različica profila AVRCP za Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Izberite različico profila AVRCP za Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Zvočni kodek za Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Izberi zvočni kodek za Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Hitrost vzorčenja zvoka prek Bluetootha"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Izberi zvočni kodek za Bluetooth:\nHitrost vzorčenja"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Število bitov na vzorec za zvok prek Bluetootha"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Izberi zvočni kodek za Bluetooth:\nBitov na vzorec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Način zvočnega kanala prek Bluetootha"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Izberi zvočni kodek za Bluetooth:\nNačin kanala"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Zvočni kodek LDAC za Bluetooth: kakovost predvajanja"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Izberi zvočni kodek LDAC za Bluetooth:\nKakovost predvajanja"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Pretočno predvajanje: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Zasebni strežnik DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Izbira načina zasebnega strežnika DNS"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Samodejno"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Ime gostitelja pri ponudniku zasebnega strežnika DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Vnesite ime gostitelja pri ponudniku strežnika DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Povezave ni bilo mogoče vzpostaviti"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povečaj raven zapis. dnev. za Wi-Fi; v izbir. Wi‑Fi-ja pokaži glede na SSID RSSI"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Dodelitev naključnega naslova MAC pri povezovanju z omrežji Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Z omejenim prenosom podatkov"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Z neomejenim prenosom podatkov"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Velikosti medpomn. zapisov. dnevnika"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Izberite velikost medpomnilnika dnevnika"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Želite izbrisati trajno shranjevanje dnevniškega orodja?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Približen preostali čas glede na način uporabe: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Še <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Naprava bi morala glede na način uporabe (<xliff:g id="LEVEL">%2$s</xliff:g>) delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Naprava bi morala glede na način uporabe delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Naprava bi morala delovati do približno <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Naprava bi morala delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo manj kot <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Preostanek: manj kot <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Preostali čas delovanja: manj kot <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrirana"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ni registrirana"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ni na voljo"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Naslov MAC je naključno izbran"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Povezana je %1$d naprava</item>
<item quantity="two">Povezani sta %1$d napravi</item>
@@ -445,6 +457,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vedno vprašaj"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Pravkar"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index dd436b9..22c8af4 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"E lidhur përmes %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"E mundshme përmes %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"U lidh, por nuk ka internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nuk ka internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kërkohet identifikimi"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pika e qasjes është përkohësisht plot"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"E lidhur përmes %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"E disponueshme përmes %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"E lidhur (pa telefon), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"E lidhur (pa media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"E lidhur (pa telefon ose media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiv, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiv"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audioja e klipit \"media\""</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonatat"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferimi i skedarëve"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kufje"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Hyrje periferike"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth-i"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Aparati i dëgjimit majtas po çiftohet…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Aparati i dëgjimit djathtas po çiftohet…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Majtas - bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Djathtas - bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi është çaktivizuar."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi është i shkëputur."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi ka një vijë."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Qëndro zgjuar"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekrani nuk do të kalojë asnjëherë në gjendje gjumi gjatë ngarkimit"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivizo regjistrin testues të Bluetooth HCI-së"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Kap të gjitha paketat HCI të Bluetooth-it në një skedar"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Kap të gjitha paketat HCI të Bluetooth-it në një skedar (ndryshoje Bluetooth-in pas ndryshimit të këtij cilësimi)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Shkyçja e OEM-së"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Lejo shkyçjen e ngarkimit të sistemit"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Të lejohet shkyçja e OEM-së?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versioni AVRCP i Bluetooth-it"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Zgjidh versionin AVRCP të Bluetooth-it"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Kodeku Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Zgjidh kodekun e audios së Bluetooth-it"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Shpejtësia e shembullit të Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Zgjidh kodekun e audios së Bluetooth-it:\nShpejtësia e shembullit"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bite për shembull Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Zgjidh kodekun e audios së Bluetooth-it:\nBite për shembull"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Regjimi i kanalit Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Zgjidh kodekun e audios së Bluetooth-it:\nModaliteti i kanalit"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodeku LDAC i audios së Bluetooth-it: Cilësia e luajtjes"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Zgjidh kodekun LDAC të audios së Bluetooth-it:\nCilësia e luajtjes"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Transmetimi: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS-ja private"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Zgjidh modalitetin e DNS-së private"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatik"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Emri i pritësit të ofruesit të DNS-së private"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Fut emrin e pritësit të ofruesit të DNS-së"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nuk mund të lidhej"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Shfaq opsionet për certifikimin e ekranit valor"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Zgjidh rastësisht adresën MAC kur lidhesh me rrjete Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Me matje"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Pa matje"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Madhësitë e regjistruesit"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Përzgjidh madhësitë e regjistruesit"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Do të pastrosh hapësirën ruajtëse të vazhdueshme të regjistruesit?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Rreth <xliff:g id="TIME">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Mbeten rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> të mbetura"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Mbeten më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mbeten më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Regjistruar"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Paregjistruar"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nuk ofrohet"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Adresa MAC është e rastësishme"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d pajisje të lidhura</item>
<item quantity="one">%1$d pajisje e lidhur</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ditën <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kohëzgjatja"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pyet çdo herë"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Pikërisht tani"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index d93fda7..a6d07a7 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Веза је успостављена преко приступне тачке %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступна је преко приступне тачке %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Веза је успостављена, нема интернета"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернета"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Треба да се пријавите"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Приступна тачка је привремено заузета"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Повезано преко %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступно преко %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Повезано (без телефона), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Повезано (без медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Повезано (без телефона или медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Активан, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Активан"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Звук медија"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонски позиви"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Пренос датотеке"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Слушалице"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Периферни уређај за унос"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Упаривање левог слушног апарата…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Упаривање десног слушног апарата…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Леви – ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Десни – ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi је искључен."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi веза је прекинута."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi сигнал има једну црту."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Не закључавај"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Екран неће бити у режиму спавања током пуњења"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Омогући snoop евиденцију за Bluetooth HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Сними све Bluetooth HCI пакете у датотеци"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сними све Bluetooth HCI пакете у датотеци (Укључите/искључите Bluetooth када промените ово подешавање)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Откључавање OEM-a"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволи откључавање функције за покретање"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Желите ли да дозволите откључавање произвођача оригиналне опреме (OEM)?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Верзија Bluetooth AVRCP-а"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Изаберите верзију Bluetooth AVRCP-а"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth аудио кодек"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Изаберите Bluetooth аудио кодек"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Брзина узорковања за Bluetooth аудио"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Изаберите Bluetooth аудио кодек:\nбрзина узорковања"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Битова по узорку за Bluetooth аудио"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Изаберите Bluetooth аудио кодек:\nбитова по узорку"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Режим канала за Bluetooth аудио"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Изаберите Bluetooth аудио кодек:\nрежим канала"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth аудио кодек LDAC: квалитет репродукције"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Изаберите Bluetooth аудио кодек LDAC:\nквалитет репродукције"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Стримовање: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Приватни DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Изаберите режим приватног DNS-а"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Аутоматски"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Име хоста добављача услуге приватног DNS-а"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Унесите име хоста добављача услуге DNS-а"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Повезивање није успело"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Приказ опција за сертификацију бежичног екрана"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Изабери насумичну MAC адресу током повезивања на Wi‑Fi мреже"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Са ограничењем"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Без ограничења"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Величине бафера података у програму за евидентирање"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Изаберите величине по баферу евиденције"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Желите ли да обришете стални меморијски простор програма за евидентирање?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основу потрошње имате још отприлике <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"На основу коришћења имате још приближно <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Преостало време: <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Преостало је мање од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Преостало је мање од <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Преостало је више од <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Регистрован je"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Није регистрован"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Недоступно"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC адреса је насумично изабрана"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Повезан је %1$d уређај</item>
<item quantity="few">Повезана су %1$d уређаја</item>
@@ -444,6 +456,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Трајање"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Увек питај"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Управо сада"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 3949a0c..0636816 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Anslutet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tillgängligt via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ansluten, inget internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Åtkomstpunkten har inga platser över för tillfället"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Anslutet via %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Tillgängligt via %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ansluten (ingen mobil), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ansluten (inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ansluten (ingen mobil och inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medialjud"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtal"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filöverföring"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hörlur"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Inmatning från kringutrustning"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi är inaktiverat."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Ingen Wi-Fi-anslutning."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: en stapel."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Håll aktiverad"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skärmen vilar aldrig när laddning pågår"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivera HCI snoop-logg för Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Samla alla HCI-paket för Bluetooth i en fil"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Samla alla HCI-paket för Bluetooth i en fil (aktivera och inaktivera Bluetooth när du har ändrat den här inställningen)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-upplåsning"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillåt att bootloadern låses upp"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vill du tillåta OEM-upplåsning?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"AVRCP-version för Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Välj AVRCP-version för Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Ljudkodek för Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Välj Ljudkodek för Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Samplingsfrekvens för Bluetooth-ljud"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Välj Ljudkodek för Bluetooth:\nsamplingsfrekvens"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Antar bitar per sampling för Bluetooth-ljud"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Välj Ljudkodek för Bluetooth:\nbitar per sampling"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Kanalläge för Bluetooth-ljud"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Välj Ljudkodek för Bluetooth:\nkanalläge"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth-ljud via LDAC-kodek: uppspelningskvalitet"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Välj Bluetooth-ljud via LDAC-kodek:\nuppspelningskvalitet"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Privat DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Välj läget Privat DNS"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Värdnamn för leverantör av privat DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ange värdnamn för DNS-leverantör"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Generera en slumpmässig MAC-adress när du ansluter till Wi‑Fi-nätverk"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Buffertstorlekar för logg"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Välj loggstorlekar per loggbuffert"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vill du rensa lagringsutrymmet för loggar?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cirka <xliff:g id="TIME">%1$s</xliff:g> kvar utifrån din användning"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"About <xliff:g id="TIME">%1$s</xliff:g> kvar utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> kvar"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Mindre än <xliff:g id="THRESHOLD">%1$s</xliff:g> återstår"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Mindre än <xliff:g id="THRESHOLD">%1$s</xliff:g> återstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mer än <xliff:g id="TIME_REMAINING">%1$s</xliff:g> återstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrerad"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Ej registrerad"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Inte tillgängligt"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC-adressen slumpgenereras"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d enheter är anslutna</item>
<item quantity="one">%1$d enhet är ansluten</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varaktighet"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Fråga varje gång"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Nyss"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index f03a9d3..50edf38 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Imeunganishwa kupitia %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Inapatikana kupitia %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Imeunganishwa, hakuna intaneti"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Hakuna intaneti"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Unahitaji kuingia katika akaunti"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Lango la mtandao lina shughuli nyingi kwa sasa"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Imeunganishwa kupitia %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Inapatikana kupitia %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Imeunganishwa (hamna simu), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Imeunganishwa (hamna kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Imeunganishwa (hamna simu au kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Inatumika, chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Unaendelea"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media ya sauti"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Simu"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Uhamishaji wa faili"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kifaa cha sauti"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Vifaa vya Ziada vya Kuingiza Data"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Inaoanisha kifaa cha kushoto cha kusaidia kusikia…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Inaoanisha kifaa cha kulia cha kusaidia kusikia…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kushoto - chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kulia - chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi imezimwa."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi imeondolewa."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Kipima mtandao kimoja cha Wifi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Weka skrini ikiwa imewashwa"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Skrini haitawahi kuzima wakati unachaji"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Washa kumbukumbu ya Bluetooth HCI Snoop"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Nasa pakiti zote za Bluetooth HCI katika faili"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Nasa vifurushi vyote vya Bluetooth HCI katika faili (Washa Bluetooth baada ya kuweka mipangilio hii)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Ufunguaji wa OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Ruhusu bootloader ifunguliwe"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Je, ungependa kuruhusu ufunguaji wa OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Toleo la Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Chagua Toleo la Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Kodeki ya Sauti ya Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Chagua Kodeki ya Sauti ya Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Kiwango cha Sampuli ya Sauti ya Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Chagua Kodeki ya Sauti ya Bluetooth:\nKiwango cha Sampuli"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Biti za Sauti ya Bluetooth kwa Kila Sampuli"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Chagua Kodeki ya Sauti ya Bluetooth:\nBiti kwa Kila Sampuli"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Hali ya Mkondo wa Sauti ya Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Chagua Kodeki ya Sauti ya Bluetooth:\nHali ya Kituo"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Kodeki ya LDAC ya Sauti ya Bluetooth: Ubora wa Kucheza"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Chagua Kodeki ya LDAC ya Sauti ya Bluetooth:\nUbora wa Kucheza"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Kutiririsha: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS ya Faragha"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Chagua Hali ya DNS ya Faragha"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Otomatiki"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Jina la mpangishi wa huduma za DNS ya faragha"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Weka jina la mpangishi wa huduma za DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Imeshindwa kuunganisha"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Onyesha chaguo za cheti cha kuonyesha pasiwaya"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Weka anwani ya MAC kwa nasibu wakati unaunganisha kwenye mitandao ya Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Mtandao unapima data"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Mtandao usiopima data"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Ukubwa wa kiweka bafa ya kumbukumbu"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Chagua ukubwa wa kila Kumbukumbu"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ungependa kufuta data iliyo kwenye hifadhi ya kiweka kumbukumbu za mara kwa mara?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Takriban <xliff:g id="TIME">%1$s</xliff:g> zimesalia kulingana na matumizi yako"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Zimesalia takribani <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi utakavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zimesalia <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Imesajiliwa"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Haijasajiliwa"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Hapatikani"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Imechagua anwani ya MAC kwa nasibu"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">Imeunganisha vifaa %1$d</item>
<item quantity="one">Imeunganisha kifaa %1$d</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"siku ya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Muda"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uliza kila wakati"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Sasa hivi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index e70da67..f3fe2e9 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s வழியாக இணைக்கப்பட்டது"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s வழியாகக் கிடைக்கிறது"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"இணைக்கப்பட்டுள்ளது, ஆனால் இண்டர்நெட் இல்லை"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"தற்காலிகமாக அணுகல் புள்ளி நிரம்பியுள்ளது"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s வழியாக இணைக்கப்பட்டது"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s வழியாகக் கிடைக்கிறது"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"இணைக்கப்பட்டது (மொபைல் இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"இணைக்கப்பட்டது (மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"இணைக்கப்பட்டது (மொபைல் அல்லது மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"மீடியா ஆடியோ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ஃபோன் அழைப்புகள்"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"கோப்பு இடமாற்றம்"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ஹெட்ஃபோன்"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"இன்புட் பெரிபெரல்"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"புளூடூத்"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"வைஃபை முடக்கப்பட்டது."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"வைஃபை துண்டிக்கப்பட்டது."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"வைஃபை சிக்னல்: ஒரு கோடு."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"செயலில் வைத்திரு"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"சார்ஜ் ஏறும்போது திரை எப்போதும் உறக்கநிலைக்குச் செல்லாது"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்கு"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"கோப்பில் உள்ள எல்லா புளூடூத் HCI தொகுதிகளையும் படமெடு"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM திறத்தல்"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"பூட்லோடரைத் திறக்க அனுமதி"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM திறத்தலை அனுமதிக்கவா?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"புளூடூத் AVRCP பதிப்பு"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"புளூடூத் AVRCP பதிப்பைத் தேர்ந்தெடு"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"புளூடூத் ஆடியோ கோடெக்"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"புளூடூத் ஆடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும்"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"புளூடூத் ஆடியோ சாம்பிள் ரேட்"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"புளூடூத் ஆடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும்:\nசாம்பிள் ரேட்"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"புளூடூத் ஆடியோ பிட்கள்/சாம்பிள்"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"புளூடூத் ஆடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும்:\nபிட்கள்/சாம்பிள்"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"புளூடூத் ஆடியோ சேனல் பயன்முறை"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"புளூடூத் ஆடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும்:\nசேனல் பயன்முறை"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"புளூடூத் ஆடியோ LDAC கோடெக்: வீடியோவின் தரம்"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"புளூடூத் ஆடியோ LDAC கோடெக்கைத் தேர்ந்தெடுக்கவும்:\nவீடியோவின் தரம்"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ஸ்ட்ரீமிங்: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"தனிப்பட்ட DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"தனிப்பட்ட DNS பயன்முறையைத் தேர்ந்தெடுக்கவும்"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"தானியங்கு"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"தனிப்பட்ட DNS வழங்குநரின் ஹோஸ்ட் பெயர்"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS வழங்குநரின் ஹோஸ்ட் பெயரை உள்ளிடவும்"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wifi நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi நெட்வொர்க்குகளில் இணைக்கும்போது Randomize MAC இன் முகவரி"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"லாகர் பஃபர் அளவுகள்"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"லாக் பஃபர் ஒன்றிற்கு லாகர் அளவுகளைத் தேர்வுசெய்க"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"லாகரின் நிலையான சேமிப்பகத்தை அழிக்கவா?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME">%1$s</xliff:g> மீதமுள்ளது"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"பயன்படுத்துவதன் அடிப்படையில், <xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> மீதமுள்ளது"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில், <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில் <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும்"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும்"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும்"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கும் மேல் பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"பதிவு செய்யப்பட்டது"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"பதிவு செய்யப்படவில்லை"</string>
<string name="status_unavailable" msgid="7862009036663793314">"கிடைக்கவில்லை"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC முகவரி சீரற்றுள்ளது"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d சாதனங்கள் இணைக்கப்பட்டன</item>
<item quantity="one">%1$d சாதனம் இணைக்கப்பட்டது</item>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index bfe54a0..5558e8d 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"కనెక్ట్ చేయబడింది, ఇంటర్నెట్ లేదు"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"యాక్సెస్ పాయింట్ తాత్కాలికంగా నిండుకుంది"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"కనెక్ట్ చేయబడింది (మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"మీడియా ఆడియో"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ఫోన్ కాల్లు"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ఫైల్ బదిలీ"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"హెడ్ఫోన్"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ఇన్పుట్ అనుబంధ పరికరం"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"బ్లూటూత్"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ఆఫ్లో ఉంది."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi డిస్కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi సిగ్నల్ ఒక బార్ ఉంది."</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"సక్రియంగా ఉంచు"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"ఛార్జ్ చేస్తున్నప్పుడు స్క్రీన్ ఎప్పటికీ నిద్రావస్థలోకి వెళ్లదు"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"బ్లూటూత్ HCI రహస్య లాగ్ను ప్రారంభించు"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ఫైల్లో అన్ని బ్లూటూత్ HCI ప్యాకెట్లను క్యాప్చర్ చేయి"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM అన్లాకింగ్"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"బూట్లోడర్ అన్లాక్ కావడానికి అనుమతించు"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM అన్లాకింగ్ను అనుమతించాలా?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"బ్లూటూత్ AVRCP వెర్షన్"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"బ్లూటూత్ AVRCP సంస్కరణను ఎంచుకోండి"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"బ్లూటూత్ ఆడియో కోడెక్"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"బ్లూటూత్ ఆడియో కోడెక్ని ఎంచుకోండి"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"బ్లూటూత్ ఆడియో నమూనా రేట్"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"బ్లూటూత్ ఆడియో కోడెక్ని ఎంచుకోండి:\nనమూనా రేటు"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ఒక్కో నమూనాకు బ్లూటూత్ ఆడియో బిట్లు"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"బ్లూటూత్ ఆడియో కోడెక్ని ఎంచుకోండి:\nఒక్కో నమూనాలో బిట్లు"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"బ్లూటూత్ ఆడియో ఛానెల్ మోడ్"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"బ్లూటూత్ ఆడియో కోడెక్ని ఎంచుకోండి:\nఛానెల్ మోడ్"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"బ్లూటూత్ ఆడియో LDAC కోడెక్: ప్లేబ్యాక్ నాణ్యత"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"బ్లూటూత్ ఆడియో LDAC కోడెక్ని ఎంచుకోండి:\nప్లేబ్యాక్ నాణ్యత"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ప్రసారం చేస్తోంది: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ప్రైవేట్ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ప్రైవేట్ DNS మోడ్ను ఎంచుకోండి"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ఆటోమేటిక్"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ప్రైవేట్ DNS ప్రదాత హోస్ట్పేరు"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ప్రదాత యొక్క హోస్ట్పేరును నమోదు చేయండి"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"వైర్లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi నెట్వర్క్కు కనెక్ట్ చేస్తున్నప్పుడు MAC చిరునామాను యాదృచ్ఛికం చేయండి"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"లాగర్ బఫర్ పరిమాణాలు"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"లాగ్ బఫర్కి లాగర్ పరిమా. ఎంచుకోండి"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"లాగర్ నిరంతర నిల్వలోని డేటాను తీసివేయాలా?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"మీ వినియోగం ఆధారంగా సుమారు <xliff:g id="TIME">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME">%1$s</xliff:g> ఉండవచ్చు (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> మిగిలి ఉంది"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"మీ వినియోగం ఆధారంగా <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> కంటే ఎక్కువ సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"నమోదు చేయబడింది"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"నమోదు కాలేదు"</string>
<string name="status_unavailable" msgid="7862009036663793314">"అందుబాటులో లేదు"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC యాదృచ్ఛికంగా ఉంది"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d పరికరాలు కనెక్ట్ చేయబడ్డాయి</item>
<item quantity="one">%1$d పరికరం కనెక్ట్ చేయబడింది</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"వ్యవధి"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ప్రతిసారి అడుగు"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ఇప్పుడే"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 6952ba3..77457ac 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"พร้อมใช้งานผ่านทาง %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"เชื่อมต่อแล้ว ไม่พบอินเทอร์เน็ต"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"ไม่มีอินเทอร์เน็ต"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ต้องลงชื่อเข้าใช้"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"จุดเข้าใช้งานเต็มชั่วคราว"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"พร้อมใช้งานผ่านทาง %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"เชื่อมต่อแล้ว (ไม่รวมสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์หรือสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ใช้งานอยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ใช้งานอยู่"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"เสียงของสื่อ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"โทรศัพท์"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"การถ่ายโอนไฟล์"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"หูฟัง"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"อุปกรณ์อินพุต"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"บลูทูธ"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"กำลังจับคู่กับเครื่องช่วยการได้ยินข้างซ้าย…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"กำลังจับคู่กับเครื่องช่วยการได้ยินข้างขวา…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ข้างซ้าย - แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ข้างขวา - แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ปิดอยู่"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"ไม่ได้เชื่อมต่อ Wi-Fi"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"สัญญาณ Wi-Fi 1 ขีด"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"เปิดหน้าจอค้าง"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"หน้าจอจะไม่เข้าสู่โหมดสลีปขณะชาร์จ"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"เปิดใช้งานบันทึกสอดแนมบลูทูธ HCI"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"บันทึกแพ็คเก็ตบลูทูธ HCI ทั้งหมดในไฟล์"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"บันทึกแพ็กเก็ตบลูทูธ HCI ทั้งหมดในไฟล์ (สลับสวิตช์บลูทูธหลังจากเปลี่ยนการตั้งค่านี้)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"การปลดล็อก OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"อนุญาตให้ปลดล็อกตัวโหลดการเปิดเครื่อง"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"อนุญาตการปลดล็อก OEM ไหม"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"เวอร์ชันของบลูทูธ AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"เลือกเวอร์ชันของบลูทูธ AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ตัวแปลงรหัสเสียงบลูทูธ"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"เลือกตัวแปลงรหัสเสียงบลูทูธ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"อัตราตัวอย่างเสียงบลูทูธ"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"เลือกตัวแปลงรหัสเสียงบลูทูธ:\nอัตราการสุ่มตัวอย่าง"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"บิตต่อตัวอย่างของเสียงบลูทูธ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"เลือกตัวแปลงรหัสเสียงบลูทูธ:\nบิตต่อตัวอย่าง"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"โหมดช่องสัญญาณเสียงบลูทูธ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"เลือกตัวแปลงรหัสเสียงบลูทูธ:\nโหมดช่องสัญญาณ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ตัวแปลงรหัสเสียงบลูทูธที่ใช้ LDAC: คุณภาพการเล่น"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"เลือกตัวแปลงรหัสเสียงบลูทูธที่ใช้ LDAC:\nคุณภาพการเล่น"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"สตรีมมิง: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS ส่วนตัว"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"เลือกโหมด DNS ส่วนตัว"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"อัตโนมัติ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"ชื่อโฮสต์ของผู้ให้บริการ DNS ส่วนตัว"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ป้อนชื่อโฮสต์ของผู้ให้บริการ DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"เชื่อมต่อไม่ได้"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"สุ่มที่อยู่ MAC เมื่อเชื่อมต่อกับเครือข่าย Wi‑Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"มีการวัดปริมาณอินเทอร์เน็ต"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"ขนาดบัฟเฟอร์ของ Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"เลือกขนาด Logger ต่อบัฟเฟอร์ไฟล์บันทึก"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ล้างพื้นที่เก็บข้อมูลถาวรของตัวบันทึกไหม"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"เหลืออีกราว <xliff:g id="TIME">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"ใช้งานได้อีกประมาณ <xliff:g id="TIME">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"เหลืออีก <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"เหลืออีกไม่ถึง <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"เหลือเวลาอีกไม่ถึง <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"เหลือเวลามากกว่า <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"ลงทะเบียนแล้ว"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ไม่ได้ลงทะเบียน"</string>
<string name="status_unavailable" msgid="7862009036663793314">"ไม่ว่าง"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC เป็นแบบสุ่ม"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">มีอุปกรณ์ที่เชื่อมต่อ %1$d เครื่อง</item>
<item quantity="one">มีอุปกรณ์ที่เชื่อมต่อ %1$d เครื่อง</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"วัน<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ระยะเวลา"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ถามทุกครั้ง"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"เมื่อสักครู่"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index ef228d5..712424c 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Nakakonekta sa pamamagitan ng %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available sa pamamagitan ng %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Nakakonekta, walang internet"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Walang internet"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kinakailangang mag-sign in"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pansamantalang puno ang access point"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Nakakonekta sa pamamagitan ng %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Available sa pamamagitan ng %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Nakakonekta (walang telepono), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Nakakonekta (walang media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Nakakonekta (walang telepono o media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktibo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktibo"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio ng media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Mga tawag sa telepono"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Paglilipat ng file"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Headphone"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Input Peripheral"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Nagpapares ang kaliwang hearing aid…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Nagpapares ang kanang hearing aid…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kaliwa - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kanan - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterya"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Naka-off ang Wifi."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Nakadiskonekta ang Wifi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"May isang bar ang Wifi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Manatiling gumagana"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Hindi kailanman hihinto ang screen kapag kinakargahan"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"I-enable ang Bluetooth HCI snoop log"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"I-capture ang lahat ng bluetooth HCI packet sa isang file"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"I-capture ang lahat ng Bluetooth HCI packet sa isang file (I-toggle ang Bluetooth pagkatapos baguhin ang setting na ito)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Pag-a-unlock ng OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Payagan na ma-unlock ang bootloader"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Payagan ang pag-a-unlock ng OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bersyon ng AVRCP ng Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Pumili ng Bersyon ng AVRCP ng Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Piliin ang Audio Codec ng Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Sample na Rate ng Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Piliin ang Audio Codec ng Bluetooth:\nRate ng Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits Per Sample ng Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Piliin ang Audio Codec ng Bluetooth:\nBit Kada Sample"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Channel Mode ng Bluetooth Audio"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Piliin ang Audio Codec ng Bluetooth:\nChannel Mode"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Audio LDAC Codec ng Bluetooth: Kalidad ng Pag-playback"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Piliin ang Audio LDAC Codec ng Bluetooth:\nKalidad ng Pag-playback"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Pribadong DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Pumili ng Pribadong DNS Mode"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Awtomatiko"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname ng provider ng pribadong DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ilagay ang hostname ng DNS provider"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Hindi makakonekta"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ipakita ang mga opsyon para sa certification ng wireless display"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"I-randomize ang MAC address kapag kumokonekta sa mga Wi‑Fi network"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Nakametro"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Hindi Nakametro"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Mga laki ng buffer ng Logger"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Pumili ng mga laki ng Logger bawat log buffer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"I-clear ang tuluy-tuloy na storage ng logger?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> ang natitira batay sa iyong paggamit"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"May humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> pa batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> pa"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Wala nang <xliff:g id="THRESHOLD">%1$s</xliff:g> ang natitira"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Wala nang <xliff:g id="THRESHOLD">%1$s</xliff:g> ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Mahigit <xliff:g id="TIME_REMAINING">%1$s</xliff:g> pa ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Nakarehistro"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Hindi nakarehistro"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Hindi available"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Naka-randomize ang MAC"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d device ang nakakonekta</item>
<item quantity="other">%1$d na device ang nakakonekta</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"sa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tagal"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Magtanong palagi"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Ngayon lang"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 64ee676..b88c757 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s üzerinden bağlı"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s üzerinden kullanılabilir"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Bağlı, internet yok"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yok"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Oturum açılması gerekiyor"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Erişim noktası geçici olarak dolu"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s üzerinden bağlı"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s üzerinden kullanılabilir"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (medya yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon veya medya yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Etkin, pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Etkin"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medya sesi"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon çağrıları"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dosya aktarımı"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kulaklık"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Giriş Çevre Birimi"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Sol kulak işitme cihazı eşleniyor…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Sağ kulak işitme cihazı eşleniyor…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Sol - Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Sağ - Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Kablosuz kapalı."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Kablosuz bağlantı kesildi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Kablosuz sinyal gücü tek çubuk."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Uyanık kal"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Şarj edilirken ekran hiçbir zaman uykuya geçmez"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI araştırmayı etkinleştir"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Bir dosyadaki tüm Bluetooth HCI paketlerini yakala"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bir dosyadaki tüm Bluetooth HCI paketlerini yakala (Bu ayarı değiştirdikten sonra Bluetooth seçimini değiştirin)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM kilit açma"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Önyükleyicinin kilidinin açılmasına izin ver"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM kilit açmaya izin verilsin mi?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Sürümü"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP Sürümünü seçin"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Ses Codec\'i"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth Ses Codec\'ini Seçin"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Ses Örnek Hızı"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth Ses Codec\'ini Seçin:\nÖrnek Hızı"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Ses Örnek Başına Bit Sayısı"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth Ses Codec\'ini Seçin:\nÖrnek Başına Bit Sayısı"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Ses Kanalı Modu"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth Ses Codec\'ini Seçin:\nKanal Modu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Ses LDAC Codec\'i: Oynatma Kalitesi"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth Ses LDAC Codec\'ini Seçin:\nOynatma Kalitesi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Akış: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Gizli DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Gizli DNS Modunu Seçin"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Otomatik"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Gizli DNS sağlayıcının ana makine adı"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS sağlayıcının ana makine adını gir"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Bağlanılamadı"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Kablosuz ekran sertifikası seçeneklerini göster"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster."</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Kablosuz ağlara bağlanırken MAC adresini rastgele seç"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Sayaçlı"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Sayaçsız"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Günlük Kaydedici arabellek boyutları"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Gün. arabel. başına Gün. Kayd. boyutunu seç"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Günlük kaydedici kalıcı depolama alanı silinsin mi?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"En fazla <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"En çok <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"En az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Kaydettirildi"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Kaydettirilmedi"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Kullanılamıyor"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC rastgele yapıldı"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d cihaz bağlı</item>
<item quantity="one">%1$d cihaz bağlı</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"zaman: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Süre"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Her zaman sor"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Az önce"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 2bf7564..1157a20 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Під’єднано через %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступ через %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Під’єднано, але немає доступу до Інтернету"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Немає Інтернету"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потрібно ввійти в обліковий запис"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точка доступу тимчасово переповнена"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Під’єднано через мережу %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Доступ через мережу %1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона й медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Активовано, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Активовано"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Звук медіа-файлів"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонні дзвінки"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Передавання файлів"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Навушники"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Периферійне введення"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Підключення лівого слухового апарата…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Підключення правого слухового апарата…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Лівий – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Правий – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> заряду акумулятора"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi вимкнено."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi від’єднано."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Одна смужка сигналу Wi-Fi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Залишати активним"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Екран не засинатиме під час заряджання"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Увімкнути журнал відстеження інтерфейсу Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Зберігати всі пакети інтерфейсу Bluetooth у файлі"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Зберігати всі пакети інтерфейсу Bluetooth у файлі (перемикати Bluetooth після змінення цього налаштування)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Розблокування виробником"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволити розблокування завантажувача"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дозволити виробникові розблоковувати пристрій?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версія Bluetooth AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Виберіть версію Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Кодек для аудіо Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Вибрати кодек для аудіо Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Частота вибірки для аудіо Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Вибрати кодек для аудіо Bluetooth:\nчастота вибірки"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Кількість бітів на зразок для аудіо Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Вибрати кодек для аудіо Bluetooth:\nбіти у вибірці"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Режим каналу для аудіо Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Вибрати кодек для аудіо Bluetooth:\nрежим каналу"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Кодек для аудіо Bluetooth LDAC: якість відтворення"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Вибрати кодек для аудіо Bluetooth LDAC:\nякість відтворення"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Трансляція: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Приватна DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Виберіть режим \"Приватна DNS\""</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Автоматично"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Ім’я хосту приватного постачальника послуг DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Введіть ім’я хосту постачальника послуг DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Не вдалося під’єднатися"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показати параметри сертифікації бездротового екрана"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Довільно вибирати MAC-адресу під час з’єднання з мережами Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"З тарифікацією трафіку"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Без тарифікації трафіку"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Розміри буфера журналу"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Виберіть розміри буфера журналу"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Очистити постійну пам’ять журналу?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основі використання залишилося близько <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Відповідно до даних про використання, залишилося близько <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Залишилося <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"На основі даних про використання (<xliff:g id="LEVEL">%2$s</xliff:g>), вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"На основі даних про використання, вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Залишилося менше ніж <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Залишилося менше ніж <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Залишилося понад <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Зареєстровано"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Не зареєстровано"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Недоступно"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Для MAC-адреси вибрано функцію довільного вибору"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">Під’єднано %1$d пристрій</item>
<item quantity="few">Під’єднано %1$d пристрої</item>
@@ -445,6 +457,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Тривалість"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Запитувати щоразу"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Щойно"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 4228f54..fac268b 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"منسلک بذریعہ %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"دستیاب بذریعہ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"منسلک، انٹرنیٹ نہیں ہے"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"رسائی پوائنٹ عارضی طور پر فُل ہے"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"منسلک بذریعہ %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"دستیاب بذریعہ %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"منسلک ہے (فون کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"منسلک ہے (میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"منسلک ہے (فون یا میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"میڈيا آڈیو"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"فون کالز"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"فائل کی منتقلی"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ہیڈ فون"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ان پٹ پیریفرل"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"بلوٹوتھ"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi آف ہے۔"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi غیر منسلک ہو گیا۔"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi ایک بار۔"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"بیدار رکھیں"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"چارج ہوتے وقت اسکرین کبھی بھی سلیپ وضع میں نہيں جائے گی"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"بلوٹوتھ HCI کا جاسوسی لاگ فعال کریں"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"سبھی بلوٹوتھ HCI کے پیکٹس ایک فائل میں قید کریں"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM اَن لاکنگ"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"بوٹ لوڈر کو غیر مقفل ہونے کی اجازت دیں"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM اَن لاکنگ کی اجازت دیں؟"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"بلوٹوتھ AVRCP ورژن"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"بلوٹوتھ AVRCP ورژن منتخب کریں"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"بلوٹوتھ آڈیو کوڈیک"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"بلوٹوتھ آڈیو کوڈیک منتخب کریں"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"بلوٹوتھ آڈیو کے نمونے کی شرح"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"بلوٹوتھ آڈیو کوڈیک منتخب کریں:\nنمونے کی شرح"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"بلوٹوتھ آڈیو بٹس فی نمونہ"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"بلوٹوتھ آڈیو کوڈیک منتخب کریں:\nبٹس فی نمونہ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"بلوٹوتھ آڈیو چینل موڈ"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"بلوٹوتھ آڈیو کوڈیک منتخب کریں:\nچینل موڈ"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"بلوٹوتھ آڈیو LDAC کوڈیک: پلے بیک کا معیار"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"بلوٹوتھ آڈیو LDAC کوڈیک منتخب کریں:\nپلے بیک کا معیار"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"سلسلہ بندی: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"نجی DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"نجی DNS وضع منتخب کریں"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"خودکار"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"نجی DNS فراہم کنندہ میزبان کا نام"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS فراہم کنندہ کے میزبان کا نام درج کریں"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi نیٹ ورکس سے منسلک کرتے وقت MAC پتے کو غیر مرتب کریں"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"لاگر بفر کے سائز"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"فی لاگ بفر لاگر کے سائز منتخب کریں"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"لاگر مستقل اسٹوریج صاف کریں؟"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> سے کم باقی ہے"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g> سے کم باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> سے زیادہ باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"رجسٹر شدہ"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"رجسٹر نہیں ہے"</string>
<string name="status_unavailable" msgid="7862009036663793314">"غیر دستیاب"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC پتہ رینڈم ہے"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d آلات منسلک ہیں</item>
<item quantity="one">%1$d آلہ منسلک ہے</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"مدت"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ہر بار پوچھیں"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"ابھی ابھی"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index ebd873c..648cda7 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s orqali ulangan"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s orqali ishlaydi"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ulangan, lekin internet aloqasi yo‘q"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Internet kirish nuqtasi vaqtinchalik to‘lgan"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"%1$s orqali ulangan"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s orqali ishlaydi"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefondan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefon yoki mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon chaqiruvlari"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl uzatish"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Quloqchin"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Kiritish qurilmasi"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi o‘chiq."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi o‘chiq."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: bitta ustun"</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Ekranning yoniq turishi"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Qurilma quvvat olayotganda ekran doim yoniq turadi"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI amallari translatsiyasi jurnali"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Barcha Bluetooth HCI paketlarini bitta faylga saqlash"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Barcha Bluetooth HCI paketlarini bitta faylga saqlash (Bu parametrni o‘zgartirishdan keyin Bluetooth funksiyasini yoqish/o‘chirish)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Zavod qulfini yechish"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Operatsion tizimni yuklash dasturining qulfini yechishga ruxsat berish"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Zavod qulfini yechishga ruxsat berilsinmi?"</string>
@@ -199,7 +217,7 @@
<string name="debug_networking_category" msgid="7044075693643009662">"Tarmoqlar"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"Simsiz monitor sertifikatlari"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Batafsil Wi-Fi jurnali"</string>
- <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"Ulangan MAC randomizatsiyasi"</string>
+ <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"Wi-Fi orqali ulanganda tasodifiy MAC manzillar yaratish"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobil internet doim yoniq tursin"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Modem rejimida apparatli tezlashtirish"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth qurilmalarini nomlarisiz ko‘rsatish"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP versiyasi"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP versiyasini tanlang"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth audio kodeki"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth orqali uzatish uchun audiokodek"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth audio namunasi chastotasi"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth orqali uzatish uchun audiokodek:\nnamuna chastotasi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth audio namunasidagi bitlar soni"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth orqali uzatish uchun audiokodek:\nnamunadagi bitlar soni"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth audio kanali rejimi"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth orqali uzatish uchun audiokodek:\nkanal rejimi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"LDAC audiokodeki bilan ijro etish sifati (Bluetooth orqali)"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"LDAC audiokodeki:\nijro sifati"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Translatsiya: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Shaxsiy DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Shaxsiy DNS rejimini tanlang"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Avtomatik"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Shaxsiy DNS provayderining host nomi"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS provayderining host nomini kiriting"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi tarmoqlarga ulanishda MAC manzilini tasodifiy tanlash"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Jurnal buferi hajmi"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Jurnal xotirasi hajmini tanlang"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Jurnalning doimiy xotirasi tozalansinmi?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> qoldi"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>dan kamroq vaqt qoldi"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"<xliff:g id="THRESHOLD">%1$s</xliff:g>dan kamroq vaqt qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>dan ko‘proq vaqt qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registratsiya qilingan"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Registratsiya qilinmagan"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Mavjud emas"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC tasodifiy tanlandi"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d ta qurilma ulangan</item>
<item quantity="one">%1$d ta qurilma ulangan</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Davomiyligi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Har safar so‘ralsin"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Hozir"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 8e71bf3..0599aea 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Được kết nối qua %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Có sẵn qua %1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Đã kết nối, không có Internet"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Điểm truy cập tạm thời đã đạt đến giới hạn số lượng thiết bị truy cập."</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Được kết nối qua %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Có sẵn qua %1$s"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Đã kết nối (không có điện thoại), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Đã kết nối (không có phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Đã kết nối (không có điện thoại hoặc phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Âm thanh của phương tiện"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Cuộc gọi điện thoại"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Chuyển tệp"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Tai nghe"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Thiết bị ngoại vi vào"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Đã tắt Wi-Fi."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Đã ngắt kết nối Wi-Fi."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Tín hiệu Wi-Fi một vạch."</string>
@@ -188,7 +206,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Không khóa màn hình"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Màn hình sẽ không bao giờ chuyển sang chế độ nghỉ khi sạc"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bật nhật ký theo dõi HCI Bluetooth"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Giữ tất cả các gói HCI bluetooth trong một tệp"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Thu thập tất cả các gói HCI Bluetooth vào một tệp (Bật/tắt Bluetooth sau khi thay đổi cài đặt này)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Mở khóa OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Cho phép mở khóa trình khởi động"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Cho phép mở khóa OEM?"</string>
@@ -207,15 +225,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth phiên bản AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Chọn Bluetooth phiên bản AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Codec âm thanh Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Chọn Codec âm thanh Bluetooth"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Tốc độ lấy mẫu âm thanh Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Chọn Codec âm thanh Bluetooth:\nTốc độ lấy mẫu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Số bit âm thanh Bluetooth mỗi mẫu"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Chọn Codec âm thanh Bluetooth:\nSố bit trên mẫu"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Chế độ kênh âm thanh Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Chọn Codec âm thanh Bluetooth:\nChế độ kênh"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Codec LDAC âm thanh Bluetooth: Chất lượng phát lại"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Chọn Codec LDAC âm thanh Bluetooth:\nChất lượng phát lại"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Truyền trực tuyến: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS riêng tư"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Chọn chế độ DNS riêng tư"</string>
@@ -223,9 +246,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Tự động"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Tên máy chủ của nhà cung cấp DNS riêng tư"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Nhập tên máy chủ của nhà cung cấp DNS"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Lựa chọn ngẫu nhiên địa chỉ MAC khi kết nối với mạng Wi‑Fi"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"Kích cỡ tải trình ghi"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Chọn kích thước Trình ghi/lần tải nhật ký"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Xóa bộ nhớ ổn định trong trình ghi nhật ký?"</string>
@@ -360,14 +389,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Còn khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Còn khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa vào mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Còn lại <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Còn lại không đến <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Còn lại không đến <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Còn lại hơn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +447,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Đã đăng ký"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Chưa được đăng ký"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Không có"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"Địa chỉ MAC được gán ngẫu nhiên"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d thiết bị được kết nối</item>
<item quantity="one">%1$d thiết bị được kết nối</item>
@@ -443,6 +467,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"vào <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Thời lượng"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Luôn hỏi"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Vừa xong"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index cc4d7e9..22ba3c3 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -40,6 +40,10 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已通过%1$s连接"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可通过%1$s连接"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已连接,但无法访问互联网"</string>
+ <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
+ <skip />
+ <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
+ <skip />
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"接入点暂时满载"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已通过%1$s连接"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可通过%1$s连接"</string>
@@ -63,6 +67,12 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已连接(无手机信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已连接(无媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已连接(无手机或媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
+ <skip />
+ <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
+ <skip />
+ <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
+ <skip />
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒体音频"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通话"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"文件传输"</string>
@@ -109,6 +119,14 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"耳机"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"外围输入设备"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"蓝牙"</string>
+ <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
+ <skip />
<string name="accessibility_wifi_off" msgid="1166761729660614716">"WLAN 已关闭。"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"WLAN 连接已断开。"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WLAN 信号强度为一格。"</string>
@@ -188,7 +206,8 @@
<string name="keep_screen_on" msgid="1146389631208760344">"不锁定屏幕"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"充电时屏幕不会休眠"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"启用蓝牙 HCI 信息收集日志"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"捕获单个文件中的所有蓝牙 HCI 包"</string>
+ <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
+ <skip />
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 解锁"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允许解锁引导加载程序"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"要允许 OEM 解锁吗?"</string>
@@ -207,15 +226,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"蓝牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"选择蓝牙 AVRCP 版本"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"蓝牙音频编解码器"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"选择蓝牙音频编解码器"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"蓝牙音频采样率"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"选择蓝牙音频编解码器:\n采样率"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"蓝牙音频每样本位数"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"选择蓝牙音频编解码器:\n每样本位数"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"蓝牙音频声道模式"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"选择蓝牙音频编解码器:\n声道模式"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"蓝牙音频 LDAC 编解码器:播放质量"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"选择蓝牙音频 LDAC 编解码器:\n播放质量"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"正在流式传输:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"私人 DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"选择私人 DNS 模式"</string>
@@ -223,9 +247,15 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"自动"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"私人 DNS 提供商主机名"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"输入 DNS 提供商的主机名"</string>
+ <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
+ <skip />
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"显示无线显示认证选项"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"提升WLAN日志记录级别(在WLAN选择器中显示每个SSID的RSSI)"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"连接到 WLAN 网络时随机选择 MAC 地址"</string>
+ <!-- no translation found for wifi_metered_label (4514924227256839725) -->
+ <skip />
+ <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
+ <skip />
<string name="select_logd_size_title" msgid="7433137108348553508">"日志记录器缓冲区大小"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"选择每个日志缓冲区的日志记录器大小"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"要清除永久存储的日志记录器数据吗?"</string>
@@ -360,14 +390,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根据您的使用情况,大约还可使用 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"根据您的使用情况,剩余时间大约还有 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"还可用 <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根据您的使用情况,目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计还能使用大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根据您的使用情况,电量估计还能使用大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计还能使用大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"估计还能使用大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"剩余电池续航时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"电量剩余使用时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"电量剩余使用时间超过 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +448,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"已注册"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"未注册"</string>
<string name="status_unavailable" msgid="7862009036663793314">"无法获取"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC 已随机化"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">已连接 %1$d 个设备</item>
<item quantity="one">已连接 %1$d 个设备</item>
@@ -443,6 +468,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"时间:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"持续时间"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都询问"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"刚刚"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index daf83a9..887959d 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 連線"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,但沒有互聯網"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有網際網路連線"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時已滿"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 連線"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已連接 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已連接 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已連接 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"使用中"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒體音效"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"檔案傳輸"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"耳機"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"輸入周邊設備"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"藍牙"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"正在配對左側助聽器…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"正在配對右側助聽器…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"左側 - 電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"右側 - 電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi 已關閉。"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi 連線已中斷。"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi 訊號一格。"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"保持啟用"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"充電時螢幕永不休眠"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"啟用藍牙 HCI 窺探記錄"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"擷取單一檔案內的所有藍牙 HCI 封包"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"擷取單一檔案內的所有藍牙 HCI 封包 (變更此設定後必須切換藍牙)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"原始設備製造商 (OEM) 解鎖"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允許 Bootloader 被解鎖"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"允許原始設備製造商 (OEM) 解鎖嗎?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"選擇藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"藍牙音訊編解碼器"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"選擇藍牙音訊編解碼器"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"藍牙音訊取樣率"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"選擇藍牙音訊編解碼器:\n取樣率"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"藍牙音訊每個樣本位元數"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"選擇藍牙音訊編解碼器:\n每個樣本位元數"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"藍牙音訊聲道模式"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"選擇藍牙音訊編解碼器:\n聲道模式"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"藍牙音訊 LDAC 編解碼器:播放品質"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"選擇藍牙音訊 LDAC 編解碼器:\n播放品質"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"正在串流:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"不公開的網域名稱系統 (DNS)"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"選取不公開的網域名稱系統 (DNS) 模式"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"自動"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"不公開的網域名稱系統 (DNS) 供應商主機名稱"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"輸入網域名稱系統 (DNS) 供應商的主機名稱"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"無法連線"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"連線至 Wi‑Fi 網絡時隨機產生 MAC 位址"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"計量付費"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"非計量付費"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"記錄器緩衝區空間"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"選取每個記錄緩衝區的記錄器空間"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"要清除記錄器的持久儲存空間嗎?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據您的使用情況,剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"根據您的使用情況,還有大約 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"尚餘 <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據您的使用情況 (<xliff:g id="LEVEL">%2$s</xliff:g>),電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據您的使用情況,電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"剩餘電量時間少於 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"還有少於 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"還有超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"已註冊"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"未註冊"</string>
<string name="status_unavailable" msgid="7862009036663793314">"無法使用"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC 位址已隨機產生"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d 部已連線的裝置</item>
<item quantity="one">%1$d 部已連線的裝置</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"長度"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 7b90e73..f679833 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 使用"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,沒有網際網路"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有網際網路連線"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時滿載"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 使用"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已連線 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已連線 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已連線 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"使用中,電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"使用中"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒體音訊"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"檔案傳輸"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"頭戴式耳機"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"周邊輸入裝置"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"藍牙"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"正在配對左側助聽器…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"正在配對右側助聽器…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"左側 - 電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"右側 - 電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"已關閉 Wi-Fi。"</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi 連線已中斷。"</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi 訊號強度一格。"</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"螢幕不休眠"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"充電時螢幕不會進入休眠"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"啟用藍牙 HCI 窺探紀錄"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"擷取單一檔案內的所有藍牙 HCI 封包"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"擷取單一檔案內的所有藍牙 HCI 封包 (變更這項設定後必須切換藍牙)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 解鎖"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允許解除鎖定開機載入器"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"要允許 OEM 解鎖嗎?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"選取藍牙 AVRCP 版本"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"藍牙音訊轉碼器"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"選取藍牙音訊轉碼器"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"藍牙音訊取樣率"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"選取藍牙音訊轉碼器:\n取樣率"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"藍牙音訊每單位樣本位元數"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"選取藍牙音訊轉碼器:\n每單位樣本位元數"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"藍牙音訊聲道模式"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"選取藍牙音訊轉碼器:\n聲道模式"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"藍牙音訊 LDAC 轉碼器:播放品質"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"選取藍牙音訊 LDAC 轉碼器:\n播放品質"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"串流中:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"私人 DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"選取私人 DNS 模式"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"自動"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"私人 DNS 供應商主機名稱"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"輸入 DNS 供應商的主機名稱"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"無法連線"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"連線至 Wi‑Fi 網路時隨機化 MAC 位址"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"計量付費"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"非計量付費"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"紀錄器緩衝區空間"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"選取每個紀錄緩衝區的紀錄器空間"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"要清除永久儲存的記錄器資料嗎?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,還能持續使用 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"還剩 <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據你的使用情形,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"電池可用時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"已註冊"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"未註冊"</string>
<string name="status_unavailable" msgid="7862009036663793314">"無法取得"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"MAC 位址已隨機化"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="other">%1$d 個已連線的裝置</item>
<item quantity="one">%1$d 個已連線的裝置</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"時間長度"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 24bf7bb..e3fa0a8 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -40,6 +40,8 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Kuxhumeke nge-%1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Iyatholakala nge-%1$s"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Kuxhunyiwe, ayikho i-inthanethi"</string>
+ <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ayikho i-inthanethi"</string>
+ <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Ukungena ngemvume kuyadingeka"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Iphoyinti lokufinyelela ligcwele okwesikhashana"</string>
<string name="connected_via_carrier" msgid="7583780074526041912">"Kuxhumeke nge-%1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Iyatholakala nge-%1$s"</string>
@@ -63,6 +65,9 @@
<string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ixhunyiwe (ayikho ifoni), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ixhunyiwe (ayikho imidiya), ibhethri iku-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ixhunyiwe (ayikho ifoni noma imidiya), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Kuyasebenza, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
+ <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
+ <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Iyasebenza"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Umsindo wemidiya"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Amakholi efoni"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dlulisa ifayela"</string>
@@ -109,6 +114,10 @@
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Amahedfoni"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Okokufaka okulawulwa yikhompuyutha"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"I-Bluetooth"</string>
+ <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Ibhanqa insiza yokuzwa engakwesokunxele…"</string>
+ <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Ibhanqa insiza yokuzwa…"</string>
+ <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kwesokunxele - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
+ <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kwesokudla - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ibhethri"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"I-Wifi ivaliwe."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"I-Wifi inqanyuliwe."</string>
<string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Ibha elilodwa le-Wifi."</string>
@@ -188,7 +197,7 @@
<string name="keep_screen_on" msgid="1146389631208760344">"Hlala uphapheme"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Isikrini asisoze salala ngenkathi sishaja"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Nika amandla i-Bluetooth HCI yelogu lokuhlola"</string>
- <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Shutha wonke amaphakethe we-bluetooth HCI kufayela"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Thwebula onke amaphakethe e-Bluetooth HCI kwifayela (Shintsha i-Bluetooth ngemuva kokushintsha lesi silungiselelo)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Ukuvula i-OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Vumela ukuthi i-bootloader ivulwe"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vumela ukuvula i-OEM?"</string>
@@ -207,15 +216,20 @@
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Inguqulo ye-Bluetooth ye-AVRCP"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Khetha inguqulo ye-Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"I-Bluetooth Audio Codec"</string>
- <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Khetha i-Bluetooth Audio Codec"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_type_dialog_title (8436224899475822557) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Isilinganiso sesampula yomsindo we-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Khetha i-Bluetooth Audio Codec:\nIsilinganiso sesampula"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_sample_rate_dialog_title (8010380028880963535) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Ama-Bits omsindo we-Bluetooth ngesampula ngayinye"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Khetha i-Bluetooth Audio Codec:\nBits ngesampuli"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_bits_per_sample_dialog_title (8063859754619484760) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Imodi yesiteshi somsindo we-Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Khetha i-Bluetooth Audio Codec:\nImodi yesiteshi"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_channel_mode_dialog_title (7234956835280563341) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"I-Bluetooth Audio LDAC Codec: Ikhwalithi yokudlala"</string>
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Khetha i-Bluetooth Audio LDAC Codec:\nIkhwalithi yokudlala"</string>
+ <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (7595776220458732825) -->
+ <skip />
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Ukusakaza: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"I-DNS eyimfihlo"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Khetha imodi ye-DNS eyimfihlo"</string>
@@ -223,9 +237,12 @@
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Okuzenzekelayo"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Igama lomsingathi womhlinzeki we-DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Faka igama lomsingathi womhlinzeki we-DNS"</string>
+ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ayikwazanga ukuxhuma"</string>
<string name="wifi_display_certification_summary" msgid="1155182309166746973">"Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo"</string>
<string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi"</string>
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Ungahleli ikheli le-MAC uma kuxhumeke kumanethiwekhi e-Wi-Fi"</string>
+ <string name="wifi_metered_label" msgid="4514924227256839725">"Kulinganisiwe"</string>
+ <string name="wifi_unmetered_label" msgid="6124098729457992931">"Akulinganiselwa"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Amasayizi weloga ngebhafa"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Khetha amasayizi weloga ngebhafa ngayinye yelogu"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Sula isitoreji seloga eqhubekayo?"</string>
@@ -360,14 +377,10 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cishe kusele okungu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
<string name="power_discharging_duration_enhanced" msgid="5726302316642148671">"Cishe u-<xliff:g id="TIME">%1$s</xliff:g> osele ngokuya ngokusebenzisa kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> esisele"</string>
- <!-- no translation found for power_discharge_by_enhanced (2095821536747992464) -->
- <skip />
- <!-- no translation found for power_discharge_by_only_enhanced (2175151772952365149) -->
- <skip />
- <!-- no translation found for power_discharge_by (6453537733650125582) -->
- <skip />
- <!-- no translation found for power_discharge_by_only (107616694963545745) -->
- <skip />
+ <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
+ <string name="power_discharge_by" msgid="6453537733650125582">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Kusele okungaphansi kunokungu-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Ngaphansi kuka-<xliff:g id="THRESHOLD">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_more_than_subtext" msgid="3176771815132876675">"Ngaphezu kuka-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
@@ -422,8 +435,7 @@
<string name="ims_reg_status_registered" msgid="933003316932739188">"Kubhalisiwe"</string>
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Akubhalisiwe"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Ayitholakali"</string>
- <!-- no translation found for wifi_status_mac_randomized (5589328382467438245) -->
- <skip />
+ <string name="wifi_status_mac_randomized" msgid="5589328382467438245">"I-MAC ayihleliwe"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
<item quantity="one">%1$d amadivayisi axhunyiwe</item>
<item quantity="other">%1$d amadivayisi axhunyiwe</item>
@@ -443,6 +455,5 @@
<string name="alarm_template_far" msgid="3779172822607461675">"nge-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ubude besikhathi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Buza njalo"</string>
- <!-- no translation found for time_unit_just_now (6363336622778342422) -->
- <skip />
+ <string name="time_unit_just_now" msgid="6363336622778342422">"Khona manje"</string>
</resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 24a6804..6368607 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -97,6 +97,12 @@
<!-- Summary for Connected wifi network without internet -->
<string name="wifi_connected_no_internet">Connected, no internet</string>
+ <!-- Wi-Fi status indicating that the current network is connected, but has no internet access. -->
+ <string name="wifi_status_no_internet">No internet</string>
+
+ <!-- Wi-Fi status indicating that the current network is connected requires sign in to access the internet. -->
+ <string name="wifi_status_sign_in_required">Sign in required</string>
+
<!-- Summary for networks failing to connect due to association rejection status 17, AP full -->
<string name="wifi_ap_unable_to_handle_new_sta">Access point temporarily full</string>
@@ -494,10 +500,10 @@
<string name="keep_screen_on">Stay awake</string>
<!-- setting Checkbox summary whether to keep the screen on when plugged in -->
<string name="keep_screen_on_summary">Screen will never sleep while charging</string>
- <!-- Setting Checkbox title whether to enable bluetooth HCI snoop log -->
+ <!-- Setting Checkbox title whether to enable Bluetooth HCI snoop log -->
<string name="bt_hci_snoop_log">Enable Bluetooth HCI snoop log</string>
- <!-- setting Checkbox summary whether to capture all bluetooth HCI packets in a file -->
- <string name="bt_hci_snoop_log_summary">Capture all bluetooth HCI packets in a file</string>
+ <!-- setting Checkbox summary whether to capture all Bluetooth HCI packets in a file -->
+ <string name="bt_hci_snoop_log_summary">Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)</string>
<!-- setting Checkbox title whether to enable OEM unlock [CHAR_LIMIT=35] -->
<string name="oem_unlock_enable">OEM unlocking</string>
<!-- setting Checkbox summary whether to enable OEM unlock [CHAR_LIMIT=50] -->
@@ -537,30 +543,30 @@
<!-- UI debug setting: Select Bluetooth AVRCP Version -->
<string name="bluetooth_select_avrcp_version_dialog_title">Select Bluetooth AVRCP Version</string>
- <!-- UI debug setting: Select Bluetooth Audio Codec -->
+ <!-- UI debug setting: Trigger Bluetooth Audio Codec Selection -->
<string name="bluetooth_select_a2dp_codec_type">Bluetooth Audio Codec</string>
- <!-- UI debug setting: Select Bluetooth Audio Codec -->
- <string name="bluetooth_select_a2dp_codec_type_dialog_title">Select Bluetooth Audio Codec</string>
+ <!-- UI debug setting: Trigger Bluetooth Audio Codec Selection -->
+ <string name="bluetooth_select_a2dp_codec_type_dialog_title">Trigger Bluetooth Audio Codec\u000ASelection</string>
- <!-- UI debug setting: Select Bluetooth Audio Sample Rate -->
+ <!-- UI debug setting: Trigger Bluetooth Audio Sample Rate Selection -->
<string name="bluetooth_select_a2dp_codec_sample_rate">Bluetooth Audio Sample Rate</string>
- <!-- UI debug setting: Select Bluetooth Audio Codec: Sample Rate -->
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title">Select Bluetooth Audio Codec:\u000ASample Rate</string>
+ <!-- UI debug setting: Trigger Bluetooth Audio Codec Selection: Sample Rate -->
+ <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title">Trigger Bluetooth Audio Codec\u000ASelection: Sample Rate</string>
- <!-- UI debug setting: Select Bluetooth Audio Bits Per Sample -->
+ <!-- UI debug setting: Trigger Bluetooth Audio Bits Per Sample Selection -->
<string name="bluetooth_select_a2dp_codec_bits_per_sample">Bluetooth Audio Bits Per Sample</string>
- <!-- UI debug setting: Select Bluetooth Audio Codec: Bits Per Sample -->
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title">Select Bluetooth Audio Codec:\u000ABits Per Sample</string>
+ <!-- UI debug setting: Trigger Bluetooth Audio Codec Selection: Bits Per Sample -->
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title">Trigger Bluetooth Audio Codec\u000ASelection: Bits Per Sample</string>
- <!-- UI debug setting: Select Bluetooth Audio Channel Mode -->
+ <!-- UI debug setting: Trigger Bluetooth Audio Channel Mode Selection -->
<string name="bluetooth_select_a2dp_codec_channel_mode">Bluetooth Audio Channel Mode</string>
- <!-- UI debug setting: Select Bluetooth Audio Codec: Channel Mode -->
- <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title">Select Bluetooth Audio Codec:\u000AChannel Mode</string>
+ <!-- UI debug setting: Trigger Bluetooth Audio Codec Selection: Channel Mode -->
+ <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title">Trigger Bluetooth Audio Codec\u000ASelection: Channel Mode</string>
- <!-- UI debug setting: Select Bluetooth Audio LDAC Playback Quality -->
+ <!-- UI debug setting: Trigger Bluetooth Audio LDAC Playback Quality Selection -->
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality">Bluetooth Audio LDAC Codec: Playback Quality</string>
<!-- UI debug setting: Select Bluetooth Audio LDAC Codec: LDAC Playback Quality -->
- <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title">Select Bluetooth Audio LDAC Codec:\u000APlayback Quality</string>
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title">Trigger Bluetooth Audio LDAC Codec\u000ASelection: Playback Quality</string>
<!-- [CHAR LIMIT=NONE] Label for displaying Bluetooth Audio Codec Parameters while streaming -->
<string name="bluetooth_select_a2dp_codec_streaming_label">Streaming: <xliff:g id="streaming_parameter">%1$s</xliff:g></string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
index 7728f66..aeb4a85 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
@@ -378,7 +378,7 @@
final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
Context.DEVICE_POLICY_SERVICE);
- return dpm.isMeteredDataDisabledForUser(enforcedAdmin.component, packageName, userId)
+ return dpm.isMeteredDataDisabledPackageForUser(enforcedAdmin.component, packageName, userId)
? enforcedAdmin : null;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
index 48b7c35..42b3156 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
@@ -16,20 +16,20 @@
package com.android.settingslib;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import android.content.Context;
import android.content.res.TypedArray;
import android.os.UserHandle;
+import android.support.v14.preference.SwitchPreference;
import android.support.v4.content.res.TypedArrayUtils;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceViewHolder;
-import android.support.v14.preference.SwitchPreference;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
/**
* Version of SwitchPreference that can be disabled by a device admin
* using a user restriction.
@@ -37,7 +37,7 @@
public class RestrictedSwitchPreference extends SwitchPreference {
RestrictedPreferenceHelper mHelper;
boolean mUseAdditionalSummary = false;
- String mRestrictedSwitchSummary = null;
+ CharSequence mRestrictedSwitchSummary;
public RestrictedSwitchPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
@@ -57,19 +57,15 @@
final TypedValue restrictedSwitchSummary = attributes.peekValue(
R.styleable.RestrictedSwitchPreference_restrictedSwitchSummary);
- CharSequence data = null;
if (restrictedSwitchSummary != null
&& restrictedSwitchSummary.type == TypedValue.TYPE_STRING) {
if (restrictedSwitchSummary.resourceId != 0) {
- data = context.getString(restrictedSwitchSummary.resourceId);
+ mRestrictedSwitchSummary =
+ context.getText(restrictedSwitchSummary.resourceId);
} else {
- data = restrictedSwitchSummary.string;
+ mRestrictedSwitchSummary = restrictedSwitchSummary.string;
}
}
- mRestrictedSwitchSummary = data == null ? null : data.toString();
- }
- if (mRestrictedSwitchSummary == null) {
- mRestrictedSwitchSummary = context.getString(R.string.disabled_by_admin);
}
if (mUseAdditionalSummary) {
setLayoutResource(R.layout.restricted_switch_preference);
@@ -94,6 +90,15 @@
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
mHelper.onBindViewHolder(holder);
+
+ CharSequence switchSummary;
+ if (mRestrictedSwitchSummary == null) {
+ switchSummary = getContext().getText(isChecked()
+ ? R.string.enabled_by_admin : R.string.disabled_by_admin);
+ } else {
+ switchSummary = mRestrictedSwitchSummary;
+ }
+
final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
final View switchWidget = holder.findViewById(android.R.id.switch_widget);
if (restrictedIcon != null) {
@@ -102,12 +107,13 @@
if (switchWidget != null) {
switchWidget.setVisibility(isDisabledByAdmin() ? View.GONE : View.VISIBLE);
}
+
if (mUseAdditionalSummary) {
final TextView additionalSummaryView = (TextView) holder.findViewById(
R.id.additional_summary);
if (additionalSummaryView != null) {
if (isDisabledByAdmin()) {
- additionalSummaryView.setText(mRestrictedSwitchSummary);
+ additionalSummaryView.setText(switchSummary);
additionalSummaryView.setVisibility(View.VISIBLE);
} else {
additionalSummaryView.setVisibility(View.GONE);
@@ -117,7 +123,7 @@
final TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
if (summaryView != null) {
if (isDisabledByAdmin()) {
- summaryView.setText(mRestrictedSwitchSummary);
+ summaryView.setText(switchSummary);
summaryView.setVisibility(View.VISIBLE);
}
// No need to change the visibility to GONE in the else case here since Preference
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
index ac3599c..4a6df50 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
@@ -29,4 +29,5 @@
void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState);
void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state);
void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile);
+ void onProfileAudioStateChanged(int bluetoothProfile, int state);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
index ee12191..f9f80eb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
@@ -163,6 +163,11 @@
return mService.getActiveDevice();
}
+ public boolean isAudioOn() {
+ if (mService == null) return false;
+ return mService.isAudioOn();
+ }
+
public boolean isPreferred(BluetoothDevice device) {
if (mService == null) return false;
return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF;
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
index e2c7747..835ff07 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
@@ -20,8 +20,11 @@
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
+import android.provider.Settings.Global;
import android.provider.Settings.Secure;
+import android.util.KeyValueListParser;
import android.util.Log;
+import android.util.Slog;
/**
* Utilities related to battery saver.
@@ -34,10 +37,49 @@
private static final boolean DEBUG = false;
- // Broadcast action for SystemUI to show the battery saver confirmation dialog.
+ private static final String SYSUI_PACKAGE = "com.android.systemui";
+
+ /** Broadcast action for SystemUI to show the battery saver confirmation dialog. */
public static final String ACTION_SHOW_START_SAVER_CONFIRMATION = "PNW.startSaverConfirmation";
/**
+ * Broadcast action for SystemUI to show the notification that suggests turning on
+ * automatic battery saver.
+ */
+ public static final String ACTION_SHOW_AUTO_SAVER_SUGGESTION
+ = "PNW.autoSaverSuggestion";
+
+ private static class Parameters {
+ private final Context mContext;
+
+ /**
+ * We show the auto battery saver suggestion notification when the user manually enables
+ * battery saver for the START_NTH time through the END_NTH time.
+ * (We won't show it for END_NTH + 1 time and after.)
+ */
+ private static final int AUTO_SAVER_SUGGESTION_START_NTH = 4;
+ private static final int AUTO_SAVER_SUGGESTION_END_NTH = 8;
+
+ public final int startNth;
+ public final int endNth;
+
+ public Parameters(Context context) {
+ mContext = context;
+
+ final String newValue = Global.getString(mContext.getContentResolver(),
+ Global.LOW_POWER_MODE_SUGGESTION_PARAMS);
+ final KeyValueListParser parser = new KeyValueListParser(',');
+ try {
+ parser.setString(newValue);
+ } catch (IllegalArgumentException e) {
+ Slog.wtf(TAG, "Bad constants: " + newValue);
+ }
+ startNth = parser.getInt("start_nth", AUTO_SAVER_SUGGESTION_START_NTH);
+ endNth = parser.getInt("end_nth", AUTO_SAVER_SUGGESTION_END_NTH);
+ }
+ }
+
+ /**
* Enable / disable battery saver by user request.
* - If it's the first time and needFirstTimeWarning, show the first time dialog.
* - If it's 4th time through 8th time, show the schedule suggestion notification.
@@ -62,11 +104,19 @@
if (context.getSystemService(PowerManager.class).setPowerSaveMode(enable)) {
if (enable) {
- Secure.putInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT,
- Secure.getInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 0) + 1);
+ final int count =
+ Secure.getInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 0) + 1;
+ Secure.putInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, count);
- // TODO If enabling, and the count is between 4 and 8 (inclusive), then
- // show the "battery saver schedule suggestion" notification.
+ final Parameters parameters = new Parameters(context);
+
+ if ((count >= parameters.startNth)
+ && (count <= parameters.endNth)
+ && Global.getInt(cr, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) == 0
+ && Secure.getInt(cr,
+ Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, 0) == 0) {
+ showAutoBatterySaverSuggestion(context);
+ }
}
return true;
@@ -79,13 +129,34 @@
Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 0) != 0) {
return false; // Already shown.
}
- final Intent i = new Intent(ACTION_SHOW_START_SAVER_CONFIRMATION);
- context.sendBroadcast(i);
-
+ context.sendBroadcast(getSystemUiBroadcast(ACTION_SHOW_START_SAVER_CONFIRMATION));
return true;
}
+ private static void showAutoBatterySaverSuggestion(Context context) {
+ context.sendBroadcast(getSystemUiBroadcast(ACTION_SHOW_AUTO_SAVER_SUGGESTION));
+ }
+
+ private static Intent getSystemUiBroadcast(String action) {
+ final Intent i = new Intent(action);
+ i.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ i.setPackage(SYSUI_PACKAGE);
+ return i;
+ }
+
private static void setBatterySaverConfirmationAcknowledged(Context context) {
Secure.putInt(context.getContentResolver(), Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1);
}
+
+ public static void suppressAutoBatterySaver(Context context) {
+ Secure.putInt(context.getContentResolver(),
+ Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, 1);
+ }
+
+ public static void scheduleAutoBatterySaver(Context context, int level) {
+ if (Global.getInt(context.getContentResolver(), Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)
+ == 0) {
+ Global.putInt(context.getContentResolver(), Global.LOW_POWER_MODE_TRIGGER_LEVEL, level);
+ }
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
index cc69e0e..c4ca339 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
@@ -86,7 +86,7 @@
* @return List of {@code UserInfo} for each user that is not the current user.
*/
public List<UserInfo> getAllUsersExcludesCurrentUser() {
- List<UserInfo> others = mUserManager.getUsers(true);
+ List<UserInfo> others = getAllUsers();
for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
UserInfo userInfo = iterator.next();
@@ -98,6 +98,31 @@
return others;
}
+ /**
+ * Gets all the other users on the system that are not the system user.
+ *
+ * @return List of {@code UserInfo} for each user that is not the system user.
+ */
+ public List<UserInfo> getAllUsersExcludesSystemUser() {
+ List<UserInfo> others = getAllUsers();
+
+ for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userIsSystemUser(userInfo)) {
+ // Remove system user from the list.
+ iterator.remove();
+ }
+ }
+ return others;
+ }
+
+ /**
+ * Gets all the users on the system that are not currently being removed.
+ */
+ public List<UserInfo> getAllUsers() {
+ return mUserManager.getUsers(true /* excludeDying */);
+ }
+
// User information accessors
/**
@@ -224,7 +249,7 @@
* @return {@code true} if user is successfully removed, {@code false} otherwise.
*/
public boolean removeUser(UserInfo userInfo) {
- if (userInfo.id == UserHandle.USER_SYSTEM) {
+ if (userIsSystemUser(userInfo)) {
Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
return false;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
index 81a2d43..3e3c039 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
@@ -41,10 +41,11 @@
public static final int SECONDS_PER_DAY = 24 * 60 * 60;
/**
- * Returns elapsed time for the given millis, in the following format:
- * 2d 5h 40m 29s
- * @param context the application context
- * @param millis the elapsed time in milli seconds
+ * Returns elapsed time for the given millis, in the following format:
+ * 2 days, 5 hr, 40 min, 29 sec
+ *
+ * @param context the application context
+ * @param millis the elapsed time in milli seconds
* @param withSeconds include seconds?
* @return the formatted elapsed time
*/
@@ -92,7 +93,7 @@
final Locale locale = context.getResources().getConfiguration().locale;
final MeasureFormat measureFormat = MeasureFormat.getInstance(
- locale, FormatWidth.NARROW);
+ locale, FormatWidth.SHORT);
sb.append(measureFormat.formatMeasures(measureArray));
if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index c5c1169..50dfc26 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -43,8 +43,6 @@
import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -896,6 +894,13 @@
summary.append(WifiUtils.buildLoggingSummary(this, config));
}
+ if (config != null && (WifiUtils.isMeteredOverridden(config) || config.meteredHint)) {
+ return mContext.getResources().getString(
+ R.string.preference_summary_default_combination,
+ WifiUtils.getMeteredLabel(mContext, config),
+ summary.toString());
+ }
+
// If Speed label and summary are both present, use the preference combination to combine
// the two, else return the non-null one.
if (getSpeedLabel() != null && summary.length() != 0) {
@@ -1154,7 +1159,7 @@
@Nullable
@Speed
- private int roundToClosestSpeedEnum(int speed) {
+ private static int roundToClosestSpeedEnum(int speed) {
if (speed < Speed.SLOW) {
return Speed.NONE;
} else if (speed < (Speed.SLOW + Speed.MODERATE) / 2) {
@@ -1170,21 +1175,31 @@
@Nullable
String getSpeedLabel(@Speed int speed) {
+ return getSpeedLabel(mContext, speed);
+ }
+
+ private static String getSpeedLabel(Context context, int speed) {
switch (speed) {
case Speed.VERY_FAST:
- return mContext.getString(R.string.speed_label_very_fast);
+ return context.getString(R.string.speed_label_very_fast);
case Speed.FAST:
- return mContext.getString(R.string.speed_label_fast);
+ return context.getString(R.string.speed_label_fast);
case Speed.MODERATE:
- return mContext.getString(R.string.speed_label_okay);
+ return context.getString(R.string.speed_label_okay);
case Speed.SLOW:
- return mContext.getString(R.string.speed_label_slow);
+ return context.getString(R.string.speed_label_slow);
case Speed.NONE:
default:
return null;
}
}
+ /** Return the speed label for a {@link ScoredNetwork} at the specified {@code rssi} level. */
+ @Nullable
+ public static String getSpeedLabel(Context context, ScoredNetwork scoredNetwork, int rssi) {
+ return getSpeedLabel(context, roundToClosestSpeedEnum(scoredNetwork.calculateBadge(rssi)));
+ }
+
/** Return true if the current RSSI is reachable, and false otherwise. */
public boolean isReachable() {
return mRssi != UNREACHABLE_RSSI;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 6e12e20..9347674 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -10,28 +10,92 @@
package com.android.settingslib.wifi;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+
+import android.content.Context;
import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
+import android.net.NetworkKey;
+import android.net.NetworkRequest;
+import android.net.NetworkScoreManager;
+import android.net.ScoredNetwork;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiSsid;
+import android.os.Handler;
+import android.os.Looper;
+
+import com.android.settingslib.R;
import java.util.List;
-public class WifiStatusTracker {
-
+public class WifiStatusTracker extends ConnectivityManager.NetworkCallback {
+ private final Context mContext;
+ private final WifiNetworkScoreCache mWifiNetworkScoreCache;
private final WifiManager mWifiManager;
+ private final NetworkScoreManager mNetworkScoreManager;
+ private final ConnectivityManager mConnectivityManager;
+ private final WifiNetworkScoreCache.CacheListener mCacheListener =
+ new WifiNetworkScoreCache.CacheListener(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void networkCacheUpdated(List<ScoredNetwork> updatedNetworks) {
+ updateStatusLabel();
+ mCallback.run();
+ }
+ };
+ private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
+ .clearCapabilities()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
+ private final ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager
+ .NetworkCallback() {
+ @Override
+ public void onCapabilitiesChanged(
+ Network network, NetworkCapabilities networkCapabilities) {
+ updateStatusLabel();
+ mCallback.run();
+ }
+ };
+ private final Runnable mCallback;
+
+ private WifiInfo mWifiInfo;
public boolean enabled;
public int state;
public boolean connected;
- public boolean connecting;
public String ssid;
public int rssi;
public int level;
+ public String statusLabel;
- public WifiStatusTracker(WifiManager wifiManager) {
+ public WifiStatusTracker(Context context, WifiManager wifiManager,
+ NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
+ Runnable callback) {
+ mContext = context;
mWifiManager = wifiManager;
+ mWifiNetworkScoreCache = new WifiNetworkScoreCache(context);
+ mNetworkScoreManager = networkScoreManager;
+ mConnectivityManager = connectivityManager;
+ mCallback = callback;
+ }
+
+ public void setListening(boolean listening) {
+ if (listening) {
+ mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
+ mWifiNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_CURRENT_NETWORK);
+ mWifiNetworkScoreCache.registerListener(mCacheListener);
+ mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+ } else {
+ mNetworkScoreManager.unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI,
+ mWifiNetworkScoreCache);
+ mWifiNetworkScoreCache.unregisterListener();
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ }
}
public void handleBroadcast(Intent intent) {
@@ -40,34 +104,59 @@
state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
WifiManager.WIFI_STATE_UNKNOWN);
enabled = state == WifiManager.WIFI_STATE_ENABLED;
-
-
- enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
- WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
} else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
- final NetworkInfo networkInfo = (NetworkInfo)
+ final NetworkInfo networkInfo =
intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
- connecting = networkInfo != null && !networkInfo.isConnected()
- && networkInfo.isConnectedOrConnecting();
connected = networkInfo != null && networkInfo.isConnected();
- // If Connected grab the signal strength and ssid.
+ mWifiInfo = null;
+ ssid = null;
if (connected) {
- WifiInfo info = mWifiManager.getConnectionInfo();
- if (info != null) {
- ssid = getValidSsid(info);
- } else {
- ssid = null;
+ mWifiInfo = mWifiManager.getConnectionInfo();
+ if (mWifiInfo != null) {
+ ssid = getValidSsid(mWifiInfo);
+ updateRssi(mWifiInfo.getRssi());
+ maybeRequestNetworkScore();
}
- } else if (!connected) {
- ssid = null;
}
+ updateStatusLabel();
} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
// Default to -200 as its below WifiManager.MIN_RSSI.
- rssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
- level = WifiManager.calculateSignalLevel(rssi, 5);
+ updateRssi(intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200));
+ updateStatusLabel();
}
}
+ private void updateRssi(int newRssi) {
+ rssi = newRssi;
+ level = WifiManager.calculateSignalLevel(rssi, WifiManager.RSSI_LEVELS);
+ }
+
+ private void maybeRequestNetworkScore() {
+ NetworkKey networkKey = NetworkKey.createFromWifiInfo(mWifiInfo);
+ if (mWifiNetworkScoreCache.getScoredNetwork(networkKey) == null) {
+ mNetworkScoreManager.requestScores(new NetworkKey[]{ networkKey });
+ }
+ }
+
+ private void updateStatusLabel() {
+ final NetworkCapabilities networkCapabilities
+ = mConnectivityManager.getNetworkCapabilities(mWifiManager.getCurrentNetwork());
+ if (networkCapabilities != null) {
+ if (networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) {
+ statusLabel = mContext.getString(R.string.wifi_status_sign_in_required);
+ return;
+ } else if (!networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) {
+ statusLabel = mContext.getString(R.string.wifi_status_no_internet);
+ return;
+ }
+ }
+
+ ScoredNetwork scoredNetwork =
+ mWifiNetworkScoreCache.getScoredNetwork(NetworkKey.createFromWifiInfo(mWifiInfo));
+ statusLabel = scoredNetwork == null
+ ? null : AccessPoint.getSpeedLabel(mContext, scoredNetwork, rssi);
+ }
+
private String getValidSsid(WifiInfo info) {
String ssid = info.getSSID();
if (ssid != null && !WifiSsid.NONE.equals(ssid)) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 8f80527..a128b54 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -213,6 +213,7 @@
mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
index 61efabc..bee2fa1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
@@ -16,12 +16,15 @@
package com.android.settingslib.wifi;
+import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.SystemClock;
import android.support.annotation.VisibleForTesting;
+import com.android.settingslib.R;
+
import java.util.Map;
public class WifiUtils {
@@ -198,4 +201,18 @@
// speed wil be determined by mRssi
return timedScore.getScore().calculateBadge(result.level);
}
+
+ public static String getMeteredLabel(Context context, WifiConfiguration config) {
+ // meteredOverride is whether the user manually set the metered setting or not.
+ // meteredHint is whether the network itself is telling us that it is metered
+ if (config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED
+ || (config.meteredHint && !isMeteredOverridden(config))) {
+ return context.getString(R.string.wifi_metered_label);
+ }
+ return context.getString(R.string.wifi_unmetered_label);
+ }
+
+ public static boolean isMeteredOverridden(WifiConfiguration config) {
+ return config.meteredOverride != WifiConfiguration.METERED_OVERRIDE_NONE;
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
index 325ef3a..3f1fcbb 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
@@ -113,6 +113,54 @@
}
@Test
+ public void testGetAllUsersExcludesSystemUser() {
+ UserInfo otherUser1 = createUserInfoForId(10);
+ UserInfo otherUser2 = createUserInfoForId(11);
+ UserInfo otherUser3 = createUserInfoForId(12);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(otherUser1);
+ testUsers.add(otherUser2);
+ testUsers.add(mSystemUser);
+ testUsers.add(otherUser3);
+
+ when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+ // Should return 3 users that don't have SYSTEM USER id.
+ assertThat(mHelper.getAllUsersExcludesSystemUser().size()).isEqualTo(3);
+ // Should not contain system user.
+ assertThat(mHelper.getAllUsersExcludesSystemUser()).doesNotContain(mSystemUser);
+ // Should contain non-system users.
+ assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser1);
+ assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser2);
+ assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser3);
+ }
+
+ @Test
+ public void testGetAllUsers() {
+ int currentUser = UserHandle.myUserId();
+
+ UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
+ UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
+ UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(otherUser1);
+ testUsers.add(otherUser2);
+ testUsers.add(mCurrentUser);
+ testUsers.add(otherUser3);
+
+ when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+ // Should return 3 users that don't have currentUser id.
+ assertThat(mHelper.getAllUsers().size()).isEqualTo(4);
+ assertThat(mHelper.getAllUsers()).contains(mCurrentUser);
+ assertThat(mHelper.getAllUsers()).contains(otherUser1);
+ assertThat(mHelper.getAllUsers()).contains(otherUser2);
+ assertThat(mHelper.getAllUsers()).contains(otherUser3);
+ }
+
+ @Test
public void testUserCanBeRemoved() {
UserInfo testInfo = new UserInfo();
@@ -208,11 +256,6 @@
// Cannot remove system user.
assertThat(mHelper.removeUser(mSystemUser)).isFalse();
- // Removing current user, calls "switch" to system user.
- mHelper.removeUser(mCurrentUser);
- verify(mActivityManager).switchUser(UserHandle.USER_SYSTEM);
- verify(mUserManager).removeUser(mCurrentUser.id);
-
// Removing non-current, non-system user, simply calls removeUser.
UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
mHelper.removeUser(userToRemove);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HeadsetProfileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HeadsetProfileTest.java
new file mode 100644
index 0000000..117f447
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HeadsetProfileTest.java
@@ -0,0 +1,60 @@
+package com.android.settingslib.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class HeadsetProfileTest {
+
+ @Mock
+ private LocalBluetoothAdapter mAdapter;
+ @Mock
+ private CachedBluetoothDeviceManager mDeviceManager;
+ @Mock
+ private LocalBluetoothProfileManager mProfileManager;
+ @Mock
+ private BluetoothHeadset mService;
+
+ private BluetoothProfile.ServiceListener mServiceListener;
+ private HeadsetProfile mProfile;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Context context = spy(RuntimeEnvironment.application);
+
+ doAnswer((invocation) -> {
+ mServiceListener = (BluetoothProfile.ServiceListener) invocation.getArguments()[1];
+ return null;
+ }).when(mAdapter).getProfileProxy(any(Context.class), any(), eq(BluetoothProfile.HEADSET));
+
+ mProfile = new HeadsetProfile(context, mAdapter, mDeviceManager, mProfileManager);
+ mServiceListener.onServiceConnected(BluetoothProfile.HEADSET, mService);
+ }
+
+ @Test
+ public void bluetoothProfile_shouldReturnTheAudioStatusFromBlueToothHeadsetService() {
+ when(mService.isAudioOn()).thenReturn(true);
+ assertThat(mProfile.isAudioOn()).isTrue();
+
+ when(mService.isAudioOn()).thenReturn(false);
+ assertThat(mProfile.isAudioOn()).isFalse();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
index c11687b..05247ba 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
@@ -137,9 +137,9 @@
true /* basedOnUsage */);
// shortened string should not have percentage
- assertThat(info).isEqualTo("Less than 15m remaining");
+ assertThat(info).isEqualTo("Less than 15 min remaining");
// Add percentage to string when provided
- assertThat(info2).isEqualTo("Less than 15m remaining (10%)");
+ assertThat(info2).isEqualTo("Less than 15 min remaining (10%)");
}
@Test
@@ -154,9 +154,9 @@
false /* basedOnUsage */);
// We only add special mention for the long string
- assertThat(info).isEqualTo("About 1d 6h left based on your usage");
+ assertThat(info).isEqualTo("About 1 day, 6 hr left based on your usage");
// shortened string should not have extra text
- assertThat(info2).isEqualTo("About 1d 6h left (10%)");
+ assertThat(info2).isEqualTo("About 1 day, 6 hr left (10%)");
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
index 532c755..743951a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
@@ -43,7 +43,7 @@
@Test
public void testFormatElapsedTime_WithSeconds_ShowSeconds() {
final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "5m 30s";
+ final String expectedTime = "5 min, 30 sec";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true).toString())
.isEqualTo(expectedTime);
@@ -52,7 +52,7 @@
@Test
public void testFormatElapsedTime_NoSeconds_DoNotShowSeconds() {
final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "6m";
+ final String expectedTime = "6 min";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString())
.isEqualTo(expectedTime);
@@ -62,7 +62,7 @@
public void testFormatElapsedTime_TimeMoreThanOneDay_ShowCorrectly() {
final double testMillis = 2 * DateUtils.DAY_IN_MILLIS
+ 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2d 4h 15m";
+ final String expectedTime = "2 days, 4 hr, 15 min";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString())
.isEqualTo(expectedTime);
@@ -71,7 +71,7 @@
@Test
public void testFormatElapsedTime_ZeroFieldsInTheMiddleDontShow() {
final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2d 15m";
+ final String expectedTime = "2 days, 15 min";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString())
.isEqualTo(expectedTime);
@@ -80,7 +80,7 @@
@Test
public void testFormatElapsedTime_FormatZero_WithSeconds() {
final double testMillis = 0;
- final String expectedTime = "0s";
+ final String expectedTime = "0 sec";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true).toString())
.isEqualTo(expectedTime);
@@ -89,7 +89,7 @@
@Test
public void testFormatElapsedTime_FormatZero_NoSeconds() {
final double testMillis = 0;
- final String expectedTime = "0m";
+ final String expectedTime = "0 min";
assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString())
.isEqualTo(expectedTime);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
index 91d9f91..d25adde 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
@@ -27,6 +27,7 @@
import android.net.ScoredNetwork;
import android.net.WifiKey;
import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiNetworkScoreCache;
import android.os.Bundle;
import android.os.Parcelable;
@@ -61,6 +62,8 @@
private WifiNetworkScoreCache mockWifiNetworkScoreCache;
@Mock
private AccessPoint mAccessPoint;
+ @Mock
+ WifiConfiguration mWifiConfig;
@Before
public void setUp() {
@@ -98,6 +101,52 @@
WifiUtils.getVisibilityStatus(mAccessPoint);
}
+ @Test
+ public void testGetMeteredLabel_returnsCorrectValues() {
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NONE;
+ assertThat(WifiUtils.getMeteredLabel(mContext, mWifiConfig)).isEqualTo("Metered");
+
+ mWifiConfig.meteredHint = false;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
+ assertThat(WifiUtils.getMeteredLabel(mContext, mWifiConfig)).isEqualTo("Metered");
+
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
+ assertThat(WifiUtils.getMeteredLabel(mContext, mWifiConfig)).isEqualTo("Metered");
+
+ mWifiConfig.meteredHint = false;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ assertThat(WifiUtils.getMeteredLabel(mContext, mWifiConfig)).isEqualTo("Unmetered");
+
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ assertThat(WifiUtils.getMeteredLabel(mContext, mWifiConfig)).isEqualTo("Unmetered");
+ }
+
+ @Test
+ public void testIsMeteredOverridden_returnsCorrectValues() {
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NONE;
+ assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isFalse();
+
+ mWifiConfig.meteredHint = false;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
+ assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isTrue();
+
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
+ assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isTrue();
+
+ mWifiConfig.meteredHint = false;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isTrue();
+
+ mWifiConfig.meteredHint = true;
+ mWifiConfig.meteredOverride = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isTrue();
+ }
+
private static ArrayList<ScanResult> buildScanResultCache() {
ArrayList<ScanResult> scanResults = new ArrayList<>();
for (int i = 0; i < 5; i++) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 6d9da9b..f43e719 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1512,105 +1512,360 @@
s.dumpHistoricalOperations(p, SecureSettingsProto.HISTORICAL_OPERATIONS);
- // This uses the same order as in Settings.Secure.
+ // This uses the same order as in SecureSettingsProto.
- // Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED intentionally excluded since it's deprecated.
- // Settings.Secure.BUGREPORT_IN_POWER_MENU intentionally excluded since it's deprecated.
- // Settings.Secure.ADB_ENABLED intentionally excluded since it's deprecated.
- // Settings.Secure.ALLOW_MOCK_LOCATION intentionally excluded since it's deprecated.
+ final long accessibilityToken = p.start(SecureSettingsProto.ACCESSIBILITY);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_ENABLED,
+ SecureSettingsProto.Accessibility.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ SecureSettingsProto.Accessibility.ENABLED_ACCESSIBILITY_SERVICES);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED,
+ SecureSettingsProto.Accessibility.AUTOCLICK_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY,
+ SecureSettingsProto.Accessibility.AUTOCLICK_DELAY);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT,
+ SecureSettingsProto.Accessibility.BUTTON_TARGET_COMPONENT);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
+ SecureSettingsProto.Accessibility.CAPTIONING_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE,
+ SecureSettingsProto.Accessibility.CAPTIONING_LOCALE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET,
+ SecureSettingsProto.Accessibility.CAPTIONING_PRESET);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
+ SecureSettingsProto.Accessibility.CAPTIONING_BACKGROUND_COLOR);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
+ SecureSettingsProto.Accessibility.CAPTIONING_FOREGROUND_COLOR);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
+ SecureSettingsProto.Accessibility.CAPTIONING_EDGE_TYPE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
+ SecureSettingsProto.Accessibility.CAPTIONING_EDGE_COLOR);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
+ SecureSettingsProto.Accessibility.CAPTIONING_WINDOW_COLOR);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE,
+ SecureSettingsProto.Accessibility.CAPTIONING_TYPEFACE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
+ SecureSettingsProto.Accessibility.CAPTIONING_FONT_SCALE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
+ SecureSettingsProto.Accessibility.DISPLAY_DALTONIZER_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER,
+ SecureSettingsProto.Accessibility.DISPLAY_DALTONIZER);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
+ SecureSettingsProto.Accessibility.DISPLAY_INVERSION_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
+ SecureSettingsProto.Accessibility.DISPLAY_MAGNIFICATION_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
+ SecureSettingsProto.Accessibility.DISPLAY_MAGNIFICATION_NAVBAR_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
+ SecureSettingsProto.Accessibility.DISPLAY_MAGNIFICATION_SCALE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
+ SecureSettingsProto.Accessibility.HIGH_TEXT_CONTRAST_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON,
+ SecureSettingsProto.Accessibility.LARGE_POINTER_ICON);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED,
+ SecureSettingsProto.Accessibility.SHORTCUT_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN,
+ SecureSettingsProto.Accessibility.SHORTCUT_ON_LOCK_SCREEN);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
+ SecureSettingsProto.Accessibility.SHORTCUT_DIALOG_SHOWN);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ SecureSettingsProto.Accessibility.SHORTCUT_TARGET_SERVICE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
+ SecureSettingsProto.Accessibility.SOFT_KEYBOARD_MODE);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
+ SecureSettingsProto.Accessibility.SPEAK_PASSWORD);
+ dumpSetting(s, p,
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED,
+ SecureSettingsProto.Accessibility.TOUCH_EXPLORATION_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+ SecureSettingsProto.Accessibility.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
+ p.end(accessibilityToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
+ SecureSettingsProto.ALLOWED_GEOLOCATION_ORIGINS);
+
+ final long aovToken = p.start(SecureSettingsProto.ALWAYS_ON_VPN);
+ dumpSetting(s, p,
+ Settings.Secure.ALWAYS_ON_VPN_APP,
+ SecureSettingsProto.AlwaysOnVpn.APP);
+ dumpSetting(s, p,
+ Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
+ SecureSettingsProto.AlwaysOnVpn.LOCKDOWN);
+ p.end(aovToken);
+
dumpSetting(s, p,
Settings.Secure.ANDROID_ID,
SecureSettingsProto.ANDROID_ID);
- // Settings.Secure.BLUETOOTH_ON intentionally excluded since it's deprecated.
- // Settings.Secure.DATA_ROAMING intentionally excluded since it's deprecated.
dumpSetting(s, p,
- Settings.Secure.DEFAULT_INPUT_METHOD,
- SecureSettingsProto.DEFAULT_INPUT_METHOD);
+ Settings.Secure.ANR_SHOW_BACKGROUND,
+ SecureSettingsProto.ANR_SHOW_BACKGROUND);
+
+ final long assistToken = p.start(SecureSettingsProto.ASSIST);
dumpSetting(s, p,
- Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE,
- SecureSettingsProto.SELECTED_INPUT_METHOD_SUBTYPE);
+ Settings.Secure.ASSISTANT,
+ SecureSettingsProto.Assist.ASSISTANT);
dumpSetting(s, p,
- Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY,
- SecureSettingsProto.INPUT_METHODS_SUBTYPE_HISTORY);
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED,
+ SecureSettingsProto.Assist.STRUCTURE_ENABLED);
dumpSetting(s, p,
- Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
- SecureSettingsProto.INPUT_METHOD_SELECTOR_VISIBILITY);
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
+ SecureSettingsProto.Assist.SCREENSHOT_ENABLED);
dumpSetting(s, p,
- Settings.Secure.VOICE_INTERACTION_SERVICE,
- SecureSettingsProto.VOICE_INTERACTION_SERVICE);
+ Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
+ SecureSettingsProto.Assist.DISCLOSURE_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ASSIST_GESTURE_ENABLED,
+ SecureSettingsProto.Assist.GESTURE_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ASSIST_GESTURE_SENSITIVITY,
+ SecureSettingsProto.Assist.GESTURE_SENSITIVITY);
+ dumpSetting(s, p,
+ Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
+ SecureSettingsProto.Assist.GESTURE_SILENCE_ALERTS_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ASSIST_GESTURE_WAKE_ENABLED,
+ SecureSettingsProto.Assist.GESTURE_WAKE_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ASSIST_GESTURE_SETUP_COMPLETE,
+ SecureSettingsProto.Assist.GESTURE_SETUP_COMPLETE);
+ p.end(assistToken);
+
+ final long autofillToken = p.start(SecureSettingsProto.AUTOFILL);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_SERVICE,
- SecureSettingsProto.AUTOFILL_SERVICE);
+ SecureSettingsProto.Autofill.SERVICE);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION,
- SecureSettingsProto.AUTOFILL_FEATURE_FIELD_CLASSIFICATION);
+ SecureSettingsProto.Autofill.FEATURE_FIELD_CLASSIFICATION);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE,
- SecureSettingsProto.AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE);
+ SecureSettingsProto.Autofill.USER_DATA_MAX_USER_DATA_SIZE);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE,
- SecureSettingsProto.AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE);
+ SecureSettingsProto.Autofill.USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT,
- SecureSettingsProto.AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT);
+ SecureSettingsProto.Autofill.USER_DATA_MAX_CATEGORY_COUNT);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_USER_DATA_MAX_VALUE_LENGTH,
- SecureSettingsProto.AUTOFILL_USER_DATA_MAX_VALUE_LENGTH);
+ SecureSettingsProto.Autofill.USER_DATA_MAX_VALUE_LENGTH);
dumpSetting(s, p,
Settings.Secure.AUTOFILL_USER_DATA_MIN_VALUE_LENGTH,
- SecureSettingsProto.AUTOFILL_USER_DATA_MIN_VALUE_LENGTH);
- // Settings.Secure.DEVICE_PROVISIONED intentionally excluded since it's deprecated.
+ SecureSettingsProto.Autofill.USER_DATA_MIN_VALUE_LENGTH);
dumpSetting(s, p,
- Settings.Secure.USER_SETUP_COMPLETE,
- SecureSettingsProto.USER_SETUP_COMPLETE);
- // Whether the current user has been set up via setup wizard (0 = false, 1 = true). This
- // value differs from USER_SETUP_COMPLETE in that it can be reset back to 0 in case
- // SetupWizard has been re-enabled on TV devices.
+ Settings.Secure.AUTOFILL_SERVICE_SEARCH_URI,
+ SecureSettingsProto.Autofill.SERVICE_SEARCH_URI);
+ p.end(autofillToken);
+
+ final long asmToken = p.start(SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER);
dumpSetting(s, p,
- Settings.Secure.TV_USER_SETUP_COMPLETE,
- SecureSettingsProto.TV_USER_SETUP_COMPLETE);
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+ SecureSettingsProto.AutomaticStorageManager.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
+ SecureSettingsProto.AutomaticStorageManager.DAYS_TO_RETAIN);
+ dumpSetting(s, p,
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
+ SecureSettingsProto.AutomaticStorageManager.BYTES_CLEARED);
+ dumpSetting(s, p,
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
+ SecureSettingsProto.AutomaticStorageManager.LAST_RUN);
+ dumpSetting(s, p,
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_TURNED_OFF_BY_POLICY,
+ SecureSettingsProto.AutomaticStorageManager.TURNED_OFF_BY_POLICY);
+ p.end(asmToken);
+
+ final long backupToken = p.start(SecureSettingsProto.BACKUP);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_ENABLED,
+ SecureSettingsProto.Backup.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_AUTO_RESTORE,
+ SecureSettingsProto.Backup.AUTO_RESTORE);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_PROVISIONED,
+ SecureSettingsProto.Backup.PROVISIONED);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_TRANSPORT,
+ SecureSettingsProto.Backup.TRANSPORT);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_MANAGER_CONSTANTS,
+ SecureSettingsProto.Backup.MANAGER_CONSTANTS);
+ dumpSetting(s, p,
+ Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS,
+ SecureSettingsProto.Backup.LOCAL_TRANSPORT_PARAMETERS);
+ dumpSetting(s, p,
+ Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE,
+ SecureSettingsProto.Backup.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE);
+ p.end(backupToken);
+
+ // Settings.Secure.BLUETOOTH_ON intentionally excluded since it's deprecated.
+ dumpSetting(s, p,
+ Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
+ SecureSettingsProto.BLUETOOTH_ON_WHILE_DRIVING);
+
+ final long cameraToken = p.start(SecureSettingsProto.CAMERA);
+ dumpSetting(s, p,
+ Settings.Secure.CAMERA_GESTURE_DISABLED,
+ SecureSettingsProto.Camera.GESTURE_DISABLED);
+ dumpSetting(s, p,
+ Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
+ SecureSettingsProto.Camera.DOUBLE_TAP_POWER_GESTURE_DISABLED);
+ dumpSetting(s, p,
+ Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
+ SecureSettingsProto.Camera.DOUBLE_TWIST_TO_FLIP_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.CAMERA_LIFT_TRIGGER_ENABLED,
+ SecureSettingsProto.Camera.LIFT_TRIGGER_ENABLED);
+ p.end(cameraToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.CARRIER_APPS_HANDLED,
+ SecureSettingsProto.CARRIER_APPS_HANDLED);
+ dumpSetting(s, p,
+ Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG,
+ SecureSettingsProto.CMAS_ADDITIONAL_BROADCAST_PKG);
dumpRepeatedSetting(s, p,
Settings.Secure.COMPLETED_CATEGORY_PREFIX,
SecureSettingsProto.COMPLETED_CATEGORIES);
dumpSetting(s, p,
- Settings.Secure.ENABLED_INPUT_METHODS,
- SecureSettingsProto.ENABLED_INPUT_METHODS);
+ Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS,
+ SecureSettingsProto.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS);
+ dumpSetting(s, p,
+ Settings.Secure.DEVICE_PAIRED,
+ SecureSettingsProto.DEVICE_PAIRED);
+ dumpSetting(s, p,
+ Settings.Secure.DIALER_DEFAULT_APPLICATION,
+ SecureSettingsProto.DIALER_DEFAULT_APPLICATION);
+ dumpSetting(s, p,
+ Settings.Secure.DISPLAY_DENSITY_FORCED,
+ SecureSettingsProto.DISPLAY_DENSITY_FORCED);
+ dumpSetting(s, p,
+ Settings.Secure.DOUBLE_TAP_TO_WAKE,
+ SecureSettingsProto.DOUBLE_TAP_TO_WAKE);
+
+ final long dozeToken = p.start(SecureSettingsProto.DOZE);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_ENABLED,
+ SecureSettingsProto.Doze.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_ALWAYS_ON,
+ SecureSettingsProto.Doze.ALWAYS_ON);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_PULSE_ON_PICK_UP,
+ SecureSettingsProto.Doze.PULSE_ON_PICK_UP);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
+ SecureSettingsProto.Doze.PULSE_ON_LONG_PRESS);
+ dumpSetting(s, p,
+ Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+ SecureSettingsProto.Doze.PULSE_ON_DOUBLE_TAP);
+ p.end(dozeToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
+ SecureSettingsProto.EMERGENCY_ASSISTANCE_APPLICATION);
+ dumpSetting(s, p,
+ Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED,
+ SecureSettingsProto.ENHANCED_VOICE_PRIVACY_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
+ SecureSettingsProto.IMMERSIVE_MODE_CONFIRMATIONS);
+
+ final long incallToken = p.start(SecureSettingsProto.INCALL);
+ dumpSetting(s, p,
+ Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
+ SecureSettingsProto.Incall.POWER_BUTTON_BEHAVIOR);
+ dumpSetting(s, p,
+ Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR,
+ SecureSettingsProto.Incall.BACK_BUTTON_BEHAVIOR);
+ p.end(incallToken);
+
+ final long inputMethodsToken = p.start(SecureSettingsProto.INPUT_METHODS);
+ dumpSetting(s, p,
+ Settings.Secure.DEFAULT_INPUT_METHOD,
+ SecureSettingsProto.InputMethods.DEFAULT_INPUT_METHOD);
dumpSetting(s, p,
Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
- SecureSettingsProto.DISABLED_SYSTEM_INPUT_METHODS);
+ SecureSettingsProto.InputMethods.DISABLED_SYSTEM_INPUT_METHODS);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_INPUT_METHODS,
+ SecureSettingsProto.InputMethods.ENABLED_INPUT_METHODS);
+ dumpSetting(s, p,
+ Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY,
+ SecureSettingsProto.InputMethods.SUBTYPE_HISTORY);
+ dumpSetting(s, p,
+ Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
+ SecureSettingsProto.InputMethods.METHOD_SELECTOR_VISIBILITY);
+ dumpSetting(s, p,
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE,
+ SecureSettingsProto.InputMethods.SELECTED_INPUT_METHOD_SUBTYPE);
dumpSetting(s, p,
Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD,
- SecureSettingsProto.SHOW_IME_WITH_HARD_KEYBOARD);
- // Settings.Secure.HTTP_PROXY intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.ALWAYS_ON_VPN_APP,
- SecureSettingsProto.ALWAYS_ON_VPN_APP);
- dumpSetting(s, p,
- Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
- SecureSettingsProto.ALWAYS_ON_VPN_LOCKDOWN);
+ SecureSettingsProto.InputMethods.SHOW_IME_WITH_HARD_KEYBOARD);
+ p.end(inputMethodsToken);
+
dumpSetting(s, p,
Settings.Secure.INSTALL_NON_MARKET_APPS,
SecureSettingsProto.INSTALL_NON_MARKET_APPS);
dumpSetting(s, p,
- Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED,
- SecureSettingsProto.UNKNOWN_SOURCES_DEFAULT_REVERSED);
+ Settings.Secure.INSTANT_APPS_ENABLED,
+ SecureSettingsProto.INSTANT_APPS_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.KEYGUARD_SLICE_URI,
+ SecureSettingsProto.KEYGUARD_SLICE_URI);
+ dumpSetting(s, p,
+ Settings.Secure.LAST_SETUP_SHOWN,
+ SecureSettingsProto.LAST_SETUP_SHOWN);
+
+ final long locationToken = p.start(SecureSettingsProto.LOCATION);
// Settings.Secure.LOCATION_PROVIDERS_ALLOWED intentionally excluded since it's deprecated.
dumpSetting(s, p,
Settings.Secure.LOCATION_MODE,
- SecureSettingsProto.LOCATION_MODE);
+ SecureSettingsProto.Location.MODE);
dumpSetting(s, p,
Settings.Secure.LOCATION_CHANGER,
- SecureSettingsProto.LOCATION_CHANGER);
+ SecureSettingsProto.Location.CHANGER);
+ p.end(locationToken);
+
+ final long lockScreenToken = p.start(SecureSettingsProto.LOCK_SCREEN);
// Settings.Secure.LOCK_BIOMETRIC_WEAK_FLAGS intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
- SecureSettingsProto.LOCK_TO_APP_EXIT_LOCKED);
// Settings.Secure.LOCK_PATTERN_ENABLED intentionally excluded since it's deprecated.
// Settings.Secure.LOCK_PATTERN_VISIBLE intentionally excluded since it's deprecated.
// Settings.Secure.LOCK_PATTERN_TACTICLE_FEEDBACK_ENABLED intentionally excluded since it's deprecated.
dumpSetting(s, p,
Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
- SecureSettingsProto.LOCK_SCREEN_LOCK_AFTER_TIMEOUT);
+ SecureSettingsProto.LockScreen.LOCK_AFTER_TIMEOUT);
// Settings.Secure.LOCK_SCREEN_OWNER_INFO intentionally excluded since it's deprecated.
// Settings.Secure.LOCK_SCREEN_APPWIDGET_IDS intentionally excluded since it's deprecated.
// Settings.Secure.LOCK_SCREEN_FALLBACK_APPWIDGET_ID intentionally excluded since it's deprecated.
@@ -1618,162 +1873,371 @@
// Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED intentionally excluded since it's deprecated.
dumpSetting(s, p,
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
- SecureSettingsProto.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+ SecureSettingsProto.LockScreen.ALLOW_PRIVATE_NOTIFICATIONS);
dumpSetting(s, p,
Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT,
- SecureSettingsProto.LOCK_SCREEN_ALLOW_REMOTE_INPUT);
+ SecureSettingsProto.LockScreen.ALLOW_REMOTE_INPUT);
dumpSetting(s, p,
- Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING,
- SecureSettingsProto.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING);
+ Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
+ SecureSettingsProto.LockScreen.SHOW_NOTIFICATIONS);
+ p.end(lockScreenToken);
+
dumpSetting(s, p,
- Settings.Secure.TRUST_AGENTS_INITIALIZED,
- SecureSettingsProto.TRUST_AGENTS_INITIALIZED);
- // Settings.Secure.LOGGING_ID intentionally excluded since it's deprecated.
- // Settings.Secure.NETWORK_PREFERENCE intentionally excluded since it's deprecated.
+ Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
+ SecureSettingsProto.LOCK_TO_APP_EXIT_LOCKED);
dumpSetting(s, p,
- Settings.Secure.PARENTAL_CONTROL_ENABLED,
- SecureSettingsProto.PARENTAL_CONTROL_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
- SecureSettingsProto.PARENTAL_CONTROL_LAST_UPDATE);
- dumpSetting(s, p,
- Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
- SecureSettingsProto.PARENTAL_CONTROL_REDIRECT_URL);
- dumpSetting(s, p,
- Settings.Secure.SETTINGS_CLASSNAME,
- SecureSettingsProto.SETTINGS_CLASSNAME);
- // Settings.Secure.USB_MASS_STORAGE_ENABLED intentionally excluded since it's deprecated.
- // Settings.Secure.USE_GOOGLE_MAIL intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_SHORTCUT_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN,
- SecureSettingsProto.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
- SecureSettingsProto.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
- SecureSettingsProto.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT,
- SecureSettingsProto.ACCESSIBILITY_BUTTON_TARGET_COMPONENT);
- dumpSetting(s, p,
- Settings.Secure.TOUCH_EXPLORATION_ENABLED,
- SecureSettingsProto.TOUCH_EXPLORATION_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- SecureSettingsProto.ENABLED_ACCESSIBILITY_SERVICES);
- dumpSetting(s, p,
- Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
- SecureSettingsProto.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
- dumpSetting(s, p,
- Settings.Secure.KEYGUARD_SLICE_URI,
- SecureSettingsProto.KEYGUARD_SLICE_URI);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
- SecureSettingsProto.ACCESSIBILITY_SPEAK_PASSWORD);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
- SecureSettingsProto.ACCESSIBILITY_SOFT_KEYBOARD_MODE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_LOCALE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_PRESET);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_EDGE_TYPE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_EDGE_COLOR);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_TYPEFACE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
- SecureSettingsProto.ACCESSIBILITY_CAPTIONING_FONT_SCALE);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER,
- SecureSettingsProto.ACCESSIBILITY_DISPLAY_DALTONIZER);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED,
- SecureSettingsProto.ACCESSIBILITY_AUTOCLICK_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY,
- SecureSettingsProto.ACCESSIBILITY_AUTOCLICK_DELAY);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON,
- SecureSettingsProto.ACCESSIBILITY_LARGE_POINTER_ICON);
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU,
+ SecureSettingsProto.LOCKDOWN_IN_POWER_MENU);
dumpSetting(s, p,
Settings.Secure.LONG_PRESS_TIMEOUT,
SecureSettingsProto.LONG_PRESS_TIMEOUT);
+
+ final long managedProfileToken = p.start(SecureSettingsProto.MANAGED_PROFILE);
+ dumpSetting(s, p,
+ Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
+ SecureSettingsProto.ManagedProfile.CONTACT_REMOTE_SEARCH);
+ p.end(managedProfileToken);
+
+ final long mountToken = p.start(SecureSettingsProto.MOUNT);
+ dumpSetting(s, p,
+ Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
+ SecureSettingsProto.Mount.PLAY_NOTIFICATION_SND);
+ dumpSetting(s, p,
+ Settings.Secure.MOUNT_UMS_AUTOSTART,
+ SecureSettingsProto.Mount.UMS_AUTOSTART);
+ dumpSetting(s, p,
+ Settings.Secure.MOUNT_UMS_PROMPT,
+ SecureSettingsProto.Mount.UMS_PROMPT);
+ dumpSetting(s, p,
+ Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
+ SecureSettingsProto.Mount.UMS_NOTIFY_ENABLED);
+ p.end(mountToken);
+
dumpSetting(s, p,
Settings.Secure.MULTI_PRESS_TIMEOUT,
SecureSettingsProto.MULTI_PRESS_TIMEOUT);
+
+ final long nfcPaymentToken = p.start(SecureSettingsProto.NFC_PAYMENT);
+ dumpSetting(s, p,
+ Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT,
+ SecureSettingsProto.NfcPayment.DEFAULT_COMPONENT);
+ dumpSetting(s, p,
+ Settings.Secure.NFC_PAYMENT_FOREGROUND,
+ SecureSettingsProto.NfcPayment.FOREGROUND);
+ dumpSetting(s, p,
+ Settings.Secure.PAYMENT_SERVICE_SEARCH_URI,
+ SecureSettingsProto.NfcPayment.PAYMENT_SERVICE_SEARCH_URI);
+ p.end(nfcPaymentToken);
+
+ final long nightDisplayToken = p.start(SecureSettingsProto.NIGHT_DISPLAY);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_ACTIVATED,
+ SecureSettingsProto.NightDisplay.ACTIVATED);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_AUTO_MODE,
+ SecureSettingsProto.NightDisplay.AUTO_MODE);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE,
+ SecureSettingsProto.NightDisplay.COLOR_TEMPERATURE);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_CUSTOM_START_TIME,
+ SecureSettingsProto.NightDisplay.CUSTOM_START_TIME);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_CUSTOM_END_TIME,
+ SecureSettingsProto.NightDisplay.CUSTOM_END_TIME);
+ dumpSetting(s, p,
+ Settings.Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
+ SecureSettingsProto.NightDisplay.LAST_ACTIVATED_TIME);
+ p.end(nightDisplayToken);
+
+ final long notificationToken = p.start(SecureSettingsProto.NOTIFICATION);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT,
+ SecureSettingsProto.Notification.ENABLED_ASSISTANT);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+ SecureSettingsProto.Notification.ENABLED_LISTENERS);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
+ SecureSettingsProto.Notification.ENABLED_POLICY_ACCESS_PACKAGES);
+ dumpSetting(s, p,
+ Settings.Secure.NOTIFICATION_BADGING,
+ SecureSettingsProto.Notification.BADGING);
+ dumpSetting(s, p,
+ Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING,
+ SecureSettingsProto.Notification.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING);
+ p.end(notificationToken);
+
+ final long packageVerifierToken = p.start(SecureSettingsProto.PACKAGE_VERIFIER);
+ dumpSetting(s, p,
+ Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT,
+ SecureSettingsProto.PackageVerifier.USER_CONSENT);
+ dumpSetting(s, p,
+ Settings.Secure.PACKAGE_VERIFIER_STATE,
+ SecureSettingsProto.PackageVerifier.STATE);
+ p.end(packageVerifierToken);
+
+ final long parentalControlToken = p.start(SecureSettingsProto.PARENTAL_CONTROL);
+ dumpSetting(s, p,
+ Settings.Secure.PARENTAL_CONTROL_ENABLED,
+ SecureSettingsProto.ParentalControl.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
+ SecureSettingsProto.ParentalControl.LAST_UPDATE);
+ dumpSetting(s, p,
+ Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
+ SecureSettingsProto.ParentalControl.REDIRECT_URL);
+ p.end(parentalControlToken);
+
+ final long printServiceToken = p.start(SecureSettingsProto.PRINT_SERVICE);
+ dumpSetting(s, p,
+ Settings.Secure.PRINT_SERVICE_SEARCH_URI,
+ SecureSettingsProto.PrintService.SEARCH_URI);
dumpSetting(s, p,
Settings.Secure.ENABLED_PRINT_SERVICES,
- SecureSettingsProto.ENABLED_PRINT_SERVICES);
+ SecureSettingsProto.PrintService.ENABLED_PRINT_SERVICES);
dumpSetting(s, p,
Settings.Secure.DISABLED_PRINT_SERVICES,
- SecureSettingsProto.DISABLED_PRINT_SERVICES);
+ SecureSettingsProto.PrintService.DISABLED_PRINT_SERVICES);
+ p.end(printServiceToken);
+
+ final long qsToken = p.start(SecureSettingsProto.QS);
dumpSetting(s, p,
- Settings.Secure.DISPLAY_DENSITY_FORCED,
- SecureSettingsProto.DISPLAY_DENSITY_FORCED);
+ Settings.Secure.QS_TILES,
+ SecureSettingsProto.QuickSettings.TILES);
+ dumpSetting(s, p,
+ Settings.Secure.QS_AUTO_ADDED_TILES,
+ SecureSettingsProto.QuickSettings.AUTO_ADDED_TILES);
+ p.end(qsToken);
+
+ final long rotationToken = p.start(SecureSettingsProto.ROTATION);
+ dumpSetting(s, p,
+ Settings.Secure.SHOW_ROTATION_SUGGESTIONS,
+ SecureSettingsProto.Rotation.SHOW_ROTATION_SUGGESTIONS);
+ dumpSetting(s, p,
+ Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED,
+ SecureSettingsProto.Rotation.NUM_ROTATION_SUGGESTIONS_ACCEPTED);
+ p.end(rotationToken);
+
+ final long screensaverToken = p.start(SecureSettingsProto.SCREENSAVER);
+ dumpSetting(s, p,
+ Settings.Secure.SCREENSAVER_ENABLED,
+ SecureSettingsProto.Screensaver.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.SCREENSAVER_COMPONENTS,
+ SecureSettingsProto.Screensaver.COMPONENTS);
+ dumpSetting(s, p,
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
+ SecureSettingsProto.Screensaver.ACTIVATE_ON_DOCK);
+ dumpSetting(s, p,
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
+ SecureSettingsProto.Screensaver.ACTIVATE_ON_SLEEP);
+ dumpSetting(s, p,
+ Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
+ SecureSettingsProto.Screensaver.DEFAULT_COMPONENT);
+ p.end(screensaverToken);
+
+ final long searchToken = p.start(SecureSettingsProto.SEARCH);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_GLOBAL_SEARCH_ACTIVITY,
+ SecureSettingsProto.Search.GLOBAL_SEARCH_ACTIVITY);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_NUM_PROMOTED_SOURCES,
+ SecureSettingsProto.Search.NUM_PROMOTED_SOURCES);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MAX_RESULTS_TO_DISPLAY,
+ SecureSettingsProto.Search.MAX_RESULTS_TO_DISPLAY);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MAX_RESULTS_PER_SOURCE,
+ SecureSettingsProto.Search.MAX_RESULTS_PER_SOURCE);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_WEB_RESULTS_OVERRIDE_LIMIT,
+ SecureSettingsProto.Search.WEB_RESULTS_OVERRIDE_LIMIT);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS,
+ SecureSettingsProto.Search.PROMOTED_SOURCE_DEADLINE_MILLIS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_SOURCE_TIMEOUT_MILLIS,
+ SecureSettingsProto.Search.SOURCE_TIMEOUT_MILLIS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_PREFILL_MILLIS,
+ SecureSettingsProto.Search.PREFILL_MILLIS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MAX_STAT_AGE_MILLIS,
+ SecureSettingsProto.Search.MAX_STAT_AGE_MILLIS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS,
+ SecureSettingsProto.Search.MAX_SOURCE_EVENT_AGE_MILLIS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING,
+ SecureSettingsProto.Search.MIN_IMPRESSIONS_FOR_SOURCE_RANKING);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING,
+ SecureSettingsProto.Search.MIN_CLICKS_FOR_SOURCE_RANKING);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_MAX_SHORTCUTS_RETURNED,
+ SecureSettingsProto.Search.MAX_SHORTCUTS_RETURNED);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_QUERY_THREAD_CORE_POOL_SIZE,
+ SecureSettingsProto.Search.QUERY_THREAD_CORE_POOL_SIZE);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_QUERY_THREAD_MAX_POOL_SIZE,
+ SecureSettingsProto.Search.QUERY_THREAD_MAX_POOL_SIZE);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE,
+ SecureSettingsProto.Search.SHORTCUT_REFRESH_CORE_POOL_SIZE);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE,
+ SecureSettingsProto.Search.SHORTCUT_REFRESH_MAX_POOL_SIZE);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_THREAD_KEEPALIVE_SECONDS,
+ SecureSettingsProto.Search.THREAD_KEEPALIVE_SECONDS);
+ dumpSetting(s, p,
+ Settings.Secure.SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT,
+ SecureSettingsProto.Search.PER_SOURCE_CONCURRENT_QUERY_LIMIT);
+ p.end(searchToken);
+
+ final long spellCheckerToken = p.start(SecureSettingsProto.SPELL_CHECKER);
+ dumpSetting(s, p,
+ Settings.Secure.SPELL_CHECKER_ENABLED,
+ SecureSettingsProto.SpellChecker.ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.SELECTED_SPELL_CHECKER,
+ SecureSettingsProto.SpellChecker.SELECTED);
+ dumpSetting(s, p,
+ Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE,
+ SecureSettingsProto.SpellChecker.SELECTED_SUBTYPE);
+ p.end(spellCheckerToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.SETTINGS_CLASSNAME,
+ SecureSettingsProto.SETTINGS_CLASSNAME);
+ dumpSetting(s, p,
+ Settings.Secure.SHOW_FIRST_CRASH_DIALOG_DEV_OPTION,
+ SecureSettingsProto.SHOW_FIRST_CRASH_DIALOG_DEV_OPTION);
+ dumpSetting(s, p,
+ Settings.Secure.SKIP_FIRST_USE_HINTS,
+ SecureSettingsProto.SKIP_FIRST_USE_HINTS);
+ dumpSetting(s, p,
+ Settings.Secure.SLEEP_TIMEOUT,
+ SecureSettingsProto.SLEEP_TIMEOUT);
+ dumpSetting(s, p,
+ Settings.Secure.SMS_DEFAULT_APPLICATION,
+ SecureSettingsProto.SMS_DEFAULT_APPLICATION);
+ dumpSetting(s, p,
+ Settings.Secure.SYNC_PARENT_SOUNDS,
+ SecureSettingsProto.SYNC_PARENT_SOUNDS);
+ dumpSetting(s, p,
+ Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED,
+ SecureSettingsProto.SYSTEM_NAVIGATION_KEYS_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.TRUST_AGENTS_INITIALIZED,
+ SecureSettingsProto.TRUST_AGENTS_INITIALIZED);
+
+ final long ttsToken = p.start(SecureSettingsProto.TTS);
// Settings.Secure.TTS_USE_DEFAULTS intentionally excluded since it's deprecated.
dumpSetting(s, p,
Settings.Secure.TTS_DEFAULT_RATE,
- SecureSettingsProto.TTS_DEFAULT_RATE);
+ SecureSettingsProto.Tts.DEFAULT_RATE);
dumpSetting(s, p,
Settings.Secure.TTS_DEFAULT_PITCH,
- SecureSettingsProto.TTS_DEFAULT_PITCH);
+ SecureSettingsProto.Tts.DEFAULT_PITCH);
dumpSetting(s, p,
Settings.Secure.TTS_DEFAULT_SYNTH,
- SecureSettingsProto.TTS_DEFAULT_SYNTH);
+ SecureSettingsProto.Tts.DEFAULT_SYNTH);
// Settings.Secure.TTS_DEFAULT_LANG intentionally excluded since it's deprecated.
// Settings.Secure.TTS_DEFAULT_COUNTRY intentionally excluded since it's deprecated.
// Settings.Secure.TTS_DEFAULT_VARIANT intentionally excluded since it's deprecated.
dumpSetting(s, p,
Settings.Secure.TTS_DEFAULT_LOCALE,
- SecureSettingsProto.TTS_DEFAULT_LOCALE);
+ SecureSettingsProto.Tts.DEFAULT_LOCALE);
dumpSetting(s, p,
Settings.Secure.TTS_ENABLED_PLUGINS,
- SecureSettingsProto.TTS_ENABLED_PLUGINS);
+ SecureSettingsProto.Tts.ENABLED_PLUGINS);
+ p.end(ttsToken);
+
+ final long ttyToken = p.start(SecureSettingsProto.TTY);
+ dumpSetting(s, p,
+ Settings.Secure.TTY_MODE_ENABLED,
+ SecureSettingsProto.Tty.TTY_MODE_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.PREFERRED_TTY_MODE,
+ SecureSettingsProto.Tty.PREFERRED_TTY_MODE);
+ p.end(ttyToken);
+
+ final long tvToken = p.start(SecureSettingsProto.TV);
+ // Whether the current user has been set up via setup wizard (0 = false, 1 = true). This
+ // value differs from USER_SETUP_COMPLETE in that it can be reset back to 0 in case
+ // SetupWizard has been re-enabled on TV devices.
+ dumpSetting(s, p,
+ Settings.Secure.TV_USER_SETUP_COMPLETE,
+ SecureSettingsProto.Tv.USER_SETUP_COMPLETE);
+ dumpSetting(s, p,
+ Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
+ SecureSettingsProto.Tv.INPUT_HIDDEN_INPUTS);
+ dumpSetting(s, p,
+ Settings.Secure.TV_INPUT_CUSTOM_LABELS,
+ SecureSettingsProto.Tv.INPUT_CUSTOM_LABELS);
+ p.end(tvToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.UI_NIGHT_MODE,
+ SecureSettingsProto.UI_NIGHT_MODE);
+ dumpSetting(s, p,
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED,
+ SecureSettingsProto.UNKNOWN_SOURCES_DEFAULT_REVERSED);
+ dumpSetting(s, p,
+ Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED,
+ SecureSettingsProto.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED);
+ dumpSetting(s, p,
+ Settings.Secure.USER_SETUP_COMPLETE,
+ SecureSettingsProto.USER_SETUP_COMPLETE);
+
+ final long voiceToken = p.start(SecureSettingsProto.VOICE);
+ dumpSetting(s, p,
+ Settings.Secure.VOICE_INTERACTION_SERVICE,
+ SecureSettingsProto.Voice.INTERACTION_SERVICE);
+ dumpSetting(s, p,
+ Settings.Secure.VOICE_RECOGNITION_SERVICE,
+ SecureSettingsProto.Voice.RECOGNITION_SERVICE);
+ p.end(voiceToken);
+
+ final long volumeToken = p.start(SecureSettingsProto.VOLUME);
+ dumpSetting(s, p,
+ Settings.Secure.VOLUME_HUSH_GESTURE,
+ SecureSettingsProto.Volume.HUSH_GESTURE);
+ dumpSetting(s, p,
+ Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS,
+ SecureSettingsProto.Volume.UNSAFE_VOLUME_MUSIC_ACTIVE_MS);
+ p.end(volumeToken);
+
+ final long vrToken = p.start(SecureSettingsProto.VR);
+ dumpSetting(s, p,
+ Settings.Secure.VR_DISPLAY_MODE,
+ SecureSettingsProto.Vr.DISPLAY_MODE);
+ dumpSetting(s, p,
+ Settings.Secure.ENABLED_VR_LISTENERS,
+ SecureSettingsProto.Vr.ENABLED_LISTENERS);
+ p.end(vrToken);
+
+ dumpSetting(s, p,
+ Settings.Secure.WAKE_GESTURE_ENABLED,
+ SecureSettingsProto.WAKE_GESTURE_ENABLED);
+
+ // Please insert new settings using the same order as in SecureSettingsProto.
+ p.end(token);
+
+ // Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED intentionally excluded since it's deprecated.
+ // Settings.Secure.BUGREPORT_IN_POWER_MENU intentionally excluded since it's deprecated.
+ // Settings.Secure.ADB_ENABLED intentionally excluded since it's deprecated.
+ // Settings.Secure.ALLOW_MOCK_LOCATION intentionally excluded since it's deprecated.
+ // Settings.Secure.DATA_ROAMING intentionally excluded since it's deprecated.
+ // Settings.Secure.DEVICE_PROVISIONED intentionally excluded since it's deprecated.
+ // Settings.Secure.HTTP_PROXY intentionally excluded since it's deprecated.
+ // Settings.Secure.LOGGING_ID intentionally excluded since it's deprecated.
+ // Settings.Secure.NETWORK_PREFERENCE intentionally excluded since it's deprecated.
+ // Settings.Secure.USB_MASS_STORAGE_ENABLED intentionally excluded since it's deprecated.
+ // Settings.Secure.USE_GOOGLE_MAIL intentionally excluded since it's deprecated.
// Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON intentionally excluded since it's deprecated.
// Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY intentionally excluded since it's deprecated.
// Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT intentionally excluded since it's deprecated.
@@ -1792,365 +2256,11 @@
// Settings.Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS intentionally excluded since it's deprecated.
// Settings.Secure.WIFI_MAX_DHCP_RETRY_COUNT intentionally excluded since it's deprecated.
// Settings.Secure.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS,
- SecureSettingsProto.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS);
// Settings.Secure.BACKGROUND_DATA intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
- SecureSettingsProto.ALLOWED_GEOLOCATION_ORIGINS);
- dumpSetting(s, p,
- Settings.Secure.PREFERRED_TTY_MODE,
- SecureSettingsProto.PREFERRED_TTY_MODE);
- dumpSetting(s, p,
- Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED,
- SecureSettingsProto.ENHANCED_VOICE_PRIVACY_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.TTY_MODE_ENABLED,
- SecureSettingsProto.TTY_MODE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_ENABLED,
- SecureSettingsProto.BACKUP_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_AUTO_RESTORE,
- SecureSettingsProto.BACKUP_AUTO_RESTORE);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_PROVISIONED,
- SecureSettingsProto.BACKUP_PROVISIONED);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_TRANSPORT,
- SecureSettingsProto.BACKUP_TRANSPORT);
- dumpSetting(s, p,
- Settings.Secure.LAST_SETUP_SHOWN,
- SecureSettingsProto.LAST_SETUP_SHOWN);
// Settings.Secure.WIFI_IDLE_MS intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.Secure.SEARCH_GLOBAL_SEARCH_ACTIVITY,
- SecureSettingsProto.SEARCH_GLOBAL_SEARCH_ACTIVITY);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_NUM_PROMOTED_SOURCES,
- SecureSettingsProto.SEARCH_NUM_PROMOTED_SOURCES);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MAX_RESULTS_TO_DISPLAY,
- SecureSettingsProto.SEARCH_MAX_RESULTS_TO_DISPLAY);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MAX_RESULTS_PER_SOURCE,
- SecureSettingsProto.SEARCH_MAX_RESULTS_PER_SOURCE);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_WEB_RESULTS_OVERRIDE_LIMIT,
- SecureSettingsProto.SEARCH_WEB_RESULTS_OVERRIDE_LIMIT);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS,
- SecureSettingsProto.SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_SOURCE_TIMEOUT_MILLIS,
- SecureSettingsProto.SEARCH_SOURCE_TIMEOUT_MILLIS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_PREFILL_MILLIS,
- SecureSettingsProto.SEARCH_PREFILL_MILLIS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MAX_STAT_AGE_MILLIS,
- SecureSettingsProto.SEARCH_MAX_STAT_AGE_MILLIS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS,
- SecureSettingsProto.SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING,
- SecureSettingsProto.SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING,
- SecureSettingsProto.SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_MAX_SHORTCUTS_RETURNED,
- SecureSettingsProto.SEARCH_MAX_SHORTCUTS_RETURNED);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_QUERY_THREAD_CORE_POOL_SIZE,
- SecureSettingsProto.SEARCH_QUERY_THREAD_CORE_POOL_SIZE);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_QUERY_THREAD_MAX_POOL_SIZE,
- SecureSettingsProto.SEARCH_QUERY_THREAD_MAX_POOL_SIZE);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE,
- SecureSettingsProto.SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE,
- SecureSettingsProto.SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_THREAD_KEEPALIVE_SECONDS,
- SecureSettingsProto.SEARCH_THREAD_KEEPALIVE_SECONDS);
- dumpSetting(s, p,
- Settings.Secure.SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT,
- SecureSettingsProto.SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT);
- dumpSetting(s, p,
- Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
- SecureSettingsProto.MOUNT_PLAY_NOTIFICATION_SND);
- dumpSetting(s, p,
- Settings.Secure.MOUNT_UMS_AUTOSTART,
- SecureSettingsProto.MOUNT_UMS_AUTOSTART);
- dumpSetting(s, p,
- Settings.Secure.MOUNT_UMS_PROMPT,
- SecureSettingsProto.MOUNT_UMS_PROMPT);
- dumpSetting(s, p,
- Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
- SecureSettingsProto.MOUNT_UMS_NOTIFY_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ANR_SHOW_BACKGROUND,
- SecureSettingsProto.ANR_SHOW_BACKGROUND);
- dumpSetting(s, p,
- Settings.Secure.SHOW_FIRST_CRASH_DIALOG_DEV_OPTION,
- SecureSettingsProto.SHOW_FIRST_CRASH_DIALOG_DEV_OPTION);
- dumpSetting(s, p,
- Settings.Secure.VOICE_RECOGNITION_SERVICE,
- SecureSettingsProto.VOICE_RECOGNITION_SERVICE);
- dumpSetting(s, p,
- Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT,
- SecureSettingsProto.PACKAGE_VERIFIER_USER_CONSENT);
- dumpSetting(s, p,
- Settings.Secure.SELECTED_SPELL_CHECKER,
- SecureSettingsProto.SELECTED_SPELL_CHECKER);
- dumpSetting(s, p,
- Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE,
- SecureSettingsProto.SELECTED_SPELL_CHECKER_SUBTYPE);
- dumpSetting(s, p,
- Settings.Secure.SPELL_CHECKER_ENABLED,
- SecureSettingsProto.SPELL_CHECKER_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
- SecureSettingsProto.INCALL_POWER_BUTTON_BEHAVIOR);
- dumpSetting(s, p,
- Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR,
- SecureSettingsProto.INCALL_BACK_BUTTON_BEHAVIOR);
- dumpSetting(s, p,
- Settings.Secure.WAKE_GESTURE_ENABLED,
- SecureSettingsProto.WAKE_GESTURE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.DOZE_ENABLED,
- SecureSettingsProto.DOZE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.DOZE_ALWAYS_ON,
- SecureSettingsProto.DOZE_ALWAYS_ON);
- dumpSetting(s, p,
- Settings.Secure.DOZE_PULSE_ON_PICK_UP,
- SecureSettingsProto.DOZE_PULSE_ON_PICK_UP);
- dumpSetting(s, p,
- Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
- SecureSettingsProto.DOZE_PULSE_ON_LONG_PRESS);
- dumpSetting(s, p,
- Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
- SecureSettingsProto.DOZE_PULSE_ON_DOUBLE_TAP);
- dumpSetting(s, p,
- Settings.Secure.UI_NIGHT_MODE,
- SecureSettingsProto.UI_NIGHT_MODE);
- dumpSetting(s, p,
- Settings.Secure.SCREENSAVER_ENABLED,
- SecureSettingsProto.SCREENSAVER_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.SCREENSAVER_COMPONENTS,
- SecureSettingsProto.SCREENSAVER_COMPONENTS);
- dumpSetting(s, p,
- Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
- SecureSettingsProto.SCREENSAVER_ACTIVATE_ON_DOCK);
- dumpSetting(s, p,
- Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
- SecureSettingsProto.SCREENSAVER_ACTIVATE_ON_SLEEP);
- dumpSetting(s, p,
- Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT,
- SecureSettingsProto.SCREENSAVER_DEFAULT_COMPONENT);
- dumpSetting(s, p,
- Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT,
- SecureSettingsProto.NFC_PAYMENT_DEFAULT_COMPONENT);
- dumpSetting(s, p,
- Settings.Secure.NFC_PAYMENT_FOREGROUND,
- SecureSettingsProto.NFC_PAYMENT_FOREGROUND);
- dumpSetting(s, p,
- Settings.Secure.SMS_DEFAULT_APPLICATION,
- SecureSettingsProto.SMS_DEFAULT_APPLICATION);
- dumpSetting(s, p,
- Settings.Secure.DIALER_DEFAULT_APPLICATION,
- SecureSettingsProto.DIALER_DEFAULT_APPLICATION);
- dumpSetting(s, p,
- Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
- SecureSettingsProto.EMERGENCY_ASSISTANCE_APPLICATION);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_STRUCTURE_ENABLED,
- SecureSettingsProto.ASSIST_STRUCTURE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
- SecureSettingsProto.ASSIST_SCREENSHOT_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
- SecureSettingsProto.ASSIST_DISCLOSURE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.SHOW_ROTATION_SUGGESTIONS,
- SecureSettingsProto.SHOW_ROTATION_SUGGESTIONS);
- dumpSetting(s, p,
- Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED,
- SecureSettingsProto.NUM_ROTATION_SUGGESTIONS_ACCEPTED);
- dumpSetting(s, p,
- Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT,
- SecureSettingsProto.ENABLED_NOTIFICATION_ASSISTANT);
- dumpSetting(s, p,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- SecureSettingsProto.ENABLED_NOTIFICATION_LISTENERS);
- dumpSetting(s, p,
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
- SecureSettingsProto.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES);
- dumpSetting(s, p,
- Settings.Secure.SYNC_PARENT_SOUNDS,
- SecureSettingsProto.SYNC_PARENT_SOUNDS);
- dumpSetting(s, p,
- Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
- SecureSettingsProto.IMMERSIVE_MODE_CONFIRMATIONS);
- dumpSetting(s, p,
- Settings.Secure.PRINT_SERVICE_SEARCH_URI,
- SecureSettingsProto.PRINT_SERVICE_SEARCH_URI);
- dumpSetting(s, p,
- Settings.Secure.PAYMENT_SERVICE_SEARCH_URI,
- SecureSettingsProto.PAYMENT_SERVICE_SEARCH_URI);
- dumpSetting(s, p,
- Settings.Secure.AUTOFILL_SERVICE_SEARCH_URI,
- SecureSettingsProto.AUTOFILL_SERVICE_SEARCH_URI);
- dumpSetting(s, p,
- Settings.Secure.SKIP_FIRST_USE_HINTS,
- SecureSettingsProto.SKIP_FIRST_USE_HINTS);
- dumpSetting(s, p,
- Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS,
- SecureSettingsProto.UNSAFE_VOLUME_MUSIC_ACTIVE_MS);
- dumpSetting(s, p,
- Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
- SecureSettingsProto.LOCK_SCREEN_SHOW_NOTIFICATIONS);
- dumpSetting(s, p,
- Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
- SecureSettingsProto.TV_INPUT_HIDDEN_INPUTS);
- dumpSetting(s, p,
- Settings.Secure.TV_INPUT_CUSTOM_LABELS,
- SecureSettingsProto.TV_INPUT_CUSTOM_LABELS);
- dumpSetting(s, p,
- Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED,
- SecureSettingsProto.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED);
- dumpSetting(s, p,
- Settings.Secure.SLEEP_TIMEOUT,
- SecureSettingsProto.SLEEP_TIMEOUT);
- dumpSetting(s, p,
- Settings.Secure.DOUBLE_TAP_TO_WAKE,
- SecureSettingsProto.DOUBLE_TAP_TO_WAKE);
- dumpSetting(s, p,
- Settings.Secure.ASSISTANT,
- SecureSettingsProto.ASSISTANT);
- dumpSetting(s, p,
- Settings.Secure.CAMERA_GESTURE_DISABLED,
- SecureSettingsProto.CAMERA_GESTURE_DISABLED);
- dumpSetting(s, p,
- Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
- SecureSettingsProto.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED);
- dumpSetting(s, p,
- Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
- SecureSettingsProto.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.CAMERA_LIFT_TRIGGER_ENABLED,
- SecureSettingsProto.CAMERA_LIFT_TRIGGER_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_GESTURE_ENABLED,
- SecureSettingsProto.ASSIST_GESTURE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_GESTURE_SENSITIVITY,
- SecureSettingsProto.ASSIST_GESTURE_SENSITIVITY);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
- SecureSettingsProto.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_GESTURE_WAKE_ENABLED,
- SecureSettingsProto.ASSIST_GESTURE_WAKE_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.ASSIST_GESTURE_SETUP_COMPLETE,
- SecureSettingsProto.ASSIST_GESTURE_SETUP_COMPLETE);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_ACTIVATED,
- SecureSettingsProto.NIGHT_DISPLAY_ACTIVATED);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_AUTO_MODE,
- SecureSettingsProto.NIGHT_DISPLAY_AUTO_MODE);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE,
- SecureSettingsProto.NIGHT_DISPLAY_COLOR_TEMPERATURE);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_CUSTOM_START_TIME,
- SecureSettingsProto.NIGHT_DISPLAY_CUSTOM_START_TIME);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_CUSTOM_END_TIME,
- SecureSettingsProto.NIGHT_DISPLAY_CUSTOM_END_TIME);
- dumpSetting(s, p,
- Settings.Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
- SecureSettingsProto.NIGHT_DISPLAY_LAST_ACTIVATED_TIME);
- dumpSetting(s, p,
- Settings.Secure.ENABLED_VR_LISTENERS,
- SecureSettingsProto.ENABLED_VR_LISTENERS);
- dumpSetting(s, p,
- Settings.Secure.VR_DISPLAY_MODE,
- SecureSettingsProto.VR_DISPLAY_MODE);
- dumpSetting(s, p,
- Settings.Secure.CARRIER_APPS_HANDLED,
- SecureSettingsProto.CARRIER_APPS_HANDLED);
- dumpSetting(s, p,
- Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
- SecureSettingsProto.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH);
- dumpSetting(s, p,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
- SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
- SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN);
- dumpSetting(s, p,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
- SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED);
- dumpSetting(s, p,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
- SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER_LAST_RUN);
- dumpSetting(s, p,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_TURNED_OFF_BY_POLICY,
- SecureSettingsProto.AUTOMATIC_STORAGE_MANAGER_TURNED_OFF_BY_POLICY);
- dumpSetting(s, p,
- Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED,
- SecureSettingsProto.SYSTEM_NAVIGATION_KEYS_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.QS_TILES,
- SecureSettingsProto.QS_TILES);
- dumpSetting(s, p,
- Settings.Secure.INSTANT_APPS_ENABLED,
- SecureSettingsProto.INSTANT_APPS_ENABLED);
- dumpSetting(s, p,
- Settings.Secure.DEVICE_PAIRED,
- SecureSettingsProto.DEVICE_PAIRED);
- dumpSetting(s, p,
- Settings.Secure.PACKAGE_VERIFIER_STATE,
- SecureSettingsProto.PACKAGE_VERIFIER_STATE);
- dumpSetting(s, p,
- Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG,
- SecureSettingsProto.CMAS_ADDITIONAL_BROADCAST_PKG);
- dumpSetting(s, p,
- Settings.Secure.NOTIFICATION_BADGING,
- SecureSettingsProto.NOTIFICATION_BADGING);
- dumpSetting(s, p,
- Settings.Secure.QS_AUTO_ADDED_TILES,
- SecureSettingsProto.QS_AUTO_ADDED_TILES);
- dumpSetting(s, p,
- Settings.Secure.LOCKDOWN_IN_POWER_MENU,
- SecureSettingsProto.LOCKDOWN_IN_POWER_MENU);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_MANAGER_CONSTANTS,
- SecureSettingsProto.BACKUP_MANAGER_CONSTANTS);
- dumpSetting(s, p,
- Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS,
- SecureSettingsProto.BACKUP_LOCAL_TRANSPORT_PARAMETERS);
- dumpSetting(s, p,
- Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
- SecureSettingsProto.BLUETOOTH_ON_WHILE_DRIVING);
- dumpSetting(s, p,
- Settings.Secure.VOLUME_HUSH_GESTURE,
- SecureSettingsProto.VOLUME_HUSH_GESTURE);
- // Please insert new settings using the same order as in Settings.Secure.
- p.end(token);
+
+ // Please insert new settings using the same order as in SecureSettingsProto.
}
private static void dumpProtoSystemSettingsLocked(
@@ -2159,15 +2269,293 @@
s.dumpHistoricalOperations(p, SystemSettingsProto.HISTORICAL_OPERATIONS);
- // This uses the same order as in Settings.System.
+ // This uses the same order as in SystemSettingsProto.
- // Settings.System.STAY_ON_WHILE_PLUGGED_IN intentionally excluded since it's deprecated.
+ dumpSetting(s, p,
+ Settings.System.ADVANCED_SETTINGS,
+ SystemSettingsProto.ADVANCED_SETTINGS);
+
+ final long alarmToken = p.start(SystemSettingsProto.ALARM);
+ dumpSetting(s, p,
+ Settings.System.ALARM_ALERT,
+ SystemSettingsProto.Alarm.DEFAULT_URI);
+ dumpSetting(s, p,
+ Settings.System.ALARM_ALERT_CACHE,
+ SystemSettingsProto.Alarm.ALERT_CACHE);
+ // Settings.System.NEXT_ALARM_FORMATTED intentionally excluded since it's deprecated.
+ p.end(alarmToken);
+
+ final long bluetoothToken = p.start(SystemSettingsProto.BLUETOOTH);
+ dumpSetting(s, p,
+ Settings.System.BLUETOOTH_DISCOVERABILITY,
+ SystemSettingsProto.Bluetooth.DISCOVERABILITY);
+ dumpSetting(s, p,
+ Settings.System.BLUETOOTH_DISCOVERABILITY_TIMEOUT,
+ SystemSettingsProto.Bluetooth.DISCOVERABILITY_TIMEOUT_SECS);
+ p.end(bluetoothToken);
+
+ dumpSetting(s, p,
+ Settings.System.DATE_FORMAT,
+ SystemSettingsProto.DATE_FORMAT);
+ dumpSetting(s, p,
+ Settings.System.DISPLAY_COLOR_MODE,
+ SystemSettingsProto.DISPLAY_COLOR_MODE);
+
+ final long devOptionsToken = p.start(SystemSettingsProto.DEVELOPER_OPTIONS);
+ dumpSetting(s, p,
+ Settings.System.SHOW_TOUCHES,
+ SystemSettingsProto.DevOptions.SHOW_TOUCHES);
+ dumpSetting(s, p,
+ Settings.System.POINTER_LOCATION,
+ SystemSettingsProto.DevOptions.POINTER_LOCATION);
+ dumpSetting(s, p,
+ Settings.System.WINDOW_ORIENTATION_LISTENER_LOG,
+ SystemSettingsProto.DevOptions.WINDOW_ORIENTATION_LISTENER_LOG);
+ p.end(devOptionsToken);
+
+ final long dtmfToneToken = p.start(SystemSettingsProto.DTMF_TONE);
+ dumpSetting(s, p,
+ Settings.System.DTMF_TONE_WHEN_DIALING,
+ SystemSettingsProto.DtmfTone.PLAY_WHEN_DIALING);
+ dumpSetting(s, p,
+ Settings.System.DTMF_TONE_TYPE_WHEN_DIALING,
+ SystemSettingsProto.DtmfTone.TYPE_PLAYED_WHEN_DIALING);
+ p.end(dtmfToneToken);
+
+ dumpSetting(s, p,
+ Settings.System.EGG_MODE,
+ SystemSettingsProto.EGG_MODE);
dumpSetting(s, p,
Settings.System.END_BUTTON_BEHAVIOR,
SystemSettingsProto.END_BUTTON_BEHAVIOR);
dumpSetting(s, p,
- Settings.System.ADVANCED_SETTINGS,
- SystemSettingsProto.ADVANCED_SETTINGS);
+ Settings.System.FONT_SCALE,
+ SystemSettingsProto.FONT_SCALE);
+
+ final long hapticFeedbackToken = p.start(SystemSettingsProto.HAPTIC_FEEDBACK);
+ dumpSetting(s, p,
+ Settings.System.HAPTIC_FEEDBACK_ENABLED,
+ SystemSettingsProto.HapticFeedback.ENABLED);
+ dumpSetting(s, p,
+ Settings.System.HAPTIC_FEEDBACK_INTENSITY,
+ SystemSettingsProto.HapticFeedback.INTENSITY);
+ p.end(hapticFeedbackToken);
+
+ dumpSetting(s, p,
+ Settings.System.HEARING_AID,
+ SystemSettingsProto.HEARING_AID);
+ dumpSetting(s, p,
+ Settings.System.LOCK_TO_APP_ENABLED,
+ SystemSettingsProto.LOCK_TO_APP_ENABLED);
+
+ final long lockscreenToken = p.start(SystemSettingsProto.LOCKSCREEN);
+ dumpSetting(s, p,
+ Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
+ SystemSettingsProto.Lockscreen.SOUNDS_ENABLED);
+ dumpSetting(s, p,
+ Settings.System.LOCKSCREEN_DISABLED,
+ SystemSettingsProto.Lockscreen.DISABLED);
+ p.end(lockscreenToken);
+
+ dumpSetting(s, p,
+ Settings.System.MEDIA_BUTTON_RECEIVER,
+ SystemSettingsProto.MEDIA_BUTTON_RECEIVER);
+
+ final long notificationToken = p.start(SystemSettingsProto.NOTIFICATION);
+ dumpSetting(s, p,
+ Settings.System.NOTIFICATION_SOUND,
+ SystemSettingsProto.Notification.SOUND);
+ dumpSetting(s, p,
+ Settings.System.NOTIFICATION_SOUND_CACHE,
+ SystemSettingsProto.Notification.SOUND_CACHE);
+ dumpSetting(s, p,
+ Settings.System.NOTIFICATION_LIGHT_PULSE,
+ SystemSettingsProto.Notification.LIGHT_PULSE);
+ dumpSetting(s, p,
+ Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+ SystemSettingsProto.Notification.VIBRATION_INTENSITY);
+ // Settings.System.NOTIFICATIONS_USE_RING_VOLUME intentionally excluded since it's deprecated.
+ p.end(notificationToken);
+
+ dumpSetting(s, p,
+ Settings.System.POINTER_SPEED,
+ SystemSettingsProto.POINTER_SPEED);
+
+ final long ringtoneToken = p.start(SystemSettingsProto.RINGTONE);
+ dumpSetting(s, p,
+ Settings.System.RINGTONE,
+ SystemSettingsProto.Ringtone.DEFAULT_URI);
+ dumpSetting(s, p,
+ Settings.System.RINGTONE_CACHE,
+ SystemSettingsProto.Ringtone.CACHE);
+ p.end(ringtoneToken);
+
+ final long rotationToken = p.start(SystemSettingsProto.ROTATION);
+ dumpSetting(s, p,
+ Settings.System.ACCELEROMETER_ROTATION,
+ SystemSettingsProto.Rotation.ACCELEROMETER_ROTATION);
+ dumpSetting(s, p,
+ Settings.System.USER_ROTATION,
+ SystemSettingsProto.Rotation.USER_ROTATION);
+ dumpSetting(s, p,
+ Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY,
+ SystemSettingsProto.Rotation.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY);
+ p.end(rotationToken);
+
+ dumpSetting(s, p,
+ Settings.System.RTT_CALLING_MODE,
+ SystemSettingsProto.RTT_CALLING_MODE);
+
+ final long screenToken = p.start(SystemSettingsProto.SCREEN);
+ dumpSetting(s, p,
+ Settings.System.SCREEN_OFF_TIMEOUT,
+ SystemSettingsProto.Screen.OFF_TIMEOUT);
+ dumpSetting(s, p,
+ Settings.System.SCREEN_BRIGHTNESS,
+ SystemSettingsProto.Screen.BRIGHTNESS);
+ dumpSetting(s, p,
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR,
+ SystemSettingsProto.Screen.BRIGHTNESS_FOR_VR);
+ dumpSetting(s, p,
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ SystemSettingsProto.Screen.BRIGHTNESS_MODE);
+ dumpSetting(s, p,
+ Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
+ SystemSettingsProto.Screen.AUTO_BRIGHTNESS_ADJ);
+ p.end(screenToken);
+
+ dumpSetting(s, p,
+ Settings.System.SETUP_WIZARD_HAS_RUN,
+ SystemSettingsProto.SETUP_WIZARD_HAS_RUN);
+ dumpSetting(s, p,
+ Settings.System.SHOW_BATTERY_PERCENT,
+ SystemSettingsProto.SHOW_BATTERY_PERCENT);
+ dumpSetting(s, p,
+ Settings.System.SHOW_GTALK_SERVICE_STATUS,
+ SystemSettingsProto.SHOW_GTALK_SERVICE_STATUS);
+ // Settings.System.SHOW_PROCESSES intentionally excluded since it's deprecated.
+ // Settings.System.SHOW_WEB_SUGGESTIONS intentionally excluded since it's deprecated.
+
+ final long sipToken = p.start(SystemSettingsProto.SIP);
+ dumpSetting(s, p,
+ Settings.System.SIP_RECEIVE_CALLS,
+ SystemSettingsProto.Sip.RECEIVE_CALLS);
+ dumpSetting(s, p,
+ Settings.System.SIP_CALL_OPTIONS,
+ SystemSettingsProto.Sip.CALL_OPTIONS);
+ dumpSetting(s, p,
+ Settings.System.SIP_ALWAYS,
+ SystemSettingsProto.Sip.ALWAYS);
+ dumpSetting(s, p,
+ Settings.System.SIP_ADDRESS_ONLY,
+ SystemSettingsProto.Sip.ADDRESS_ONLY);
+ // Settings.System.SIP_ASK_ME_EACH_TIME intentionally excluded since it's deprecated.
+ p.end(sipToken);
+
+ dumpSetting(s, p,
+ Settings.System.SOUND_EFFECTS_ENABLED,
+ SystemSettingsProto.SOUND_EFFECTS_ENABLED);
+ // Settings.System.POWER_SOUNDS_ENABLED intentionally excluded since it's deprecated.
+ // Settings.System.DOCK_SOUNDS_ENABLED intentionally excluded since it's deprecated.
+ // Settings.System.LOW_BATTERY_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.DESK_DOCK_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.DESK_UNDOCK_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.CAR_DOCK_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.CAR_UNDOCK_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.LOCK_SOUND intentionally excluded since it's deprecated.
+ // Settings.System.UNLOCK_SOUND intentionally excluded since it's deprecated.
+ dumpSetting(s, p,
+ Settings.System.SYSTEM_LOCALES,
+ SystemSettingsProto.SYSTEM_LOCALES);
+
+ final long textToken = p.start(SystemSettingsProto.TEXT);
+ dumpSetting(s, p,
+ Settings.System.TEXT_AUTO_REPLACE,
+ SystemSettingsProto.Text.AUTO_REPLACE);
+ dumpSetting(s, p,
+ Settings.System.TEXT_AUTO_CAPS,
+ SystemSettingsProto.Text.AUTO_CAPS);
+ dumpSetting(s, p,
+ Settings.System.TEXT_AUTO_PUNCTUATE,
+ SystemSettingsProto.Text.AUTO_PUNCTUATE);
+ dumpSetting(s, p,
+ Settings.System.TEXT_SHOW_PASSWORD,
+ SystemSettingsProto.Text.SHOW_PASSWORD);
+ p.end(textToken);
+
+ // Settings.System.AUTO_TIME intentionally excluded since it's deprecated.
+ // Settings.System.AUTO_TIME_ZONE intentionally excluded since it's deprecated.
+ dumpSetting(s, p,
+ Settings.System.TIME_12_24,
+ SystemSettingsProto.TIME_12_24);
+ dumpSetting(s, p,
+ Settings.System.TTY_MODE,
+ SystemSettingsProto.TTY_MODE);
+
+ final long vibrateToken = p.start(SystemSettingsProto.VIBRATE);
+ dumpSetting(s, p,
+ Settings.System.VIBRATE_ON,
+ SystemSettingsProto.Vibrate.ON);
+ dumpSetting(s, p,
+ Settings.System.VIBRATE_INPUT_DEVICES,
+ SystemSettingsProto.Vibrate.INPUT_DEVICES);
+ dumpSetting(s, p,
+ Settings.System.VIBRATE_IN_SILENT,
+ SystemSettingsProto.Vibrate.IN_SILENT);
+ dumpSetting(s, p,
+ Settings.System.VIBRATE_WHEN_RINGING,
+ SystemSettingsProto.Vibrate.WHEN_RINGING);
+ p.end(vibrateToken);
+
+ final long volumeToken = p.start(SystemSettingsProto.VOLUME);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_RING,
+ SystemSettingsProto.Volume.RING);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_SYSTEM,
+ SystemSettingsProto.Volume.SYSTEM);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_VOICE,
+ SystemSettingsProto.Volume.VOICE);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_MUSIC,
+ SystemSettingsProto.Volume.MUSIC);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_ALARM,
+ SystemSettingsProto.Volume.ALARM);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_NOTIFICATION,
+ SystemSettingsProto.Volume.NOTIFICATION);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_BLUETOOTH_SCO,
+ SystemSettingsProto.Volume.BLUETOOTH_SCO);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_ACCESSIBILITY,
+ SystemSettingsProto.Volume.ACCESSIBILITY);
+ dumpSetting(s, p,
+ Settings.System.VOLUME_MASTER,
+ SystemSettingsProto.Volume.MASTER);
+ dumpSetting(s, p,
+ Settings.System.MASTER_MONO,
+ SystemSettingsProto.Volume.MASTER_MONO);
+ dumpSetting(s, p,
+ Settings.System.MODE_RINGER_STREAMS_AFFECTED,
+ SystemSettingsProto.Volume.MODE_RINGER_STREAMS_AFFECTED);
+ dumpSetting(s, p,
+ Settings.System.MUTE_STREAMS_AFFECTED,
+ SystemSettingsProto.Volume.MUTE_STREAMS_AFFECTED);
+ p.end(volumeToken);
+
+ dumpSetting(s, p,
+ Settings.System.WHEN_TO_MAKE_WIFI_CALLS,
+ SystemSettingsProto.WHEN_TO_MAKE_WIFI_CALLS);
+
+ // Please insert new settings using the same order as in SecureSettingsProto.
+
+ // The rest of the settings were moved to Settings.Secure, and are thus excluded here since
+ // they're deprecated from Settings.System.
+
+ // Settings.System.STAY_ON_WHILE_PLUGGED_IN intentionally excluded since it's deprecated.
// Settings.System.AIRPLANE_MODE_ON intentionally excluded since it's deprecated.
// Settings.System.RADIO_BLUETOOTH intentionally excluded since it's just a constant.
// Settings.System.RADIO_WIFI intentionally excluded since it's just a constant.
@@ -2184,245 +2572,24 @@
// Settings.System.WIFI_STATIC_NETMASK intentionally excluded since it's deprecated.
// Settings.System.WIFI_STATIC_DNS1 intentionally excluded since it's deprecated.
// Settings.System.WIFI_STATIC_DNS2 intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.BLUETOOTH_DISCOVERABILITY,
- SystemSettingsProto.BLUETOOTH_DISCOVERABILITY);
- dumpSetting(s, p,
- Settings.System.BLUETOOTH_DISCOVERABILITY_TIMEOUT,
- SystemSettingsProto.BLUETOOTH_DISCOVERABILITY_TIMEOUT);
// Settings.System.LOCK_PATTERN_ENABLED intentionally excluded since it's deprecated.
// Settings.System.LOCK_PATTERN_VISIBLE intentionally excluded since it's deprecated.
// Settings.System.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED intentionally excluded since it's deprecated.
- // Settings.System.NEXT_ALARM_FORMATTED intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.FONT_SCALE,
- SystemSettingsProto.FONT_SCALE);
- dumpSetting(s, p,
- Settings.System.SYSTEM_LOCALES,
- SystemSettingsProto.SYSTEM_LOCALES);
// Settings.System.DEBUG_APP intentionally excluded since it's deprecated.
// Settings.System.WAIT_FOR_DEBUGGER intentionally excluded since it's deprecated.
// Settings.System.DIM_SCREEN intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.DISPLAY_COLOR_MODE,
- SystemSettingsProto.DISPLAY_COLOR_MODE);
- dumpSetting(s, p,
- Settings.System.SCREEN_OFF_TIMEOUT,
- SystemSettingsProto.SCREEN_OFF_TIMEOUT);
- dumpSetting(s, p,
- Settings.System.SCREEN_BRIGHTNESS,
- SystemSettingsProto.SCREEN_BRIGHTNESS);
- dumpSetting(s, p,
- Settings.System.SCREEN_BRIGHTNESS_FOR_VR,
- SystemSettingsProto.SCREEN_BRIGHTNESS_FOR_VR);
- dumpSetting(s, p,
- Settings.System.SCREEN_BRIGHTNESS_MODE,
- SystemSettingsProto.SCREEN_BRIGHTNESS_MODE);
- dumpSetting(s, p,
- Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
- SystemSettingsProto.SCREEN_AUTO_BRIGHTNESS_ADJ);
- // Settings.System.SHOW_PROCESSES intentionally excluded since it's deprecated.
// Settings.System.ALWAYS_FINISH_ACTIVITIES intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.MODE_RINGER_STREAMS_AFFECTED,
- SystemSettingsProto.MODE_RINGER_STREAMS_AFFECTED);
- dumpSetting(s, p,
- Settings.System.MUTE_STREAMS_AFFECTED,
- SystemSettingsProto.MUTE_STREAMS_AFFECTED);
- dumpSetting(s, p,
- Settings.System.VIBRATE_ON,
- SystemSettingsProto.VIBRATE_ON);
- dumpSetting(s, p,
- Settings.System.VIBRATE_INPUT_DEVICES,
- SystemSettingsProto.VIBRATE_INPUT_DEVICES);
- dumpSetting(s, p,
- Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- SystemSettingsProto.NOTIFICATION_VIBRATION_INTENSITY);
- dumpSetting(s, p,
- Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- SystemSettingsProto.HAPTIC_FEEDBACK_INTENSITY);
- dumpSetting(s, p,
- Settings.System.VOLUME_RING,
- SystemSettingsProto.VOLUME_RING);
- dumpSetting(s, p,
- Settings.System.VOLUME_SYSTEM,
- SystemSettingsProto.VOLUME_SYSTEM);
- dumpSetting(s, p,
- Settings.System.VOLUME_VOICE,
- SystemSettingsProto.VOLUME_VOICE);
- dumpSetting(s, p,
- Settings.System.VOLUME_MUSIC,
- SystemSettingsProto.VOLUME_MUSIC);
- dumpSetting(s, p,
- Settings.System.VOLUME_ALARM,
- SystemSettingsProto.VOLUME_ALARM);
- dumpSetting(s, p,
- Settings.System.VOLUME_NOTIFICATION,
- SystemSettingsProto.VOLUME_NOTIFICATION);
- dumpSetting(s, p,
- Settings.System.VOLUME_BLUETOOTH_SCO,
- SystemSettingsProto.VOLUME_BLUETOOTH_SCO);
- dumpSetting(s, p,
- Settings.System.VOLUME_ACCESSIBILITY,
- SystemSettingsProto.VOLUME_ACCESSIBILITY);
- dumpSetting(s, p,
- Settings.System.VOLUME_MASTER,
- SystemSettingsProto.VOLUME_MASTER);
- dumpSetting(s, p,
- Settings.System.MASTER_MONO,
- SystemSettingsProto.MASTER_MONO);
- // Settings.System.NOTIFICATIONS_USE_RING_VOLUME intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.VIBRATE_IN_SILENT,
- SystemSettingsProto.VIBRATE_IN_SILENT);
- dumpSetting(s, p,
- Settings.System.APPEND_FOR_LAST_AUDIBLE,
- SystemSettingsProto.APPEND_FOR_LAST_AUDIBLE);
- dumpSetting(s, p,
- Settings.System.RINGTONE,
- SystemSettingsProto.RINGTONE);
- dumpSetting(s, p,
- Settings.System.RINGTONE_CACHE,
- SystemSettingsProto.RINGTONE_CACHE);
- dumpSetting(s, p,
- Settings.System.NOTIFICATION_SOUND,
- SystemSettingsProto.NOTIFICATION_SOUND);
- dumpSetting(s, p,
- Settings.System.NOTIFICATION_SOUND_CACHE,
- SystemSettingsProto.NOTIFICATION_SOUND_CACHE);
- dumpSetting(s, p,
- Settings.System.ALARM_ALERT,
- SystemSettingsProto.ALARM_ALERT);
- dumpSetting(s, p,
- Settings.System.ALARM_ALERT_CACHE,
- SystemSettingsProto.ALARM_ALERT_CACHE);
- dumpSetting(s, p,
- Settings.System.MEDIA_BUTTON_RECEIVER,
- SystemSettingsProto.MEDIA_BUTTON_RECEIVER);
- dumpSetting(s, p,
- Settings.System.TEXT_AUTO_REPLACE,
- SystemSettingsProto.TEXT_AUTO_REPLACE);
- dumpSetting(s, p,
- Settings.System.TEXT_AUTO_CAPS,
- SystemSettingsProto.TEXT_AUTO_CAPS);
- dumpSetting(s, p,
- Settings.System.TEXT_AUTO_PUNCTUATE,
- SystemSettingsProto.TEXT_AUTO_PUNCTUATE);
- dumpSetting(s, p,
- Settings.System.TEXT_SHOW_PASSWORD,
- SystemSettingsProto.TEXT_SHOW_PASSWORD);
- dumpSetting(s, p,
- Settings.System.SHOW_GTALK_SERVICE_STATUS,
- SystemSettingsProto.SHOW_GTALK_SERVICE_STATUS);
+ // Settings.System.APPEND_FOR_LAST_AUDIBLE intentionally excluded since it hasn't been used since API 2.
// Settings.System.WALLPAPER_ACTIVITY intentionally excluded since it's deprecated.
- // Settings.System.AUTO_TIME intentionally excluded since it's deprecated.
- // Settings.System.AUTO_TIME_ZONE intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.TIME_12_24,
- SystemSettingsProto.TIME_12_24);
- dumpSetting(s, p,
- Settings.System.DATE_FORMAT,
- SystemSettingsProto.DATE_FORMAT);
- dumpSetting(s, p,
- Settings.System.SETUP_WIZARD_HAS_RUN,
- SystemSettingsProto.SETUP_WIZARD_HAS_RUN);
// Settings.System.WINDOW_ANIMATION_SCALE intentionally excluded since it's deprecated.
// Settings.System.TRANSITION_ANIMATION_SCALE intentionally excluded since it's deprecated.
// Settings.System.ANIMATOR_ANIMATION_SCALE intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.ACCELEROMETER_ROTATION,
- SystemSettingsProto.ACCELEROMETER_ROTATION);
- dumpSetting(s, p,
- Settings.System.USER_ROTATION,
- SystemSettingsProto.USER_ROTATION);
- dumpSetting(s, p,
- Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY,
- SystemSettingsProto.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY);
- dumpSetting(s, p,
- Settings.System.VIBRATE_WHEN_RINGING,
- SystemSettingsProto.VIBRATE_WHEN_RINGING);
- dumpSetting(s, p,
- Settings.System.DTMF_TONE_WHEN_DIALING,
- SystemSettingsProto.DTMF_TONE_WHEN_DIALING);
- dumpSetting(s, p,
- Settings.System.DTMF_TONE_TYPE_WHEN_DIALING,
- SystemSettingsProto.DTMF_TONE_TYPE_WHEN_DIALING);
- dumpSetting(s, p,
- Settings.System.HEARING_AID,
- SystemSettingsProto.HEARING_AID);
- dumpSetting(s, p,
- Settings.System.TTY_MODE,
- SystemSettingsProto.TTY_MODE);
- dumpSetting(s, p,
- Settings.System.RTT_CALLING_MODE,
- SystemSettingsProto.RTT_CALLING_MODE);
- dumpSetting(s, p,
- Settings.System.SOUND_EFFECTS_ENABLED,
- SystemSettingsProto.SOUND_EFFECTS_ENABLED);
- dumpSetting(s, p,
- Settings.System.HAPTIC_FEEDBACK_ENABLED,
- SystemSettingsProto.HAPTIC_FEEDBACK_ENABLED);
- // Settings.System.SHOW_WEB_SUGGESTIONS intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.NOTIFICATION_LIGHT_PULSE,
- SystemSettingsProto.NOTIFICATION_LIGHT_PULSE);
- dumpSetting(s, p,
- Settings.System.POINTER_LOCATION,
- SystemSettingsProto.POINTER_LOCATION);
- dumpSetting(s, p,
- Settings.System.SHOW_TOUCHES,
- SystemSettingsProto.SHOW_TOUCHES);
- dumpSetting(s, p,
- Settings.System.WINDOW_ORIENTATION_LISTENER_LOG,
- SystemSettingsProto.WINDOW_ORIENTATION_LISTENER_LOG);
- // Settings.System.POWER_SOUNDS_ENABLED intentionally excluded since it's deprecated.
- // Settings.System.DOCK_SOUNDS_ENABLED intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
- SystemSettingsProto.LOCKSCREEN_SOUNDS_ENABLED);
- dumpSetting(s, p,
- Settings.System.LOCKSCREEN_DISABLED,
- SystemSettingsProto.LOCKSCREEN_DISABLED);
- // Settings.System.LOW_BATTERY_SOUND intentionally excluded since it's deprecated.
- // Settings.System.DESK_DOCK_SOUND intentionally excluded since it's deprecated.
- // Settings.System.DESK_UNDOCK_SOUND intentionally excluded since it's deprecated.
- // Settings.System.CAR_DOCK_SOUND intentionally excluded since it's deprecated.
- // Settings.System.CAR_UNDOCK_SOUND intentionally excluded since it's deprecated.
- // Settings.System.LOCK_SOUND intentionally excluded since it's deprecated.
- // Settings.System.UNLOCK_SOUND intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.SIP_RECEIVE_CALLS,
- SystemSettingsProto.SIP_RECEIVE_CALLS);
- dumpSetting(s, p,
- Settings.System.SIP_CALL_OPTIONS,
- SystemSettingsProto.SIP_CALL_OPTIONS);
- dumpSetting(s, p,
- Settings.System.SIP_ALWAYS,
- SystemSettingsProto.SIP_ALWAYS);
- dumpSetting(s, p,
- Settings.System.SIP_ADDRESS_ONLY,
- SystemSettingsProto.SIP_ADDRESS_ONLY);
- // Settings.System.SIP_ASK_ME_EACH_TIME intentionally excluded since it's deprecated.
- dumpSetting(s, p,
- Settings.System.POINTER_SPEED,
- SystemSettingsProto.POINTER_SPEED);
- dumpSetting(s, p,
- Settings.System.LOCK_TO_APP_ENABLED,
- SystemSettingsProto.LOCK_TO_APP_ENABLED);
- dumpSetting(s, p,
- Settings.System.EGG_MODE,
- SystemSettingsProto.EGG_MODE);
- dumpSetting(s, p,
- Settings.System.SHOW_BATTERY_PERCENT,
- SystemSettingsProto.SHOW_BATTERY_PERCENT);
- dumpSetting(s, p,
- Settings.System.WHEN_TO_MAKE_WIFI_CALLS,
- SystemSettingsProto.WHEN_TO_MAKE_WIFI_CALLS);
+
// The rest of the settings were moved to Settings.Secure, and are thus excluded here since
// they're deprecated from Settings.System.
- // Please insert new settings using the same order as in Settings.System.
-
+ // Please insert new settings using the same order as in SecureSettingsProto.
p.end(token);
+ // Please insert new settings using the same order as in SecureSettingsProto.
}
}
diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml
index de6f78c..0e59223 100644
--- a/packages/Shell/res/values-as/strings.xml
+++ b/packages/Shell/res/values-as/strings.xml
@@ -30,8 +30,7 @@
<string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"স্ক্ৰীণশ্বট নোলোৱাকৈ বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবলৈ ইয়াত টিপক বা স্ক্ৰীণশ্বট সম্পূৰ্ণ হোৱালৈ অপেক্ষা কৰক"</string>
<string name="bugreport_confirm" msgid="5917407234515812495">"বাগ সম্পর্কীয় অভিযোগত ছিষ্টেমৰ বিভিন্ন লগ ফাইল থাকে, ইয়াৰ ভিতৰত আপুনি স্পর্শকাতৰ বুলি গণ্য কৰা ডেটা (যেনে এপৰ ব্য়ৱহাৰ আৰু অৱস্থান সম্পৰ্কীয় তথ্য়) অন্তর্ভুক্ত হ\'ব পাৰে। কেৱল আপোনাৰ বিশ্বাসী লোক বা এপৰ সৈতেহে বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিব।"</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"পুনৰাই নেদেখুৱাব"</string>
- <!-- no translation found for bugreport_storage_title (5332488144740527109) -->
- <skip />
+ <string name="bugreport_storage_title" msgid="5332488144740527109">"বাগ সম্পর্কীয় প্ৰতিবেদনসমূহ"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"বাগ সম্পর্কীয় অভিযোগৰ ফাইলটো পঢ়িব পৰা নগ\'ল"</string>
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"বাগ সম্পর্কীয় অভিযোগৰ বিৱৰণ জিপ ফাইলত যোগ কৰিব পৰা নগ\'ল"</string>
<string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string>
diff --git a/packages/Shell/res/values-or/strings.xml b/packages/Shell/res/values-or/strings.xml
index 30aeb9c..438b715 100644
--- a/packages/Shell/res/values-or/strings.xml
+++ b/packages/Shell/res/values-or/strings.xml
@@ -17,46 +17,31 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="3701846017049540910">"ଶେଲ୍"</string>
- <!-- no translation found for bugreport_notification_channel (2574150205913861141) -->
- <skip />
- <!-- no translation found for bugreport_in_progress_title (4311705936714972757) -->
- <skip />
- <!-- no translation found for bugreport_finished_title (4429132808670114081) -->
- <skip />
+ <string name="bugreport_notification_channel" msgid="2574150205913861141">"ବଗ୍ ରିପୋର୍ଟ"</string>
+ <string name="bugreport_in_progress_title" msgid="4311705936714972757">"ବଗ୍ ରିପୋର୍ଟ <xliff:g id="ID">#%d</xliff:g> ତିଆରି କରାଯାଉଛି"</string>
+ <string name="bugreport_finished_title" msgid="4429132808670114081">"ବଗ୍ ରିପୋର୍ଟ <xliff:g id="ID">#%d</xliff:g> କ୍ୟାପଚର୍ କରାଗଲା"</string>
<string name="bugreport_updating_title" msgid="4423539949559634214">"ବଗ୍ ରିପୋର୍ଟରେ ବିବରଣୀ ଯୋଡ଼ାଯାଉଛି"</string>
<string name="bugreport_updating_wait" msgid="3322151947853929470">"ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ…"</string>
<string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"ଅଳ୍ପ ସମୟ ମଧ୍ୟରେ ଫୋନ୍ରେ ବଗ୍ ରିପୋର୍ଟ ଦେଖାଯିବ"</string>
- <!-- no translation found for bugreport_finished_text (5758325479058638893) -->
- <skip />
- <!-- no translation found for bugreport_finished_text (8353769438382138847) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
- <skip />
- <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
- <skip />
- <!-- no translation found for bugreport_confirm (5917407234515812495) -->
- <skip />
- <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) -->
- <skip />
+ <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"ଆପଣଙ୍କ ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବାକୁ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"ଆପଣଙ୍କ ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ଗୋଟିଏ ସ୍କ୍ରୀନଶଟ୍ ସହିତ ଆପଣଙ୍କ ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବାକୁ ଚୟନ କରନ୍ତୁ କିମ୍ବା ସ୍କ୍ରୀନଶଟ୍ ସମାପ୍ତ ହେବାକୁ ଅପେକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"ସ୍କ୍ରୀନଶଟ୍ ବିନା ଆପଣଙ୍କ ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ କିମ୍ବା ସ୍କ୍ରୀନଶଟ୍ ସମାପ୍ତ ହେବା ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ସ୍କ୍ରୀନଶଟ୍ ବିନା ଆପଣଙ୍କ ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ କିମ୍ବା ସ୍କ୍ରୀନଶଟ୍ ସମାପ୍ତ ହେବା ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"ବଗ୍ ରିପୋର୍ଟରେ ସିଷ୍ଟମର ବିଭିନ୍ନ ଲଗ୍ ଫାଇଲ୍ରୁ ଆସିଥିବା ଡାଟା ରହିଛି, ଯେଉଁଥିରେ ଆପଣଙ୍କ ସମ୍ବେଦନଶୀଳ ଡାଟା (ଯେପରିକି ଆପ୍-ବ୍ୟବହାର ଓ ଲୋକେଶନ୍ ଡାଟା) ରହିଥାଇପାରେ। ଆପଣ ବିଶ୍ୱାସ କରୁଥିବା ଲୋକ ତଥା ଆପ୍ ସହ ଏପରି ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରନ୍ତୁ।"</string>
+ <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"ବଗ୍ ରିପୋର୍ଟ"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"ବଗ୍ ରିପୋର୍ଟ ଫାଇଲ୍ ପଢ଼ାଯାଇପାରିଲା ନାହିଁ"</string>
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ଜିପ୍ ଫାଇଲରେ ବଗ୍ ରିପୋର୍ଟ ବିବରଣୀ ଯୋଡ଼ାଯାଇପାରିଲା ନାହିଁ"</string>
<string name="bugreport_unnamed" msgid="2800582406842092709">"ବେନାମୀ"</string>
<string name="bugreport_info_action" msgid="2158204228510576227">"ବିବରଣୀ"</string>
<string name="bugreport_screenshot_action" msgid="8677781721940614995">"ସ୍କ୍ରୀନ୍ଶଟ୍"</string>
- <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) -->
- <skip />
+ <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ସଫଳତାପୂର୍ବକ ସ୍କ୍ରୀନଶଟ୍ ନିଆଗଲା"</string>
<string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ସ୍କ୍ରୀନ୍ଶଟ୍ ନିଆଯାଇପାରିଲା ନାହିଁ।"</string>
- <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) -->
- <skip />
+ <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ବଗ୍ ରିପୋର୍ଟ <xliff:g id="ID">#%d</xliff:g>ର ବିବରଣୀ"</string>
<string name="bugreport_info_name" msgid="4414036021935139527">"ଫାଇଲ୍ ନାମ"</string>
- <!-- no translation found for bugreport_info_title (2306030793918239804) -->
- <skip />
- <!-- no translation found for bugreport_info_description (5072835127481627722) -->
- <skip />
- <!-- no translation found for save (4781509040564835759) -->
- <skip />
+ <string name="bugreport_info_title" msgid="2306030793918239804">"ବଗ୍ର ନାମ"</string>
+ <string name="bugreport_info_description" msgid="5072835127481627722">"ବଗ୍ର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string>
+ <string name="save" msgid="4781509040564835759">"ସେଭ୍ କରନ୍ତୁ"</string>
<string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"ବଗ୍ ରିପୋର୍ଟ ଶେୟାର୍ କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index 68293d9..df21151 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -56,7 +56,8 @@
SystemUI-tags \
SystemUI-proto
-LOCAL_JAVA_LIBRARIES := telephony-common
+LOCAL_JAVA_LIBRARIES := telephony-common \
+ android.car
LOCAL_PACKAGE_NAME := SystemUI
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3d49e5c..3488168 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -205,6 +205,9 @@
<!-- Listen app op changes -->
<uses-permission android:name="android.permission.WATCH_APPOPS" />
+ <!-- to read and change hvac values in a car -->
+ <uses-permission android:name="android.car.permission.ADJUST_CAR_CLIMATE" />
+
<application
android:name=".SystemUIApplication"
android:persistent="true"
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 7c97ca61..e217ace 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -22,3 +22,6 @@
twickham@google.com
winsonc@google.com
+#Android Auto
+stenning@google.com
+
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
index c8bcdaa..5f4cf03 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
@@ -19,6 +19,7 @@
import android.media.AudioManager;
import android.media.AudioSystem;
import android.os.Handler;
+import android.os.VibrationEffect;
import android.util.SparseArray;
import com.android.systemui.plugins.VolumeDialogController.Callbacks;
@@ -44,7 +45,8 @@
void setRingerMode(int ringerModeNormal, boolean external);
boolean hasVibrator();
- void vibrate();
+ void vibrate(VibrationEffect effect);
+ void scheduleTouchFeedback();
AudioManager getAudioManager();
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
index 53f7e44..ad300f4 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
@@ -50,4 +50,6 @@
public abstract void onStateChanged(State state);
public abstract int getDetailY();
+
+ public void setExpansion(float expansion) {}
}
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
index 6edae4b..1f6b24b 100644
--- a/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
+++ b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
@@ -21,5 +21,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M22,3H7C6.31,3 5.77,3.35 5.41,3.88l-5.04,7.57c-0.22,0.34 -0.22,0.77 0,1.11l5.04,7.56C5.77,20.64 6.31,21 7,21h15c1.1,0 2,-0.9 2,-2V5C24,3.9 23.1,3 22,3zM18.3,16.3L18.3,16.3c-0.39,0.39 -1.02,0.39 -1.41,0L14,13.41l-2.89,2.89c-0.39,0.39 -1.02,0.39 -1.41,0h0c-0.39,-0.39 -0.39,-1.02 0,-1.41L12.59,12L9.7,9.11c-0.39,-0.39 -0.39,-1.02 0,-1.41l0,0c0.39,-0.39 1.02,-0.39 1.41,0L14,10.59l2.89,-2.89c0.39,-0.39 1.02,-0.39 1.41,0v0c0.39,0.39 0.39,1.02 0,1.41L15.41,12l2.89,2.89C18.68,15.27 18.68,15.91 18.3,16.3z"/>
+ android:pathData="M9,15.59L12.59,12L9,8.41L10.41,7L14,10.59L17.59,7L19,8.41L15.41,12L19,15.59L17.59,17L14,13.41L10.41,17L9,15.59zM21,6H8l-4.5,6L8,18h13V6M21,4c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2H8c-0.63,0 -1.22,-0.3 -1.6,-0.8L1,12l5.4,-7.2C6.78,4.3 7.37,4 8,4H21L21,4z"/>
</vector>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index c466a0e..149d254 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"የይለፍ ቃል ለመተየብ ይንኩ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"ለመክፈት የይለፍ ቃል ይተይቡ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"ለመክፈት ፒን ይተይቡ"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"የእርስዎን ፒን ያስገቡ"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"ስርዓተ-ጥለትዎን ያስገቡ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"ይለፍ ቃልዎን ያስገቡ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ትክክል ያልሆነ ፒን ኮድ።"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ልክ ያልሆነ ካርድ።"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ባትሪ ሞልቷል"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index d2ecb34..a1ba5a4 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"المس لكتابة كلمة المرور"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"اكتب كلمة المرور لإلغاء التأمين"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"اكتب رمز رقم التعريف الشخصي لإلغاء التأمين"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"أدخل رقم التعريف الشخصي (PIN)"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"أدخل النقش"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"أدخل كلمة المرور"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"رمز رقم التعريف الشخصي غير صحيح."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"بطاقة غير صالحة."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"تم الشحن"</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 40e2a30..c901402 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -28,15 +28,15 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"পাছৱৰ্ড লিখিবলৈ স্পৰ্শ কৰক"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"আনলক কৰিবলৈ পাছৱৰ্ড লিখক"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"আনলক কৰিবলৈ পিন লিখক"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"আপোনাৰ পিন দিয়ক"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"আপোনাৰ আৰ্হি দিয়ক"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"আপোনাৰ পাছৱৰ্ড দিয়ক"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন ক\'ড।"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"চ্চার্জ কৰা হ\'ল"</string>
- <!-- no translation found for keyguard_plugged_in (3161102098900158923) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (3684592786276709342) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (509533586841478405) -->
- <skip />
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চ্চার্জ কৰি থকা হৈছে"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • লাহে লাহে চ্চাৰ্জ কৰি থকা হৈছে"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"আপোনাৰ চ্চার্জাৰ সংযোগ কৰক।"</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"আনলক কৰিবলৈ মেনু টিপক।"</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"নেটৱর্ক লক কৰা অৱস্থাত আছে"</string>
@@ -56,10 +56,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পৰৱৰ্তী এলাৰ্ম <xliff:g id="ALARM">%1$s</xliff:g> বজাত ছেট কৰা হৈছে"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মচক"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"ই-ছিম অক্ষম কৰক"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ই-ছিম অক্ষম কৰিব পৰা নাযায়"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"এটা আসোঁৱাহৰ কাৰণে ই-ছিম অক্ষম কৰিব পৰা নাযায়।"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এণ্টাৰ বুটাম"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"আৰ্হি পাহৰিলে নেকি"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল আৰ্হি"</string>
@@ -72,8 +70,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"আপোনাৰ আৰ্হি আঁকক"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ছিমৰ পিন দিয়ক।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"ৰ ছিমৰ পিন দিয়ক।"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ম\'বাইল সেৱা অবিহনে ডিভাইচ ব্যৱহাৰ কৰিবলৈ ই-ছিম অক্ষম কৰক।"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"পিন দিয়ক"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"পাছৱৰ্ড দিয়ক"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ছিমখন বর্তমান অক্ষম অৱস্থাত আছে। অব্যাহত ৰাখিবলৈ PUK ক\'ড লিখক। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 59b4b53..1f1be13 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dodirnite za unos lozinke"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Unesite lozinku da biste otključali"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Unesite PIN za otključavanje"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Unesite PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Unesite šablon"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Unesite lozinku"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kôd je netačan."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Napunjena je"</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index aa92e3d..8ab0cab 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Дакраніцеся, каб увесці пароль"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Увядзіце пароль для разблакіравання"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Каб разблакіраваць, увядзіце PIN-код"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Увядзіце PIN-код"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Увядзіце ўзор разблакіроўкі"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Увядзіце пароль"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Няправільны PIN-код."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Несапраўдная картка."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Зараджаны"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 17e52d3..b270ef99 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"পাসওয়ার্ড লিখতে স্পর্শ করুন"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"আনলক করতে পাসওয়ার্ড লিখুন"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"আনলক করতে পিন লিখুন"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"পিন লিখুন"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"প্যাটার্ন আঁকুন"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"পাসওয়ার্ড লিখুন"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন কোড দেওয়া হয়েছে।"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ভুল কার্ড।"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"চার্জ হয়েছে"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index c9574f2..cf8bc5c 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dodirnite da upišete lozinku"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Upišite lozinku za otključavanje"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Upišite PIN za otključavanje"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Unesite svoj PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Unesite svoj uzorak"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Unesite svoju lozinku"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Pogrešan PIN."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Napunjeno"</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index d5f80cb..36f05f4 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -28,12 +28,15 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Klepnutím zadáte heslo"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Zadejte heslo pro odemknutí"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Zadejte kód PIN pro odemknutí"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Zadejte PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Zadejte gesto"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Zadejte heslo"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Nesprávný kód PIN."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Neplatná karta."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Nabito"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"Nabíjení"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Rychlé nabíjení"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Pomalé nabíjení"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíjení"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Rychlé nabíjení"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Pomalé nabíjení"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Připojte dobíjecí zařízení."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Klávesy odemknete stisknutím tlačítka nabídky."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Síť je blokována"</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index 7677aef..ac185d6 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Tryk for at angive adgangskode"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Indtast adgangskoden for at låse op"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Indtast pinkoden for at låse op"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Angiv din pinkode"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Angiv dit mønster"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Angiv din adgangskode"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Forkert pinkode."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ugyldigt kort."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Opladet"</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index f269421..0889721 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Zur Passworteingabe berühren"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Bitte gib das Passwort zum Entsperren ein"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Bitte gib die PIN zum Entsperren ein"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Gib deine PIN ein"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Gib dein Muster ein"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Gib dein Passwort ein"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Falscher PIN-Code."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ungültige Karte."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Aufgeladen"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 28415ff..3eb63d5 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toca para ingresar contraseña"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Ingresa la contraseña para desbloquearlo"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Ingresa el PIN para desbloquearlo"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Ingresa tu PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Ingresa tu patrón"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Ingresa tu contraseña"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorrecto"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Tarjeta no válida"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Cargada"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index 0cb3e0b..86fcf1f 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -28,12 +28,15 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"برای تایپ گذرواژه لمس کنید"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"برای بازکردن قفل، گذرواژه را وارد کنید"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"برای بازکردن قفل، پین را تایپ کنید"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"پین را وارد کنید"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"الگویتان را وارد کنید"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"گذرواژهتان را وارد کنید"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"کد پین اشتباه است."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"کارت نامعتبر"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"شارژ کامل شد"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"درحال شارژ شدن"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"شارژ سریع"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"شارژ آهسته"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ شدن"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ سریع"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ آهسته"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"شارژر را وصل کنید."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"برای باز کردن قفل روی «منو» فشار دهید."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"شبکه قفل شد"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index e0b14b9..cff3ac2 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -28,12 +28,15 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Touchez ici pour entrer le mot de passe"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Entrez le mot de passe pour déverrouiller le clavier."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Entrez le NIP pour déverrouiller le clavier."</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Entrez votre NIP"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Entrez votre schéma"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Entrez votre mot de passe"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"NIP erroné."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Cette carte n\'est pas valide."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Chargé"</string>
- <string name="keyguard_plugged_in" msgid="89308975354638682">"Pile en cours de charge"</string>
- <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charge rapide"</string>
- <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charge lente"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"En recharge : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"En recharge rapide : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"En recharge lente : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="keyguard_low_battery" msgid="9218432555787624490">"Branchez votre chargeur."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Appuyez sur la touche Menu pour déverrouiller l\'appareil."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Réseau verrouillé"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index d76fdd5..4033c83 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Appuyez pour saisir mot passe"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Saisissez le mot de passe pour déverrouiller le clavier"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Saisissez le code pour déverrouiller le clavier"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Saisissez le code d\'accès"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Tracez le schéma"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Saisissez le mot de passe"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Le code est incorrect."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Carte non valide."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Chargé"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 331a8ba..35b188d 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"પાસવર્ડ લખવા માટે સ્પર્શ કરો"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"અનલૉક કરવા માટે પાસવર્ડ લખો"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"અનલૉક કરવા માટે પિન લખો"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"તમારો પિન દાખલ કરો"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"તમારી પૅટર્ન દાખલ કરો"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"તમારો પાસવર્ડ દાખલ કરો"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ખોટો પિન કોડ."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"અમાન્ય કાર્ડ."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ચાર્જ થઈ ગયું"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index a64eb17..d680feb 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"पासवर्ड लिखने के लिए छुएं"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"अनलॉक करने के लिए पासवर्ड लिखें"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"अनलॉक करने के लिए पिन लिखें"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"अपना पिन डालें"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"अपना पैटर्न डालें"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"अपना पासवर्ड डालें"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"गलत पिन कोड."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"गलत कार्ड."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"चार्ज हो गई है"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 77cd1b5..913bbd2 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dodirnite za unos zaporke"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Unesite zaporku da biste otključali"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Unesite PIN da biste otključali"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Unesite PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Unesite uzorak"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Unesite zaporku"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kôd nije točan."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Napunjeno"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 64be74f..3f0fa76 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Հպեք` գաղտնաբառը մուտքագրելու համար"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Ապակողպելու համար մուտքագրեք գաղտնաբառը"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Ապակողպելու համար մուտքագրեք PIN կոդը"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Մուտքագրեք PIN կոդը"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Մուտքագրեք նախշը"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Մուտքագրեք գաղտնաբառը"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN կոդը սխալ է։"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Սխալ քարտ"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Լիցքավորված է"</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index dfacd38..325b128 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Snertu og sláðu inn aðgangsorð"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Sláðu inn aðgangsorðið til að opna"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Sláðu inn PIN-númer til að opna"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Sláðu inn PIN-númer"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Færðu inn mynstur"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Sláðu inn aðgangsorð"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Rangt PIN-númer."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ógilt kort."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Fullhlaðin"</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 98bb40b..38f2c25 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"גע כדי להזין את הסיסמה"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"הזן סיסמה לביטול הנעילה"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"הזן את קוד הגישה לביטול הנעילה"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"הזנת קוד גישה"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"הזנת קו ביטול נעילה"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"הזנת סיסמה"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"קוד הגישה שגוי"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"כרטיס לא חוקי."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"הסוללה טעונה"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index d00f4a6..5bd01d2 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"ಪಾಸ್ವರ್ಡ್ ಟೈಪ್ ಮಾಡಲು ಸ್ಪರ್ಶಿಸಿ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಿನ್ ಟೈಪ್ ಮಾಡಿ"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ತಪ್ಪಾದ ಪಿನ್ ಕೋಡ್."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ಅಮಾನ್ಯ ಕಾರ್ಡ್."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index ec56d10..eca0cd3 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Palieskite, kad įves. slaptaž."</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Įveskite slaptažodį, kad atrakintumėte"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Įveskite PIN kodą, kad atrakintumėte"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Įveskite PIN kodą"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Įveskite atrakinimo piešinį"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Įveskite slaptažodį"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Netinkamas PIN kodas."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Netinkama kortelė."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Įkrauta"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 42ed814..bc56406 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Piesk., lai ievadītu paroli"</font>"."</string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Ievadiet paroli, lai atbloķētu."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Ievadiet PIN kodu, lai atbloķētu."</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Ievadiet savu PIN kodu"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Ievadiet savu kombināciju"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Ievadiet savu paroli"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kods nav pareizs."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Nederīga karte."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Akumulators uzlādēts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 214bc1d..48e65a6 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"പാസ്വേഡ് ടൈപ്പുചെയ്യുന്നതിന് സ്പർശിക്കുക"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"അൺലോക്കുചെയ്യുന്നതിന് പാസ്വേഡ് ടൈപ്പുചെയ്യുക"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"അൺലോക്കുചെയ്യുന്നതിന് പിൻ ടൈപ്പുചെയ്യുക"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"പിൻ നൽകുക"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"നിങ്ങളുടെ പാറ്റേൺ നൽകുക"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"നിങ്ങളുടെ പാസ്വേഡ് നല്കുക"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"പിൻ കോഡ് തെറ്റാണ്."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"അസാധുവായ കാർഡ്."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ചാർജായി"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 044e5de..a536237 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"पासवर्ड टाइप करण्यासाठी स्पर्श करा"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"अनलॉक करण्यासाठी पासवर्ड टाइप करा"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"अनलॉक करण्यासाठी पिन टाइप करा"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"तुमचा पिन एंटर करा"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"तुमचा पॅटर्न एंटर करा"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"तुमचा पासवर्ड एंटर करा"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"चुकीचा पिन कोड."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"अवैध कार्ड."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"चार्ज झाली"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 70dfb88..cc98f8e 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"पासवर्ड टाइप गर्न छुनुहोस्"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"अनलक गर्न पासवर्ड टाइप गर्नुहोस्"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"अनलक गर्न PIN कोड टाइप गर्नुहोस्"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"आफ्नो PIN प्रविष्ट गर्नुहोस्"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"आफ्नो ढाँचा प्रविष्ट गर्नुहोस्"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"आफ्नो पासवर्ड प्रविष्ट गर्ने"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN कोड गलत छ।"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"अमान्य कार्ड।"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"चार्ज भयो"</string>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
new file mode 100644
index 0000000..1ce9894
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="3171996292755059205">"କୀ’ଗାର୍ଡ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"PIN କୋଡ୍ ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM PUK ଓ ନୂଆ PIN କୋଡ୍ ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK କୋଡ୍"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"ନୂଆ SIM PIN କୋଡ୍"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"ପାସୱର୍ଡ ଟାଇପ୍ କରିବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"ଅନଲକ୍ କରିବାକୁ ପାସ୍ୱର୍ଡ ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"ଅନଲକ୍ କରିବାକୁ PIN ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"ନିଜର PIN ଲେଖନ୍ତୁ"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"ନିଜର ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"ନିଜର ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ଭୁଲ PIN କୋଡ୍।"</string>
+ <string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ଅମାନ୍ୟ କାର୍ଡ।"</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"ଚାର୍ଜ ହୋଇଗଲା"</string>
+ <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଦ୍ରୁତ ଭାବେ ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଧୀରେ ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"ଆପଣଙ୍କ ଚାର୍ଜର୍ ସଂଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"ଅନଲକ୍ କରିବା ପାଇଁ ମେନୁକୁ ଦବାନ୍ତୁ।"</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"ନେଟୱର୍କକୁ ଲକ୍ କରାଯାଇଛି"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"କୌଣସି SIM କାର୍ଡ ନାହିଁ"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ଟାବଲେଟ୍ରେ କୌଣସି SIM କାର୍ଡ ନାହିଁ।"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ଫୋନରେ କୌଣସି SIM କାର୍ଡ ନାହିଁ।"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ଗୋଟିଏ SIM କାର୍ଡ ଭର୍ତ୍ତି କରନ୍ତୁ।"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM କାର୍ଡ ନାହିଁ କିମ୍ବା ଖରାପ ଅଛି। SIM କାର୍ଡ ଭର୍ତ୍ତି କରନ୍ତୁ।"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM କାର୍ଡଟିକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ଆପଣଙ୍କ SIM କାର୍ଡକୁ ସ୍ଥାୟୀ ରୂପେ ଅକ୍ଷମ କରିଦିଆଯାଇଛି।\n ଅନ୍ୟ SIM କାର୍ଡ ପାଇଁ ଆପଣଙ୍କ ୱାୟରଲେସ୍ ସେବା ପ୍ରଦାତାଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM କାର୍ଡ ଲକ୍ ହୋଇଯାଇଛି।"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM କାର୍ଡଟି PUK ଲକ୍ ହୋଇଯାଇଛି।"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM କାର୍ଡ ଅନଲକ୍ କରାଯାଉଛି…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN ଅଞ୍ଚଳ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN ଅଞ୍ଚଳ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK ଅଞ୍ଚଳ"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g>ରେ ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ସେଟ୍ କରାଯାଇଛି"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ଡିଲିଟ୍ କରନ୍ତୁ"</string>
+ <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMକୁ ଅକ୍ଷମ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ଗୋଟିଏ ତ୍ରୁଟି କାରଣରୁ eSIMକୁ ଅକ୍ଷମ କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ଏଣ୍ଟର୍"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"ଭୁଲ ପାଟର୍ନ"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"ଭୁଲ ପାସୱର୍ଡ"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"ଭୁଲ PIN"</string>
+ <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="4368805541257003755">
+ <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
+ <item quantity="one">1 ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
+ </plurals>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ନିଜ ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
+ <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIMର PIN ଲେଖନ୍ତୁ।"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ପାଇଁ SIMର PIN ଲେଖନ୍ତୁ।"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ବିନା ମୋବାଇଲ୍ ସେବାରେ ଡିଭାଇସ୍କୁ ବ୍ୟବହାର କରିବା ପାଇଁ eSIMକୁ ଅକ୍ଷମ କରନ୍ତୁ।"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN ଲେଖନ୍ତୁ"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM ବର୍ତ୍ତମାନ ଅକ୍ଷମ ଅଟେ। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଏଣ୍ଟର୍ କରନ୍ତୁ। ବିବରଣୀ ପାଇଁ ନିଜ କେରିଅର୍ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରାଯାଇଛି। ଜାରିରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ବିବରଣୀ ପାଇଁ କେରିଅରଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"ନିଜ ଇଚ୍ଛାର PIN କୋଡ୍ ଲେଖନ୍ତୁ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"ନିଜ ଇଚ୍ଛାର PIN କୋଡ୍ ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM କାର୍ଡ ଅନଲକ୍ କରାଯାଉଛି…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 ରୁ 8 ନମ୍ବର ବିଶିଷ୍ଟ ଏକ PIN ଟାଇପ୍ କରନ୍ତୁ।"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK କୋଡ୍ରେ 8ଟି କିମ୍ବା ଅଧିକ ନମ୍ବର ରହିଥାଏ।"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ଠିକ୍ PUK କୋଡ୍ ପୁଣି ଲେଖନ୍ତୁ। ବାରମ୍ବାର ପ୍ରୟାସ କଲେ SIM କାର୍ଡ ସ୍ଥାୟୀ ରୂପେ ଅକ୍ଷମ ହୋଇଯିବ।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN କୋଡ୍ ମେଳ ହେଉନାହିଁ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"ଅନେକ ପାଟର୍ନ ପ୍ରୟାସ"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"ଆପଣଙ୍କ PIN ଆପଣ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଟାଇପ୍ କରିଛନ୍ତି। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"ଆପଣଙ୍କ ପାସ୍ୱର୍ଡକୁ ଆପଣ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଥର ଭୁଲ ଭାବେ ଟାଇପ୍ କରିଛନ୍ତି। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"ଆପଣଙ୍କ ଲକ୍ ଖୋଲିବା ପାଟର୍ନକୁ ଆପଣ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଅଙ୍କନ କରିଛନ୍ତି। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"ଆପଣ ଟାବଲେଟକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଭୁଲ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ଏହି ଟାବଲେଟଟି ରିସେଟ୍ ହୋଇଯିବ, ଯାହାଦ୍ୱାରା ଏହାର ସମସ୍ତ ଡାଟା ଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"ଆପଣ ଫୋନକୁ ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଭୁଲ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ଏହି ଫୋନଟି ରିସେଟ୍ ହୋଇଯିବ, ଯାହାଦ୍ୱାରା ଏହାର ସମସ୍ତ ଡାଟା ଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"ଆପଣ ଟାବଲେଟକୁ ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g> ଥର ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଏହି ଟାବଲେଟକୁ ରିସେଟ୍ କରାଯିବ, ଯାହାଦ୍ୱାରା ଏହାର ସମସ୍ତ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"ଆପଣ ଫୋନଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g>ଥର ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଏହି ଫୋନ୍ ରିସେଟ୍ କରାଯିବ, ଯାହା ଦ୍ୱାରା ଏହାର ସମସ୍ତ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"ଆପଣ ଟାବଲେଟ୍ଟିକୁ ଅନଲକ୍ କରିବା ପାଇଁ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଥର ଭୁଲ ଭାବେ ଚେଷ୍ଟା କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g> ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ୱାର୍କ ପ୍ରୋଫାଇଲ୍କୁ ବାହାର କରିଦିଆଯିବ ଏବଂ ଏହା ଦ୍ୱାରା ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"ଆପଣ ଫୋନଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ଏହି ୟୁଜରଙ୍କୁ ବାହାର କରିଦିଆଯିବ ଏବଂ ଏହାଦ୍ୱାରା ସମସ୍ତ ୟୁଜର୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"ଆପଣ ଟାବଲେଟଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g>ଥର ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଏହି ୟୁଜରଙ୍କୁ ବାହାର କରିଦିଆଯିବ, ଯାହାଦ୍ୱାରା ସମସ୍ତ ୟୁଜର୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"ଆପଣ ଫୋନକୁ ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g> ଥର ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଏହି ୟୁଜରଙ୍କୁ ବାହାର କରିଦିଆଯିବ, ଯାହାଦ୍ୱାରା ସମସ୍ତ ୟୁଜର୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"ଆପଣ ଟାବଲେଟଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ୱାର୍କ ପ୍ରୋଫାଇଲ୍କୁ ବାହାର କରିଦିଆଯିବ ଏବଂ ଏହାଦ୍ୱାରା ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"ଆପଣ ଫୋନଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ୍ ପ୍ରୟାସ ପରେ, ୱାର୍କ ପ୍ରୋଫାଇଲ୍କୁ ବାହାର କରିଦିଆଯିବ ଏବଂ ଏହାଦ୍ୱାରା ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"ଆପଣ ଟାବଲେଟକୁ ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g> ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍ ବାହାର କରିଦିଆଯିବ, ଯାହାଦ୍ୱାରା ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"ଆପଣ ଫୋନଟି ଅନଲକ୍ କରିବାକୁ <xliff:g id="NUMBER">%d</xliff:g>ଥର ଭୁଲ୍ ଭାବେ ପ୍ରୟାସ କରିଛନ୍ତି। ୱର୍କ ପ୍ରୋଫାଇଲ୍ ବାହାର କରିଦିଆଯିବ, ଯାହା ଦ୍ୱାରା ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"ଆପଣଙ୍କ ଅନଲକ୍ ପାଟର୍ନକୁ ଆପଣ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଥର ଭୁଲ ଭାବେ ଅଙ୍କନ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g> ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ନିଜ ଟାବଲେଟକୁ ଅନଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"ଆପଣଙ୍କ ଅନଲକ୍ ପାଟର୍ନକୁ ଆପଣ <xliff:g id="NUMBER_0">%1$d</xliff:g> ଥର ଭୁଲ ଭାବେ ଅଙ୍କନ କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g> ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ନିଜ ଫୋନକୁ ଅନଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"ଭୁଲ SIM PIN କୋଡ୍, ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନଲକ୍ କରିବା ପାଇଁ ଏବେ ହିଁ ନିଜ କେରିଅର୍ଙ୍କ ସହ ସମ୍ପର୍କ କରନ୍ତୁ।"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">ଭୁଲ SIM PIN କୋଡ୍, ଆପଣଙ୍କର ଆଉ <xliff:g id="NUMBER_1">%d</xliff:g>ଟି ପ୍ରୟାସ ବାକି ରହିଛି।</item>
+ <item quantity="one">ଭୁଲ SIM PIN କୋଡ୍, ଡିଭାଇସ୍ ଅନଲକ୍ କରିବା ପାଇଁ କେରିଅରଙ୍କ ସହିତ ଯୋଗାଯୋଗ କରିବା ପୂର୍ବରୁ ଆପଣଙ୍କ ପାଖରେ ଆଉ <xliff:g id="NUMBER_0">%d</xliff:g>ଟି ପ୍ରୟାସ ବାକି ରହିଛି।</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ। ନିଜ କେରିଅର୍ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">ଭୁଲ SIM PUK କୋଡ୍, SIMଟି ଆଉ <xliff:g id="NUMBER_1">%d</xliff:g>ଟି ପ୍ରୟାସ ପରେ ସ୍ଥାୟୀ ଭାବେ ବ୍ୟବହାର କରାଯାଇରିବ ନାହିଁ।</item>
+ <item quantity="one">ଭୁଲ SIM PUK କୋଡ୍, SIMଟି ଆଉ <xliff:g id="NUMBER_0">%d</xliff:g>ଟି ପ୍ରୟାସ ପରେ ସ୍ଥାୟୀ ଭାବେ ବ୍ୟବହାର କରାଯାଇରିବ ନାହିଁ।</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN କାମ ବିଫଳ ହେଲା!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUKର କାମ ବିଫଳ ହେଲା!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"କୋଡ୍ ସ୍ୱୀକାର କରାଗଲା!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"କୌଣସି ସେବା ନାହିଁ।"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ଇନପୁଟ୍ ପଦ୍ଧତି ବଦଳାନ୍ତୁ"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାଟର୍ନ ଆବଶ୍ୟକ ଅଟେ"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ ହେବାପରେ ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ ହେବା ପରେ ପାସୱର୍ଡ ଆବଶ୍ୟକ ଅଟେ"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ପାଟର୍ନ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ PIN ଆବଶ୍ୟକ ଅଟେ"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"ଆପଣ ପ୍ରୋଫାଇଲ୍ ବଦଳାଇବାବେଳେ ପାଟର୍ନ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"ଆପଣ ପ୍ରୋଫାଇଲ୍ ବଦଳାଇବା ବେଳେ PIN ଆବଶ୍ୟକ ଅଟେ"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"ଆପଣ ପ୍ରୋଫାଇଲ୍ ବଦଳାଇବାବେଳେ ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"ଡିଭାଇସ୍ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଲକ୍ କରାଯାଇଛି"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ଡିଭାଇସ୍ ମାନୁଆଲ ଭାବେ ଲକ୍ କରାଗଲା"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇନାହିଁ। ପାଟର୍ନ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇନାହିଁ। ପାଟର୍ନ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇ ନାହିଁ। PIN ନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇ ନାହିଁ। PIN ନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇ ନାହିଁ। ପାସୱର୍ଡ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍ ଅନଲକ୍ କରାଯାଇ ନାହିଁ। ପାସୱର୍ଡ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
+ <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943">
+ <item quantity="other">SIM କାର୍ଡର PIN ଲେଖନ୍ତୁ, ଆପଣ ଆଉ <xliff:g id="NUMBER_1">%d</xliff:g> ଥର ପ୍ରୟାସ କରିପାରିବେ।</item>
+ <item quantity="one">SIM କାର୍ଡର PIN ଲେଖନ୍ତୁ, ଆପଣଙ୍କ ଡିଭାଇସ୍ ଅନଲକ୍ କରିବାକୁ ଆପଣ ଆଉ <xliff:g id="NUMBER_0">%d</xliff:g> ଥର ପ୍ରୟାସ କରିପାରିବେ, ତା\'ପରେ ଆପଣଙ୍କୁ ନିଜ କେରିଅର୍ର ସହିତ ଯୋଗାଯୋଗ କରିବାକୁ ପଡ଼ିବ।</item>
+ </plurals>
+ <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352">
+ <item quantity="other">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_1">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
+ <item quantity="one">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_0">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
+ </plurals>
+</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index e09b584..f17f9fc 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"ਪਾਸਵਰਡ ਟਾਈਪ ਕਰਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਿੰਨ ਟਾਈਪ ਕਰੋ"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"ਆਪਣਾ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"ਆਪਣਾ ਪੈਟਰਨ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ਗਲਤ ਪਿੰਨ ਕੋਡ।"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"ਅਵੈਧ ਕਾਰਡ।"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ਚਾਰਜ ਹੋ ਗਿਆ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index d60ff97..7e3e048 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dotknij, by wpisać hasło"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Wpisz hasło, aby odblokować"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Wpisz kod PIN, aby odblokować"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Wpisz kod PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Narysuj wzór"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Wpisz hasło"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Nieprawidłowy kod PIN."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Nieprawidłowa karta."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Naładowana"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 7d19b14..296dd16 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toque para inserir a senha"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Digite a senha para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Insira o PIN para desbloquear"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Digite seu PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Digite seu padrão"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Digite sua senha"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 7d19b14..296dd16 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toque para inserir a senha"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Digite a senha para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Insira o PIN para desbloquear"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Digite seu PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Digite seu padrão"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Digite sua senha"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index 9a68604..6d2f91d 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Нажмите для ввода пароля"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Введите пароль"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Введите PIN-код для разблокировки"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Введите PIN-код"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Введите графический ключ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Введите пароль"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Неверный PIN-код."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ошибка SIM-карты."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Батарея заряжена"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index b380556..c0642c2 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Додирните за унос лозинке"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Унесите лозинку да бисте откључали"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Унесите PIN за откључавање"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Унесите PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Унесите шаблон"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Унесите лозинку"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN кôд је нетачан."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Неважећа картица."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Напуњена је"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 0bbc470..f679b02 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"கடவுச்சொல்லை உள்ளிட, தொடவும்"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"திறக்க, கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"திறக்க, பின்னை உள்ளிடவும்"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"பின்னை உள்ளிடுக"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"பேட்டர்னை உள்ளிடுக"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"கடவுச்சொல்லை உள்ளிடுக"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"தவறான பின் குறியீடு."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"செல்லாத சிம் கார்டு."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"சார்ஜ் செய்யப்பட்டது"</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index b024c3e..ceb6793 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"పాస్వర్డ్ను టైప్ చేయడానికి తాకండి"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"అన్లాక్ చేయడానికి పాస్వర్డ్ను టైప్ చేయండి"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"అన్లాక్ చేయడానికి పిన్ టైప్ చేయండి"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"మీ పిన్ని నమోదు చేయండి"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"మీ ఆకృతిని నమోదు చేయండి"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"మీ పాస్వర్డ్ను నమోదు చేయండి"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"పిన్ కోడ్ తప్పు."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"చెల్లని కార్డ్."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"ఛార్జ్ చేయబడింది"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 717eda0..5e37ed6 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Pindutin para i-type password"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"I-type ang password upang i-unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"I-type ang PIN upang i-unlock"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Ilagay ang iyong PIN"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Ilagay ang iyong Pattern"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Ilagay ang iyong Password"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Mali ang PIN code."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Di-wasto ang Card."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Tapos nang mag-charge"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 827f78e..a358085 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Торкніться, щоб ввести пароль"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Введіть пароль, щоб розблокувати"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Введіть PIN-код, щоб розблокувати"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Введіть PIN-код"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Введіть ключ"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Введіть пароль"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Неправильний PIN-код."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Недійсна картка."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Заряджено"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 1fcce81..ccda081 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"پاسورڈ ٹائپ کرنے کیلئے ٹچ کریں"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"غیر مقفل کرنے کیلئے پاس ورڈ ٹائپ کریں"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"غیر مقفل کرنے کیلئے PIN ٹائپ کریں"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"اپنا PIN درج کریں"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"اپنا پیٹرن درج کریں"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"اپنا پاس ورڈ درج کریں"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"غلط PIN کوڈ۔"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"غلط کارڈ۔"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"چارج ہوگئی"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 4514eb1..7ef2431 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -29,7 +29,7 @@
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Qulfni ochish uchun parolni kiriting"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Qulfni ochish uchun PIN kodni kiriting"</string>
<string name="keyguard_enter_your_pin" msgid="7152989016739952871">"PIN kodni kiriting"</string>
- <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Grafik kalitni kiriting"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Grafik kalitni chizing"</string>
<string name="keyguard_enter_your_password" msgid="5761514484663983731">"Parolni kiriting"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kodi xato."</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"SIM karta yaroqsiz."</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 1d9732c..c4f1833 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -28,6 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"触摸即可输入密码"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"输入密码即可解锁"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"输入 PIN 码即可解锁"</string>
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"输入您的 PIN 码"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"绘制您的图案"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"输入您的密码"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN 码有误。"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"SIM 卡无效。"</string>
<string name="keyguard_charged" msgid="2222329688813033109">"已充满电"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index b959933..2bf328c 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -28,12 +28,9 @@
<string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Thinta ukuze uthayiphe iphasiwedi"</font></string>
<string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Bhala iphasiwedi ukuze kuvuleke"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Faka i-PIN ukuvula"</string>
- <!-- no translation found for keyguard_enter_your_pin (7152989016739952871) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_pattern (3915717164691787047) -->
- <skip />
- <!-- no translation found for keyguard_enter_your_password (5761514484663983731) -->
- <skip />
+ <string name="keyguard_enter_your_pin" msgid="7152989016739952871">"Faka iPHINIKHODI yakho"</string>
+ <string name="keyguard_enter_your_pattern" msgid="3915717164691787047">"Faka iphethini yakho"</string>
+ <string name="keyguard_enter_your_password" msgid="5761514484663983731">"Faka iphasiwedi yakho"</string>
<string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Ikhodi ye-PIN engalungile!"</string>
<string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ikhadi elingavumelekile."</string>
<string name="keyguard_charged" msgid="2222329688813033109">"Kushajiwe"</string>
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 0615668..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 839e5ed..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 1480c865..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 66e11fb..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index d2fe0c3..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 5923269..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index d0196e5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index d3a2b39..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 726643c..0000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 31078f6..0000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_1x_mobiledata.xml b/packages/SystemUI/res/drawable/ic_1x_mobiledata.xml
index 726d814..c0e0e59 100644
--- a/packages/SystemUI/res/drawable/ic_1x_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_1x_mobiledata.xml
@@ -14,17 +14,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="14dp"
- android:height="24dp"
- android:viewportWidth="14"
- android:viewportHeight="24">
+ android:width="14dp"
+ android:height="17dp"
+ android:viewportWidth="14"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M5.62,16.29H4.58V9.06l-1.79,0.8V8.88l2.67-1.17h0.16V16.29z" />
+ android:pathData="M3.77,13.48H2.55V5.05L0.46,5.98V4.84l3.12-1.36h0.19V13.48z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M11.08,11.02l1.61-3.27h1.26l-2.22,4.23l2.27,4.3h-1.27l-1.64-3.33l-1.65,3.33H8.16l2.28-4.3L8.21,7.75h1.25L11.08,11.02z" />
+ android:pathData="M10.14,7.34l1.87-3.81h1.47L10.9,8.46l2.65,5.02h-1.48l-1.91-3.88l-1.92,3.88H6.74L9.4,8.46l-2.6-4.94h1.46L10.14,7.34z" />
<path
- android:pathData="M 0 0 H 13.99 V 24 H 0 V 0 Z" />
-</vector>
\ No newline at end of file
+ android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_3g_mobiledata.xml b/packages/SystemUI/res/drawable/ic_3g_mobiledata.xml
index 7a539ff..e4a5bf8 100644
--- a/packages/SystemUI/res/drawable/ic_3g_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_3g_mobiledata.xml
@@ -14,17 +14,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="14dp"
- android:height="24dp"
- android:viewportWidth="14"
- android:viewportHeight="24">
+ android:width="14dp"
+ android:height="17dp"
+ android:viewportWidth="14"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M3.83,11.38h0.66c0.43,0,0.75-0.13,0.98-0.39s0.35-0.62,0.35-1.07c0-1-0.39-1.5-1.16-1.5c-0.37,0-0.66,0.13-0.87,0.4 S3.47,9.44,3.47,9.88H2.44c0-0.68,0.21-1.25,0.62-1.69s0.95-0.67,1.6-0.67c0.67,0,1.21,0.21,1.6,0.63s0.59,1.01,0.59,1.78 c0,0.39-0.1,0.76-0.31,1.1s-0.47,0.59-0.8,0.75c0.8,0.3,1.21,0.96,1.21,2c0,0.76-0.21,1.37-0.64,1.82s-0.98,0.68-1.66,0.68 c-0.68,0-1.22-0.21-1.64-0.64s-0.62-1-0.62-1.73h1.04c0,0.45,0.11,0.81,0.33,1.08s0.52,0.4,0.9,0.4c0.39,0,0.69-0.13,0.92-0.39 s0.34-0.66,0.34-1.2c0-1.04-0.49-1.55-1.47-1.55H3.83V11.38z" />
+ android:pathData="M1.9,7.88h0.77c0.5,0,0.88-0.15,1.15-0.46s0.4-0.72,0.4-1.25c0-1.17-0.45-1.75-1.35-1.75c-0.43,0-0.77,0.16-1.02,0.47 S1.49,5.62,1.49,6.13h-1.2c0-0.8,0.24-1.46,0.73-1.97s1.11-0.78,1.86-0.78c0.78,0,1.41,0.25,1.87,0.73S5.43,5.31,5.43,6.2 c0,0.46-0.12,0.89-0.36,1.29S4.52,8.18,4.14,8.37c0.94,0.35,1.41,1.12,1.41,2.33c0,0.89-0.25,1.6-0.74,2.12 c-0.49,0.53-1.14,0.79-1.94,0.79c-0.79,0-1.43-0.25-1.91-0.75c-0.49-0.5-0.73-1.17-0.73-2.01h1.21c0,0.53,0.13,0.95,0.38,1.26 c0.26,0.31,0.6,0.47,1.05,0.47c0.45,0,0.81-0.15,1.08-0.46s0.4-0.77,0.4-1.39c0-1.21-0.57-1.81-1.72-1.81H1.9V7.88z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M14,15.11l-0.19,0.23c-0.54,0.63-1.33,0.94-2.37,0.94c-0.92,0-1.65-0.31-2.17-0.92s-0.79-1.48-0.81-2.59V11.1 c0-1.2,0.24-2.09,0.72-2.69s1.19-0.89,2.15-0.89c0.81,0,1.45,0.23,1.91,0.68s0.71,1.1,0.76,1.94h-1.07 c-0.04-0.53-0.19-0.95-0.44-1.25s-0.63-0.45-1.15-0.45c-0.61,0-1.06,0.2-1.35,0.6s-0.43,1.04-0.45,1.92v1.74 c0,0.86,0.16,1.52,0.49,1.98s0.8,0.69,1.41,0.69c0.58,0,1.02-0.14,1.32-0.42l0.16-0.15v-1.96h-1.56v-0.92H14V15.11z" />
+ android:pathData="M13.77,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 C12.47,5.82,12.3,5.33,12,4.98s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.59,6.37,8.58,7.4v2.03c0,1,0.19,1.77,0.57,2.31 c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59H10.7V8.52h3.07V12.24z" />
<path
- android:pathData="M 0 0 H 14 V 24 H 0 V 0 Z" />
-</vector>
\ No newline at end of file
+ android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_4g_mobiledata.xml b/packages/SystemUI/res/drawable/ic_4g_mobiledata.xml
index b2fab0c8..e98560b 100644
--- a/packages/SystemUI/res/drawable/ic_4g_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_4g_mobiledata.xml
@@ -14,17 +14,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="14dp"
- android:height="24dp"
- android:viewportWidth="14"
- android:viewportHeight="24">
+ android:width="14dp"
+ android:height="17dp"
+ android:viewportWidth="14"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M6.42,13.3h0.95v0.88H6.42v1.98H5.38v-1.98H2.16v-0.64l3.17-5.91h1.09C6.42,7.63,6.42,13.3,6.42,13.3z M3.31,13.3h2.07 V9.25L3.31,13.3z" />
+ android:pathData="M5.07,10.13h1.11v1.03H5.07v2.31H3.86v-2.31H0.1v-0.75l3.7-6.9h1.27V10.13z M1.44,10.13h2.42V5.4L1.44,10.13z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M13.99,15.11l-0.19,0.23c-0.54,0.63-1.33,0.94-2.37,0.94c-0.92,0-1.65-0.31-2.17-0.92s-0.79-1.48-0.8-2.59V11.1 c0-1.2,0.24-2.09,0.72-2.69s1.2-0.89,2.15-0.89c0.81,0,1.45,0.23,1.91,0.68s0.71,1.1,0.76,1.94h-1.07 c-0.04-0.53-0.19-0.95-0.44-1.25s-0.63-0.45-1.14-0.45c-0.61,0-1.06,0.2-1.35,0.6s-0.43,1.04-0.45,1.92v1.74 c0,0.86,0.16,1.52,0.49,1.98s0.8,0.69,1.41,0.69c0.58,0,1.02-0.14,1.32-0.42l0.16-0.15v-1.96h-1.56v-0.92h2.62V15.11z" />
+ android:pathData="M13.9,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 c-0.05-0.62-0.22-1.1-0.52-1.45s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.72,6.37,8.71,7.4v2.03 c0,1,0.19,1.77,0.57,2.31c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59h-1.82V8.52h3.07V12.24z" />
<path
- android:pathData="M 0 0 H 14 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_4g_plus_mobiledata.xml b/packages/SystemUI/res/drawable/ic_4g_plus_mobiledata.xml
index bdbb2df..bf39ea2 100644
--- a/packages/SystemUI/res/drawable/ic_4g_plus_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_4g_plus_mobiledata.xml
@@ -14,20 +14,20 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="20dp"
- android:height="24dp"
- android:viewportWidth="20"
- android:viewportHeight="24">
+ android:width="22dp"
+ android:height="17dp"
+ android:viewportWidth="22"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M6.18,13.3h0.95v0.88H6.18v1.98H5.14v-1.98H1.92v-0.64l3.17-5.91h1.09V13.3z M3.07,13.3h2.07V9.25L3.07,13.3z" />
+ android:pathData="M5.32,10.13h1.11v1.03H5.32v2.31H4.11v-2.31H0.35v-0.75l3.7-6.9h1.27V10.13z M1.69,10.13h2.42V5.4L1.69,10.13z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M13.75,15.11l-0.19,0.23c-0.54,0.63-1.33,0.94-2.37,0.94c-0.92,0-1.65-0.31-2.17-0.92s-0.79-1.48-0.8-2.59V11.1 c0-1.2,0.24-2.09,0.72-2.69s1.2-0.89,2.15-0.89c0.81,0,1.45,0.23,1.91,0.68s0.71,1.1,0.76,1.94h-1.07 c-0.04-0.53-0.19-0.95-0.44-1.25s-0.63-0.45-1.14-0.45c-0.61,0-1.06,0.2-1.35,0.6s-0.43,1.04-0.45,1.92v1.74 c0,0.86,0.16,1.52,0.49,1.98s0.8,0.69,1.41,0.69c0.58,0,1.02-0.14,1.32-0.42l0.16-0.15v-1.96h-1.56v-0.92h2.63V15.11z" />
+ android:pathData="M14.15,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26H12.9 c-0.05-0.62-0.22-1.1-0.52-1.45s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.97,6.37,8.96,7.4v2.03 c0,1,0.19,1.77,0.57,2.31c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59h-1.82V8.52h3.07V12.24z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M 20 9.64 L 18 9.64 L 18 7.64 L 17 7.64 L 17 9.64 L 15 9.64 L 15 10.64 L 17 10.64 L 17 12.64 L 18 12.64 L 18 10.64 L 20 10.64 Z" />
+ android:pathData="M 19.3 5.74 L 19.3 3.39 L 18 3.39 L 18 5.74 L 15.65 5.74 L 15.65 7.04 L 18 7.04 L 18 9.39 L 19.3 9.39 L 19.3 7.04 L 21.65 7.04 L 21.65 5.74 Z" />
<path
- android:pathData="M 0 0 H 20 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 22 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_account_circle.xml b/packages/SystemUI/res/drawable/ic_account_circle.xml
deleted file mode 100644
index 3c5f01b..0000000
--- a/packages/SystemUI/res/drawable/ic_account_circle.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48.0dp"
- android:height="48.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:pathData="M24,0C10.8,0 0,10.8 0,24s10.8,24 24,24s24,-10.8 24,-24S37.200001,0 24,0zM24,7.2c3.96,0 7.2,3.24 7.2,7.2s-3.24,7.2 -7.2,7.2s-7.2,-3.24 -7.2,-7.2S20.040001,7.2 24,7.2zM24,41.279999c-6,0 -11.28,-3.12 -14.4,-7.68c0.12,-4.8 9.6,-7.44 14.4,-7.44s14.28,2.64 14.4,7.44C35.279999,38.16 30,41.279999 24,41.279999z"
- android:fillColor="?attr/wallpaperTextColor"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
index 8281836..6f3da75 100644
--- a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
+++ b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
@@ -18,10 +18,12 @@
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
+
<path
- android:pathData="m18.250000,12.000000a6.250000,6.250000 0.000000,1.000000 1.000000,-12.500000 0.000000,6.250000 6.250000,0.000000 1.000000,1.000000 12.500000,0.000000z"
- android:fillColor="@android:color/transparent" />
+ android:pathData="M18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48z"
+ android:fillColor="?android:attr/colorPrimary" />
+
<path
- android:pathData="M20,8.69L20,5c0,-0.55 -0.45,-1 -1,-1h-3.69l-2.6,-2.6a0.996,0.996 0,0 0,-1.41 0L8.69,4L5,4c-0.55,0 -1,0.45 -1,1v3.69l-2.6,2.6a0.996,0.996 0,0 0,0 1.41L4,15.3L4,19c0,0.55 0.45,1 1,1h3.69l2.6,2.6c0.39,0.39 1.02,0.39 1.41,0l2.6,-2.6L19,20c0.55,0 1,-0.45 1,-1v-3.69l2.6,-2.6a0.996,0.996 0,0 0,0 -1.41L20,8.69zM12,18.08c-3.36,0 -6.08,-2.73 -6.08,-6.08S8.64,5.92 12,5.92s6.08,2.73 6.08,6.08 -2.72,6.08 -6.08,6.08zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"
+ android:pathData=" M20,8.69 V4h-4.69L12,0.69L8.69,4H4v4.69L0.69,12L4,15.31V20h4.69L12,23.31L15.31,20H20v-4.69L23.31,12L20,8.69z M18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48z M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S14.76,7 12,7z"
android:fillColor="?android:attr/colorControlActivated" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_e_mobiledata.xml b/packages/SystemUI/res/drawable/ic_e_mobiledata.xml
index 1a4a2e3..ca601d6 100644
--- a/packages/SystemUI/res/drawable/ic_e_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_e_mobiledata.xml
@@ -14,14 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="7dp"
- android:height="24dp"
- android:viewportWidth="7"
- android:viewportHeight="24">
+ android:width="6dp"
+ android:height="17dp"
+ android:viewportWidth="6"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M6.5,12.32H3.48v3.02H7v0.92H2.41V7.73h4.53v0.92H3.48v2.75H6.5V12.32z" />
+ android:pathData="M5.1,8.88H1.57v3.53h4.1v1.07H0.32V3.52h5.28V4.6H1.57V7.8H5.1V8.88z" />
<path
- android:pathData="M 0 0 H 7 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 6 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_g_mobiledata.xml b/packages/SystemUI/res/drawable/ic_g_mobiledata.xml
index d6a0488..8ff6d7a 100644
--- a/packages/SystemUI/res/drawable/ic_g_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_g_mobiledata.xml
@@ -14,14 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="8dp"
- android:height="24dp"
- android:viewportWidth="8"
- android:viewportHeight="24">
+ android:width="7dp"
+ android:height="17dp"
+ android:viewportWidth="7"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M8,15.21l-0.19,0.23c-0.54,0.63-1.33,0.94-2.37,0.94c-0.92,0-1.65-0.31-2.17-0.92s-0.79-1.48-0.81-2.59V11.2 c0-1.2,0.24-2.09,0.72-2.69s1.19-0.89,2.15-0.89c0.81,0,1.45,0.23,1.91,0.68S7.95,9.39,8,10.23H6.93C6.88,9.7,6.74,9.28,6.49,8.99 S5.85,8.54,5.34,8.54c-0.61,0-1.06,0.2-1.35,0.6s-0.43,1.04-0.45,1.92v1.74c0,0.86,0.16,1.52,0.49,1.98s0.8,0.69,1.41,0.69 c0.58,0,1.02-0.14,1.32-0.42l0.16-0.15v-1.96H5.37v-0.92H8V15.21z" />
+ android:pathData="M6.73,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13S2.5,3.39,3.62,3.39c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26H5.48 c-0.05-0.62-0.22-1.1-0.52-1.45S4.22,4.46,3.62,4.46c-0.72,0-1.24,0.23-1.57,0.7S1.54,6.37,1.53,7.4v2.03c0,1,0.19,1.77,0.57,2.31 c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59H3.66V8.52h3.07V12.24z" />
<path
- android:pathData="M 0 0 H 8 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 7 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_h_mobiledata.xml b/packages/SystemUI/res/drawable/ic_h_mobiledata.xml
index be85bbb..68ea58e 100644
--- a/packages/SystemUI/res/drawable/ic_h_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_h_mobiledata.xml
@@ -14,14 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="8dp"
- android:height="24dp"
- android:viewportWidth="8"
- android:viewportHeight="24">
+ android:width="7dp"
+ android:height="17dp"
+ android:viewportWidth="7"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M8,16.27H6.92v-3.94H3.49v3.94H2.42V7.73h1.07v3.67h3.43V7.73H8V16.27z" />
+ android:pathData="M6.76,13.48H5.5v-4.6H1.49v4.6H0.24V3.52h1.25V7.8H5.5V3.52h1.26V13.48z" />
<path
- android:pathData="M 0 0 H 8 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 7 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_h_plus_mobiledata.xml b/packages/SystemUI/res/drawable/ic_h_plus_mobiledata.xml
index f31f83c..42128002 100644
--- a/packages/SystemUI/res/drawable/ic_h_plus_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_h_plus_mobiledata.xml
@@ -14,17 +14,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="14dp"
- android:height="24dp"
- android:viewportWidth="14"
- android:viewportHeight="24">
+ android:width="15dp"
+ android:height="17dp"
+ android:viewportWidth="15"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M7.64,16.27H6.56v-3.94H3.13v3.94H2.06V7.73h1.07v3.67h3.43V7.73h1.08V16.27z" />
+ android:pathData="M7.01,13.48H5.75v-4.6H1.74v4.6H0.49V3.52h1.25V7.8h4.01V3.52h1.26V13.48z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M 14 9.73 L 12 9.73 L 12 7.73 L 11 7.73 L 11 9.73 L 9 9.73 L 9 10.73 L 11 10.73 L 11 12.73 L 12 12.73 L 12 10.73 L 14 10.73 Z" />
+ android:pathData="M 12.16 5.74 L 12.16 3.39 L 10.86 3.39 L 10.86 5.74 L 8.51 5.74 L 8.51 7.04 L 10.86 7.04 L 10.86 9.39 L 12.16 9.39 L 12.16 7.04 L 14.51 7.04 L 14.51 5.74 Z" />
<path
- android:pathData="M 0 0 H 14 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 15 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lte_mobiledata.xml b/packages/SystemUI/res/drawable/ic_lte_mobiledata.xml
index e45b5e0..7536f51 100644
--- a/packages/SystemUI/res/drawable/ic_lte_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_lte_mobiledata.xml
@@ -14,20 +14,20 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="18dp"
- android:height="24dp"
- android:viewportWidth="18"
- android:viewportHeight="24">
+ android:width="18dp"
+ android:height="17dp"
+ android:viewportWidth="18"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M3.79,15.35h3.35v0.92H2.71V7.73h1.08V15.35z" />
+ android:pathData="M1.34,12.4h3.9v1.07H0.08V3.52h1.26V12.4z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M12.15,8.65H9.91v7.61H8.84V8.65H6.6V7.73h5.55V8.65z" />
+ android:pathData="M11.1,4.6H8.48v8.88H7.23V4.6H4.62V3.52h6.48V4.6z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M17.5,12.32h-3.02v3.02H18v0.92h-4.59V7.73h4.53v0.92h-3.46v2.75h3.02V12.32z" />
+ android:pathData="M17.34,8.88h-3.52v3.53h4.1v1.07h-5.35V3.52h5.28V4.6h-4.03V7.8h3.52V8.88z" />
<path
- android:pathData="M 0 0 H 18 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 18 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lte_plus_mobiledata.xml b/packages/SystemUI/res/drawable/ic_lte_plus_mobiledata.xml
index 553a5bd..302e3bd 100644
--- a/packages/SystemUI/res/drawable/ic_lte_plus_mobiledata.xml
+++ b/packages/SystemUI/res/drawable/ic_lte_plus_mobiledata.xml
@@ -14,23 +14,23 @@
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">
+ android:width="26dp"
+ android:height="17dp"
+ android:viewportWidth="26"
+ android:viewportHeight="17">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M3.91,15.35h3.35v0.92H2.84V7.73h1.08V15.35z" />
+ android:pathData="M1.59,12.4h3.9v1.07H0.33V3.52h1.26V12.4z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M12.28,8.65h-2.24v7.61H8.96V8.65H6.73V7.73h5.55V8.65z" />
+ android:pathData="M11.35,4.6H8.73v8.88H7.48V4.6H4.87V3.52h6.48V4.6z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M17.63,12.32h-3.02v3.02h3.52v0.92h-4.59V7.73h4.53v0.92h-3.46v2.75h3.02V12.32z" />
+ android:pathData="M17.59,8.88h-3.52v3.53h4.1v1.07h-5.35V3.52h5.28V4.6h-4.03V7.8h3.52V8.88z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M 24 9.76 L 22 9.76 L 22 7.76 L 21 7.76 L 21 9.76 L 19 9.76 L 19 10.76 L 21 10.76 L 21 12.76 L 22 12.76 L 22 10.76 L 24 10.76 Z" />
+ android:pathData="M 23.32 5.74 L 23.32 3.39 L 22.02 3.39 L 22.02 5.74 L 19.67 5.74 L 19.67 7.04 L 22.02 7.04 L 22.02 9.39 L 23.32 9.39 L 23.32 7.04 L 25.67 7.04 L 25.67 5.74 Z" />
<path
- android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+ android:pathData="M 0 0 H 26 V 17 H 0 V 0 Z" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
new file mode 100644
index 0000000..1603eba
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1S6.11,6.7 3.5,6L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1L20.5,6zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"
+ android:fillColor="?attr/singleToneColor"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_customizer_background.xml b/packages/SystemUI/res/drawable/qs_customizer_background.xml
index 12d8016..e15a734 100644
--- a/packages/SystemUI/res/drawable/qs_customizer_background.xml
+++ b/packages/SystemUI/res/drawable/qs_customizer_background.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
<transition xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@color/qs_detail_transition" />
- <item android:drawable="?android:attr/colorPrimary" />
+ <item android:drawable="@drawable/qs_customizer_background_transition" />
+ <item android:drawable="@drawable/qs_customizer_background_primary" />
</transition>
diff --git a/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml
new file mode 100644
index 0000000..abe1429
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml
@@ -0,0 +1,21 @@
+<?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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape>
+ <solid android:color="?android:attr/colorPrimary"/>
+ <corners android:radius="?android:attr/dialogCornerRadius" />
+ </shape>
+</inset>
diff --git a/packages/SystemUI/res/drawable/qs_customizer_background_transition.xml b/packages/SystemUI/res/drawable/qs_customizer_background_transition.xml
new file mode 100644
index 0000000..ed8f61a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_customizer_background_transition.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape>
+ <solid android:color="@color/qs_detail_transition"/>
+ <corners android:radius="?android:attr/dialogCornerRadius" />
+ </shape>
+</inset>
diff --git a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
new file mode 100644
index 0000000..557cae1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape>
+ <solid android:color="?android:attr/colorSecondary"/>
+ <corners
+ android:topLeftRadius="?android:attr/dialogCornerRadius"
+ android:topRightRadius="?android:attr/dialogCornerRadius" />
+ </shape>
+</inset>
diff --git a/packages/SystemUI/res/drawable/rounded_full_bg_bottom.xml b/packages/SystemUI/res/drawable/rounded_full_bg_bottom.xml
index c3e36f2..a4b3c99 100644
--- a/packages/SystemUI/res/drawable/rounded_full_bg_bottom.xml
+++ b/packages/SystemUI/res/drawable/rounded_full_bg_bottom.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?android:attr/colorPrimaryDark" />
diff --git a/packages/SystemUI/res/drawable/rounded_ripple.xml b/packages/SystemUI/res/drawable/rounded_ripple.xml
new file mode 100644
index 0000000..5588eb2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/rounded_ripple.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight">
+ <item android:id="@android:id/mask">
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#FFFFFFFF"/>
+ <corners android:radius="8dp"/>
+ </shape>
+ </item>
+ <item android:id="@android:id/background">
+ <shape android:shape="rectangle">
+ <solid android:color="#FFFFFFFF"/>
+ <corners android:radius="8dp"/>
+ </shape>
+ </item>
+</ripple>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/stat_sys_roaming.xml b/packages/SystemUI/res/drawable/stat_sys_roaming.xml
index bd2edf3..0dd9f5a 100644
--- a/packages/SystemUI/res/drawable/stat_sys_roaming.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_roaming.xml
@@ -1,28 +1,27 @@
<!--
-Copyright (C) 2014 The Android Open Source Project
+ 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
+ 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
+ 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.
+ 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="@dimen/signal_icon_size"
android:height="@dimen/signal_icon_size"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M7.8,7.2L9,10H7L5.87,7.33H4V10H2V2h5c1.13,0,2,0.87,2,2v1.33C9,6.13,8.47,6.87,7.8,7.2z M7,4H4v1.33h3V4z" />
- <path
- android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
- <path
- android:pathData="M0,0h24v24H0V0z" />
-</vector>
\ No newline at end of file
+ android:viewportWidth="17"
+ android:viewportHeight="17">
+
+<path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.93,4.81H1.81V7.4H1V1h1.79c0.63,0,1.1,0.16,1.42,0.49S4.7,2.29,4.7,2.92c0,0.4-0.09,0.74-0.26,1.04 C4.26,4.25,4.02,4.48,3.7,4.63l1.24,2.72V7.4H4.07L2.93,4.81z M1.81,4.12h0.98c0.34,0,0.61-0.11,0.81-0.33 c0.2-0.22,0.3-0.51,0.3-0.87c0-0.82-0.37-1.23-1.12-1.23H1.81V4.12z" />
+<path
+ android:pathData="M 0 0 H 17 V 17 H 0 V 0 Z" />
+</vector>
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
index 6f153c1..78304fd 100644
--- a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
@@ -41,16 +41,4 @@
</FrameLayout>
- <com.android.systemui.statusbar.policy.DeadZone
- android:id="@+id/deadzone"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:layout_gravity="top"
- systemui:minSize="@dimen/navigation_bar_deadzone_size"
- systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
- systemui:holdTime="@integer/navigation_bar_deadzone_hold"
- systemui:decayTime="@integer/navigation_bar_deadzone_decay"
- systemui:orientation="horizontal"
- />
-
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/car_facet_button.xml b/packages/SystemUI/res/layout/car_facet_button.xml
index f432d36..ad86049 100644
--- a/packages/SystemUI/res/layout/car_facet_button.xml
+++ b/packages/SystemUI/res/layout/car_facet_button.xml
@@ -42,6 +42,7 @@
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:animateLayoutChanges="true"
+ android:src="@drawable/car_ic_arrow"
android:background="@android:color/transparent"
android:scaleType="fitCenter">
</com.android.keyguard.AlphaOptimizedImageButton>
diff --git a/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
new file mode 100644
index 0000000..a65ff16
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@drawable/system_bar_background">
+
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/nav_buttons"
+ android:orientation="vertical"
+ android:gravity="top"
+ android:paddingTop="30dp"
+ android:layout_weight="1"
+ android:background="@drawable/system_bar_background"
+ android:animateLayoutChanges="true">
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/home"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+ android:src="@drawable/car_ic_overview"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingTop="30dp"
+ android:paddingBottom="30dp"
+ />
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/hvac"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
+ systemui:broadcast="true"
+ android:src="@drawable/car_ic_hvac"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingTop="30dp"
+ android:paddingBottom="30dp"
+ />
+ </LinearLayout>
+</com.android.systemui.statusbar.car.CarNavigationBarView>
diff --git a/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml
new file mode 100644
index 0000000..b0488ae
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@drawable/system_bar_background">
+
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:orientation="horizontal"
+ android:id="@+id/nav_buttons"
+ android:gravity="left"
+ android:paddingLeft="30dp"
+ android:layout_weight="1"
+ android:animateLayoutChanges="true">
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/home"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+ android:src="@drawable/car_ic_overview"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingLeft="30dp"
+ android:paddingRight="30dp"
+ />
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/hvac"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
+ systemui:broadcast="true"
+ android:src="@drawable/car_ic_hvac"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingLeft="30dp"
+ android:paddingRight="30dp"
+ />
+ </LinearLayout>
+</com.android.systemui.statusbar.car.CarNavigationBarView>
+
diff --git a/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
new file mode 100644
index 0000000..a65ff16
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@drawable/system_bar_background">
+
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/nav_buttons"
+ android:orientation="vertical"
+ android:gravity="top"
+ android:paddingTop="30dp"
+ android:layout_weight="1"
+ android:background="@drawable/system_bar_background"
+ android:animateLayoutChanges="true">
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/home"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+ android:src="@drawable/car_ic_overview"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingTop="30dp"
+ android:paddingBottom="30dp"
+ />
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/hvac"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
+ systemui:broadcast="true"
+ android:src="@drawable/car_ic_hvac"
+ android:background="?android:attr/selectableItemBackground"
+ android:paddingTop="30dp"
+ android:paddingBottom="30dp"
+ />
+ </LinearLayout>
+</com.android.systemui.statusbar.car.CarNavigationBarView>
diff --git a/packages/SystemUI/res/layout/car_status_bar_header.xml b/packages/SystemUI/res/layout/car_status_bar_header.xml
index 158907e..f2ef301 100644
--- a/packages/SystemUI/res/layout/car_status_bar_header.xml
+++ b/packages/SystemUI/res/layout/car_status_bar_header.xml
@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<!-- Extends RelativeLayout -->
+<!-- Extends LinearLayout -->
<com.android.systemui.qs.car.CarStatusBarHeader
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
@@ -23,22 +23,21 @@
android:paddingStart="8dp"
android:paddingEnd="8dp" >
- <include
- layout="@layout/system_icons"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true" />
+ <include layout="@layout/system_icons"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical|end"
+ android:layout_weight="1"
+ />
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
android:singleLine="true"
android:paddingStart="@dimen/status_bar_clock_starting_padding"
android:paddingEnd="@dimen/status_bar_clock_end_padding"
- systemui:showDark="false" />
+ android:gravity="center_vertical|end"
+ />
</com.android.systemui.qs.car.CarStatusBarHeader>
diff --git a/packages/SystemUI/res/layout/car_top_navigation_bar.xml b/packages/SystemUI/res/layout/car_top_navigation_bar.xml
new file mode 100644
index 0000000..e16014b
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_top_navigation_bar.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+** Copyright 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.
+*/
+-->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@drawable/system_bar_background">
+
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:paddingStart="@dimen/status_bar_clock_starting_padding"
+ android:paddingEnd="@dimen/status_bar_clock_end_padding"
+ android:gravity="center_vertical"
+ />
+
+</com.android.systemui.statusbar.car.CarNavigationBarView>
+
diff --git a/packages/SystemUI/res/layout/car_volume_dialog.xml b/packages/SystemUI/res/layout/car_volume_dialog.xml
index dca50a5..94cc001 100644
--- a/packages/SystemUI/res/layout/car_volume_dialog.xml
+++ b/packages/SystemUI/res/layout/car_volume_dialog.xml
@@ -24,7 +24,7 @@
android:clipChildren="false" >
<LinearLayout
android:id="@+id/volume_dialog"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
android:orientation="vertical"
@@ -38,7 +38,7 @@
android:orientation="vertical"
android:clipChildren="false"
android:clipToPadding="false"
- android:elevation="@dimen/volume_panel_elevation" >
+ android:elevation="@dimen/volume_dialog_elevation" >
<LinearLayout
android:id="@+id/car_volume_dialog_rows"
android:layout_width="match_parent"
@@ -53,14 +53,15 @@
android:layout_width="wrap_content"
android:layout_height="@dimen/car_single_line_list_item_height"
android:gravity="center"
- android:layout_marginEnd="@dimen/car_keyline_1">
- <ImageButton
+ android:layout_marginEnd="@dimen/car_keyline_1"
+ android:layout_gravity="end">
+ <com.android.keyguard.AlphaOptimizedImageButton
android:id="@+id/expand"
android:layout_gravity="center"
android:layout_width="@dimen/car_primary_icon_size"
android:layout_height="@dimen/car_primary_icon_size"
- android:layout_marginEnd="@dimen/car_keyline_1"
android:src="@drawable/car_ic_arrow_drop_up"
+ android:background="?android:attr/selectableItemBackground"
android:tint="@color/car_tint"
android:scaleType="fitCenter"
/>
diff --git a/packages/SystemUI/res/layout/car_volume_dialog_row.xml b/packages/SystemUI/res/layout/car_volume_dialog_row.xml
index 14baf49..33cecfa 100644
--- a/packages/SystemUI/res/layout/car_volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/car_volume_dialog_row.xml
@@ -33,13 +33,14 @@
android:layout_width="@dimen/car_primary_icon_size"
android:layout_height="@dimen/car_primary_icon_size"
android:layout_marginStart="@dimen/car_keyline_1"
+ android:background="?android:attr/selectableItemBackground"
android:tint="@color/car_tint"
android:scaleType="fitCenter"
android:soundEffectsEnabled="false" />
<SeekBar
android:id="@+id/volume_row_slider"
android:clickable="true"
- android:layout_marginStart="@dimen/car_keyline_3"
+ android:layout_marginStart="@dimen/car_keyline_1_keyline_3_diff"
android:layout_marginEnd="@dimen/car_keyline_3"
android:layout_width="match_parent"
android:layout_height="@dimen/car_single_line_list_item_height"/>
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index cc6e3bf..5ecd380 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -50,7 +50,8 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
- android:paddingEnd="1dp"
+ android:paddingStart="1dp"
+ android:paddingEnd="2dp"
android:visibility="gone" />
<Space
android:id="@+id/mobile_roaming_space"
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index 3e60794..953abc7 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -46,16 +46,4 @@
</com.android.systemui.statusbar.phone.NearestTouchFrame>
- <com.android.systemui.statusbar.policy.DeadZone
- android:id="@+id/deadzone"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:layout_gravity="top"
- systemui:minSize="@dimen/navigation_bar_deadzone_size"
- systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
- systemui:holdTime="@integer/navigation_bar_deadzone_hold"
- systemui:decayTime="@integer/navigation_bar_deadzone_decay"
- systemui:orientation="horizontal"
- />
-
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 39cdff4..0e17e5b5 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -46,16 +46,4 @@
</com.android.systemui.statusbar.phone.NearestTouchFrame>
- <com.android.systemui.statusbar.policy.DeadZone
- android:id="@+id/deadzone"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:layout_gravity="top"
- systemui:minSize="@dimen/navigation_bar_deadzone_size"
- systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
- systemui:holdTime="@integer/navigation_bar_deadzone_hold"
- systemui:decayTime="@integer/navigation_bar_deadzone_decay"
- systemui:orientation="vertical"
- />
-
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/qs_customize_divider.xml b/packages/SystemUI/res/layout/qs_customize_divider.xml
index 71ad85b..51febc7 100644
--- a/packages/SystemUI/res/layout/qs_customize_divider.xml
+++ b/packages/SystemUI/res/layout/qs_customize_divider.xml
@@ -20,9 +20,8 @@
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:gravity="center"
android:paddingTop="20dp"
- android:paddingStart="16dp"
- android:paddingEnd="8dp"
android:paddingBottom="13dp"
android:textAppearance="@android:style/TextAppearance.Material.Body2"
android:textColor="?android:attr/colorAccent"
diff --git a/packages/SystemUI/res/layout/qs_customize_panel.xml b/packages/SystemUI/res/layout/qs_customize_panel.xml
index b3b6a0c..506e6c8 100644
--- a/packages/SystemUI/res/layout/qs_customize_panel.xml
+++ b/packages/SystemUI/res/layout/qs_customize_panel.xml
@@ -22,7 +22,6 @@
android:layout_height="0dp"
android:elevation="4dp"
android:orientation="vertical"
- android:background="@drawable/qs_customizer_background"
android:gravity="center_horizontal">
</com.android.systemui.qs.customize.QSCustomizer>
diff --git a/packages/SystemUI/res/layout/qs_customize_panel_content.xml b/packages/SystemUI/res/layout/qs_customize_panel_content.xml
index 04d0e65..d70a37a 100644
--- a/packages/SystemUI/res/layout/qs_customize_panel_content.xml
+++ b/packages/SystemUI/res/layout/qs_customize_panel_content.xml
@@ -15,24 +15,44 @@
limitations under the License.
-->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <Toolbar
- android:id="@*android:id/action_bar"
+<merge xmlns:android="http://schemas.android.com/apk/res/android">->
+ <View
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="28dp"
- android:navigationContentDescription="@*android:string/action_bar_up_description"
- style="?android:attr/toolbarStyle" />
+ android:layout_height="@*android:dimen/quick_qs_offset_height"
+ android:background="@android:color/transparent" />
- <android.support.v7.widget.RecyclerView
- android:id="@android:id/list"
+ <com.android.keyguard.AlphaOptimizedLinearLayout
+ android:id="@+id/customize_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
- android:scrollIndicators="top"
- android:scrollbars="vertical"
- android:importantForAccessibility="no" />
+ android:layout_marginLeft="@dimen/notification_side_paddings"
+ android:layout_marginRight="@dimen/notification_side_paddings"
+ android:orientation="vertical"
+ android:background="@drawable/qs_customizer_background">
+ <Toolbar
+ android:id="@*android:id/action_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/qs_customizer_toolbar"
+ android:navigationContentDescription="@*android:string/action_bar_up_description"
+ style="?android:attr/toolbarStyle" />
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:paddingTop="28dp"
+ android:paddingLeft="@dimen/qs_tile_layout_margin_side"
+ android:paddingRight="@dimen/qs_tile_layout_margin_side"
+ android:paddingBottom="28dp"
+ android:clipToPadding="false"
+ android:scrollIndicators="top"
+ android:scrollbars="vertical"
+ android:scrollbarStyle="outsideOverlay"
+ android:importantForAccessibility="no" />
+ </com.android.keyguard.AlphaOptimizedLinearLayout>
<View
android:id="@+id/nav_bar_background"
diff --git a/packages/SystemUI/res/layout/qs_customize_tile_frame.xml b/packages/SystemUI/res/layout/qs_customize_tile_frame.xml
index ff55f99..a2250b1 100644
--- a/packages/SystemUI/res/layout/qs_customize_tile_frame.xml
+++ b/packages/SystemUI/res/layout/qs_customize_tile_frame.xml
@@ -17,9 +17,8 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/qs_tile_height"
android:layout_width="match_parent"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:paddingTop="8dp"
+ android:layout_marginTop="@dimen/qs_tile_margin_top_bottom"
+ android:layout_marginBottom="@dimen/qs_tile_margin_top_bottom"
android:gravity="center" />
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index ea1ad2d1..ef18725 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -22,6 +22,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/qs_footer_height"
android:elevation="4dp"
+ android:background="@android:color/transparent"
android:baselineAligned="false"
android:clickable="false"
android:clipChildren="false"
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 1c9ce18..8c57ae8 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -56,9 +56,11 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/qs_footer_height"
android:elevation="4dp"
+ android:background="@android:color/transparent"
+ android:focusable="true"
+ android:accessibilityTraversalBefore="@id/qs_carrier_text"
/>
-
<include layout="@layout/quick_status_bar_expanded_header" />
<include layout="@layout/qs_footer_impl" />
diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml
index b138df0..74c22b0 100644
--- a/packages/SystemUI/res/layout/qs_tile_label.xml
+++ b/packages/SystemUI/res/layout/qs_tile_label.xml
@@ -44,7 +44,7 @@
android:maxLines="2"
android:padding="0dp"
android:gravity="center"
- android:ellipsize="end"
+ android:ellipsize="marquee"
android:textAppearance="@style/TextAppearance.QS.TileLabel"
android:textColor="?android:attr/textColorPrimary"/>
@@ -75,6 +75,7 @@
android:layout_alignEnd="@id/label_group"
android:layout_below="@id/label_group"
android:clickable="false"
+ android:ellipsize="marquee"
android:maxLines="1"
android:padding="0dp"
android:visibility="gone"
diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
index cd3271f..c03f25c 100644
--- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml
+++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
@@ -21,7 +21,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="14dp"
android:layout_below="@id/quick_status_bar_system_icons"
- >
+ android:paddingEnd="@dimen/signal_cluster_battery_padding" >
<com.android.systemui.statusbar.phone.StatusIconContainer
android:id="@+id/statusIcons"
@@ -29,9 +29,4 @@
android:layout_height="match_parent"
android:layout_weight="1" />
- <include layout="@layout/signal_cluster_view"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginStart="@dimen/signal_cluster_margin_start" />
-
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml
index 7ec437c..5229f9b 100644
--- a/packages/SystemUI/res/layout/quick_settings_header_info.xml
+++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml
@@ -33,7 +33,7 @@
android:visibility="invisible" />
<LinearLayout
- android:id="@+id/next_alarm"
+ android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
@@ -41,6 +41,29 @@
android:visibility="invisible">
<ImageView
+ android:id="@+id/ringer_mode_icon"
+ android:layout_width="@dimen/qs_header_alarm_icon_size"
+ android:layout_height="@dimen/qs_header_alarm_icon_size"
+ android:tint="?android:attr/textColorPrimary" />
+
+ <TextView
+ android:id="@+id/ringer_mode_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
+ android:textAppearance="@style/TextAppearance.QS.TileLabel" />
+
+ <View
+ android:id="@+id/status_separator"
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
+ android:background="@android:color/white"
+ android:backgroundTint="?android:attr/textColorPrimary" />
+
+ <ImageView
+ android:id="@+id/next_alarm_icon"
android:layout_width="@dimen/qs_header_alarm_icon_size"
android:layout_height="@dimen/qs_header_alarm_icon_size"
android:src="@drawable/stat_sys_alarm"
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index ca8fcba..ed18dc7 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -22,6 +22,7 @@
android:layout_width="match_parent"
android:layout_height="@*android:dimen/quick_qs_total_height"
android:layout_gravity="@integer/notification_panel_layout_gravity"
+ android:background="@android:color/transparent"
android:baselineAligned="false"
android:clickable="false"
android:clipChildren="false"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 9d336e2..f0138a6 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -60,7 +60,11 @@
<include layout="@layout/heads_up_status_bar_layout" />
+ <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the
+ individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and
+ DISABLE_NOTIFICATION_ICONS, respectively -->
<LinearLayout
+ android:id="@+id/status_bar_left_side"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:clipChildren="false"
@@ -76,8 +80,6 @@
android:gravity="center_vertical|start"
/>
- <!-- The alpha of this area is controlled from both PhoneStatusBarTransitions and
- PhoneStatusBar (DISABLE_NOTIFICATION_ICONS). -->
<com.android.systemui.statusbar.AlphaOptimizedFrameLayout
android:id="@+id/notification_icon_area"
android:layout_width="0dp"
diff --git a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
new file mode 100644
index 0000000..d607c8c
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+<com.android.systemui.statusbar.StatusBarMobileView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/mobile_combo"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:orientation="horizontal">
+ <FrameLayout
+ android:id="@+id/inout_container"
+ android:layout_height="17dp"
+ android:layout_width="wrap_content"
+ android:layout_gravity="center_vertical">
+ <ImageView
+ android:id="@+id/mobile_in"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/ic_activity_down"
+ android:visibility="gone"
+ android:paddingEnd="2dp"
+ />
+ <ImageView
+ android:id="@+id/mobile_out"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/ic_activity_up"
+ android:paddingEnd="2dp"
+ android:visibility="gone"
+ />
+ </FrameLayout>
+ <ImageView
+ android:id="@+id/mobile_type"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:paddingEnd="1dp"
+ android:visibility="gone" />
+ <Space
+ android:id="@+id/mobile_roaming_space"
+ android:layout_height="match_parent"
+ android:layout_width="@dimen/roaming_icon_start_padding"
+ android:visibility="gone"
+ />
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+ <com.android.systemui.statusbar.AnimatedImageView
+ android:id="@+id/mobile_signal"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ systemui:hasOverlappingRendering="false"
+ />
+ <ImageView
+ android:id="@+id/mobile_roaming"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/stat_sys_roaming"
+ android:contentDescription="@string/data_connection_roaming"
+ android:visibility="gone" />
+ </FrameLayout>
+</com.android.systemui.statusbar.StatusBarMobileView>
+
diff --git a/packages/SystemUI/res/layout/status_bar_notification_dismiss_all.xml b/packages/SystemUI/res/layout/status_bar_notification_dismiss_all.xml
deleted file mode 100644
index 8dc4cb4..0000000
--- a/packages/SystemUI/res/layout/status_bar_notification_dismiss_all.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
- ~ 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
- -->
-
-<!-- Extends Framelayout -->
-<com.android.systemui.statusbar.DismissView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingEnd="8dp"
- android:visibility="gone">
- <com.android.systemui.statusbar.DismissViewButton
- style="@android:style/Widget.Material.Button.Borderless"
- android:id="@+id/dismiss_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:focusable="true"
- android:contentDescription="@string/accessibility_clear_all"
- android:text="@string/clear_all_notifications_text"
- android:textColor="?attr/wallpaperTextColor"
- android:textAllCaps="true"/>
-</com.android.systemui.statusbar.DismissView>
diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer.xml b/packages/SystemUI/res/layout/status_bar_notification_footer.xml
new file mode 100644
index 0000000..22f1618
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_notification_footer.xml
@@ -0,0 +1,49 @@
+<!--
+ ~ 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
+ -->
+
+<!-- Extends Framelayout -->
+<com.android.systemui.statusbar.FooterView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="8dp"
+ android:visibility="gone">
+ <FrameLayout
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+ <com.android.systemui.statusbar.FooterViewButton
+ style="@android:style/Widget.Material.Button.Borderless"
+ android:id="@+id/manage_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start"
+ android:focusable="true"
+ android:text="@string/manage_notifications_text"
+ android:textColor="?attr/wallpaperTextColor"
+ android:textAllCaps="false"/>
+ <com.android.systemui.statusbar.FooterViewButton
+ style="@android:style/Widget.Material.Button.Borderless"
+ android:id="@+id/dismiss_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end"
+ android:focusable="true"
+ android:contentDescription="@string/accessibility_clear_all"
+ android:text="@string/clear_all_notifications_text"
+ android:textColor="?attr/wallpaperTextColor"/>
+ </FrameLayout>
+</com.android.systemui.statusbar.FooterView>
diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml
index 2e7ab7f..f15ca9e 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_row.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml
@@ -55,19 +55,6 @@
android:paddingStart="8dp"
/>
- <!-- TODO: remove -->
- <ImageButton
- android:id="@+id/helper"
- android:layout_width="48dp"
- android:layout_height="@*android:dimen/notification_header_height"
- android:layout_gravity="top|end"
- android:layout_marginEnd="6dp"
- android:src="@drawable/ic_dnd"
- android:tint="#FF0000"
- android:background="@drawable/ripple_drawable"
- android:visibility="visible"
- />
-
<ViewStub
android:layout="@layout/notification_children_container"
android:id="@+id/child_container_stub"
diff --git a/packages/SystemUI/res/layout/status_bar_wifi_group.xml b/packages/SystemUI/res/layout/status_bar_wifi_group.xml
new file mode 100644
index 0000000..08cef55
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_wifi_group.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+<com.android.systemui.statusbar.StatusBarWifiView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/wifi_combo"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingStart="4dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal" >
+
+ <FrameLayout
+ android:id="@+id/inout_container"
+ android:layout_height="17dp"
+ android:layout_width="wrap_content"
+ android:gravity="center_vertical" >
+ <ImageView
+ android:id="@+id/wifi_in"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/ic_activity_down"
+ android:visibility="gone"
+ android:paddingEnd="2dp"
+ />
+ <ImageView
+ android:id="@+id/wifi_out"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/ic_activity_up"
+ android:paddingEnd="2dp"
+ android:visibility="gone"
+ />
+ </FrameLayout>
+ <FrameLayout
+ android:id="@+id/wifi_combo"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:gravity="center_vertical" >
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:theme="?attr/lightIconTheme"
+ android:id="@+id/wifi_signal"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content" />
+ </FrameLayout>
+
+ <View
+ android:id="@+id/wifi_signal_spacer"
+ android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone" />
+
+ <!-- Looks like CarStatusBar uses this... -->
+ <ViewStub
+ android:id="@+id/connected_device_signals_stub"
+ android:layout="@layout/connected_device_signal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <View
+ android:id="@+id/wifi_airplane_spacer"
+ android:layout_width="@dimen/status_bar_airplane_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone"
+ />
+</com.android.systemui.statusbar.StatusBarWifiView>
diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml
index 1fafb2f..258b82a 100644
--- a/packages/SystemUI/res/layout/system_icons.xml
+++ b/packages/SystemUI/res/layout/system_icons.xml
@@ -24,14 +24,10 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
+ android:paddingEnd="4dp"
android:gravity="center_vertical"
android:orientation="horizontal"/>
- <include layout="@layout/signal_cluster_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/signal_cluster_margin_start"/>
-
<com.android.systemui.BatteryMeterView android:id="@+id/battery"
android:layout_height="match_parent"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index 0a3f4eb..d4fe1c6 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -17,9 +17,11 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:padding="@dimen/volume_dialog_panel_transparent_padding"
android:background="@android:color/transparent"
android:theme="@style/qs_theme"
- android:clipChildren="false" >
+ android:clipChildren="false"
+ android:clipToPadding="false">
<!-- right-aligned to be physically near volume button -->
<LinearLayout
android:id="@+id/volume_dialog"
@@ -30,22 +32,25 @@
android:background="@android:color/transparent"
android:layout_margin="@dimen/volume_dialog_base_margin"
android:orientation="vertical"
- android:clipChildren="false" >
+ android:clipChildren="false"
+ android:clipToPadding="false" >
<FrameLayout
android:id="@+id/ringer"
android:layout_width="@dimen/volume_dialog_ringer_size"
android:layout_height="@dimen/volume_dialog_ringer_size"
android:layout_marginBottom="@dimen/volume_dialog_spacer"
- android:elevation="@dimen/volume_panel_elevation"
+ android:translationZ="@dimen/volume_dialog_elevation"
android:layout_gravity="right"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:background="@drawable/rounded_bg_full">
<com.android.keyguard.AlphaOptimizedImageButton
android:id="@+id/ringer_icon"
style="@style/VolumeButtons"
- android:background="?android:selectableItemBackgroundBorderless"
- android:layout_width="@dimen/volume_dialog_tap_target_size"
- android:layout_height="@dimen/volume_dialog_tap_target_size"
+ android:background="@drawable/rounded_ripple"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:tint="@color/accent_tint_color_selector"
android:layout_gravity="center"
android:soundEffectsEnabled="false" />
@@ -59,10 +64,10 @@
android:minWidth="@dimen/volume_dialog_panel_width"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:translationZ="@dimen/volume_dialog_elevation"
android:clipChildren="false"
android:clipToPadding="false"
- android:background="@drawable/rounded_bg_full"
- android:elevation="@dimen/volume_panel_elevation" >
+ android:background="@drawable/rounded_bg_full" >
<LinearLayout
android:id="@+id/volume_dialog_rows"
android:layout_width="wrap_content"
@@ -84,7 +89,7 @@
android:layout_height="@dimen/volume_dialog_tap_target_size"
android:layout_gravity="center"
android:contentDescription="@string/accessibility_volume_settings"
- android:background="?android:selectableItemBackgroundBorderless"
+ android:background="@drawable/ripple_drawable_20dp"
android:tint="?android:attr/colorControlNormal"
android:soundEffectsEnabled="false" />
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml
index bcc3692..6128da8 100644
--- a/packages/SystemUI/res/layout/volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_row.xml
@@ -60,7 +60,7 @@
style="@style/VolumeButtons"
android:layout_width="@dimen/volume_dialog_tap_target_size"
android:layout_height="@dimen/volume_dialog_tap_target_size"
- android:background="?android:selectableItemBackgroundBorderless"
+ android:background="@drawable/ripple_drawable_20dp"
android:layout_marginBottom="@dimen/volume_dialog_row_margin_bottom"
android:tint="@color/accent_tint_color_selector"
android:soundEffectsEnabled="false" />
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 214af1e..792b642 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Voortdurend"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Kennisgewings"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is amper pap"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is amper pap. Skakel Batterybespaarder aan"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> oor"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> oor; ongeveer <xliff:g id="TIME">%s</xliff:g> oor op grond van jou gebruik"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> oor; ongeveer <xliff:g id="TIME">%s</xliff:g> oor"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skermkiekie"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Stoor tans skermkiekie..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Stoor tans skermkiekie..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Skermkiekie word tans gestoor"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skermkiekie is gestoor"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tik om jou skermkiekie te bekyk"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Kon nie skermkiekie neem nie"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Kon nie skermkiekie stoor nie"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Kon nie skermkiekie stoor nie"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Probeer weer skermkiekie neem"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kan weens beperkte bergingspasie nie skermkiekie stoor nie"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Die program of jou organisasie laat nie toe dat skermkiekies geneem word nie"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-lêeroordrag-opsies"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan by sonsondergang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot sonsopkoms"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is gedeaktiveer"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is geaktiveer"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sal alles begin vasvang wat op jou skerm gewys word."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Moenie weer wys nie"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Vee alles uit"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Moenie Steur Nie versteek tans kennisgewings"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Bestuur kennisgewings"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Moenie Steur Nie versteek tans kennisgewings"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Begin nou"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Geen kennisgewings nie"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profiel kan gemonitor word"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om op vibreer te stel."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te demp."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volumekontroles"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Oproepe en kennisgewings sal lui"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Foonoproep-uitvoer"</string>
<string name="output_none_found" msgid="5544982839808921091">"Geen toestelle gekry nie"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kennisgewingkontroles"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"kennisgewing-sluimeropsies"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Sluimer"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ONTDOEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Sluimer vir <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Horlosie"</string>
<string name="headset" msgid="4534219457597457353">"Kopstuk"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Oorfone is gekoppel"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Kopstuk is gekoppel"</string>
<string name="data_saver" msgid="5037565123367048522">"Databespaarder"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skermkiekies"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Algemene boodskappe"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Berging"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Wenke"</string>
<string name="instant_apps" msgid="6647570248119804907">"Kitsprogramme"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Kitsprogramme hoef nie geïnstalleer te word nie."</string>
<string name="app_info" msgid="6856026610594615344">"Programinligting"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Laat <xliff:g id="APP">%1$s</xliff:g> toe om skyfies uit enige program te gebruik"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Laat toe"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Weier"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tik om Batterybespaarder te skeduleer"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Skakel outomaties aan wanneer battery by <xliff:g id="PERCENTAGE">%d</xliff:g>%% is"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nee, dankie"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Batterybespaarder-skedule is aangeskakel"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batterybespaarder sal outomaties aanskakel wanneer battery onder <xliff:g id="PERCENTAGE">%d</xliff:g>%% is."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Het dit"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 306e418..c3006889 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"በመካሄድ ላይ ያለ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ማሳወቂያዎች"</string>
<string name="battery_low_title" msgid="6456385927409742437">"የባትሪ ኃይል አነስተኛ ነው"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ባትሪ ዝቅተኛ ነው። የባትሪ ቆጣቢን ያብሩ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ይቀራል"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ይቀራል፣ በእርስዎ አጠቃቀም ላይ በመመረት <xliff:g id="TIME">%s</xliff:g> ገደማ ይቀራል"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ይቀራል፣ <xliff:g id="TIME">%s</xliff:g> ገደማ ይቀራል"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> ይቀራል። ባትሪ ቆጣቢ በርቷል።"</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"በዩኤስቢ በኩል ኃይል መሙላት አይቻልም። ከመሣሪያዎ ጋር የመጣውን ኃይል መሙያ ይጠቀሙ።"</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"በዩኤስቢ በኩል ኃይል መሙላት አይቻልም"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"ከእርስዎ መሣሪያ ጋር የመጣውን ኃይል መሙያ ይጠቀሙ"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ቅንብሮች"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"ባትሪ ቆጣቢ ይብራ?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"አብራ"</string>
@@ -76,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ቅጽበታዊ ገጽ እይታ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ቅጽበታዊ ገጽ እይታ እየተቀመጠ ነው"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ቅጽበታዊ ገጽ እይታ ተቀምጧል"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"የእርስዎን ቅጽበታዊ ገጽ እይታ ለማየት መታ ያድርጉ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ቅጽበታዊ ገጽ እይታን ማንሳት አልተቻለም"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ቅጽበታዊ ገጽ ዕይታን በማስቀመጥ ላይ ሳለ ችግር አጋጥሟል"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"ቅጽበታዊ ገጽ ዕይታን ማስቀመጥ አልተቻለም"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ቅጽበታዊ ገጽ ዕይታን እንደገና ማንሳት ይሞክሩ"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ባለው ውሱን የማከማቻ ቦታ ምክንያት ቅጽበታዊ ገጽ ዕይታን ማስቀመጥ አይችልም"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"የUSB ፋይል ሰደዳ አማራጮች"</string>
@@ -151,7 +146,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"ተገናኝቷል።"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"በማገናኘት ላይ።"</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"ጂፒአርኤስ"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"ኤችኤስፒኤ"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3ጂ"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5ጂ"</string>
@@ -211,8 +205,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"የአውሮፕላን ሁነታ በርቷል።"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"የአውሮፕላን ሁነታ ጠፍቷል።"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"የአውሮፕላን ሁነታ በርቷል።"</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"አትረብሽ በርቷል።"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"አትረብሽ በርቷል፣ ሙሉ ለሙሉ ጸጥታ።"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"አትረብሽ በርቷል፣ ማንቂያዎች ብቻ።"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"አትረብሽ።"</string>
@@ -278,7 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"የማወራረጃ ምግቦች መያዣ"</string>
<string name="start_dreams" msgid="5640361424498338327">"የማያ ገጽ ማቆያ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ኤተርኔት"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"ለተጨማሪ አማራጮች አዶዎቹ ላይ ተጭነው ይያዟቸው"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ተጨማሪ አማራጮችን ለማግኘት አዶዎችን ነክተው ይያዙ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"አትረብሽ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ቅድሚያ የሚሰጠው ብቻ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ማንቂያዎች ብቻ"</string>
@@ -353,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ጸሐይ ስትጠልቅ ይበራል"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ጸሐይ እስክትወጣ ድረስ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ላይ ይበራል"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"ኤንኤፍሲ"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"ኤንኤፍሲ ተሰናክሏል"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"ኤንኤፍሲ ነቅቷል"</string>
@@ -437,8 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በማያ ገጽዎ ላይ የታየውን ነገር በሙሉ ማንሳት ይጀምራል።"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ዳግመኛ አታሳይ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ሁሉንም አጽዳ"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"ማሳወቂያዎችን ያስተዳድሩ"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"አሁን ጀምር"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ምንም ማሳወቂያ የለም"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"መገለጫ ክትትል ሊደረግበት ይችላል"</string>
@@ -544,9 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ።"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ።"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s የድምፅ መቆጣጠሪያዎች"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ጥሪዎች እና ማሳወቂያዎች ይነዝራሉ"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ጥሪዎች እና ማሳወቂያዎች ድምፀ-ከል ይሆናሉ"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ጥሪዎች እና ማሳወቂያዎች ይደውላሉ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"የሚዲያ ውጽዓት"</string>
<string name="output_calls_title" msgid="8717692905017206161">"የስልክ ጥሪ ውፅዓት"</string>
<string name="output_none_found" msgid="5544982839808921091">"ምንም መሣሪያዎች አልተገኙም"</string>
@@ -633,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"የማሳወቂያ መቆጣጠሪያዎች"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"የማሳወቂያ ማሸለቢያ አማራጮች"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"አሸልብ"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ቀልብስ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ለ<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> አሸልቧል"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -696,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"ባትሪ"</string>
<string name="clock" msgid="7416090374234785905">"ሰዓት"</string>
<string name="headset" msgid="4534219457597457353">"ጆሮ ማዳመጫ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"የጆር ማዳመጫዎች ተገናኝተዋል"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"የጆሮ ማዳመጫ ተገናኝቷል"</string>
<string name="data_saver" msgid="5037565123367048522">"ውሂብ ቆጣቢ"</string>
@@ -730,8 +725,9 @@
<string name="right_keycode" msgid="708447961000848163">"የቀኝ ቁልፍ ኮድ"</string>
<string name="left_icon" msgid="3096287125959387541">"የግራ አዶ"</string>
<string name="right_icon" msgid="3952104823293824311">"የቀኝ አዶ"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"ሰቆችን ለማከል ይጎትቱ"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ፋይሎችን ለማከል ይዘት ይጎትቱ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ለማስወገድ ወደዚህ ይጎትቱ"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"ቢያንስ 6 ሰቆች ያስፈልገዎታል"</string>
<string name="qs_edit" msgid="2232596095725105230">"አርትዕ"</string>
<string name="tuner_time" msgid="6572217313285536011">"ሰዓት"</string>
<string-array name="clock_options">
@@ -818,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ቅጽበታዊ ገጽ እይታዎች"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"አጠቃላይ መልዕክቶች"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ማከማቻ"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"ፍንጮች"</string>
<string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string>
<string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string>
@@ -835,7 +832,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"ተካ"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"በጀርባ ውስጥ የሚያሄዱ መተግበሪያዎች"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"በባትሪ እና ውሂብ አጠቃቀም ላይ ዝርዝሮችን ለማግኘት መታ ያድርጉ"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"በ<xliff:g id="CARRIER">%s</xliff:g> በኩል የውሂብ ወይም የበይነመረቡ መዳረሻ አይኖረዎትም። በይነመረብ በWi-Fi በኩል ብቻ ነው የሚገኝ የሚሆነው።"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"የእርስዎ አገልግሎት አቅራቢ"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"አንድ መተግበሪያ የፍቃድ ጥያቄ እያገደ ስለሆነ ቅንብሮች ጥያቄዎን ማረጋገጥ አይችሉም።"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን እንዲያሳይ ይፈቀድለት?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ከ<xliff:g id="APP">%1$s</xliff:g> የመጣ መረጃን ማንበብ ይችላል"</string>
@@ -843,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> ከማንኛውም መተግበሪያ የመጡ ቁራጮችን እንዲያሳይ ፍቀድለት"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ፍቀድ"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ከልክል"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"ለባትሪ ቆጣቢ መርሐግብርን ለማስያዝ መታ ያድርጉ"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"ባትሪ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ላይ ሲሆን በራስ-ሰር ያብሩ"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"አይ፣ አመሰግናለሁ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"የባትሪ ቆጣቢ መርሐግብር በርቷል"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"ባትሪ ልክ ከ<xliff:g id="PERCENTAGE">%d</xliff:g>%% በታች ሲሆን ባትሪ ቆጣቢ በራስ-ሰር ይበራል።"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"ቅንብሮች"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"ገባኝ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 611753a..fbbe502 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -37,17 +37,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"الإشعارات"</string>
<string name="battery_low_title" msgid="6456385927409742437">"البطارية منخفضة"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"طاقة البطارية منخفضة، لذا يُرجى تفعيل الوضع \"توفير شحن البطارية\"."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"متبقي <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"طاقة البطارية المتبقية <xliff:g id="PERCENTAGE">%s</xliff:g> ويتبقى على نفادها <xliff:g id="TIME">%s</xliff:g> تقريبًا بناءً على استخدامك."</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"طاقة البطارية المتبقية <xliff:g id="PERCENTAGE">%s</xliff:g> ويتبقى على نفادها <xliff:g id="TIME">%s</xliff:g> تقريبًا."</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"يتبقى <xliff:g id="PERCENTAGE">%s</xliff:g>. تم تفعيل ميزة توفير شحن البطارية."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"يتعذّر الشحن باستخدام USB. استخدم الشاحن المرفق بجهازك."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"يتعذّر الشحن باستخدام USB."</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"استخدم الشاحن المرفق بجهازك."</string>
<string name="battery_low_why" msgid="4553600287639198111">"الإعدادات"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"هل تريد تفعيل ميزة توفير شحن البطارية؟"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"تشغيل"</string>
@@ -80,11 +76,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"لقطة شاشة"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"جارٍ حفظ لقطة الشاشة..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"جارٍ حفظ لقطة الشاشة..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"جارٍ حفظ لقطة الشاشة."</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"تم حفظ لقطة الشاشة."</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"انقر لعرض لقطة الشاشة."</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"تعذَّر الحصول على لقطة شاشة"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"حدثت مشكلة أثناء حفظ لقطة الشاشة."</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"تعذّر حفظ لقطة الشاشة"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"جرّب أخذ لقطة الشاشة مرة أخرى"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"يتعذر حفظ لقطة الشاشة لأن مساحة التخزين المتاحة محدودة."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"يحظر التطبيق أو تحظر مؤسستك التقاط لقطات شاشة"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"خيارات نقل الملفات عبر USB"</string>
@@ -155,7 +150,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"متصل."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"جارٍ الاتصال."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"شبكة GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"شبكة الجيل الثالث"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"شبكة 3.5G"</string>
@@ -215,8 +209,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"تشغيل وضع الطائرة."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"تم إيقاف وضع الطائرة."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"تم تشغيل وضع الطائرة."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"وضع الرجاء عدم الإزعاج مفعّل"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"تم تشغيل \"عدم الإزعاج، كتم الصوت تمامًا\"."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"تم تشغيل \"عدم الإزعاج، التنبيهات فقط\"."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"عدم الإزعاج."</string>
@@ -286,7 +279,7 @@
<string name="dessert_case" msgid="1295161776223959221">"حالة الحلويات"</string>
<string name="start_dreams" msgid="5640361424498338327">"شاشة التوقف"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"اضغط مع الاستمرار على الرموز لمزيد من الخيارات"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"انقر مع الاستمرار على الرموز للحصول على المزيد من الخيارات."</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"عدم الإزعاج"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"الأولوية فقط"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"التنبيهات فقط"</string>
@@ -365,7 +358,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"تفعيل عند غروب الشمس"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"حتى شروق الشمس"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"تفعيل الإعداد في <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"حتى <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"حتى <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"الاتصال القريب المدى (NFC)"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"تم تعطيل الاتصال القريب المدى"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"تم تمكين الاتصال القريب المدى"</string>
@@ -449,8 +442,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> سيبدأ التقاط كل شيء يتم عرضه على الشاشة."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"عدم الإظهار مرة أخرى"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"محو الكل"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"إدارة الإشعارات"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"يؤدي تفعيل وضع الرجاء عدم الإزعاج إلى إخفاء الإشعارات."</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"البدء الآن"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ليس هناك أي اشعارات"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ربما تتم مراقبة الملف الشخصي"</string>
@@ -556,9 +549,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. انقر للتعيين على الاهتزاز."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. انقر لكتم الصوت."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s عنصر للتحكم في مستوى الصوت"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقي المكالمات والإشعارات"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"سيصدِر الهاتف رنينًا عند تلقي المكالمات والإشعارات"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"إخراج الوسائط"</string>
<string name="output_calls_title" msgid="8717692905017206161">"إخراج المكالمة الهاتفية"</string>
<string name="output_none_found" msgid="5544982839808921091">"لم يتم العثور على أي أجهزة."</string>
@@ -653,6 +645,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"عناصر التحكم في الإشعارات"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"خيارات تأجيل الإشعارات"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"تأجيل"</string>
<string name="snooze_undo" msgid="6074877317002985129">"تراجع"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"تم تأجيل الإشعار لمدة <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -724,6 +717,8 @@
<string name="battery" msgid="7498329822413202973">"البطارية"</string>
<string name="clock" msgid="7416090374234785905">"الساعة"</string>
<string name="headset" msgid="4534219457597457353">"سماعة الرأس"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"تم توصيل سماعات رأس"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"تم توصيل سماعات رأس"</string>
<string name="data_saver" msgid="5037565123367048522">"توفير البيانات"</string>
@@ -758,8 +753,9 @@
<string name="right_keycode" msgid="708447961000848163">"رمز مفتاح اليمين"</string>
<string name="left_icon" msgid="3096287125959387541">"رمز اليسار"</string>
<string name="right_icon" msgid="3952104823293824311">"رمز اليمين"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"اسحب لإضافة مربعات"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"انقر باستمرار مع السحب لإضافة المربعات."</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"اسحب هنا للإزالة"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"تحتاج إلى 6 مربعات على الأقل."</string>
<string name="qs_edit" msgid="2232596095725105230">"تعديل"</string>
<string name="tuner_time" msgid="6572217313285536011">"الوقت"</string>
<string-array name="clock_options">
@@ -846,6 +842,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"لقطات الشاشة"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"رسائل عامة"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"سعة التخزين"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"تلميحات"</string>
<string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string>
<string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string>
@@ -863,7 +860,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"استبدال"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"التطبيقات التي تعمل في الخلفية"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"انقر للحصول على تفاصيل حول البطارية واستخدام البيانات"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"هل تريد إيقاف تشغيل بيانات الجوال؟"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"هل تريد إيقاف بيانات الجوّال؟"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"لن تتمكّن من الدخول إلى البيانات أو الإنترنت من خلال <xliff:g id="CARRIER">%s</xliff:g>. ولن يتوفر اتصال الإنترنت إلا عبر Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"مشغّل شبكة الجوّال"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"لا يمكن للإعدادات التحقق من ردك لأن هناك تطبيقًا يحجب طلب الإذن."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"هل تريد السماح لتطبيق <xliff:g id="APP_0">%1$s</xliff:g> بعرض شرائح <xliff:g id="APP_2">%2$s</xliff:g>؟"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- يستطيع قراءة المعلومات من <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -871,4 +870,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"السماح لتطبيق <xliff:g id="APP">%1$s</xliff:g> بعرض شرائح من أي تطبيق"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"سماح"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"رفض"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"انقر لجدولة \"توفير شحن البطارية\"."</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"يمكنك تفعيل الميزة تلقائيًا عندما تصل نسبة شحن البطارية إلى <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"لا، شكرًا"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"تم تفعيل جدولة \"توفير شحن البطارية\"."</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"سيتم تفعيل ميزة \"توفير شحن البطارية\" عندما تنخفض البطارية عن <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"الإعدادات"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"حسنًا"</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 0076927..39f9e09 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলিত"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"জাননীসমূহ"</string>
<string name="battery_low_title" msgid="6456385927409742437">"বেটাৰি কম আছে"</string>
- <!-- no translation found for battery_low_title_hybrid (6268991275887381595) -->
- <skip />
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে"</string>
- <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) -->
- <skip />
- <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) -->
- <skip />
+ <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> অৱশিষ্ট আছে, আপোনাৰ ব্যৱহাৰক ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%s</xliff:g> বাকী আছে"</string>
+ <string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> অৱশিষ্ট আছে, প্ৰায় <xliff:g id="TIME">%s</xliff:g> বাকী"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে। বেটাৰি সঞ্চয়কাৰী অন হৈ আছে।"</string>
- <string name="invalid_charger" msgid="4549105996740522523">"ইউএছবি চ্চার্জিং কৰিব পৰা নাযাব।\nআপোনাৰ ফ\'নৰ লগত দিয়া চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
- <string name="invalid_charger_title" msgid="3515740382572798460">"ইউএছবি চ্চার্জিং সমৰ্থিত নহয়।"</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"কেৱল যোগান ধৰা চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
+ <string name="invalid_charger" msgid="2741987096648693172">"ইউএছবি জৰিয়তে চ্চাৰ্জ কৰিব নোৱাৰি। আপোনাৰ ডিভাইচৰ লগত পোৱা চ্চাৰ্জাৰটো ব্যৱহাৰ কৰক।"</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"ইউএছবি জৰিয়তে চ্চাৰ্জ কৰিব নোৱাৰি"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"আপোনাৰ ডিভাইচৰ লগত পোৱা চ্চাৰ্জাৰটো ব্যৱহাৰ কৰক।"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ছেটিংসমূহ"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"বেটাৰি সঞ্চয়কাৰী অন কৰেনে?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"অন কৰক"</string>
@@ -69,27 +65,20 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string>
- <!-- no translation found for usb_debugging_secondary_user_title (6353808721761220421) -->
- <skip />
+ <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string>
- <!-- no translation found for global_action_screenshot (8329831278085426283) -->
- <skip />
+ <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string>
- <!-- no translation found for screenshot_saving_text (2545047868936087248) -->
+ <string name="screenshot_saved_title" msgid="5637073968117370753">"স্ক্ৰীণশ্বট ছেভ কৰা হ\'ল"</string>
+ <string name="screenshot_saved_text" msgid="7574667448002050363">"আপোনাৰ স্ক্ৰীণশ্বট চাবলৈ টিপক"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
<skip />
- <!-- no translation found for screenshot_saved_title (5637073968117370753) -->
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
<skip />
- <!-- no translation found for screenshot_saved_text (7574667448002050363) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (9096484883063264803) -->
- <skip />
- <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) -->
- <skip />
- <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) -->
- <skip />
+ <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"সঞ্চয়াগাৰত সীমিত খালী ঠাই থকাৰ বাবে স্ক্ৰীণশ্বট ছেভ কৰিব পৰা নগ\'ল"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"ইউএছবিৰে ফাইল স্থানান্তৰণৰ বিকল্পসমূহ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"মিডিয়া প্লেয়াৰ (এমটিপি) হিচাপে সংলগ্ন কৰক"</string>
@@ -99,33 +88,25 @@
<string name="accessibility_home" msgid="8217216074895377641">"গৃহ পৃষ্ঠাৰ বুটাম"</string>
<string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string>
<string name="accessibility_accessibility_button" msgid="7601252764577607915">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string>
- <!-- no translation found for accessibility_rotate_button (7402949513740253006) -->
- <skip />
+ <string name="accessibility_rotate_button" msgid="7402949513740253006">"স্ক্ৰীণ ঘূৰাওক"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"অৱলোকন"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"সন্ধান কৰক"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"কেমেৰা"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ফ\'ন"</string>
- <!-- no translation found for accessibility_voice_assist_button (487611083884852965) -->
- <skip />
+ <string name="accessibility_voice_assist_button" msgid="487611083884852965">"কণ্ঠধ্বনিৰে সহায়"</string>
<string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক কৰক"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="4808860050517462885">"ফিংগাৰপ্ৰিণ্টৰ বাবে ৰৈ থকা হৈছে"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ নকৰাকৈ আনলক কৰক"</string>
<string name="unlock_label" msgid="8779712358041029439">"আনলক কৰক"</string>
<string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string>
- <!-- no translation found for voice_assist_label (3956854378310019854) -->
- <skip />
+ <string name="voice_assist_label" msgid="3956854378310019854">"কণ্ঠধ্বনিৰে সহায় খোলক"</string>
<string name="camera_label" msgid="7261107956054836961">"কেমেৰা খোলক"</string>
- <!-- no translation found for recents_caption_resize (3517056471774958200) -->
- <skip />
+ <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কাৰ্যৰ চানেকি বাছনি কৰক"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"এপ্লিকেশ্বন আইকন"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"উপযোগিতা অনুসৰি জুম কৰা বুটাম।"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"স্ক্ৰীণৰ আকাৰ ডাঙৰ কৰিবলৈ জুম কৰক।"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযোগ হ\'ল।"</string>
@@ -153,10 +134,8 @@
<string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXৰ দুডাল দণ্ড আছে।"</string>
<string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAXৰ তিনিডাল দণ্ড আছে।"</string>
<string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAXৰ ছিগনেল পূৰা আছে৷"</string>
- <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) -->
- <skip />
- <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) -->
- <skip />
+ <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string>
+ <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"ইথাৰনেট সংযোগ হৈছে।"</string>
<string name="accessibility_no_signal" msgid="7064645320782585167">"কোনো ছিগনেল নাই।"</string>
<string name="accessibility_not_connected" msgid="6395326276213402883">"সংযোগ হৈ থকা নাই।"</string>
<string name="accessibility_zero_bars" msgid="3806060224467027887">"এডালো দণ্ড নাই।"</string>
@@ -168,29 +147,28 @@
<string name="accessibility_desc_off" msgid="6475508157786853157">"অফ।"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"সংযোগ কৰা হ’ল।"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"সংযোগ কৰি থকা হৈছে।"</string>
- <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"জিপিআৰএছ"</string>
- <string name="accessibility_data_connection_1x" msgid="994133468120244018">"১ X"</string>
- <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
- <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
- <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
- <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"এলটিই"</string>
- <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
- <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
- <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ৰ\'মিং"</string>
- <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="data_connection_gprs" msgid="7652872568358508452">"জিপিআৰএছ"</string>
+ <string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
+ <string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
+ <string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
+ <string name="data_connection_3_5g_plus" msgid="7570783890290275297">"3.5G+"</string>
+ <string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
+ <string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
+ <string name="data_connection_lte" msgid="2694876797724028614">"এলটিই"</string>
+ <string name="data_connection_lte_plus" msgid="3423013208570937424">"এলটিই+"</string>
+ <string name="data_connection_cdma" msgid="4677985502159869585">"CDMA"</string>
+ <string name="data_connection_roaming" msgid="6037232010953697354">"ৰ\'মিং"</string>
+ <string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ৱাই-ফাই"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ছিম নাই।"</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"ম\'বাইল ডেটা"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"ম\'বাইল ডেটা অন অৱস্থাত আছে"</string>
- <string name="accessibility_cell_data_off" msgid="443267573897409704">"ম\'বাইল ডেটা অফ অৱস্থাত আছে"</string>
+ <string name="cell_data_off" msgid="5287705247512911922">"ম\'বাইল ডেটা অফ হৈ আছে"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টেডাৰিং।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"এয়াৰপ্লেইন ম\'ড।"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"ভিপিএন অন অৱস্থাত আছে।"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"কোনো ছিম কাৰ্ড নাই"</string>
- <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
- <skip />
+ <string name="carrier_network_change_mode" msgid="8149202439957837762">"বাহক নেটৱৰ্কৰ পৰিৱৰ্তন"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"বেটাৰিৰ বিৱৰণসমূহ খোলক"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string>
<string name="accessibility_battery_level_charging" msgid="1147587904439319646">"বেটাৰি চ্চাৰ্জ কৰি থকা হৈছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ।"</string>
@@ -209,8 +187,7 @@
<skip />
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ক আঁতৰাব।"</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> আঁতৰোৱা হৈছে৷"</string>
- <!-- no translation found for accessibility_recents_all_items_dismissed (4464697366179168836) -->
- <skip />
+ <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"শেহতীয়া সকলো এপ্লিকেশ্বন অগ্ৰাহ্য কৰা হৈছে।"</string>
<string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> এপ্লিকেশ্বনৰ তথ্য় খোলক।"</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰা হৈছে।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string>
@@ -220,8 +197,7 @@
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ছেটিংসমূহ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"অৱলোকন।"</string>
<string name="accessibility_desc_work_lock" msgid="4288774420752813383">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীণ"</string>
- <!-- no translation found for accessibility_desc_close (7479755364962766729) -->
- <skip />
+ <string name="accessibility_desc_close" msgid="7479755364962766729">"বন্ধ কৰক"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ৱাই-ফাই অফ কৰা হ\'ল।"</string>
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ৱাই-ফাই অন কৰা হ\'ল।"</string>
@@ -231,19 +207,13 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"এয়াৰপ্লেইন ম\'ড অন হৈ আছে৷"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"এয়াৰপ্লেইন ম\'ড অফ কৰা হ\'ল।"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"এয়াৰপ্লেইন ম\'ড অন কৰা হ\'ল।"</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (1448402297221249355) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_dnd_none_on (6882582132662613537) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_dnd_alarms_on (9152834845587554157) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"অসুবিধা নিদিব অন হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"অসুবিধা নিদিব অন হৈ আছে, সম্পূর্ণ নিৰৱতা।"</string>
+ <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"অসুবিধা নিদিব অন হৈ আছে, মাত্ৰ এলাৰ্মসমূহ বাজিব।"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"অসুবিধা নিদিব।"</string>
- <!-- no translation found for accessibility_quick_settings_dnd_off (2371832603753738581) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_dnd_changed_off (898107593453022935) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_dnd_changed_on (4483780856613561039) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"অসুবিধা নিদিব বন্ধ হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"অসুবিধা নিদিব বন্ধ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"অসুবিধা নিদিব অন কৰা হৈছে।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"ব্লুটুথ।"</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ব্লুটুথ অফ হৈ আছে।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ব্লুটুথ অন হৈ আছে।"</string>
@@ -277,16 +247,12 @@
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ডেটা সঞ্চয়কাৰী সুবিধা অন কৰা হ\'ল।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ডিছপ্লেৰ উজ্জ্বলতা"</string>
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"চ্চার্জ কৰি থকা হৈছে"</string>
- <!-- no translation found for data_usage_disabled_dialog_3g_title (5281770593459841889) -->
- <skip />
- <!-- no translation found for data_usage_disabled_dialog_4g_title (1601769736881078016) -->
- <skip />
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ডেটা পজ কৰা হৈছে"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ডেটা পজ কৰা হৈছে"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ম\'বাইল ডেটা পজ কৰা হৈছে"</string>
- <!-- no translation found for data_usage_disabled_dialog_title (3932437232199671967) -->
- <skip />
+ <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ডেটা পজ কৰা হৈছে"</string>
<string name="data_usage_disabled_dialog" msgid="4919541636934603816">"আপুনি নির্ধাৰণ কৰা ডেটাৰ সীমা শেষ হৈছে। আপুনি এতিয়া ম\'বাইল ডেটা ব্যৱহাৰ কৰিব নোৱাৰে। \n\nযদিহে আপুনি আকৌ ম\'বাইল ডেটা ব্যৱহাৰ কৰে তেন্তে ডেটাৰ ব্যৱহাৰৰ বাবে মাচুল ভৰিবলগীয়া হ\'ব পাৰে।"</string>
- <!-- no translation found for data_usage_disabled_dialog_enable (1412395410306390593) -->
- <skip />
+ <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"পুনৰ আৰম্ভ কৰক"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"জিপিএছ সন্ধান কৰি থকা হৈছে"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"জিপিএছএ অৱস্থান ছেট কৰিছে"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"অৱস্থানৰ অনুৰোধ সক্ৰিয় হৈ আছে"</string>
@@ -307,30 +273,20 @@
<string name="dessert_case" msgid="1295161776223959221">"মিষ্টান্ন ভাণ্ডাৰ"</string>
<string name="start_dreams" msgid="5640361424498338327">"স্ক্ৰীণ ছেভাৰ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ইথাৰনেট"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
- <!-- no translation found for quick_settings_dnd_label (8735855737575028208) -->
- <skip />
- <!-- no translation found for quick_settings_dnd_priority_label (483232950670692036) -->
- <skip />
- <!-- no translation found for quick_settings_dnd_alarms_label (2559229444312445858) -->
- <skip />
- <!-- no translation found for quick_settings_dnd_none_label (5025477807123029478) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"অধিক বিকল্পৰ বাবে আইকনসমূহ স্পৰ্শ কৰি হেঁচি ধৰক"</string>
+ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"অসুবিধা নিদিব"</string>
+ <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"কেৱল গুৰুত্বপূৰ্ণ"</string>
+ <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"কেৱল এলাৰ্মসমূহ"</string>
+ <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"সম্পূর্ণ নিৰৱতা"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ব্লুটুথ"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ব্লুটুথ (<xliff:g id="NUMBER">%d</xliff:g>টা ডিভাইচ)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ব্লুটুথ বন্ধ অৱস্থাত আছে"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"বেটাৰি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
+ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিঅ’"</string>
+ <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডছেট"</string>
+ <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"অন কৰি থকা হৈছে…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীণ"</string>
@@ -354,12 +310,9 @@
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"নেটৱৰ্ক নাই"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ৱাই-ফাই অফ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ৱাই-ফাই অন হৈ আছে"</string>
- <!-- no translation found for quick_settings_wifi_detail_empty_text (269990350383909226) -->
- <skip />
- <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
- <skip />
- <!-- no translation found for quick_settings_cast_title (7709016546426454729) -->
- <skip />
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ৱাই-ফাই নেটৱৰ্ক নাই"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"অন কৰি থকা হৈছে…"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাষ্ট"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"কাষ্টিং"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নাম নথকা ডিভাইচ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাষ্টৰ বাবে সাজু"</string>
@@ -375,9 +328,12 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"সংযোগ কৰি থকা হৈছে..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেডাৰ কৰি থকা হৈছে"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"অন কৰি থকা হৈছে…"</string>
+ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="5672131949987422420">"ডেটা সঞ্চয়কাৰী অন হৈ আছে"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d ডিভাইচ</item>
+ <item quantity="other">%d ডিভাইচ</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"জাননীসমূহ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্লাশ্বলাইট"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ম\'বাইল ডেটা"</string>
@@ -387,16 +343,12 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যৱহৃত"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সীমা"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সকীয়নি"</string>
- <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
- <skip />
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"ৰাতিৰ লাইট"</string>
- <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
- <skip />
- <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
- <skip />
- <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) -->
- <skip />
- <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) -->
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"সূৰ্যাস্তত অন কৰক"</string>
+ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"সূৰ্যোদয়ৰ লৈকে"</string>
+ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ত অন কৰক"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
<skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
@@ -410,12 +362,9 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>টো সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল।"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"সকলো মচক"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভাজিত স্ক্ৰীণ ব্য়ৱহাৰ কৰিবলৈ ইয়ালৈ টানি আনি এৰক"</string>
- <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) -->
- <skip />
- <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) -->
- <skip />
- <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) -->
- <skip />
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"আনুভূমিকভাৱে বিভাজিত কৰক"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উলম্বভাৱে বিভাজিত কৰক"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"উপযোগিতা অনুসৰি বিভাজিত কৰক"</string>
<string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"স্ক্ৰীণখনক ওপৰফাললৈ ভাগ কৰক"</string>
<string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"স্ক্ৰীণখনক বাওঁফাললৈ ভাগ কৰক"</string>
<string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"স্ক্ৰীণখনক সোঁফাললৈ ভাগ কৰক"</string>
@@ -429,8 +378,7 @@
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে বাওঁফাললৈ শ্লাইড কৰক।"</string>
<string name="zen_priority_introduction" msgid="1149025108714420281">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string>
<string name="zen_alarms_introduction" msgid="4934328096749380201">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্মৰ বাহিৰে আন কোনো ধ্বনি আৰু কম্পনৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string>
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"নিজৰ উপযোগিতা অনুসৰি"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"এই কার্যই এলার্ম, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি সকলোৰে বাবে ধ্বনি আৰু কম্পন অৱৰোধ কৰিব। আপুনি ফ\'ন কল তথাপি কৰিবলৈ সক্ষম হ\'ব।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"এই কার্যই এলার্ম, মিউজিক, ভিডিঅ\' আৰু গেইমকে ধৰি সকলোৰে ধ্বনি আৰু কম্পন অৱৰোধ কৰে।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
@@ -439,31 +387,19 @@
<string name="keyguard_unlock" msgid="8043466894212841998">"আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string>
<string name="do_disclosure_with_name" msgid="5640615509915445501">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string>
- <!-- no translation found for phone_hint (4872890986869209950) -->
- <skip />
- <!-- no translation found for voice_hint (8939888732119726665) -->
- <skip />
- <!-- no translation found for camera_hint (7939688436797157483) -->
- <skip />
+ <string name="phone_hint" msgid="4872890986869209950">"ফ\'নৰ বাবে আইকনৰপৰা ছোৱাইপ কৰক"</string>
+ <string name="voice_hint" msgid="8939888732119726665">"কণ্ঠধ্বনিৰে সহায়ৰ বাবে আইকনৰ পৰা ছোৱাইপ কৰক"</string>
+ <string name="camera_hint" msgid="7939688436797157483">"কেমেৰা খুলিবলৈ আইকনৰপৰা ছোৱাইপ কৰক"</string>
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"সম্পূর্ণ নিৰৱতা। এই কার্যই স্ক্ৰীণ ৰীডাৰসমূহকো নিৰৱ কৰিব।"</string>
- <!-- no translation found for interruption_level_none (6000083681244492992) -->
- <skip />
- <!-- no translation found for interruption_level_priority (6426766465363855505) -->
- <skip />
- <!-- no translation found for interruption_level_alarms (5226306993448328896) -->
- <skip />
- <!-- no translation found for interruption_level_none_twoline (3957581548190765889) -->
- <skip />
- <!-- no translation found for interruption_level_priority_twoline (1564715335217164124) -->
- <skip />
- <!-- no translation found for interruption_level_alarms_twoline (3266909566410106146) -->
- <skip />
- <!-- no translation found for keyguard_indication_charging_time (2056340799276374421) -->
- <skip />
- <!-- no translation found for keyguard_indication_charging_time_fast (7767562163577492332) -->
- <skip />
- <!-- no translation found for keyguard_indication_charging_time_slowly (3769655133567307069) -->
- <skip />
+ <string name="interruption_level_none" msgid="6000083681244492992">"সম্পূর্ণ নিৰৱতা"</string>
+ <string name="interruption_level_priority" msgid="6426766465363855505">"কেৱল গুৰুত্বপূৰ্ণ"</string>
+ <string name="interruption_level_alarms" msgid="5226306993448328896">"কেৱল এলাৰ্মসমূহ"</string>
+ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"সম্পূর্ণ \n নিৰৱতা"</string>
+ <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"কেৱল\nগুৰুত্বপূৰ্ণ"</string>
+ <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"কেৱল\nএলাৰ্মসমূহ"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চ্চাৰ্জ কৰি থকা হৈছে (সম্পূৰ্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> বাকী)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • দ্ৰুতগতিৰে চ্চাৰ্জ কৰি থকা হৈছে (সম্পূৰ্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> বাকী)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • লাহে লাহে চ্চাৰ্জ কৰি থকা হৈছে (সম্পূৰ্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> বাকী)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ব্যৱহাৰকাৰী সলনি কৰক"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ব্যৱহাৰকাৰী সলনি কৰক, বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"বর্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -480,11 +416,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"আকৌ আৰম্ভ কৰক"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হয়, অব্যাহত ৰাখক"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"অতিথি ব্য়ৱহাৰকাৰী"</string>
<string name="guest_notification_text" msgid="335747957734796689">"এপসমূহ আৰু ডেটা মচিবলৈ অতিথি ব্যৱহাৰকাৰীক আঁতৰাওক"</string>
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"অতিথি আঁতৰাওক"</string>
<string name="user_logout_notification_title" msgid="1453960926437240727">"ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
<string name="user_logout_notification_text" msgid="3350262809611876284">"বর্তমানৰ ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"ব্যৱহাৰকাৰীক লগ আউট কৰক"</string>
@@ -499,6 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা সকলো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> কেপশ্বাৰ কৰা আৰম্ভ কৰিব।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"পুনৰাই নেদেখুৱাব"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"সকলো মচক"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"এতিয়াই আৰম্ভ কৰক"</string>
<string name="empty_shade_text" msgid="708135716272867002">"কোনো জাননী নাই"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"প্ৰ\'ফাইল নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
@@ -549,11 +487,9 @@
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"বিশ্বাসী পৰিচয়-পত্ৰসমূহ খোলক"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।\n\nএই সম্পৰ্কে অধিক জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
- <!-- no translation found for monitoring_description_vpn (4445150119515393526) -->
- <skip />
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"আপুনি এটা এপক ভিপিএন সংযোগ ছেট আপ কৰিবলৈ অনুমতি দিছে। \n\n এই এপটোৱে ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি আপোনাৰ নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
<string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>য়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল পৰিচালনা কৰে।\n\nআপোনাৰ প্ৰশাসকে ইমেইল, এপসমূহ আৰু আপুনি চোৱা ৱেবছাইটকে ধৰি আপোনাৰ নেটৱৰ্কৰ সকলো কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে। \n\nঅধিক তথ্যৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।\n\nইয়াৰ উপৰি, আপুনি এটা ভিপিএনৰ সৈতে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ নেটৱৰ্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
- <!-- no translation found for legacy_vpn_name (6604123105765737830) -->
- <skip />
+ <string name="legacy_vpn_name" msgid="6604123105765737830">"ভিপিএন"</string>
<string name="monitoring_description_app" msgid="1828472472674709532">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
<string name="monitoring_description_app_personal" msgid="484599052118316268">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে, যি ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে ধৰি আপোনাৰ ব্যক্তিগত নেটৱর্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰে।"</string>
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে, যিয়ে ইমেইল, এপ্ আৰু ৱেবছাইটসমূহকে সামৰি আপোনাৰ ব্যক্তিগত নেটৱর্কৰ কার্যকলাপ নিৰীক্ষণ কৰিব পাৰে।"</string>
@@ -568,29 +504,21 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"ছেট আপ কৰক"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"এতিয়া অফ কৰক"</string>
- <!-- no translation found for accessibility_volume_expand (5946812790999244205) -->
- <skip />
- <!-- no translation found for accessibility_volume_collapse (3609549593031810875) -->
- <skip />
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_volume_settings" msgid="4915364006817819212">"ধ্বনিৰ ছেটিংসমূহ"</string>
+ <string name="accessibility_volume_expand" msgid="5946812790999244205">"সম্প্ৰসাৰণ কৰক"</string>
+ <string name="accessibility_volume_collapse" msgid="3609549593031810875">"সংকুচিত কৰক"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"আউটপুট ডিভাইচ সলনি কৰক"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্ৰীণ পিন কৰা হ\'ল"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'পিছলৈ যাওক\' আৰু \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'মত স্পৰ্শ কৰি সেঁচি ধৰক।"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'মত স্পৰ্শ কৰি সেঁচি ধৰক।"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"এই স্ক্ৰীণখন আনপিন কৰিবলৈ পিছলৈ যাওক আৰু অৱলোকন বুটামত স্পৰ্শ কৰি হেঁচি ধৰক।"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"এই স্ক্ৰীণখন আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'ম বুটামত স্পৰ্শ কৰি হেঁচি ধৰক।"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"বুজি পালোঁ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"নালাগে, ধন্যবাদ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"স্ক্ৰীণ পিন কৰা হ\'ল"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"স্ক্ৰীণ আনপিন কৰা হ\'ল"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকুৱাওক"</string>
@@ -613,13 +541,8 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। মিউট কৰিবলৈ টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। কম্পন অৱস্থাত ছেট কৰিবলৈ টিপক।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। মিউট কৰিবলৈ টিপক।"</string>
- <!-- no translation found for volume_dialog_title (7272969888820035876) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ধ্বনি নিয়ন্ত্ৰণসমূহ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
<skip />
<string name="output_title" msgid="5355078100792942802">"মিডিয়া আউটপুট"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ফ\'ন কল আউটপুট"</string>
@@ -629,44 +552,26 @@
<string name="output_service_wifi" msgid="3749735218931825054">"ৱাই-ফাই"</string>
<string name="output_service_bt_wifi" msgid="4486837869988770896">"ব্লুটুথ আৰু ৱাই-ফাই"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
- <!-- no translation found for show_battery_percentage (5444136600512968798) -->
- <skip />
- <!-- no translation found for show_battery_percentage_summary (3215025775576786037) -->
- <skip />
- <!-- no translation found for quick_settings (10042998191725428) -->
- <skip />
- <!-- no translation found for status_bar (4877645476959324760) -->
- <skip />
+ <string name="show_battery_percentage" msgid="5444136600512968798">"সংযুক্ত বেটাৰিৰ কিমান শতাংশ বাকী আছে দেখুওৱাক"</string>
+ <string name="show_battery_percentage_summary" msgid="3215025775576786037">"চাৰ্জ হৈ নথকা অৱস্থাত বেটাৰি কিমান শতাংশ বাকী স্থিতি দণ্ডৰ ভিতৰত দেখুৱাওক"</string>
+ <string name="quick_settings" msgid="10042998191725428">"ক্ষিপ্ৰ ছেটিংসমূহ"</string>
+ <string name="status_bar" msgid="4877645476959324760">"স্থিতি দণ্ড"</string>
<string name="overview" msgid="4018602013895926956">"অৱলোকন"</string>
<string name="demo_mode" msgid="2532177350215638026">"ছিষ্টেমৰ UI প্ৰদৰ্শন ম\'ড"</string>
- <!-- no translation found for enable_demo_mode (4844205668718636518) -->
- <skip />
- <!-- no translation found for show_demo_mode (2018336697782464029) -->
- <skip />
- <!-- no translation found for status_bar_ethernet (5044290963549500128) -->
- <skip />
- <!-- no translation found for status_bar_alarm (8536256753575881818) -->
- <skip />
- <!-- no translation found for status_bar_work (6022553324802866373) -->
- <skip />
- <!-- no translation found for status_bar_airplane (7057575501472249002) -->
- <skip />
- <!-- no translation found for add_tile (2995389510240786221) -->
- <skip />
- <!-- no translation found for broadcast_tile (3894036511763289383) -->
- <skip />
- <!-- no translation found for zen_alarm_warning_indef (3482966345578319605) -->
- <skip />
- <!-- no translation found for zen_alarm_warning (444533119582244293) -->
- <skip />
- <!-- no translation found for alarm_template (3980063409350522735) -->
- <skip />
- <!-- no translation found for alarm_template_far (4242179982586714810) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_detail (2579369091672902101) -->
- <skip />
- <!-- no translation found for accessibility_status_bar_hotspot (4099381329956402865) -->
- <skip />
+ <string name="enable_demo_mode" msgid="4844205668718636518">"ডেম\' ম\'ড সক্ষম কৰক"</string>
+ <string name="show_demo_mode" msgid="2018336697782464029">"ডেম\' ম\'ড দেখুৱাওক"</string>
+ <string name="status_bar_ethernet" msgid="5044290963549500128">"ইথাৰনেট"</string>
+ <string name="status_bar_alarm" msgid="8536256753575881818">"এলাৰ্ম"</string>
+ <string name="status_bar_work" msgid="6022553324802866373">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
+ <string name="status_bar_airplane" msgid="7057575501472249002">"এয়াৰপ্লেইন ম\'ড"</string>
+ <string name="add_tile" msgid="2995389510240786221">"টাইল যোগ দিয়ক"</string>
+ <string name="broadcast_tile" msgid="3894036511763289383">"সম্প্ৰচাৰ টাইল"</string>
+ <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব যদিহে তাৰ আগতে আপুনি এইটো অফ নকৰে"</string>
+ <string name="zen_alarm_warning" msgid="444533119582244293">"আপুনি আপোনাৰ পিছৰটো এলাৰ্ম <xliff:g id="WHEN">%1$s</xliff:g> বজাত শুনা নাপাব"</string>
+ <string name="alarm_template" msgid="3980063409350522735">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
+ <string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
+ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ক্ষিপ্ৰ ছেটিংসমূহ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
+ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"হটস্পট"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"কিছুমানৰ বাবে আমোদজনক হয় কিন্তু সকলোৰে বাবে নহয়"</string>
<string name="tuner_warning" msgid="8730648121973575701">"System UI Tunerএ আপোনাক Android ব্যৱহাৰকাৰী ইণ্টাৰফেইচ সলনি কৰিবলৈ আৰু নিজৰ উপযোগিতা অনুসৰি ব্যৱহাৰ কৰিবলৈ অতিৰিক্ত সুবিধা প্ৰদান কৰে। এই পৰীক্ষামূলক সুবিধাসমূহ সলনি হ\'ব পাৰে, সেইবোৰে কাম নকৰিব পাৰে বা আগন্তুক সংস্কৰণসমূহত সেইবোৰ অন্তৰ্ভুক্ত কৰা নহ\'ব পাৰে। সাৱধানেৰে আগবাঢ়ক।"</string>
@@ -693,32 +598,40 @@
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"অফ"</string>
<string name="power_notification_controls_description" msgid="4372459941671353358">"জাননী নিয়ন্ত্ৰণৰ অধিক কৰ্তৃত্বৰ সৈতে আপুনি এটা এপৰ জাননীৰ গুৰুত্বৰ স্তৰ ০ৰ পৰা ৫লৈ ছেট কৰিব পাৰে।\n\n"<b>"স্তৰ ৫"</b>" \n- জাননী তালিকাৰ একেবাৰে ওপৰত দেখুৱাওক \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ অনুমতি দিয়ক\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৪"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৩"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n\n"<b>"স্তৰ ২"</b>" \n- সম্পূর্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব \n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n- কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব\n\n"<b>" স্তৰ ১"</b>" \n- সম্পূৰ্ণ স্ক্ৰীণত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n-কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব \n- লক স্ক্ৰীণ আৰু স্থিতি দণ্ডৰ পৰা লুকুৱাই ৰাখক \n- জাননী তালিকাৰ একেবাৰে তলত দেখুৱাওক\n\n"<b>"স্তৰ ০"</b>" \n- এই এপৰ সকলো জাননী অৱৰোধ কৰক"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"জাননীসমূহ"</string>
- <!-- no translation found for notification_channel_disabled (344536703863700565) -->
- <skip />
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
- <!-- no translation found for inline_keep_showing (8945102997083836858) -->
- <skip />
- <!-- no translation found for inline_stop_button (4172980096860941033) -->
- <skip />
- <!-- no translation found for inline_keep_button (6665940297019018232) -->
- <skip />
- <!-- no translation found for inline_keep_showing_app (1723113469580031041) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (1037434112919403708) -->
- <skip />
+ <string name="notification_channel_disabled" msgid="344536703863700565">"আপোনাক এই জাননীসমূহ আৰু দেখুওৱা নহ\'ব"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"এই জাননীসমূহ মিনিমাইজ কৰি থোৱা হ\'ব"</string>
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"আপুনি সাধাৰণতে এই জাননীসমূহ অগ্ৰাহ্য কৰে। \nসেইবোৰ দেখুওৱাই থাকিব লাগিবনে?"</string>
+ <string name="inline_keep_showing" msgid="8945102997083836858">"এই জাননীসমূহ দেখুওৱাই থাকিব লাগিবনে?"</string>
+ <string name="inline_stop_button" msgid="4172980096860941033">"জাননী বন্ধ কৰক"</string>
+ <string name="inline_keep_button" msgid="6665940297019018232">"দেখুওৱাই থাকক"</string>
+ <string name="inline_minimize_button" msgid="966233327974702195">"সৰু কৰক"</string>
+ <string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string>
+ <string name="notification_unblockable_desc" msgid="1037434112919403708">"এই জাননীসমূহ বন্ধ কৰিব নোৱাৰি"</string>
+ <string name="notification_appops_camera_active" msgid="730959943016785931">"কেমেৰা"</string>
+ <string name="notification_appops_microphone_active" msgid="1546319728924580686">"মাইক্ৰ\'ফ\'ন"</string>
+ <string name="notification_appops_overlay_active" msgid="633813008357934729">"স্ক্ৰীণত অইন এপৰ ওপৰত দেখুৱাওক"</string>
+ <plurals name="notification_appops" formatted="false" msgid="1258122060887196817">
+ <item quantity="one">এই এপটোৱে <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> আৰু <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>।</item>
+ <item quantity="other">এই এপটোৱে <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> আৰু <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>।</item>
+ </plurals>
+ <plurals name="notification_using" formatted="false" msgid="2211008461429037973">
+ <item quantity="one"><xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> আৰু <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে</item>
+ <item quantity="other"><xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> আৰু <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে</item>
+ </plurals>
+ <string name="notification_appops_settings" msgid="1028328314935908050">"ছেটিংসমূহ"</string>
+ <string name="notification_appops_ok" msgid="602562195588819631">"ঠিক"</string>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ খোলা অৱস্থাত আছে"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ বন্ধ অৱস্থাত আছে"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"এই চ্চেনেলৰ পৰা জাননী দিবলৈ অনুমতি দিয়ক"</string>
<string name="notification_more_settings" msgid="816306283396553571">"অধিক ছেটিং"</string>
- <!-- no translation found for notification_app_settings (420348114670768449) -->
- <skip />
+ <string name="notification_app_settings" msgid="420348114670768449">"নিজৰ উপযোগিতা অনুসৰি"</string>
<string name="notification_done" msgid="5279426047273930175">"সম্পন্ন হ\'ল"</string>
- <!-- no translation found for inline_undo (558916737624706010) -->
- <skip />
+ <string name="inline_undo" msgid="558916737624706010">"আনডু কৰক"</string>
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"জাননীৰ নিয়ন্ত্ৰণসমূহ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"আনডু কৰক"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ বাবে স্নুজ কৰক"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -782,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"বেটাৰি"</string>
<string name="clock" msgid="7416090374234785905">"ঘড়ী"</string>
<string name="headset" msgid="4534219457597457353">"হেডছেট"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"হেডফ\'ন সংযোগ হৈ আছে"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"হেডছেট সংযোগ হৈ আছে"</string>
<string name="data_saver" msgid="5037565123367048522">"ডেটা সঞ্চয়কাৰী"</string>
@@ -794,7 +709,12 @@
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"বাওঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
<string name="right_nav_bar_button_type" msgid="2481056627065649656">"সোঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"ডিফ\'ল্ট"</string>
- <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
+ <string-array name="nav_bar_buttons">
+ <item msgid="1545641631806817203">"ক্লিপব\'ৰ্ড"</item>
+ <item msgid="5742013440802239414">"কীক\'ড"</item>
+ <item msgid="1951959982985094069">"ঘূৰ্ণন নিশ্চিতি, কীব\'ৰ্ড সলনিৰ সুবিধা"</item>
+ <item msgid="8175437057325747277">"একো নাই"</item>
+ </string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"সাধাৰণ"</item>
<item msgid="8256205964297588988">"ঘন"</item>
@@ -811,8 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"সোঁ কীক\'ড"</string>
<string name="left_icon" msgid="3096287125959387541">"বাওঁ আইকন"</string>
<string name="right_icon" msgid="3952104823293824311">"সোঁ আইকন"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"টাইল যোগ কৰিবৰ বাবে টানি আনি এৰক"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"টাইল যোগ কৰিবলৈ হেঁচি ধৰি টানি আনক"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"আঁতৰাবৰ বাবে টানি আনি ইয়াত এৰি দিয়ক"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"আপোনাক অতি কমেও ৬খন টাইল লাগিব"</string>
<string name="qs_edit" msgid="2232596095725105230">"সম্পাদনা কৰক"</string>
<string name="tuner_time" msgid="6572217313285536011">"সময়"</string>
<string-array name="clock_options">
@@ -856,7 +777,7 @@
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ক্ষিপ্ৰ ছেটিংসমূহ বন্ধ কৰক।"</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"এলার্ম ছেট কৰা হ\'ল।"</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"<xliff:g id="ID_1">%s</xliff:g> হিচাপে ছাইন ইন হ\'ল"</string>
- <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"ইণ্টাৰনেট সংযোগ নাই।"</string>
+ <string name="data_connection_no_internet" msgid="4503302451650972989">"ইণ্টাৰনেট সংযোগ নাই"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"বিৱৰণসমূহ খোলক।"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g>ৰ ছেটিংসমূহ খোলক।"</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ছেটিংসমূহৰ ক্ৰম সম্পাদনা কৰক।"</string>
@@ -899,11 +820,14 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্ৰীণশ্বটসমূহ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"সাধাৰণ বার্তাসমূহ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়াগাৰ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"তাৎক্ষণিক এপসমূহ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"তাৎক্ষণিক এপসমূহক ইনষ্টল কৰাৰ প্ৰয়োজন নাই।"</string>
<string name="app_info" msgid="6856026610594615344">"এপ্ সম্পৰ্কীয় তথ্য"</string>
<string name="go_to_web" msgid="2650669128861626071">"ব্ৰাউজাৰলৈ যাওক"</string>
<string name="mobile_data" msgid="7094582042819250762">"ম\'বাইল ডেটা"</string>
+ <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%s</xliff:g> — <xliff:g id="ID_2">%s</xliff:g>"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"ৱাই-ফাই অফ অৱস্থাত আছে"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ব্লুটুথ অফ অৱস্থাত আছে"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"অসুবিধা নিদিব অফ অৱস্থাত আছে"</string>
@@ -915,18 +839,28 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"সলনি কৰক"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"নেপথ্যত চলি থকা এপসমূহ"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"বেটাৰি আৰু ডেটাৰ ব্যৱহাৰৰ বিষয়ে বিশদভাৱে জানিবলৈ টিপক"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"আপুনি <xliff:g id="CARRIER">%s</xliff:g>ৰ জৰিয়তে ডেটা সংযোগ বা ইণ্টাৰনেট সংযোগ নাপাব। কেৱল ৱাই-ফাইৰ যোগেৰে ইণ্টাৰনেট উপলব্ধ হ\'ব।"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"আপোনাৰ বাহক"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"এটা এপে অনুমতি বিচাৰি কৰা অনুৰোধ এটা ঢাকি ধৰা বাবে ছেটিংসমূহে আপোনাৰ উত্তৰ সত্যাপন কৰিব পৰা নাই।"</string>
- <!-- no translation found for slice_permission_title (7465009437851044444) -->
+ <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g>ক <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাবলৈ অনুমতি দিবনে?"</string>
+ <string name="slice_permission_text_1" msgid="3514586565609596523">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ তথ্য পঢ়িব পাৰে"</string>
+ <string name="slice_permission_text_2" msgid="3146758297471143723">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ ভিতৰত কাৰ্য কৰিব পাৰে"</string>
+ <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>ক যিকোনো এপৰ অংশ দেখুওৱাবলৈ অনুমতি দিয়ক"</string>
+ <string name="slice_permission_allow" msgid="2340244901366722709">"অনুমতি দিয়ক"</string>
+ <string name="slice_permission_deny" msgid="7683681514008048807">"অস্বীকাৰ কৰক"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
<skip />
- <!-- no translation found for slice_permission_text_1 (3514586565609596523) -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
<skip />
- <!-- no translation found for slice_permission_text_2 (3146758297471143723) -->
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
<skip />
- <!-- no translation found for slice_permission_checkbox (7986504458640562900) -->
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
<skip />
- <!-- no translation found for slice_permission_allow (2340244901366722709) -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
<skip />
- <!-- no translation found for slice_permission_deny (7683681514008048807) -->
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index c9a1e11..2f8e77c 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Davam edir"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirişlər"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Enerji azdır"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batareya azdır. Batareya Qənaətini aktiv edin"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> qalır"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Qalan <xliff:g id="PERCENTAGE">%s</xliff:g>, istifadəyə əsasən təxminən <xliff:g id="TIME">%s</xliff:g> qalıb"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Qalan <xliff:g id="PERCENTAGE">%s</xliff:g>, təxminən <xliff:g id="TIME">%s</xliff:g> qalır"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinşot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinşot yadda saxlanılır..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinşot yadda saxlanır..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Skrinşot yadda saxlanır"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skrinşot yadda saxlandı"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Skrinşotunuza baxmaq üçün klikləyin"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Skrinşot çəkmək alınmadı"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Skrinşot yadda saxlanarkən problem baş verdi"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Skrinşotu yadda saxlamaq alınmadı"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Skrinşotu yenidən çəkin"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Yaddaş ehtiyatının az olması səbəbindən skrinşotu yadda saxlamaq olmur"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Skrinşot çəkməyə tətbiq və ya təşkilat tərəfindən icazə verilmir"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB fayl transferi seçimləri"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Qürubda aktiv ediləcək"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Şəfəq vaxtına qədər"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> olduqda aktiv ediləcək"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> vaxtına qədər"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> vaxtına qədər"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC deaktiv edilib"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC aktiv edilib"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranınızda olan hər şeyin şəklini çəkəcək."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Daha göstərmə"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hamısını silin"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\"Narahat etməyin\" rejimi bildirişləri gizlədir"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Bildirişləri idarə edin"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"Narahat etməyin\" rejimi bildirişləri gizlədir"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"İndi başlayın"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Heç bir bildiriş yoxdur"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil izlənə bilər"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Vibrasiyanı ayarlamaq üçün klikləyin."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Səssiz etmək üçün klikləyin."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s səs nəzarətləri"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Zəng və bildirişlər zəng çalacaq"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media çıxışı"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Zəng girişi"</string>
<string name="output_none_found" msgid="5544982839808921091">"Heç bir cihaz tapılmadı"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"bildiriş nəzarəti"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"bildiriş təxirə salma seçimləri"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Mürgü"</string>
<string name="snooze_undo" msgid="6074877317002985129">"GERİ QAYTARIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> üçün təxirə salınıb"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Batareya"</string>
<string name="clock" msgid="7416090374234785905">"Saat"</string>
<string name="headset" msgid="4534219457597457353">"Qulaqlıq"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Qulaqlıq qoşulub"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Qulaqlıq qoşulub"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Qənaəti"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skrinşotlar"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Ümumi Mesajlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Yaddaş"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Məsləhətlər"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ani Tətbiqlər"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ani tətbiqlər quraşdırma tələb etmir."</string>
<string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> tətbiqinə istənilən tətbiqdən hissə göstərmək icazəsi verin"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"İcazə verin"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Rədd edin"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Batareya Qənaətini planlaşdırmaq üçün klikləyin"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Batareya <xliff:g id="PERCENTAGE">%d</xliff:g>%% olduqda avtomatik aktiv edin"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Xeyr, təşəkkür"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Batareya Qənaəti aktivdir"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batareya <xliff:g id="PERCENTAGE">%d</xliff:g>%%-dən aşağı düşdükdə Batareya Qənaəti avtomatik aktiv ediləcək."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 7760db8..4719a30 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -34,17 +34,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Tekuće"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obaveštenja"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Nivo napunjenosti baterije je nizak"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Baterija je skoro prazna. Uključite Uštedu baterije"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>, na osnovu korišćenja ostalo je oko <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>, ostalo je oko <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>. Ušteda baterije je uključena."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Punjenje preko USB-a nije uspelo. Koristite punjač koji ste dobili uz uređaj."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Punjenje preko USB-a nije uspelo"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Koristite punjač koji ste dobili uz uređaj"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Podešavanja"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Želite li da uključite Uštedu baterije?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Uključi"</string>
@@ -77,11 +73,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Čuvanje snimka ekrana..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Čuvanje snimka ekrana..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Snimak ekrana se čuva"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Snimak ekrana je sačuvan"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Dodirnite da biste videli snimak ekrana"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ne možete da napravite snimak ekrana"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Došlo je do problema pri čuvanju snimka ekrana"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Čuvanje snimka ekrana nije uspelo"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Probajte da ponovo napravite snimak ekrana"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Čuvanje snimka ekrana nije uspelo zbog ograničenog memorijskog prostora"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikacija ili organizacija ne dozvoljavaju pravljenje snimaka ekrana"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prenosa datoteka"</string>
@@ -152,7 +147,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Povezano je."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Povezivanje."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -212,8 +206,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Režim rada u avionu je uključen."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Režim rada u avionu je isključen."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Režim rada u avionu je uključen."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Režim Ne uznemiravaj je uključen."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Podešavanje Ne uznemiravaj je uključeno, potpuna tišina."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Podešavanje Ne uznemiravaj je uključeno, samo alarmi."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Ne uznemiravaj."</string>
@@ -280,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina sa poslasticama"</string>
<string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Pritisnite i zadržite ikone za još opcija"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Dodirnite i zadržite ikone za još opcija"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne uznemiravaj"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetni prekidi"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -356,7 +349,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se po zalasku sunca"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
@@ -440,8 +433,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi da snima sve što se prikazuje na ekranu."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Obriši sve"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Upravljajte obaveštenjima"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Režim Ne uznemiravaj krije obaveštenja"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Započni odmah"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nema obaveštenja"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil se možda nadgleda"</string>
@@ -547,9 +540,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste podesili na vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole za jačinu zvuka za %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibracija za pozive i obaveštenja je uključena"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Melodija zvona za pozive i obaveštenje je isključena"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Melodija zvona za pozive i obaveštenja je uključena"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Izlaz medija"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonski poziv"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -638,6 +630,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrole obaveštenja"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcije za odlaganje obaveštenja"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Odloži"</string>
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo je za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -703,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Baterija"</string>
<string name="clock" msgid="7416090374234785905">"Sat"</string>
<string name="headset" msgid="4534219457597457353">"Naglavne slušalice"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slušalice su povezane"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Naglavne slušalice su povezane"</string>
<string name="data_saver" msgid="5037565123367048522">"Ušteda podataka"</string>
@@ -737,8 +732,9 @@
<string name="right_keycode" msgid="708447961000848163">"Desno dugme za kôd tastera"</string>
<string name="left_icon" msgid="3096287125959387541">"Leva ikona"</string>
<string name="right_icon" msgid="3952104823293824311">"Desna ikona"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Prevucite da biste dodali pločice"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Zadržite i prevucite da biste dodali pločice"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Prevucite ovde da biste uklonili"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Treba da izaberete najmanje 6 pločica"</string>
<string name="qs_edit" msgid="2232596095725105230">"Izmeni"</string>
<string name="tuner_time" msgid="6572217313285536011">"Vreme"</string>
<string-array name="clock_options">
@@ -825,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Opšte poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Memorijski prostor"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Saveti"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije ne zahtevaju instalaciju."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
@@ -842,7 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zameni"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplikacije pokrenute u pozadini"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Dodirnite za detalje o bateriji i potrošnji podataka"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Želite da onemogućite mobilne podatke?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Želite li da isključite mobilne podatke?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Nećete imati pristup podacima ili internetu preko mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo preko Wi-Fi veze."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"mobilni operater"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Podešavanja ne mogu da verifikuju vaš odgovor jer aplikacija skriva zahtev za dozvolu."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Želite li da dozvolite aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– Može da čita podatke iz aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -850,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Dozvolite aplikaciji <xliff:g id="APP">%1$s</xliff:g> da prikazuje isečke iz bilo koje aplikacije"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Dozvoli"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Odbij"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Dodirnite da biste napravili raspored za uštedu baterije"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Uključuje se automatski kada je baterija na <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, hvala"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Raspored za uštedu baterije je uključen"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Ušteda baterije će se automatski uključivati kada baterija padne ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Podešavanja"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Važi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index f20eab2..f7d748d 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -35,7 +35,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Пастаянныя"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Апавяшчэнні"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Нізкі ўзровень зараду акумулятара"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Нізкі зарад акумулятара. Уключыце функцыю эканоміі зараду"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Засталося <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Засталося <xliff:g id="PERCENTAGE">%s</xliff:g>, у вас ёсць каля <xliff:g id="TIME">%s</xliff:g> на аснове даных аб выкарыстанні вашай прылады"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Засталося <xliff:g id="PERCENTAGE">%s</xliff:g>, у вас ёсць каля <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -75,11 +74,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Захаванне скрыншота..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Захаванне скрыншота..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Захаванне здымка экрана"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Здымак экрана захаваны"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Дакраніцеся, каб прагледзець здымак экрана"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Не атрымалася зрабіць здымак экрана"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Падчас захавання здымка экрана адбылася памылка"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Немагчыма захаваць здымак экрана, бо мала месца ў сховішчы"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Рабіць здымкі экрана не дазваляе праграма ці ваша арганізацыя"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Парам. перадачы файлаў па USB"</string>
@@ -279,8 +279,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Вітрына з дэсертамі"</string>
<string name="start_dreams" msgid="5640361424498338327">"Экранная застаўка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Каб адкрыць іншыя параметры, націсніце на значок і ўтрымлівайце яго"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбаваць"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Толькі прыярытэтныя"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Толькі будзільнікі"</string>
@@ -357,7 +356,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Уключаць увечары"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Да ўсходу сонца"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Уключыць у <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Да <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC адключаны"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC уключаны"</string>
@@ -441,7 +441,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> атрымае доступ да ўсяго, што адлюстроўваецца на вашым экране."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не паказваць зноў"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ачысціць усё"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"У рэжыме \"Не турбаваць\" адключаны апавяшчэнні"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"У рэжыме «Не турбаваць» апавяшчэнні не паказваюцца"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Пачаць зараз"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Апавяшчэнняў няма"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"За профілем могуць назіраць"</string>
@@ -547,7 +549,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дакраніцеся, каб уключыць вібрацыю."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дакраніцеся, каб адключыць гук"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Рэгулятар гучнасці %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Для выклікаў і апавяшчэнняў уключаны гук"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Вывад мультымедыя"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Прылада вываду тэлефонных выклікаў"</string>
<string name="output_none_found" msgid="5544982839808921091">"Прылады не знойдзены"</string>
@@ -638,6 +641,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"кіраванне апавяшчэннямі"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"параметры адкладвання апавяшчэнняў"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"АДРАБІЦЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Адкладзена на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -705,6 +710,8 @@
<string name="battery" msgid="7498329822413202973">"Акумулятар"</string>
<string name="clock" msgid="7416090374234785905">"Гадзіннік"</string>
<string name="headset" msgid="4534219457597457353">"Гарнітура"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Навушнікі падключаны"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Гарнітура падлучана"</string>
<string name="data_saver" msgid="5037565123367048522">"Эканомія трафіку"</string>
@@ -739,11 +746,9 @@
<string name="right_keycode" msgid="708447961000848163">"Код клавішы \"управа\""</string>
<string name="left_icon" msgid="3096287125959387541">"Значок \"улева\""</string>
<string name="right_icon" msgid="3952104823293824311">"Значок \"управа\""</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Перацягніце патрэбныя пліткі"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Перацягніце сюды, каб выдаліць"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Трэба па меншай меры 6 плітак"</string>
<string name="qs_edit" msgid="2232596095725105230">"Рэдагаваць"</string>
<string name="tuner_time" msgid="6572217313285536011">"Час"</string>
<string-array name="clock_options">
@@ -830,6 +835,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Здымкі экрана"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Агульныя паведамленні"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Захоўванне"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Падказкі"</string>
<string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string>
<string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string>
@@ -847,12 +853,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замяніць"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Праграмы, якія працуюць у фонавым рэжыме"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Дакраніцеся, каб даведацца пра выкарыстанне трафіка і акумулятара"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Адключыць мабільны інтэрнэт?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"У вас не будзе доступу да даных ці інтэрнэту праз аператара <xliff:g id="CARRIER">%s</xliff:g>. Інтэрнэт будзе даступны толькі праз Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ваш аператар"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Праграма хавае запыт на дазвол, таму ваш адказ немагчыма спраўдзіць у Наладах."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Дазволіць праграме <xliff:g id="APP_0">%1$s</xliff:g> паказваць зрэзы праграмы <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Можа счытваць інфармацыю з праграмы <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -860,4 +863,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Дазволіць праграме <xliff:g id="APP">%1$s</xliff:g> паказваць зрэзы з усіх праграм"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Дазволіць"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Адмовіць"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Націсніце, каб уключыць рэжым эканоміі зараду"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Уключаць аўтаматычна пры ўзроўні зараду акумулятара <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Не, дзякуй"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Уключаны рэжым эканоміі зараду"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Калі ўзровень зараду акумулятара знізіцца да <xliff:g id="PERCENTAGE">%d</xliff:g>%%, аўтаматычна ўключыцца рэжым эканоміі энергіі."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Налады"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Зразумела"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 26d6b4a..2b3157d 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батерията е изтощена"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батерията е изтощена – включете режима за запазването й"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Остава/т <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Остава/т <xliff:g id="PERCENTAGE">%s</xliff:g> – още около <xliff:g id="TIME">%s</xliff:g> въз основа на използването"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Остава/т <xliff:g id="PERCENTAGE">%s</xliff:g> – още около <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Екранна снимка"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Екранната снимка се запазва..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Екранната снимка се запазва..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Екранната снимка се запазва"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Екранната снимка е запазена"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Докоснете, за да видите екранната снимка"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Екранната снимка не можа да бъде направена"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"При запазването на екранната снимка възникна проблем"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Не можа да се запази екранна снимка"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Опитайте да направите екранна снимка отново"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Екранната снимка не може да се запази поради ограничено място в хранилището"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Правенето на екранни снимки не е разрешено от приложението или организацията ви"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Опции за пренос на файлове чрез USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Витрина с десерти"</string>
<string name="start_dreams" msgid="5640361424498338327">"Скрийнсейвър"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"За още опции докоснете и задръжте иконите"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не безпокойте"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само с приоритет"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само будилници"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ще се вкл. по залез"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрев"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ще се включи в <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"До <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"КБП"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"КБП е деактивирана"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"КБП е активирана"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ще започне да заснема всичко, което се показва на екрана ви."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Да не се показва отново"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Изчистване на всички"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Режимът „Не безпокойте“ скрива известията"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Управление на известията"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Режимът „Не безпокойте“ скрива известията"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Стартиране сега"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Няма известия"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Възможно е потребителският профил да се наблюдава"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Докоснете, за да зададете вибриране."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Докоснете, за да заглушите звука."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Контроли за силата на звука – %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"При обаждания и известия устройството ще звъни"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Изходяща мултимедия"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Изходящи телефонни обаждания"</string>
<string name="output_none_found" msgid="5544982839808921091">"Няма намерени устройства"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"контроли за известията"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"опции за отлагане на известията"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Отлагане"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЯНА"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Батерия"</string>
<string name="clock" msgid="7416090374234785905">"Часовник"</string>
<string name="headset" msgid="4534219457597457353">"Слушалки"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Слушалките (без микрофон) са свързани"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Слушалките са свързани"</string>
<string name="data_saver" msgid="5037565123367048522">"Икономия на данни"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Екранни снимки"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Общи съобщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Съвети"</string>
<string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string>
<string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Разрешаване на <xliff:g id="APP">%1$s</xliff:g> да показва части от което и да е приложение"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Разрешаване"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Отказ"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Докоснете, за да активирате автоматичния режим за запазване на батерията"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Автоматично включване при <xliff:g id="PERCENTAGE">%d</xliff:g>%% заряд на батерията"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Не, благодаря"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Включен е автоматичен режим за запазване на батерията"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Режимът за запазване на батерията ще се включи автоматично, след като нивото й премине под <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Настройки"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Разбрах"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 41987a0..c12e069 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলতে-থাকা"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"বিজ্ঞপ্তিগুলি"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ব্যাটারি কম"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"চার্জ কম। ব্যাটারি সেভার চালু করুন"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> অবশিষ্ট আছে"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকি আছে, বর্তমান ব্যবহারের ভিত্তিতে আর <xliff:g id="TIME">%s</xliff:g> চলবে"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকি আছে, আর <xliff:g id="TIME">%s</xliff:g> চলবে"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্রিনশট নিন"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্রিনশট সেভ করা হচ্ছে..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্রিনশট সেভ করা হচ্ছে..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"স্ক্রিনশট সেভ করা হচ্ছে"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"স্ক্রিনশট সেভ করা হয়েছে"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"স্ক্রিনশটটি দেখতে ট্যাপ করুন"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"স্ক্রিনশট নেওয়া যায়নি"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"স্ক্রিনশট সেভ করার সময় সমস্যা হয়েছে"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"বেশি জায়গা নেই তাই স্ক্রিনশটটি সেভ করা যাবে না৷"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"এই অ্যাপ বা আপনার প্রতিষ্ঠান স্ক্রিনশট নেওয়ার অনুমতি দেয়নি"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ফাইল স্থানান্তরের বিকল্পগুলি"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ডেজার্ট কেস"</string>
<string name="start_dreams" msgid="5640361424498338327">"স্ক্রিন সেভার"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ইথারনেট"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"আরও বিকল্পের জন্য আইকনগুলি টাচ করে ধরে থাকুন"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"বিরক্ত করবেন না"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"শুধুমাত্র অ্যালার্মগুলি"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"সূর্যাস্তে চালু হবে"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"সূর্যোদয় পর্যন্ত"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> এ চালু হবে"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> পর্যন্ত"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC অক্ষম করা আছে"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম করা আছে"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> আপনার স্ক্রীনে দেখানো সব কিছু ক্যাপচার করা শুরু করবে।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"আর দেখাবেন না"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"সবকিছু সাফ করুন"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'বিরক্ত করবেন না\' মোড চালু আছে, তাই বিজ্ঞপ্তি লুকিয়ে ফেলা হচ্ছে"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"এখন শুরু করুন"</string>
<string name="empty_shade_text" msgid="708135716272867002">"কোনো বিজ্ঞপ্তি নেই"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"প্রোফাইল পর্যবেক্ষণ করা হতে পারে"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ভাইব্রেট করতে ট্যাপ করুন।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। নিঃশব্দ করতে ট্যাপ করুন।"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ভলিউম নিয়ন্ত্রণ"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"কল এবং বিজ্ঞপ্তি আসলে রিং হবে"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"মিডিয়া আউটপুট"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ফোন কল আউটপুট"</string>
<string name="output_none_found" msgid="5544982839808921091">"কোনও ডিভাইস খুঁজে পাওয়া যায়নি"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"বিজ্ঞপ্তির নিয়ন্ত্রণগুলি"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"বিজ্ঞপ্তি মনে করিয়ে দেওয়ার বিকল্পগুলি"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"পূর্বাবস্থায় ফিরুন"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> পরে আবার মনে করানো হবে"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"ব্যাটারি"</string>
<string name="clock" msgid="7416090374234785905">"ঘড়ি"</string>
<string name="headset" msgid="4534219457597457353">"হেডসেট"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"হেডফোনগুলি সংযুক্ত হয়েছে"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"হেডসেট সংযুক্ত হয়েছে"</string>
<string name="data_saver" msgid="5037565123367048522">"ডেটা সেভার"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"ডানদিকের কিকোড"</string>
<string name="left_icon" msgid="3096287125959387541">"বাঁ দিকের আইকন"</string>
<string name="right_icon" msgid="3952104823293824311">"ডানদিকের আইকন"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"টাইল যোগ করতে ট্যাপ করে টেনে আনুন"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"সরানোর জন্য এখানে টেনে আনুন"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"অন্তত ৬টি টাইল রাখতে হবে"</string>
<string name="qs_edit" msgid="2232596095725105230">"সম্পাদনা করুন"</string>
<string name="tuner_time" msgid="6572217313285536011">"সময়"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্রীনশটস"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"সাধারণ বার্তাগুলি"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"স্টোরেজ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string>
<string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"বদলে দিন"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"পটভূমিতে অ্যাপ চালু আছে"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"ব্যাটারি এবং ডেটার ব্যবহারের বিশদ বিবরণের জন্য ট্যাপ করুন"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"মোবাইল ডেটা বন্ধ করবেন?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"আপনি <xliff:g id="CARRIER">%s</xliff:g>-এর মাধ্যমে ডেটা অথবা ইন্টারনেট অ্যাক্সেস করতে পারবেন না। শুধুমাত্র ওয়াই-ফাইয়ের মাধ্যমেই ইন্টারনেট অ্যাক্সেস করা যাবে।"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"আপনার পরিষেবা প্রদানকারী"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"একটি অ্যাপ কোনও অনুমোদনের অনুরোধকে ঢেকে দিচ্ছে, তাই সেটিংস থেকে আপনার প্রতিক্রিয়া যাচাই করা যাচ্ছে না।"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটিকে <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখানোর অনুমতি দেবেন?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- এটি <xliff:g id="APP">%1$s</xliff:g> এর তথ্য অ্যাক্সেস করতে পারবে"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> অ্যাপটিকে যেকোনও অ্যাপের অংশ দেখাতে দিন"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"অনুমতি দিন"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"খারিজ করুন"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index b99efc8..f47fad0 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -34,7 +34,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U toku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavještenja"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Baterija je skoro prazna"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Baterija je skoro prazna. Uključite Uštedu baterije"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Preostalo <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>. Preostalo je oko <xliff:g id="TIME">%s</xliff:g>, na osnovu vašeg korištenja"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Još <xliff:g id="PERCENTAGE">%s</xliff:g>. Preostalo je oko <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -74,11 +73,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spašavanje snimka ekrana..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Spašavanje snimka ekrana..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Snimak ekrana se pohranjuje"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Snimak ekrana je sačuvan"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Dodirnite za prikaz snimka ekrana"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Pravljenje snimka ekrana nije uspjelo"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Došlo je do problema prilikom čuvanja snimka ekrana"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Nije moguće sačuvati snimak ekrana"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Pokušajte ponovo snimiti ekran"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Snimak ekrana se ne može sačuvati zbog manjka prostora za pohranu"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ova aplikacija ili vaša organizacija ne dozvoljavaju snimanje ekrana"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prijenosa fajlova"</string>
@@ -275,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Slika sa desertima"</string>
<string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Dodirnite ikone i zadržite pritisak da biste vidjeli više opcija"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Dodirnite i držite ikone za više opcija"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -351,7 +349,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svitanja"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
@@ -435,7 +433,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi snimati sve što se prikaže na ekranu."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj opet"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Očisti sve"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Način rada Ne ometaj sakriva obavještenja"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Upravljajte obavještenjima"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Način rada Ne ometaj sakriva obavještenja"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Pokreni odmah"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nema obavještenja"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil može biti nadziran"</string>
@@ -543,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da postavite vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da isključite zvuk."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće za %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Pozivi i obavještenja će zvoniti"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Izlaz za medijske fajlove"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonske pozive"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -632,6 +632,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrole obavještenja"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcije za odgodu obavještenja"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Odgodi"</string>
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -697,6 +698,8 @@
<string name="battery" msgid="7498329822413202973">"Baterija"</string>
<string name="clock" msgid="7416090374234785905">"Sat"</string>
<string name="headset" msgid="4534219457597457353">"Slušalice s mikrofonom"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slušalice su priključene"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Slušalice s mikrofonom su priključene"</string>
<string name="data_saver" msgid="5037565123367048522">"Ušteda podataka"</string>
@@ -731,11 +734,9 @@
<string name="right_keycode" msgid="708447961000848163">"Kôd tipke desno"</string>
<string name="left_icon" msgid="3096287125959387541">"Ikona lijevo"</string>
<string name="right_icon" msgid="3952104823293824311">"Ikona desno"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Držite i prevucite da dodate polja"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Prevucite ovdje za uklanjanje"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Trebate najmanje šest polja"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
<string name="tuner_time" msgid="6572217313285536011">"Vrijeme"</string>
<string-array name="clock_options">
@@ -822,6 +823,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Opće poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Savjeti"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Za instant aplikacije nije potrebna instalacija"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
@@ -839,12 +841,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zamijeni"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplikacije koje rade u pozadini"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Dodirnite za detalje o potrošnji baterije i prijenosa podataka"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Isključiti prijenos podataka na mobilnoj mreži?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Nećete imati pristup podacima ili internetu preko mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo preko Wi-Fi mreže."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"vaš operater"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Postavke ne mogu potvrditi vaš odgovor jer aplikacija zaklanja zahtjev za odobrenje."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Dozvoliti aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> prikazivanje isječaka aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Može čitati informacije iz aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -852,4 +851,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Dozvoli aplikaciji <xliff:g id="APP">%1$s</xliff:g> prikazivanje isječaka iz svake aplikacije"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Dozvoli"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Odbij"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Dodirnite da zakažete Uštedu baterije"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Automatski uključite kada je baterija ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, hvala"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Zakazivanje Uštede baterije je uključeno"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Kada je baterija ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%, Ušteda baterije se automatski uključuje."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Razumijem"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index edd7944..a08c559 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Queda poca bateria"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca bateria. Activa el mode d\'estalvi de bateria."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>."</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>; temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>; temps restant aproximat: <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"S\'està desant captura de pantalla..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"S\'està desant la captura de pantalla..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"S\'està desant la captura de pantalla"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"S\'ha desat la captura de pantalla"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toca per veure la captura de pantalla"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"No s\'ha pogut fer la captura de pantalla"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"S\'ha trobat un problema en desar la captura de pantalla"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"La captura de pantalla no es pot desar perquè no hi ha prou espai d\'emmagatzematge"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'aplicació o la teva organització no permeten fer captures de pantalla"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcions transf. fitxers USB"</string>
@@ -234,8 +234,8 @@
<string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Llanterna activada"</string>
<string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Llanterna desactivada."</string>
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Llanterna activada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"La inversió de color està desactivada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"La inversió de color està activada."</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"La inversió dels colors està desactivada."</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"La inversió dels colors està activada."</string>
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"El punt d\'accés mòbil està desactivat."</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"El punt d\'accés mòbil està activat."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"S\'ha aturat l\'emissió de la pantalla."</string>
@@ -348,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"A la posta de sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fins a l\'alba"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"L\'NFC està desactivada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"L\'NFC està activada"</string>
@@ -432,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> començarà a gravar tot el que es mostri a la pantalla."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No ho tornis a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Esborra-ho tot"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"El mode No molestis està amagant notificacions"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"El mode No molestis està amagant notificacions"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Comença ara"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Cap notificació"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"El perfil es pot supervisar"</string>
@@ -538,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca per activar la vibració."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca per silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controls de volum %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Les trucades i les notificacions sonaran"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Sortida de contingut multimèdia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortida de trucades"</string>
<string name="output_none_found" msgid="5544982839808921091">"No s\'ha trobat cap dispositiu"</string>
@@ -625,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controls de notificació"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcions per posposar la notificació"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFÉS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"S\'ha posposat <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Rellotge"</string>
<string name="headset" msgid="4534219457597457353">"Auriculars"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auriculars connectats"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auriculars connectats"</string>
<string name="data_saver" msgid="5037565123367048522">"Economitzador de dades"</string>
@@ -811,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Captures de pantalla"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Missatges generals"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Emmagatzematge"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Suggeriments"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string>
<string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string>
@@ -838,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permet que <xliff:g id="APP">%1$s</xliff:g> mostri porcions de qualsevol aplicació"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permet"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Denega"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Toca per programar la funció Estalvi de bateria"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Activa automàticament quan el nivell de bateria sigui del <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"S\'ha activat la programació de la funció Estalvi de bateria"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"La funció Estalvi de bateria s\'activarà automàticament quan el nivell de bateria sigui inferior al <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuració"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"D\'acord"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 75043bc..f76ae67 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -35,14 +35,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Baterie je slabá"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Baterie je téměř vybitá, zapněte spořič baterie"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Zbývá <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Zbývá <xliff:g id="PERCENTAGE">%s</xliff:g>, při obvyklém využití asi <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Zbývá <xliff:g id="PERCENTAGE">%s</xliff:g>, asi <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Zbývá <xliff:g id="PERCENTAGE">%s</xliff:g>. Spořič baterie je zapnutý."</string>
- <string name="invalid_charger" msgid="4549105996740522523">"Nabíjení pomocí rozhraní USB není podporováno.\nPoužívejte pouze nabíječku, která byla dodána se zařízením."</string>
- <string name="invalid_charger_title" msgid="3515740382572798460">"Nabíjení přes USB není podporováno."</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"Používejte pouze nabíječku, která je součástí balení."</string>
+ <string name="invalid_charger" msgid="2741987096648693172">"Nabíjení přes USB nefunguje. Používejte originální nabíječku, která byla dodána spolu se zařízením."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Nabíjení přes USB nefunguje"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Používejte originální nabíječku, která byla dodána spolu se zařízením."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nastavení"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Zapnout spořič baterie?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Zapnout"</string>
@@ -75,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Snímek obrazovky"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ukládání snímku obrazovky..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ukládání snímku obrazovky..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Ukládání snímku obrazovky"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Snímek obrazovky byl uložen"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Klepnutím snímek obrazovky zobrazíte"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Snímek obrazovky se nepodařilo zachytit"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Při ukládání snímku obrazovky došlo k problému"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Snímek obrazovky se nepodařilo uložit"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Zkuste snímek pořídit znovu"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Snímek obrazovky kvůli nedostatku místa v úložišti nelze uložit"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikace nebo organizace zakazuje pořizování snímků obrazovky"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti přenosu souborů pomocí rozhraní USB"</string>
@@ -105,8 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string>
<string name="cancel" msgid="6442560571259935130">"Zrušit"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikace"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast pro zprávu nápovědy"</string>
@@ -150,28 +147,28 @@
<string name="accessibility_desc_off" msgid="6475508157786853157">"Vypnuto."</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Připojeno."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Připojování."</string>
- <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
- <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
- <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
- <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
- <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
- <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
- <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
- <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
- <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
- <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
+ <string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
+ <string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
+ <string name="data_connection_3_5g" msgid="5218328297191657602">"3,5G"</string>
+ <string name="data_connection_3_5g_plus" msgid="7570783890290275297">"3,5G+"</string>
+ <string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
+ <string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
+ <string name="data_connection_lte" msgid="2694876797724028614">"LTE"</string>
+ <string name="data_connection_lte_plus" msgid="3423013208570937424">"LTE+"</string>
+ <string name="data_connection_cdma" msgid="4677985502159869585">"CDMA"</string>
+ <string name="data_connection_roaming" msgid="6037232010953697354">"Roaming"</string>
+ <string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Žádná SIM karta."</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"Mobilní data"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobilní data jsou zapnuta"</string>
- <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilní data jsou vypnuta"</string>
+ <string name="cell_data_off" msgid="5287705247512911922">"Mobilní data jsou vypnuta"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Sdílené připojení přes Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim Letadlo."</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN je zapnuto."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Není vložena SIM karta"</string>
- <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Probíhá změna sítě operátora."</string>
+ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Probíhá změna sítě operátora"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otevřít podrobnosti o baterii"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Stav baterie: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<!-- String.format failed for translation -->
@@ -212,7 +209,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Režim Letadlo je zapnutý."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Režim Letadlo je vypnutý."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Režim Letadlo je zapnutý."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Stav Nerušit je zapnutý – pouze prioritní vyrušení."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Režim Nerušit je zapnutý."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Je zapnut režim Nerušit – úplné ticho."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Nerušit, pouze budíky"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Nerušit."</string>
@@ -280,8 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Pult se sladkostmi"</string>
<string name="start_dreams" msgid="5640361424498338327">"Spořič obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Podržením ikon zobrazíte další možnosti"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušit"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Pouze prioritní"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Pouze budíky"</string>
@@ -294,6 +290,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Náhlavní souprava"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapínání…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčení"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Automatické otočení obrazovky"</string>
@@ -318,7 +315,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi vypnuta"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Budík"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Zapínání…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Odeslat"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string>
@@ -335,7 +332,8 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Připojování..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Sdílené připojení"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Zapínání..."</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"Zapínání…"</string>
+ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="5672131949987422420">"Spořič dat je zapnutý"</string>
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="few">%d zařízení</item>
<item quantity="many">%d zařízení</item>
@@ -351,13 +349,12 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využito: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornění při <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Pracovní profil"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Oznámení a aplikace jsou vypnuty"</string>
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"Pracovní profil"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noční režim"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Zapnout při soumraku"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svítání"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Zapnout v <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je vypnuto"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je zapnuto"</string>
@@ -405,9 +402,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Úplné\nticho"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Pouze\nprioritní"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Pouze\nbudíky"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Rychlé nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Pomalé nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rychlé nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Pomalé nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Přepnout uživatele"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Přepnout uživatele, aktuální uživatel: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Aktuální uživatel <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -441,6 +438,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávat vše, co je zobrazeno na obrazovce."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Tuto zprávu příště nezobrazovat"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Smazat vše"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Spravovat oznámení"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Režim Nerušit skrývá oznámení"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Spustit"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Žádná oznámení"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil může být monitorován"</string>
@@ -508,6 +507,7 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastavit"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"Vypnout"</string>
+ <string name="accessibility_volume_settings" msgid="4915364006817819212">"Nastavení zvuku"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozbalit"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sbalit"</string>
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Přepnout zařízení pro výstup"</string>
@@ -545,6 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrace."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Ovládací prvky hlasitosti %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Výstup médií"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonního hovoru"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nebyla nalezena žádná zařízení"</string>
@@ -600,12 +602,31 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Rozšířené ovládací prvky oznámení umožňují nastavit úroveň důležitosti oznámení aplikace od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazit na začátku seznamu oznámení \n– Povolit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 4"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 3"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n\n"<b>"Úroveň 2"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat žádný zvukový signál ani nevibrovat \n\n"<b>"Úroveň 1"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat zvukový signál ani nevibrovat \n– Skrýt z obrazovky uzamčení a stavového řádku \n– Zobrazovat na konci seznamu oznámení \n\n"<b>";Úroveň 0"</b>" \n– Blokovat všechna oznámení z aplikace"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Oznámení"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Tato oznámení již nebudete dostávat"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"Tato oznámení budou minimalizována"</string>
<string name="inline_blocking_helper" msgid="3055064577771478591">"Tato oznámení obvykle odmítáte. \nChcete je nadále zobrazovat?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Mají se tato oznámení nadále zobrazovat?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Přestat zobrazovat oznámení"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nadále zobrazovat"</string>
+ <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovat"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tato oznámení nelze deaktivovat"</string>
+ <string name="notification_appops_camera_active" msgid="730959943016785931">"fotoaparát"</string>
+ <string name="notification_appops_microphone_active" msgid="1546319728924580686">"mikrofon"</string>
+ <string name="notification_appops_overlay_active" msgid="633813008357934729">"zobrazení přes ostatní aplikace na obrazovce"</string>
+ <plurals name="notification_appops" formatted="false" msgid="1258122060887196817">
+ <item quantity="few">Tato aplikace <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>.</item>
+ <item quantity="many">Tato aplikace <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>.</item>
+ <item quantity="other">Tato aplikace <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>.</item>
+ <item quantity="one">Tato aplikace <xliff:g id="PERFORMING_ACTIVITY_0">%1$s</xliff:g>.</item>
+ </plurals>
+ <plurals name="notification_using" formatted="false" msgid="2211008461429037973">
+ <item quantity="few">používá položky <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ <item quantity="many">používá položky <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ <item quantity="other">používá položky <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> a <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ <item quantity="one">používá položku <xliff:g id="PERFORMING_ACTIVITY_0">%1$s</xliff:g></item>
+ </plurals>
+ <string name="notification_appops_settings" msgid="1028328314935908050">"Nastavení"</string>
+ <string name="notification_appops_ok" msgid="602562195588819631">"OK"</string>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Ovládací prvky oznámení aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> byly otevřeny"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Ovládací prvky oznámení aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> byly zavřeny"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Povolit oznámení z tohoto kanálu"</string>
@@ -616,6 +637,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"Nastavení oznámení"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Možnosti odložení oznámení"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Odložit"</string>
<string name="snooze_undo" msgid="6074877317002985129">"VRÁTIT ZPĚT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo o <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -683,6 +705,8 @@
<string name="battery" msgid="7498329822413202973">"Baterie"</string>
<string name="clock" msgid="7416090374234785905">"Hodiny"</string>
<string name="headset" msgid="4534219457597457353">"Sluchátka"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Sluchátka připojena"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Sluchátka připojena"</string>
<string name="data_saver" msgid="5037565123367048522">"Spořič dat"</string>
@@ -717,8 +741,9 @@
<string name="right_keycode" msgid="708447961000848163">"Klávesa vpravo"</string>
<string name="left_icon" msgid="3096287125959387541">"Ikona vlevo"</string>
<string name="right_icon" msgid="3952104823293824311">"Ikona vpravo"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Dlaždice přidáte přetažením"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Dlaždice přidáte podržením a přetažením"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Přetažením sem dlaždice odstraníte"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Potřebujete minimálně šest dlaždic"</string>
<string name="qs_edit" msgid="2232596095725105230">"Upravit"</string>
<string name="tuner_time" msgid="6572217313285536011">"Čas"</string>
<string-array name="clock_options">
@@ -762,7 +787,7 @@
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zavřít rychlé nastavení."</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"Budík je nastaven."</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Jste přihlášeni jako <xliff:g id="ID_1">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"Nejste připojeni k internetu."</string>
+ <string name="data_connection_no_internet" msgid="4503302451650972989">"Nejste připojeni k internetu"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Otevřít podrobnosti."</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otevřít nastavení aplikace <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Upravit pořadí nastavení."</string>
@@ -805,11 +830,13 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snímky obrazovek"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Všeobecné zprávy"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Úložiště"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Tipy"</string>
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikace"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikace není třeba instalovat."</string>
<string name="app_info" msgid="6856026610594615344">"O aplikaci"</string>
<string name="go_to_web" msgid="2650669128861626071">"Přejít do prohlížeče"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string>
+ <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%s</xliff:g> – <xliff:g id="ID_2">%s</xliff:g>"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je vypnuta"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je vypnuto"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"Režim Nerušit je vypnut"</string>
@@ -821,7 +848,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Nahradit"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplikace běžící na pozadí"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Klepnutím zobrazíte podrobnosti o využití baterie a dat"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Vypnout mobilní data?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Vypnout mobilní data?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Prostřednictvím <xliff:g id="CARRIER">%s</xliff:g> nebudete moci používat data ani internet. Internet bude dostupný pouze přes Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"vašeho operátora"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Žádost o oprávnění je blokována jinou aplikací. Nastavení proto vaši odpověď nemůže ověřit."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Povolit aplikaci <xliff:g id="APP_0">%1$s</xliff:g> zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– Může číst informace z aplikace <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -829,4 +858,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Povolit aplikaci <xliff:g id="APP">%1$s</xliff:g> zobrazovat ukázky z libovolné aplikace"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Povolit"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Zamítnout"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Klepnutím naplánujete aktivování spořiče baterie"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktivovat automaticky, když baterie klesne pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, díky"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Plánované aktivování spořiče baterie je zapnuté"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Spořič baterie se automaticky aktivuje, jakmile baterie klesne pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavení"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Rozumím"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 40c089c..131163e 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Underretninger"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batteriniveauet er lavt"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batteriniveauet er lavt – aktivér Batterisparefunktion"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> tilbage"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Der er <xliff:g id="PERCENTAGE">%s</xliff:g> tilbage eller ca. <xliff:g id="TIME">%s</xliff:g>, alt efter hvordan du bruger enheden"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> tilbage eller ca. <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Gemmer screenshot..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Gemmer screenshot..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshottet gemmes"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshottet blev gemt"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tryk for at se dit screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Screenshottet kunne ikke tages"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Der opstod et problem, da screenshottet skulle gemmes"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Screenshottet kan ikke gemmes, fordi der er begrænset lagerplads"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller din organisation tillader ikke, at du tager screenshots"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Muligheder for USB-filoverførsel"</string>
@@ -348,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Tænd ved solnedgang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Indtil solopgang"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Tænd kl. <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Indtil kl. <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er deaktiveret"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er aktiveret"</string>
@@ -432,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vil begynde at optage alt, hvad der vises på din skærm."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Vis ikke igen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ryd alt"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Forstyr ikke skjuler underretninger"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Forstyr ikke skjuler underretninger"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start nu"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ingen underretninger"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilen kan overvåges"</string>
@@ -538,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryk for at aktivere vibration."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryk for at slå lyden fra."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s lydstyrkeknapper"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Der afspilles lyd ved opkald og underretninger"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medieafspilning"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Udgang til telefonopkald"</string>
<string name="output_none_found" msgid="5544982839808921091">"Der blev ikke fundet nogen enheder"</string>
@@ -625,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrolelementer til underretninger"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Indstillinger for udsættelse"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"FORTRYD"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Udsat i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Batteri"</string>
<string name="clock" msgid="7416090374234785905">"Ur"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Hovedtelefoner er tilsluttet"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset er forbundet"</string>
<string name="data_saver" msgid="5037565123367048522">"Datasparefunktion"</string>
@@ -722,11 +730,9 @@
<string name="right_keycode" msgid="708447961000848163">"Højre tastekode"</string>
<string name="left_icon" msgid="3096287125959387541">"Venstre ikon"</string>
<string name="right_icon" msgid="3952104823293824311">"Højre ikon"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Tilføj felter ved at holde dem nede og trække"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Træk herhen for at fjerne"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Du skal bruge mindst seks felter"</string>
<string name="qs_edit" msgid="2232596095725105230">"Rediger"</string>
<string name="tuner_time" msgid="6572217313285536011">"Tid"</string>
<string-array name="clock_options">
@@ -813,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Generelle meddelelser"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagerplads"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Tips"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps kræver ingen installation."</string>
<string name="app_info" msgid="6856026610594615344">"Appinfo"</string>
@@ -830,12 +837,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Erstat"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps, der kører i baggrunden"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Tryk for at se oplysninger om batteri- og dataforbrug"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Vil du deaktivere mobildata?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Du vil ikke have data- eller internetadgang via <xliff:g id="CARRIER">%s</xliff:g>. Der vil kunne være adgang til internettet via Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"dit mobilselskab"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Indstillinger kan ikke bekræfte dit svar, da en app dækker for en anmodning om tilladelse."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Vil du give <xliff:g id="APP_0">%1$s</xliff:g> tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Den kan læse oplysninger fra <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -843,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Tillad, at <xliff:g id="APP">%1$s</xliff:g> viser eksempler fra enhver app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Tillad"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Afvis"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tryk for at fastsætte en tidsplan for batterisparefunktionen"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktivér automatisk, når batteriniveauet er på <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nej tak"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Tidsplanen for batterisparefunktionen er aktiveret"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batterisparefunktionen aktiveres automatisk, når batteriniveauet når under <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Indstillinger"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 685495a..3a03c41 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktuell"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Akku ist schwach"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Akku ist schwach. Energiesparmodus aktivieren."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> verbleibend"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ausstehend; noch ca. <xliff:g id="TIME">%s</xliff:g>, basierend auf deiner Nutzung"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ausstehend; noch ca. <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot wird gespeichert..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot wird gespeichert"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot gespeichert"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tippe, um deinen Screenshot anzusehen"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Screenshot konnte nicht aufgenommen werden"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Beim Speichern des Screenshots ist ein Problem aufgetreten"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Speichern des Screenshots aufgrund von zu wenig Speicher nicht möglich"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Die App oder deine Organisation lässt das Erstellen von Screenshots nicht zu"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string>
@@ -277,8 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertbehälter"</string>
<string name="start_dreams" msgid="5640361424498338327">"Bildschirmschoner"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Halte die Symbole gedrückt, um weitere Optionen zu sehen"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nicht stören"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Nur wichtige Unterbrechungen"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Nur Wecker"</string>
@@ -353,7 +352,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"An bei Sonnenuntergang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Bis Sonnenaufgang"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"An um <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Bis <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ist deaktiviert"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ist aktiviert"</string>
@@ -437,7 +437,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nimmt alle auf deinem Bildschirm angezeigten Aktivitäten auf."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nicht erneut anzeigen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Alle löschen"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Mit \"Bitte nicht stören\" werden Benachrichtigungen ausgeblendet"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Benachrichtigungen werden durch \"Bitte nicht stören\" ausgeblendet"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Jetzt starten"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Keine Benachrichtigungen"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil wird möglicherweise überwacht."</string>
@@ -543,7 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Zum Aktivieren der Vibration tippen."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Zum Stummschalten tippen."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Lautstärkeregler von %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Anrufe und Benachrichtigungen per Klingelton"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medienausgabe"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonanrufausgabe"</string>
<string name="output_none_found" msgid="5544982839808921091">"Keine Geräte gefunden"</string>
@@ -630,6 +633,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> – <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"Benachrichtigungseinstellungen"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Optionen für spätere Erinnerung bei Benachrichtigungen"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"RÜCKGÄNGIG"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Erinnerung in <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -693,6 +698,8 @@
<string name="battery" msgid="7498329822413202973">"Akku"</string>
<string name="clock" msgid="7416090374234785905">"Uhr"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Mit Kopfhörer verbunden"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Mit Headset verbunden"</string>
<string name="data_saver" msgid="5037565123367048522">"Datenverbrauch reduzieren"</string>
@@ -727,11 +734,9 @@
<string name="right_keycode" msgid="708447961000848163">"Rechter Keycode"</string>
<string name="left_icon" msgid="3096287125959387541">"Linkes Symbol"</string>
<string name="right_icon" msgid="3952104823293824311">"Rechtes Symbol"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Halten und ziehen, um Kacheln hinzuzufügen"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Zum Entfernen hierher ziehen"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Du brauchst mindestens sechs Kacheln"</string>
<string name="qs_edit" msgid="2232596095725105230">"Bearbeiten"</string>
<string name="tuner_time" msgid="6572217313285536011">"Uhrzeit"</string>
<string-array name="clock_options">
@@ -818,6 +823,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Nachrichten"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Speicher"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hinweise"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Bei Instant-Apps ist keine vorherige Installation erforderlich."</string>
<string name="app_info" msgid="6856026610594615344">"App-Informationen"</string>
@@ -835,12 +841,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ersetzen"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps, die im Hintergrund ausgeführt werden"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Für Details zur Akku- und Datennutzung tippen"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Mobile Daten deaktivieren?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Du kannst dann nicht mehr über <xliff:g id="CARRIER">%s</xliff:g> auf Daten und das Internet zugreifen. Das Internet ist nur noch über WLAN verfügbar."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"deinen Mobilfunkanbieter"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Deine Eingabe wird von \"Einstellungen\" nicht erkannt, weil die Berechtigungsanfrage von einer App verdeckt wird."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> erlauben, Teile von <xliff:g id="APP_2">%2$s</xliff:g> anzuzeigen?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– Darf Informationen aus <xliff:g id="APP">%1$s</xliff:g> lesen"</string>
@@ -848,4 +851,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> darf Teile aus jeder beliebigen App anzeigen"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Zulassen"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Ablehnen"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tippen zum Planen des Energiesparmodus"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Automatisch aktivieren bei einem Akkustand von <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nein danke"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Geplanter Energiesparmodus aktiviert"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Der Energiesparmodus wird bei einem Akkustand von <xliff:g id="PERCENTAGE">%d</xliff:g>%% automatisch aktiviert."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Einstellungen"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings_tv.xml b/packages/SystemUI/res/values-de/strings_tv.xml
index adae259..6859813 100644
--- a/packages/SystemUI/res/values-de/strings_tv.xml
+++ b/packages/SystemUI/res/values-de/strings_tv.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_tv_pip" msgid="134047986446577723">"Bild im Bild"</string>
- <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Kein Programmtitel)"</string>
+ <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Kein Sendungsname gefunden)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP schließen"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Vollbild"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index bdb5aa9..b7823b3 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Εν εξελίξει"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Χαμηλή στάθμη μπαταρίας"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Χαμηλή στάθμη μπαταρίας. Ενεργοποιήστε την Εξοικονόμηση μπαταρίας"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Απομένουν <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Απομένει <xliff:g id="PERCENTAGE">%s</xliff:g>, περίπου <xliff:g id="TIME">%s</xliff:g> με βάση τη χρήση σας"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Απομένει <xliff:g id="PERCENTAGE">%s</xliff:g>, περίπου <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Στιγμιότυπο οθόνης"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Αποθήκ. στιγμιότυπου οθόνης..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Αποθήκευση στιγμιότυπου οθόνης..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Γίνεται αποθήκευση του στιγμιότυπου οθόνης"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Το στιγμιότυπο οθόνης αποθηκεύτηκε"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Πατήστε για να δείτε το στιγμιότυπο οθόνης που δημιουργήσατε"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Αδύνατη η λήψη του στιγμιότυπου οθόνης."</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Παρουσιάστηκε πρόβλημα κατά την αποθήκευση του στιγμιότυπου οθόνης"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Μη δυνατή αποθήκευση του στιγμιότυπου οθόνης"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Δοκιμάστε να κάνετε ξανά λήψη του στιγμιότυπου οθόνης"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Αδύνατη η αποθήκευση του στιγμιότυπου οθόνης λόγω περιορισμένου αποθηκευτικού χώρου"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Η λήψη στιγμιότυπων οθόνης δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Επιλογές μεταφοράς αρχείων μέσω USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Επιδόρπιο"</string>
<string name="start_dreams" msgid="5640361424498338327">"Προφύλαξη οθόνης"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Αγγίξτε παρατεταμένα τα εικονίδια, για να δείτε περισσότερες επιλογές"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Μην ενοχλείτε"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Μόνο προτεραιότητας"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Μόνο ειδοποιήσεις"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Κατά τη δύση"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Μέχρι την ανατολή"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ενεργοποίηση στις <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Έως τις <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Έως τις <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Το NFC είναι απενεργοποιημένο"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Το NFC είναι ενεργοποιημένο"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Θα ξεκινήσει η καταγραφή του περιεχομένου που εμφανίζεται στην οθόνη σας από την εφαρμογή <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Να μην εμφανιστεί ξανά"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Διαγραφή όλων"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Διαχείριση ειδοποιήσεων"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Έναρξη τώρα"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Το προφίλ ενδέχεται να παρακολουθείται"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Πατήστε για να ενεργοποιήσετε τη δόνηση."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Πατήστε για σίγαση."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s στοιχεία ελέγχου έντασης ήχου"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Θα υπάρχει ηχητική ειδοποίηση για κλήσεις και ειδοποιήσεις"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Έξοδος μέσων"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Έξοδος τηλεφωνικής κλήσης"</string>
<string name="output_none_found" msgid="5544982839808921091">"Δεν βρέθηκαν συσκευές"</string>
@@ -625,7 +624,8 @@
<string name="inline_undo" msgid="558916737624706010">"Αναίρεση"</string>
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"στοιχεία ελέγχου ειδοποιήσεων"</string>
- <string name="notification_menu_snooze_description" msgid="3653669438131034525">"επιλογές αφύπνισης ειδοποιήσεων"</string>
+ <string name="notification_menu_snooze_description" msgid="3653669438131034525">"επιλογές αναβολής ειδοποιήσεων"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Αναβολή αφύπνισης"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ΑΝΑΙΡΕΣΗ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Σε αναβολή για <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Μπαταρία"</string>
<string name="clock" msgid="7416090374234785905">"Ρολόι"</string>
<string name="headset" msgid="4534219457597457353">"Ακουστικά"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Τα ακουστικά συνδέθηκαν"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Τα ακουστικά συνδέθηκαν"</string>
<string name="data_saver" msgid="5037565123367048522">"Εξοικονόμηση δεδομένων"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Στιγμιότυπα οθόνης"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Γενικά μηνύματα"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Αποθηκευτικός χώρος"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Συμβουλές"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Εφαρμογές"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση."</string>
<string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Να επιτρέπεται στην εφαρμογή <xliff:g id="APP">%1$s</xliff:g> να εμφανίζει τμήματα από οποιαδήποτε εφαρμογή"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Επιτρέπεται"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Δεν επιτρέπεται"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Πατήστε για προγραμματισμό της Εξοικονόμησης μπαταρίας"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Αυτόματη ενεργοποίηση όταν η στάθμη της μπαταρίας είναι στο <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Όχι, ευχαριστώ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Το χρονοδιάγραμμα της Εξοικονόμησης μπαταρίας ενεργοποιήθηκε"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Η Εξοικονόμηση μπαταρίας θα ενεργοποιηθεί αυτόματα μόλις η στάθμη της μπαταρίας φτάσει κάτω από <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ρυθμίσεις"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Το κατάλαβα"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index c7ddc3e..d329fbc 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is low"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is low. Turn on Battery Saver"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left based on your usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot is being saved"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot saved"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap to view your screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Couldn\'t capture screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problem encountered while saving screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Couldn\'t save screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Do not disturb is hiding notifications"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Manage notifications"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Do Not Disturb is hiding notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"notification snooze options"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Clock"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphones connected"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset connected"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Allow <xliff:g id="APP">%1$s</xliff:g> to show slices from any app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Allow"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Deny"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap to schedule Battery Saver"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Turn on automatically when battery is at <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No thanks"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver schedule turned on"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Battery Saver will turn on automatically once battery goes below <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 5649557..3ba2cff 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is low"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is low. Turn on Battery Saver"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left based on your usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot is being saved"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot saved"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap to view your screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Couldn\'t capture screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problem encountered while saving screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Couldn\'t save screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Do not disturb is hiding notifications"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Manage notifications"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Do Not Disturb is hiding notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"notification snooze options"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Clock"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphones connected"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset connected"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Allow <xliff:g id="APP">%1$s</xliff:g> to show slices from any app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Allow"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Deny"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap to schedule Battery Saver"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Turn on automatically when battery is at <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No thanks"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver schedule turned on"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Battery Saver will turn on automatically once battery goes below <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index c7ddc3e..d329fbc 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is low"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is low. Turn on Battery Saver"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left based on your usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot is being saved"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot saved"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap to view your screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Couldn\'t capture screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problem encountered while saving screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Couldn\'t save screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Do not disturb is hiding notifications"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Manage notifications"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Do Not Disturb is hiding notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"notification snooze options"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Clock"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphones connected"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset connected"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Allow <xliff:g id="APP">%1$s</xliff:g> to show slices from any app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Allow"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Deny"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap to schedule Battery Saver"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Turn on automatically when battery is at <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No thanks"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver schedule turned on"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Battery Saver will turn on automatically once battery goes below <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index c7ddc3e..d329fbc 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is low"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is low. Turn on Battery Saver"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left based on your usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot is being saved"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot saved"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap to view your screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Couldn\'t capture screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problem encountered while saving screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Couldn\'t save screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Do not disturb is hiding notifications"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Manage notifications"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Do Not Disturb is hiding notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"notification snooze options"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Clock"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphones connected"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset connected"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Allow <xliff:g id="APP">%1$s</xliff:g> to show slices from any app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Allow"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Deny"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap to schedule Battery Saver"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Turn on automatically when battery is at <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No thanks"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver schedule turned on"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Battery Saver will turn on automatically once battery goes below <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 783160c..11e6b34 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Battery is low"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Battery is low. Turn on Battery Saver"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left based on your usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> remaining, about <xliff:g id="TIME">%s</xliff:g> left"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot is being saved"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot saved"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap to view your screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Couldn\'t capture screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problem encountered while saving screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Couldn\'t save screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Taking screenshots isn\'t allowed by the app or your organization"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"On at sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Do Not disturb is hiding notifications"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Manage notifications"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Do Not Disturb is hiding notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Calls and notifications will ring"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"notification controls"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"notification snooze options"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Battery"</string>
<string name="clock" msgid="7416090374234785905">"Clock"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphones connected"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset connected"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Allow <xliff:g id="APP">%1$s</xliff:g> to show slices from any app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Allow"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Deny"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap to schedule Battery Saver"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Turn on automatically when battery is at <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No thanks"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver schedule turned on"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Battery Saver will turn on automatically once battery goes below <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Got it"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 4cc3dbf..644eb30 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batería baja"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca batería. Activa el Ahorro de batería"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de batería."</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Batería: <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">%s</xliff:g>)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Batería: <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado: <xliff:g id="TIME">%s</xliff:g>)"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura de pantalla"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando la captura de pantalla..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Se está guardando la captura de pantalla"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Se guardó la captura de pantalla"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Presiona para ver la captura de pantalla"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"No se pudo tomar la captura de pantalla"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Se produjo un error al guardar la captura de pantalla"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"No se puede guardar la captura de pantalla debido a que no hay suficiente espacio de almacenamiento"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"La app o tu organización no permiten las capturas de pantalla"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Mantén presionados los íconos para ver más opciones"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioridad"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"A la(s) <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Hasta la(s) <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La tecnología NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La tecnología NFC está habilitada"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comenzará la captura de todo lo que se muestre en la pantalla."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"El modo No interrumpir oculta las notificaciones"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"No interrumpir oculta las notificaciones"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Comenzar ahora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Es posible que se supervise el perfil."</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Presiona para establecer el modo vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Presiona para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Sonarán las llamadas y notificaciones"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Salida de llamada telefónica"</string>
<string name="output_none_found" msgid="5544982839808921091">"No se encontraron dispositivos"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controles de notificación"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opciones para posponer notificaciones"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posponer <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Batería"</string>
<string name="clock" msgid="7416090374234785905">"Reloj"</string>
<string name="headset" msgid="4534219457597457353">"Auriculares"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auriculares conectados"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auriculares conectados"</string>
<string name="data_saver" msgid="5037565123367048522">"Reducir datos"</string>
@@ -725,11 +732,9 @@
<string name="right_keycode" msgid="708447961000848163">"Clave de código derecho"</string>
<string name="left_icon" msgid="3096287125959387541">"Ícono izquierdo"</string>
<string name="right_icon" msgid="3952104823293824311">"Ícono derecho"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Mantén presionado para agregar mosaicos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra aquí para quitar"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Necesitas al menos 6 mosaicos"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
<string name="tuner_time" msgid="6572217313285536011">"Hora"</string>
<string-array name="clock_options">
@@ -816,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de pantalla"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensajes generales"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Sugerencias"</string>
<string name="instant_apps" msgid="6647570248119804907">"Apps instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Las Apps instantáneas no requieren instalación."</string>
<string name="app_info" msgid="6856026610594615344">"Información de apps"</string>
@@ -833,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Reemplazar"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps que se ejecutan en segundo plano"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Presiona para obtener información sobre el uso de datos y de la batería"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"¿Deseas desactivar los datos móviles?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"No tendrás acceso a datos ni Internet de <xliff:g id="CARRIER">%s</xliff:g>. Internet solo estará disponible mediante Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"tu proveedor"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Como una app está bloqueando una solicitud de permiso, Configuración no puede verificar tu respuesta."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"¿Permitir que <xliff:g id="APP_0">%1$s</xliff:g> muestre fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Puede leer información sobre <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -846,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que <xliff:g id="APP">%1$s</xliff:g> muestre fragmentos de cualquier app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Rechazar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Presiona para programar el Ahorro de batería"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Activar automáticamente cuando quede <xliff:g id="PERCENTAGE">%d</xliff:g>%% de batería"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No, gracias"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Se activó la programación del Ahorro de batería"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"El Ahorro de batería se activará automáticamente cuando quede menos de <xliff:g id="PERCENTAGE">%d</xliff:g>%% de batería."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index ef4d35a..8eb35e6 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batería baja"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca batería. Activa la función Ahorro de batería"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de batería"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">%s</xliff:g>)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado: <xliff:g id="TIME">%s</xliff:g>)"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando captura..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"La captura de pantalla se está guardando"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Se ha guardado la captura de pantalla"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toca para ver la captura de pantalla"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"No se ha podido guardar la captura de pantalla"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"No se ha podido guardar la captura de pantalla"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"No se puede guardar la captura de pantalla porque no hay espacio de almacenamiento suficiente"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
@@ -350,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Hora: <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Hasta: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La conexión NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La conexión NFC está habilitada"</string>
@@ -434,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"El modo No molestar oculta las notificaciones"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"El modo No molestar oculta las notificaciones"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar ahora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Es posible que se supervise el perfil"</string>
@@ -540,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para activar la vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Las llamadas y las notificaciones sonarán"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Salida de llamadas"</string>
<string name="output_none_found" msgid="5544982839808921091">"No se ha podido encontrar ningún dispositivo"</string>
@@ -627,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"Controles de las notificaciones"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Opciones para posponer las notificaciones"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Volverá a mostrarse en <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -690,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Batería"</string>
<string name="clock" msgid="7416090374234785905">"Reloj"</string>
<string name="headset" msgid="4534219457597457353">"Auriculares"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auriculares conectados"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auriculares conectados"</string>
<string name="data_saver" msgid="5037565123367048522">"Ahorro de datos"</string>
@@ -813,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de pantalla"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensajes generales"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Sugerencias"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicaciones Instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"No es necesario instalar las Aplicaciones Instantáneas."</string>
<string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string>
@@ -840,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que <xliff:g id="APP">%1$s</xliff:g> muestre fragmentos de cualquier aplicación"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Denegar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tocar para programar el modo Ahorro de batería"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Activar automáticamente cuando quede un <xliff:g id="PERCENTAGE">%d</xliff:g> %% de batería"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No, gracias"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Se ha activado la programación del modo Ahorro de batería"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"El modo Ahorro de batería se activará automáticamente cuando quede menos de un <xliff:g id="PERCENTAGE">%d</xliff:g> %% de batería."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ajustes"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 07f0a5b..1013c4a 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Jätkuv"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Märguanded"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Aku hakkab tühjaks saama"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Aku hakkab tühjaks saama. Lülitage sisse akusäästja"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Jäänud on <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> on alles, teie kasutuse põhjal on jäänud umbes <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> on alles, umbes <xliff:g id="TIME">%s</xliff:g> on jäänud"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekraanipilt"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Kuvatõmmise salvestamine ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Kuvatõmmise salvestamine ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Ekraanipilti salvestatakse"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Ekraanipilt salvestati"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Puudutage ekraanipildi vaatamiseks"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ekraanipilti ei saanud jäädvustada"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Ekraanipildi salvestamisel ilmnes probleem"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Piiratud salvestusruumi tõttu ei saa ekraanipilti salvestada"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-failiedastuse valikud"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Maiustusekorv"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekraanisäästja"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Lisavalikute nägemiseks vajutage pikalt ikoone"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mitte segada"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Ainult prioriteetsed"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ainult äratused"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Sissel. päikeselooj."</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuni päikesetõusuni"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Sisselülitam. kell <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on keelatud"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on lubatud"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> hakkab jäädvustama kõike, mida ekraanil kuvatakse."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ära kuva uuesti"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tühjenda kõik"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Režiim Mitte segada peidab märguandeid"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Režiim Mitte segada peidab märguandeid"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Alusta kohe"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Märguandeid pole"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profiili võidakse jälgida"</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Puudutage vibreerimise määramiseks."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Puudutage vaigistamiseks."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Helitugevuse juhtnupud: %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Kõnede ja märguannete puhul kõlab helin"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Meediaväljund"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonikõne väljund"</string>
<string name="output_none_found" msgid="5544982839808921091">"Seadmeid ei leitud"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"märguannete juhtnupud"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"märguannete edasilükkamise valikud"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VÕTA TAGASI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Edasi lükatud <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Aku"</string>
<string name="clock" msgid="7416090374234785905">"Kell"</string>
<string name="headset" msgid="4534219457597457353">"Peakomplekt"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Kõrvaklapid on ühendatud"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Peakomplekt on ühendatud"</string>
<string name="data_saver" msgid="5037565123367048522">"Andmeside mahu säästja"</string>
@@ -814,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekraanipildid"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Üldised sõnumid"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Salvestusruum"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Vihjed"</string>
<string name="instant_apps" msgid="6647570248119804907">"Installimata avatavad rakendused"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Installimata avatavaid rakendusi pole vaja installida."</string>
<string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string>
@@ -841,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Luba rakendus <xliff:g id="APP">%1$s</xliff:g>, et kuvada lõike mis tahes rakendusest"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Luba"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Keela"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Puudutage akusäästja ajastamiseks"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Lülita automaatselt sisse, kui aku tase langeb alla <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Tänan, ei"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Automaatne akusäästja on sisse lülitatud"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Kui aku tase langeb alla <xliff:g id="PERCENTAGE">%d</xliff:g>%%, lülitub akusäästja automaatselt sisse."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Seaded"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selge"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 0c7bd4e..dc9ba53 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Abian"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Jakinarazpenak"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateria agortzen ari da"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Bateria gutxi gelditzen da. Aktibatu Bateria-aurrezlea."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> gelditzen da"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> gelditzen da; <xliff:g id="TIME">%s</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> gelditzen da; <xliff:g id="TIME">%s</xliff:g> inguru gelditzen dira"</string>
@@ -64,7 +63,7 @@
<string name="always_use_device" msgid="4015357883336738417">"Ireki <xliff:g id="APPLICATION">%1$s</xliff:g> <xliff:g id="USB_DEVICE">%2$s</xliff:g> konektatzen den guztietan"</string>
<string name="always_use_accessory" msgid="3257892669444535154">"Ireki <xliff:g id="APPLICATION">%1$s</xliff:g> <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> konektatzen den guztietan"</string>
<string name="usb_debugging_title" msgid="4513918393387141949">"USB arazketa onartu?"</string>
- <string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren hatz-marka hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Pantaila-argazkia"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Pantaila-argazkia gordetzen…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Pantaila-argazkia gordetzen…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Pantaila-argazkia gordetzen ari da"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Gorde da pantaila-argazkia"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Sakatu pantaila-argazkia ikusteko"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ezin izan da atera pantaila-argazkia"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Arazo bat izan da pantaila-argazkia gordetzean"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ezin da gorde pantaila-argazkia ez delako gelditzen tokirik"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB fitxategiak transferitzeko aukerak"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Postreen kutxa"</string>
<string name="start_dreams" msgid="5640361424498338327">"Pantaila-babeslea"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Aukera gehiago ikusteko, eduki sakatuta ikonoak"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ez molestatu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Lehentasunezkoak soilik"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmak soilik"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ilunabarrean"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ilunabarrera arte"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> arte"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Desgaituta dago NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Gaituta dago NFC"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak pantailan bistaratzen den guztia grabatuko du."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ez erakutsi berriro"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztiak"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\"Ez molestatu\" modua jakinarazpenak ezkutatzen ari da"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"Ez molestatu\" modua jakinarazpenak ezkutatzen ari da"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Hasi"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ez dago jakinarazpenik"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Baliteke profila kontrolatuta egotea"</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Sakatu hau dardara ezartzeko."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sakatu hau audioa desaktibatzeko."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s gailuaren bolumena kontrolatzeko aukerak"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Tonua joko da deiak eta jakinarazpenak jasotzean"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Multimedia-irteera"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefono-deiaren irteera"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ez da aurkitu gailurik"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"jakinarazpena kontrolatzeko aukerak"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"jakinarazpena atzeratzeko aukerak"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESEGIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>z atzeratu da"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Erlojua"</string>
<string name="headset" msgid="4534219457597457353">"Mikrofonodun entzungailua"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Aurikularrak konektatu dira"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Mikrofonodun entzungailua konektatu da"</string>
<string name="data_saver" msgid="5037565123367048522">"Datu-aurrezlea"</string>
@@ -814,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Pantaila-argazkiak"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mezu orokorrak"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Memoria"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Aholkuak"</string>
<string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Zuzeneko aplikazioak ez dira instalatu behar."</string>
<string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string>
@@ -832,7 +840,7 @@
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplikazioak exekutatzen ari dira atzeko planoan"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko"</string>
<string name="mobile_data_disable_title" msgid="1068272097382942231">"Datu-konexioa desaktibatu nahi duzu?"</string>
- <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> erabilita ezingo dituzu erabili datuak edo Internet. Wi-Fi sare batera soilik konektatu ahal izango duzu Internetera."</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> erabilita ezingo dituzu erabili datuak edo Internet. Wi-Fi sare baten bidez soilik konektatu ahal izango zara Internetera."</string>
<string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"Uneko operadorea"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Aplikazio bat baimen-eskaera oztopatzen ari denez, ezarpenek ezin dute egiaztatu erantzuna."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> aplikazioari <xliff:g id="APP_2">%2$s</xliff:g> aplikazioaren zatiak erakustea baimendu nahi diozu?"</string>
@@ -841,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Baimendu <xliff:g id="APP">%1$s</xliff:g> aplikazioari edozein aplikazioren zatiak erakustea"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Baimendu"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Ukatu"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Sakatu bateria-aurrezlea noiz aktibatu antolatzeko"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktibatu automatikoki bateriaren %% <xliff:g id="PERCENTAGE">%d</xliff:g> gelditzen denean"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ez"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Bateria-aurrezle aktibatu da"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Bateria-aurrezlea automatikoki aktibatuko da bateriaren %% <xliff:g id="PERCENTAGE">%d</xliff:g> gelditzen denean."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ezarpenak"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ados"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 9dcdf68..a52c3474 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -33,14 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلانها"</string>
<string name="battery_low_title" msgid="6456385927409742437">"شارژ باتری کم است"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"شارژ باتری کم است. «بهینهسازی باتری» را روشن کنید"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی مانده است"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی مانده، براساس میزان مصرف شما حدود <xliff:g id="TIME">%s</xliff:g> باقی مانده است"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی مانده، حدود <xliff:g id="TIME">%s</xliff:g> باقی مانده است"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی مانده است. بهینهسازی باتری روشن است."</string>
- <string name="invalid_charger" msgid="4549105996740522523">"شارژ USB پشتیبانی نمیشود.\nفقط از شارژر ارائه شده استفاده کنید."</string>
- <string name="invalid_charger_title" msgid="3515740382572798460">"شارژ با USB پشتیبانی نمیشود."</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"فقط از شارژر ارائه شده استفاده کنید."</string>
+ <string name="invalid_charger" msgid="2741987096648693172">"ازطریق USB شارژ نمیشود. از شارژر ارائهشده با دستگاه استفاده کنید."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"ازطریق USB شارژ نمیشود"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"از شارژر ارائهشده با دستگاه استفاده کنید"</string>
<string name="battery_low_why" msgid="4553600287639198111">"تنظیمات"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"بهینهسازی باتری روشن شود؟"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"روشن کردن"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"عکس صفحهنمایش"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"در حال ذخیره عکس صفحهنمایش..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"در حال ذخیره عکس صفحهنمایش..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"عکس صفحهنمایش درحال ذخیره شدن است"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"عکس صفحهنمایش ذخیره شد"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"برای مشاهده عکس صفحهنمایشتان ضربه بزنید"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"عکس صفحهنمایش گرفته نشد"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"هنگام ذخیره کردن عکس صفحهنمایش مشکلی پیش آمد"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"عکس صفحهنمایش ذخیره نشد"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"دوباره عکس صفحهنمایش بگیرید"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"به دلیل محدود بودن فضای ذخیرهسازی نمیتوان عکس صفحهنمایش را ذخیره کرد"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"برنامه یا سازمان شما اجازه نمیدهند عکس صفحهنمایش بگیرید."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"گزینههای انتقال فایل USB"</string>
@@ -103,8 +101,7 @@
<string name="camera_label" msgid="7261107956054836961">"باز کردن دوربین"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرحبندی جدید کار"</string>
<string name="cancel" msgid="6442560571259935130">"لغو"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"نماد برنامه"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"بخش پیام راهنما"</string>
@@ -148,28 +145,28 @@
<string name="accessibility_desc_off" msgid="6475508157786853157">"خاموش."</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"متصل."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"در حال مرتبط شدن."</string>
- <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
- <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
- <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
- <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
- <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
- <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
- <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
- <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
- <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"رومینگ"</string>
- <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
+ <string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
+ <string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
+ <string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
+ <string name="data_connection_3_5g_plus" msgid="7570783890290275297">"3.5G+"</string>
+ <string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
+ <string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
+ <string name="data_connection_lte" msgid="2694876797724028614">"LTE"</string>
+ <string name="data_connection_lte_plus" msgid="3423013208570937424">"LTE+"</string>
+ <string name="data_connection_cdma" msgid="4677985502159869585">"CDMA"</string>
+ <string name="data_connection_roaming" msgid="6037232010953697354">"رومینگ"</string>
+ <string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"بدون سیم کارت."</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"داده تلفن همراه"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"داده تلفن همراه روشن"</string>
- <string name="accessibility_cell_data_off" msgid="443267573897409704">"داده تلفن همراه خاموش"</string>
+ <string name="cell_data_off" msgid="5287705247512911922">"داده تلفن همراه خاموش است"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"اتصال اینترنت با بلوتوث تلفن همراه."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"حالت هواپیما."</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN روشن است."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"سیمکارتی موجود نیست."</string>
- <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"تغییر شبکه شرکت مخابراتی."</string>
+ <string name="carrier_network_change_mode" msgid="8149202439957837762">"تغییر شبکه شرکت مخابراتی"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"باز کردن جزئیات باتری"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"باتری <xliff:g id="NUMBER">%d</xliff:g> درصد."</string>
<string name="accessibility_battery_level_charging" msgid="1147587904439319646">"در حال شارژ باتری، <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> درصد"</string>
@@ -208,7 +205,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"حالت هواپیما روشن است."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"حالت هواپیما خاموش شد."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"حالت هواپیما روشن شد."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"«مزاحم نشوید» روشن است، فقط اولویتدار."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"«مزاحم نشوید» روشن است."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"حالت «مزاحم نشوید» روشن است، سکوت کامل."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"حالت «مزاحم نشوید» روشن است، فقط هشدارها."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"مزاحم نشوید."</string>
@@ -274,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ویترین دسر"</string>
<string name="start_dreams" msgid="5640361424498338327">"محافظ صفحه"</string>
<string name="ethernet_label" msgid="7967563676324087464">"اترنت"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"برای گزینههای بیشتر، نمادها را لمس کنید و نگهدارید"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"مزاحم نشوید"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"فقط اولویتدار"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"فقط هشدارها"</string>
@@ -288,6 +284,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"هدست"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ورودی"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"روشن کردن…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"روشنایی"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"چرخش خودکار"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"چرخش خودکار صفحهنمایش"</string>
@@ -312,7 +309,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi خاموش است"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi روشن"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"هیچ شبکه Wi-Fi موجود نیست"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"هشدار"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"روشن کردن…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"فرستادن"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"در حال فرستادن"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"دستگاه بدون نام"</string>
@@ -329,7 +326,8 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"در حال اتصال..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"اتصال به اینترنت با تلفن همراه"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"درحال روشن کردن…"</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"روشن کردن…"</string>
+ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="5672131949987422420">"صرفهجویی داده روشن است"</string>
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="one">%d دستگاه</item>
<item quantity="other">%d دستگاه</item>
@@ -343,13 +341,12 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استفاده شده"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> محدودیت"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"هشدار <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"نمایه کاری"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"اعلانها و برنامهها خاموش است"</string>
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"نمایه کاری"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"نور شب"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"غروب روشن میشود"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"تا طلوع"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ساعت <xliff:g id="TIME">%s</xliff:g> روشن میشود"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"تا <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"تا <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیرفعال است"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال است"</string>
@@ -397,9 +394,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"سکوت\nکامل"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"فقط\nاولویتدار"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"فقط\nهشدارها"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"در حال شارژ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"در حال شارژ سریع (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"در حال شارژ آهسته (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ شدن (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ سریع (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ آهسته (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"تغییر کاربر"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"تعویض کاربر، کاربر کنونی <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"کاربر کنونی <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -433,6 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> شروع به ضبط هر چیزی میکند که در صفحهنمایش شما نمایش داده میشود."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"دوباره نشان داده نشود"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"پاک کردن همه موارد"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"مدیریت اعلانها"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"«مزاحم نشوید» اعلانها را پنهان میکند"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"اکنون شروع شود"</string>
<string name="empty_shade_text" msgid="708135716272867002">"اعلانی موجود نیست"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"شاید نمایه کنترل شود"</string>
@@ -500,6 +499,7 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"راهاندازی"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"اکنون خاموش کنید"</string>
+ <string name="accessibility_volume_settings" msgid="4915364006817819212">"تنظیمات صدا"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"بزرگ کردن"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"کوچک کردن"</string>
<string name="accessibility_output_chooser" msgid="8185317493017988680">"تغییر دستگاه خروجی"</string>
@@ -537,6 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. برای تنظیم روی لرزش، ضربه بزنید."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. برای بیصدا کردن ضربه بزنید."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s کنترلهای میزان صدا"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"خروجی رسانه"</string>
<string name="output_calls_title" msgid="8717692905017206161">"خروجی تماس تلفنی"</string>
<string name="output_none_found" msgid="5544982839808921091">"دستگاهی پیدا نشد"</string>
@@ -592,12 +594,27 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"با کنترلهای قدرتمند اعلان میتوانید سطح اهمیت اعلانهای هر برنامه را از ۰ تا ۵ تعیین کنید. \n\n"<b>"سطح ۵"</b>" \n- در صدر فهرست اعلانها نشان داده میشود \n- وقفه برای نمایش تمامصفحه مجاز است \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۴"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۳"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n\n"<b>"سطح ۲"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا و لرزش ایجاد نمیکند \n\n"<b>"سطح ۱"</b>" \n- نمایش تمام صفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا یا لرزش ایجاد نمیکند \n- در قفل صفحه و نوار وضعیت پنهان است \n- در پایین فهرست اعلانها نشان داده میشود \n\n"<b>"سطح ۰"</b>" \n- همه اعلانهای این برنامه مسدود است"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"اعلانها"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"دیگر این اعلانها را نخواهید دید"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"این اعلانها کوچک خواهد شد"</string>
<string name="inline_blocking_helper" msgid="3055064577771478591">"معمولاً این اعلانها را رد میکنید. \nهمچنان نشان داده شود؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"نمایش این اعلانها ادامه یابد؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"توقف اعلانها"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string>
+ <string name="inline_minimize_button" msgid="966233327974702195">"کوچک کردن"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"نمیتوان این اعلانها را خاموش کرد"</string>
+ <string name="notification_appops_camera_active" msgid="730959943016785931">"دوربین"</string>
+ <string name="notification_appops_microphone_active" msgid="1546319728924580686">"میکروفون"</string>
+ <string name="notification_appops_overlay_active" msgid="633813008357934729">"نمایش روی برنامههای دیگر در صفحهنمایش"</string>
+ <plurals name="notification_appops" formatted="false" msgid="1258122060887196817">
+ <item quantity="one">این برنامه <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> و <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g> است.</item>
+ <item quantity="other">این برنامه <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> و <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g> است.</item>
+ </plurals>
+ <plurals name="notification_using" formatted="false" msgid="2211008461429037973">
+ <item quantity="one">با استفاده از <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> و <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ <item quantity="other">با استفاده از <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> و <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ </plurals>
+ <string name="notification_appops_settings" msgid="1028328314935908050">"تنظیمات"</string>
+ <string name="notification_appops_ok" msgid="602562195588819631">"تأیید"</string>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> باز شد"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> بسته شد"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"مجاز کردن اعلانهای این کانال"</string>
@@ -608,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"کنترلهای اعلان"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"گزینههای تعویق اعلان"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"تعویق"</string>
<string name="snooze_undo" msgid="6074877317002985129">"واگرد"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> به تعویق افتاد"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -671,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"باتری"</string>
<string name="clock" msgid="7416090374234785905">"ساعت"</string>
<string name="headset" msgid="4534219457597457353">"هدست"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"هدفون وصل شد"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"هدست وصل شد"</string>
<string name="data_saver" msgid="5037565123367048522">"صرفهجویی داده"</string>
@@ -705,8 +725,9 @@
<string name="right_keycode" msgid="708447961000848163">"کدکلید راست"</string>
<string name="left_icon" msgid="3096287125959387541">"نماد چپ"</string>
<string name="right_icon" msgid="3952104823293824311">"نماد راست"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"برای افزودن کاشی، بکشید"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"نگهداشتن و کشیدن برای افزودن کاشی"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"برای حذف، به اینجا بکشید"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"حداقل به ۶ کاشی نیاز دارید"</string>
<string name="qs_edit" msgid="2232596095725105230">"ویرایش"</string>
<string name="tuner_time" msgid="6572217313285536011">"زمان"</string>
<string-array name="clock_options">
@@ -750,7 +771,7 @@
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"بستن تنظیمات سریع."</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"تنظیم زنگ ساعت."</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"با <xliff:g id="ID_1">%s</xliff:g> به سیستم وارد شدهاید"</string>
- <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"عدم اتصال به اینترنت."</string>
+ <string name="data_connection_no_internet" msgid="4503302451650972989">"عدم اتصال به اینترنت"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"باز کردن جزئیات."</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"باز کردن تنظیمات <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ویرایش ترتیب تنظیمات."</string>
@@ -793,11 +814,13 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"عکسهای صفحهنمایش"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"پیامهای عمومی"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"فضای ذخیرهسازی"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"نکات"</string>
<string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string>
<string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string>
<string name="go_to_web" msgid="2650669128861626071">"رفتن به مرورگر"</string>
<string name="mobile_data" msgid="7094582042819250762">"داده تلفن همراه"</string>
+ <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%s</xliff:g> — <xliff:g id="ID_2">%s</xliff:g>"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi خاموش است"</string>
<string name="bt_is_off" msgid="2640685272289706392">"بلوتوث خاموش است"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"«مزاحم نشوید» خاموش است"</string>
@@ -809,7 +832,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"جایگزین کردن"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"برنامههایی که در پسزمینه اجرا میشوند"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"برای جزئیات مربوط به مصرف باتری و داده، ضربه بزنید"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"داده شبکه تلفن همراه خاموش شود؟"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"داده تلفن همراه خاموش شود؟"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"نمیتوانید ازطریق <xliff:g id="CARRIER">%s</xliff:g> به داده یا اینترنت دسترسی داشته باشید. اینترنت فقط ازطریق Wi-Fi دردسترس خواهد بود."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"شرکت مخابراتی شما"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"چون برنامهای درحال ایجاد تداخل در درخواست مجوز است، «تنظیمات» نمیتواند پاسخ شما را تأیید کند."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"به <xliff:g id="APP_0">%1$s</xliff:g> اجازه داده شود تکههای <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد؟"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- میتواند اطلاعات <xliff:g id="APP">%1$s</xliff:g> را بخواند"</string>
@@ -817,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"به <xliff:g id="APP">%1$s</xliff:g> اجازه داده شود تکههایی از برنامهها نشان دهد"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"مجاز"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"رد کردن"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"برای زمانبندی «بهینهسازی باتری» ضربه بزنید"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"وقتی شارژ باتری به <xliff:g id="PERCENTAGE">%d</xliff:g>%% رسید، بهطور خودکار روشن شود"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"نه متشکرم"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"زمانبندی «بهینهسازی باتری» روشن شد"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"وقتی شارژ باتری به زیر <xliff:g id="PERCENTAGE">%d</xliff:g>%% برسد، «بهینهسازی باتری» بهطور خودکار روشن میشود."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"تنظیمات"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"متوجه شدم"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 6bf02b1..477a9e7 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Akku on vähissä"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Akku on vähissä, ota virransäästö käyttöön"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> jäljellä"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> käytettävissä, noin <xliff:g id="TIME">%s</xliff:g> jäljellä käytön perusteella"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> käytettävissä, noin <xliff:g id="TIME">%s</xliff:g> jäljellä"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Kuvakaappaus"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Tallennetaan kuvakaappausta..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Tallennetaan kuvakaappausta..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Kuvakaappausta tallennetaan"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Kuvakaappaus tallennettu"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Napauta katsoaksesi kuvakaappausta"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Kuvakaappauksen tallennus epäonnistui"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Kuvakaappausta tallennettaessa tapahtui virhe"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kuvakaappauksen tallennus epäonnistui, sillä tallennustilaa ei ole riittävästi"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Sovellus tai organisaatio ei salli kuvakaappauksien tallentamista."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-tiedostonsiirtoasetukset"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Jälkiruokavitriini"</string>
<string name="start_dreams" msgid="5640361424498338327">"Näytönsäästäjä"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Katso lisää vaihtoehtoja koskettamalla kuvakkeita pitkään"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Älä häiritse"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vain tärkeät"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vain herätykset"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Auringon laskiessa"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Auringonnousuun"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Käyttöön klo <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> saakka"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on poistettu käytöstä"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on käytössä"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkaa tallentaa kaiken näytölläsi näkyvän."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Älä näytä uudelleen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Poista kaikki"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Älä häiritse ‑tila piilottaa ilmoitukset."</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Älä häiritse ‑tila piilottaa ilmoitukset"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Aloita nyt"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ei ilmoituksia"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profiilia saatetaan valvoa"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Siirry värinätilaan napauttamalla."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Mykistä napauttamalla."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Äänenvoimakkuuden säädin: %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Puhelut ja ilmoitukset soivat"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Median äänentoisto"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Puhelun äänentoisto"</string>
<string name="output_none_found" msgid="5544982839808921091">"Laitteita ei löytynyt"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"Ilmoitusten hallinta"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Ilmoitusten torkkuasetukset"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"KUMOA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Torkku: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Akku"</string>
<string name="clock" msgid="7416090374234785905">"Kello"</string>
<string name="headset" msgid="4534219457597457353">"Kuulokemikrofoni"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Kuulokkeet liitetty"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Kuulokemikrofoni liitetty"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Kuvakaappaukset"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Yleiset viestit"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Tallennustila"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Vihjeet"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Pikasovelluksia ei tarvitse asentaa."</string>
<string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Salli sovelluksen <xliff:g id="APP">%1$s</xliff:g> näyttää osia mistä tahansa sovelluksesta"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Salli"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Estä"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Ajoita virransäästö napauttamalla"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Käynnistä automaattisesti, kun akun lataustaso on <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ei kiitos"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Virransäästön ajoitus otettu käyttöön"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Virransäästö käynnistyy automaattisesti, kun akun lataustaso on alle <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Asetukset"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selvä"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 7ceb7ee..0353868 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -33,14 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Pile faible"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"La pile est faible. Activez le mode Économie d\'énergie."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Il reste <xliff:g id="PERCENTAGE">%s</xliff:g>, environ <xliff:g id="TIME">%s</xliff:g> en fonction de votre usage"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Il reste <xliff:g id="PERCENTAGE">%s</xliff:g>, environ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants. La fonction Économie d\'énergie est activée."</string>
- <string name="invalid_charger" msgid="4549105996740522523">"Chargement USB non compatible.\nVous devez utiliser le chargeur fourni."</string>
- <string name="invalid_charger_title" msgid="3515740382572798460">"Le chargement par USB n\'est pas pris en charge."</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"Utilisez uniquement le chargeur fourni."</string>
+ <string name="invalid_charger" msgid="2741987096648693172">"Impossible de charger l\'appareil par USB. Servez-vous du chargeur fourni avec celui-ci."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Impossible de charger l\'appareil par USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Servez-vous du chargeur fourni avec votre appareil"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Paramètres"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Activer la fonction Économie d\'énergie?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Activer"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement capture écran…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Enregistrement de la capture d\'écran en cours…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Capture d\'écran enregistrée"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Touchez pour afficher votre capture d\'écran"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Impossible de réaliser une capture d\'écran"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Une erreur s\'est produite lors de l\'enregistrement de la capture d\'écran"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'application ou votre organisation n\'autorise pas les saisies d\'écran"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
@@ -103,8 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône de l\'application"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string>
@@ -148,28 +147,28 @@
<string name="accessibility_desc_off" msgid="6475508157786853157">"Désactivé"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Connecté"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Connexion."</string>
- <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
- <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1x"</string>
- <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"3G+"</string>
- <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3G+"</string>
- <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
- <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
- <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
- <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
- <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Itinérance"</string>
- <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
+ <string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
+ <string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
+ <string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
+ <string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
+ <string name="data_connection_3_5g_plus" msgid="7570783890290275297">"3.5G+"</string>
+ <string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
+ <string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
+ <string name="data_connection_lte" msgid="2694876797724028614">"LTE"</string>
+ <string name="data_connection_lte_plus" msgid="3423013208570937424">"LTE+"</string>
+ <string name="data_connection_cdma" msgid="4677985502159869585">"CDMA"</string>
+ <string name="data_connection_roaming" msgid="6037232010953697354">"Itinérance"</string>
+ <string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Aucune carte SIM"</string>
<string name="accessibility_cell_data" msgid="5326139158682385073">"Données cellulaires"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Données cellulaires activées"</string>
- <string name="accessibility_cell_data_off" msgid="443267573897409704">"Données cellulaires désactivées"</string>
+ <string name="cell_data_off" msgid="5287705247512911922">"Données cellulaires désactivées"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"RPV activé."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Aucune carte SIM."</string>
- <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Modification du réseau du fournisseur de services"</string>
+ <string name="carrier_network_change_mode" msgid="8149202439957837762">"Changer de réseau de fournisseur de services"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Ouvrir les détails de la pile"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Pile : <xliff:g id="NUMBER">%d</xliff:g> pour cent"</string>
<!-- String.format failed for translation -->
@@ -210,7 +209,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Mode Avion : activé"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Le mode Avion est désactivé."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Le mode Avion est activé."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Mode « Ne pas déranger » activé, interruptions prioritaires uniquement."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Le mode Ne pas déranger est activé."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Mode « Ne pas déranger » activé, aucune interruption"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Mode « Ne pas déranger » activé, alarmes uniquement."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Ne pas déranger."</string>
@@ -276,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="5640361424498338327">"Écran de veille"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Maintenez le doigt sur les icônes pour afficher plus d\'options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires seulement"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes seulement"</string>
@@ -290,6 +288,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Écouteurs"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation en cours…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Rotation automatique de l\'écran"</string>
@@ -314,7 +313,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi à proximité"</string>
- <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activation en cours…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Diffuser"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
@@ -331,7 +330,8 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès sans fil"</string>
- <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activation en cours…"</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"Activation en cours…"</string>
+ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="5672131949987422420">"Écon. données activée"</string>
<plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
<item quantity="one">%d appareil</item>
<item quantity="other">%d appareils</item>
@@ -345,13 +345,13 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Quantité de données utilisées :<xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil professionnel"</string>
- <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notifications et les applications sont désactivées"</string>
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"Profil professionnel"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éclairage nocturne"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Au coucher du soleil"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'au lev. soleil"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string>
@@ -399,9 +399,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Aucune\ninterruption"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorités\nuniquement"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours... (chargée à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Charge rapide en cours... (chargé dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Charge lente en cours... (chargé dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"En recharge : <xliff:g id="PERCENTAGE">%2$s</xliff:g> (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> jusqu\'à charge complète)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"En recharge rapide : <xliff:g id="PERCENTAGE">%2$s</xliff:g> (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> jusqu\'à ch. comp.)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"En recharge lente : <xliff:g id="PERCENTAGE">%2$s</xliff:g> (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> jusqu\'à ch. comp.)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -435,6 +435,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> commencer à enregistrer tout ce qui s\'affiche sur votre écran."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"le profil peut être contrôlé"</string>
@@ -502,6 +506,7 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurer"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"Désactiver maintenant"</string>
+ <string name="accessibility_volume_settings" msgid="4915364006817819212">"Paramètres sonores"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Développer"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Réduire"</string>
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Changer d\'appareil de sortie"</string>
@@ -539,6 +544,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Touchez pour activer les vibrations."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Touchez pour couper le son."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume de %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortie d\'appel téléphonique"</string>
<string name="output_none_found" msgid="5544982839808921091">"Aucun appareil trouvé"</string>
@@ -594,12 +601,27 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Avec les réglages avancés des notifications, vous pouvez définir un degré d\'importance de 0 à 5 pour les notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher dans le haut de la liste des notifications \n- Autoriser les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 4"</b>" \n- Empêcher les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 3"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n\n"<b>"Niveau 2"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n\n"<b>"Niveau 1"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n- Masquer de l\'écran de verrouillage et de la barre d\'état status bar \n- Afficher dans le bas de la liste des notifications \n\n"<b>"Level 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Vous ne verrez plus ces notifications"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"Ces notifications seront réduites"</string>
<string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez habituellement ces notifications. \nSouhaitez-vous continuer à les afficher?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuer à afficher ces notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuer à afficher"</string>
+ <string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
+ <string name="notification_appops_camera_active" msgid="730959943016785931">"l\'appareil photo"</string>
+ <string name="notification_appops_microphone_active" msgid="1546319728924580686">"le microphone"</string>
+ <string name="notification_appops_overlay_active" msgid="633813008357934729">"superpose du contenu par-dessus d\'autres applications à l\'écran"</string>
+ <plurals name="notification_appops" formatted="false" msgid="1258122060887196817">
+ <item quantity="one">Cette application <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> et <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>.</item>
+ <item quantity="other">Cette application <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> et <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>.</item>
+ </plurals>
+ <plurals name="notification_using" formatted="false" msgid="2211008461429037973">
+ <item quantity="one">utilise <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> et <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ <item quantity="other">utilise <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> et <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g></item>
+ </plurals>
+ <string name="notification_appops_settings" msgid="1028328314935908050">"Paramètres"</string>
+ <string name="notification_appops_ok" msgid="602562195588819631">"OK"</string>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Les paramètres des notifications pour <xliff:g id="APP_NAME">%1$s</xliff:g> sont ouverts"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Les paramètres des notifications pour <xliff:g id="APP_NAME">%1$s</xliff:g> sont fermés"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Autoriser les notifications de cette chaîne"</string>
@@ -610,6 +632,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"paramètres des notifications"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"options de répétition des notifications"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -673,6 +697,8 @@
<string name="battery" msgid="7498329822413202973">"Pile"</string>
<string name="clock" msgid="7416090374234785905">"Horloge"</string>
<string name="headset" msgid="4534219457597457353">"Écouteurs"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Écouteurs connectés"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Écouteurs connectés"</string>
<string name="data_saver" msgid="5037565123367048522">"Économiseur de données"</string>
@@ -707,8 +733,9 @@
<string name="right_keycode" msgid="708447961000848163">"Code de touche droit"</string>
<string name="left_icon" msgid="3096287125959387541">"Icône à gauche"</string>
<string name="right_icon" msgid="3952104823293824311">"Icône droite"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Faites glisser des tuiles pour les ajouter"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Maint. doigt sur écran, puis glissez-le pour aj. des tuiles"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Faites glisser les tuiles ici pour les supprimer"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Vous avez besoin d\'au moins six tuiles"</string>
<string name="qs_edit" msgid="2232596095725105230">"Modifier"</string>
<string name="tuner_time" msgid="6572217313285536011">"Heure"</string>
<string-array name="clock_options">
@@ -752,7 +779,7 @@
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fermer les réglages rapides."</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"Alarme activée."</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Connecté comme <xliff:g id="ID_1">%s</xliff:g>"</string>
- <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"Aucune connexion à Internet."</string>
+ <string name="data_connection_no_internet" msgid="4503302451650972989">"Aucune connexion Internet"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Ouvrir les détails."</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifier l\'ordre des paramètres."</string>
@@ -795,11 +822,14 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Saisies d\'écran"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Messages généraux"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Stockage"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string>
<string name="go_to_web" msgid="2650669128861626071">"Ouvrir le navigateur"</string>
<string name="mobile_data" msgid="7094582042819250762">"Données cellulaires"</string>
+ <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%s</xliff:g> : <xliff:g id="ID_2">%s</xliff:g>"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Le Wi-Fi est désactivé"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Le Bluetooth est désactivé"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"Le mode Ne pas déranger est désactivé"</string>
@@ -811,7 +841,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Remplacer"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Applications qui fonctionnent en arrière-plan"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Touchez pour afficher des détails sur l\'utilisation de la pile et des données"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Désactiver les données cellulaires?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Désactiver les données cellulaires?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Vous n\'aurez pas accès aux données ni à Internet avec <xliff:g id="CARRIER">%s</xliff:g>. Vous ne pourrez accéder à Internet que par Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"votre fournisseur de services"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Une application obscurcit une demande d\'autorisation, alors Paramètres ne peut pas vérifier votre réponse."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Autoriser <xliff:g id="APP_0">%1$s</xliff:g> à afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Il peut lire de l\'information de <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -819,4 +851,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des tranches de n\'importe quelle application"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 1a10610..cf032ba 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batterie faible"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batterie faible : activez l\'économiseur de batterie"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> – Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> – Temps restant : environ <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement de la capture d\'écran…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Enregistrement de la capture d\'écran…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Capture d\'écran enregistrée"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Appuyez pour afficher votre capture d\'écran"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Impossible d\'effectuer une capture d\'écran"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Erreur lors de l\'enregistrement de la capture d\'écran"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Les captures d\'écran ne sont pas autorisées par l\'application ni par votre organisation"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="5640361424498338327">"Économiseur d\'écran"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Appuyez de manière prolongée sur les icônes pour accéder à d\'autres options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires uniquement"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activé au crépuscule"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activé à <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string>
@@ -399,9 +399,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Aucune\ninterruption"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorité\nuniquement"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string>
- <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement… (rechargé à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement rapide… (à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement lent… (à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement… (rechargé à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement rapide… (à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rechargement lent… (à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va commencer à capturer tous les contenus affichés à l\'écran."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Le mode Ne pas déranger masque les notifications"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Le mode Ne pas déranger masque les notifications"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Le profil peut être contrôlé."</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Appuyez pour mettre en mode vibreur."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Appuyez pour ignorer."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Sonnerie pour les appels et les notifications"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortie de l\'appel téléphonique"</string>
<string name="output_none_found" msgid="5544982839808921091">"Aucun appareil détecté"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> : <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"paramètres des notifications"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"options de répétition des notifications"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Batterie"</string>
<string name="clock" msgid="7416090374234785905">"Horloge"</string>
<string name="headset" msgid="4534219457597457353">"Casque"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Casque connecté"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Casque connecté"</string>
<string name="data_saver" msgid="5037565123367048522">"Économiseur de données"</string>
@@ -725,11 +732,9 @@
<string name="right_keycode" msgid="708447961000848163">"Code de touche droit"</string>
<string name="left_icon" msgid="3096287125959387541">"Icône gauche"</string>
<string name="right_icon" msgid="3952104823293824311">"Icône droite"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Sélectionnez et faites glisser les tuiles pour les ajouter"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Faites glisser les tuiles ici pour les supprimer."</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Au minimum six tuiles sont nécessaires"</string>
<string name="qs_edit" msgid="2232596095725105230">"Modifier"</string>
<string name="tuner_time" msgid="6572217313285536011">"Heure"</string>
<string-array name="clock_options">
@@ -816,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Captures d\'écran"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Nouveaux messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Espace de stockage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Astuces"</string>
<string name="instant_apps" msgid="6647570248119804907">"Applis instantanées"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Les applis instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string>
@@ -833,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Remplacer"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Applications en cours d\'exécution en arrière-plan"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Appuyer pour obtenir des informations sur l\'utilisation de la batterie et des données"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Désactiver les données mobiles ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Vous n\'accéderez pas aux données mobiles ni à Internet via <xliff:g id="CARRIER">%s</xliff:g>. Internet ne sera disponible qu\'avec une connexion Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"votre opérateur"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"L\'application Paramètres ne peut pas valider votre réponse, car une application masque la demande d\'autorisation."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Autoriser <xliff:g id="APP_0">%1$s</xliff:g> à afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g> ?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Accès aux informations de <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -846,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des éléments de n\'importe quelle application"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Appuyez ici pour planifier l\'activation de l\'économiseur de batterie"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Activer automatiquement lorsque l\'autonomie de la batterie atteint <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Non, merci"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Programmation de l\'économiseur de batterie activée"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"L\'économiseur de batterie s\'active automatiquement lorsque l\'autonomie de la batterie est inférieure à <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index f22f794..5e5184f 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacións"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Queda pouca batería"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda pouca batería. Activa a función Aforro de batería"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>, é dicir, aproximadamente <xliff:g id="TIME">%s</xliff:g> en función do uso que fas"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>, é dicir, aproximadamente <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Gardando captura de pantalla…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Gardando captura de pantalla…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Estase gardando a captura de pantalla"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Gardouse a captura de pantalla"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toca para ver a captura de pantalla"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Non se puido facer a captura de pantalla"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Produciuse un problema ao gardar a captura de pantalla"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Non se puido gardar a captura de pantalla"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Volve tentar crear unha captura de pantalla"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Non se puido gardar a captura de pantalla porque o espazo de almacenamento é limitado"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"A aplicación ou a túa organización non permite realizar capturas de pantalla"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcións de transferencia USB"</string>
@@ -275,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Caixa de sobremesa"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Mantén premidas as iconas para ver máis opcións"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non molestar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Só alarmas"</string>
@@ -351,7 +348,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activación ao solpor"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ata o amencer"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activación (<xliff:g id="TIME">%s</xliff:g>)"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Ata: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Ata: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A opción NFC está desactivada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A opción NFC está activada"</string>
@@ -435,7 +432,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comezará a capturar todo o que apareza na túa pantalla."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrar outra vez"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Eliminar todas"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"O modo Non molestar está ocultando as notificacións"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Xestionar notificacións"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"O modo Non molestar está ocultando as notificacións"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Non hai notificacións"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pódese supervisar"</string>
@@ -541,7 +539,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para establecer a vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controis de volume de %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Soarán as chamadas e as notificacións"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Saída multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamadas telefónicas"</string>
<string name="output_none_found" msgid="5544982839808921091">"Non se atopou ningún dispositivo"</string>
@@ -628,6 +627,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controis de notificacións"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcións para adiar notificacións"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Adiar"</string>
<string name="snooze_undo" msgid="6074877317002985129">"DESFACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiouse <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +691,8 @@
<string name="battery" msgid="7498329822413202973">"Batería"</string>
<string name="clock" msgid="7416090374234785905">"Reloxo"</string>
<string name="headset" msgid="4534219457597457353">"Auriculares"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Conectáronse os auriculares"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Conectáronse os auriculares"</string>
<string name="data_saver" msgid="5037565123367048522">"Economizador de datos"</string>
@@ -814,6 +816,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de pantalla"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensaxes xerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Consellos"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicacións instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"As aplicacións instantáneas non precisan instalación."</string>
<string name="app_info" msgid="6856026610594615344">"Info. da aplicación"</string>
@@ -841,4 +844,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que a aplicación <xliff:g id="APP">%1$s</xliff:g> mostre partes de calquera aplicación"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Denegar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tocar para programar a función Aforro de batería"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Actívase automaticamente cando a batería está ao <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Non, grazas"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Activouse o programa da función Aforro de batería"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Activarase automaticamente a función Aforro de batería en canto o nivel de carga sexa inferior ao <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"De acordo"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 4392caf..967ed18 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ચાલુ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"નોટિફિકેશનો"</string>
<string name="battery_low_title" msgid="6456385927409742437">"બૅટરી ઓછી છે"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"બૅટરી ઓછી છે. બૅટરી સેવર ચાલુ કરો"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી, તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%s</xliff:g> બાકી છે"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી, લગભગ <xliff:g id="TIME">%s</xliff:g> બાકી"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"સ્ક્રીનશૉટ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"સ્ક્રીનશૉટ સાચવવામાં આવી રહ્યો છે"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"સ્ક્રીનશૉટ સાચવ્યો"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"તમારા સ્ક્રીનશૉટને જોવા માટે ટૅપ કરો"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"સ્ક્રીનશૉટ કૅપ્ચર કરી શકાયો નથી"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"સ્ક્રીનશૉટ સાચવવામાં સમસ્યા આવી"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"મર્યાદિત સ્ટોરેજ સ્પેસને કારણે સ્ક્રીનશૉટ સાચવી શકાતો નથી"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ઍપ્લિકેશન કે તમારી સંસ્થા દ્વારા સ્ક્રીનશૉટ લેવાની મંજૂરી નથી"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ફાઇલ ટ્રાન્સફર વિકલ્પો"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ડેઝર્ટ કેસ"</string>
<string name="start_dreams" msgid="5640361424498338327">"સ્ક્રીન સેવર"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ઇથરનેટ"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"વધુ વિકલ્પો માટે આઇકનને સ્પર્શ કરી રાખો"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ખલેલ પાડશો નહીં"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ફક્ત પ્રાધાન્યતા"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ફક્ત એલાર્મ્સ"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"સૂર્યાસ્ત વખતે"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"સૂર્યોદય સુધી"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> વાગ્યે"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> સુધી"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC અક્ષમ કરેલ છે"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC સક્ષમ કરેલ છે"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> તમારી સ્ક્રીન પર જે પ્રદર્શિત થાય છે તે દરેક વસ્તુને કેપ્ચર કરવાનું પ્રારંભ કરશે."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ફરીથી બતાવશો નહીં"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"બધુ સાફ કરો"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"ખલેલ પાડશો નહીં નોટિફિકેશન છુપાવી રહ્યું છે"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"હવે પ્રારંભ કરો"</string>
<string name="empty_shade_text" msgid="708135716272867002">"કોઈ સૂચનાઓ નથી"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"પ્રોફાઇલ મૉનિટર કરી શકાય છે"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. કંપન પર સેટ કરવા માટે ટૅપ કરો."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s વૉલ્યૂમ નિયંત્રણો"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"કૉલ અને નોટિફિકેશન માટે રિંગ વાગશે"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"મીડિયાનું આઉટપુટ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ફોન કૉલનો આઉટપુટ"</string>
<string name="output_none_found" msgid="5544982839808921091">"કોઈ ઉપકરણો મળ્યા નથી"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"સૂચના નિયંત્રણો"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"સૂચના સ્નૂઝ કરવાના વિકલ્પો"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"પૂર્વવત્ કરો"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> માટે સ્નૂઝ કરો"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"બૅટરી"</string>
<string name="clock" msgid="7416090374234785905">"ઘડિયાળ"</string>
<string name="headset" msgid="4534219457597457353">"હૅડસેટ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"હેડફોન કનેક્ટ કર્યાં"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"હૅડસેટ કનેક્ટ કર્યો"</string>
<string name="data_saver" msgid="5037565123367048522">"ડેટા સેવર"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"જમણો કીકોડ"</string>
<string name="left_icon" msgid="3096287125959387541">"ડાબું આઇકન"</string>
<string name="right_icon" msgid="3952104823293824311">"જમણું આઇકન"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ટાઇલ ઉમેરવા માટે તેના પર આંગળી દબાવીને ખેંચો"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"દૂર કરવા માટે અહીં ખેંચો"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"તમને ઓછામાં ઓછી 6 ટાઇલની જરૂર છે"</string>
<string name="qs_edit" msgid="2232596095725105230">"સંપાદિત કરો"</string>
<string name="tuner_time" msgid="6572217313285536011">"સમય"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"સ્ક્રીનશૉટ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"સામાન્ય સંદેશા"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"સ્ટોરેજ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string>
<string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"બદલો"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"પૃષ્ઠભૂમિમાં ચાલી રહેલ ઍપ્લિકેશનો"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"બૅટરી અને ડેટા વપરાશ વિશેની વિગતો માટે ટૅપ કરો"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"મોબાઇલ ડેટા બંધ કરીએ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"તમને <xliff:g id="CARRIER">%s</xliff:g> મારફતે ડેટા અથવા ઇન્ટરનેટનો ઍક્સેસ મળશે નહીં. ઇન્ટરનેટ માત્ર વાઇ-ફાઇ દ્વારા ઉપલબ્ધ થશે."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"તમારા કૅરિઅર"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"એક ઍપ પરવાનગી વિનંતીને અસ્પષ્ટ કરતી હોવાને કારણે, સેટિંગ્સ તમારા પ્રતિસાદને ચકાસી શકતી નથી."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g>ને <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવાની મંજૂરી આપીએ?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- મારાથી <xliff:g id="APP">%1$s</xliff:g>ની માહિતી વાંચી શકાતી નથી"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>ને કોઈપણ ઍપના સ્લાઇસ બતાવવાની મંજૂરી આપો"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"મંજૂરી આપો"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"નકારો"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index e1fefe6..6498cb3 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाएं"</string>
<string name="battery_low_title" msgid="6456385927409742437">"बैटरी कम है"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"बैटरी कम बची है. बैटरी सेवर चालू करें"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> शेष"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> बची है, आपके इस्तेमाल करने के तरीके के हिसाब से बैटरी लगभग <xliff:g id="TIME">%s</xliff:g> चलेगी"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> बची है, बैटरी लगभग <xliff:g id="TIME">%s</xliff:g> चलेगी"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"स्क्रीनशॉट सेव किया जा रहा है"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"स्क्रीनशॉट सेव किया गया"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"अपना स्क्रीनशॉट देखने के लिए टैप करें"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"स्क्रीनशॉट नहीं लिया जा सका"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"स्क्रीनशॉट सेव करते समय एक समस्या आई"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"मेमोरी कम होने की वजह से स्क्रीनशॉट सेव नहीं किया जा सका"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB फ़ाइल स्थानांतरण विकल्प"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"मिठाई का डिब्बा"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेवर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ज़्यादा विकल्प देखने के लिए आइकॉन को दबाकर रखें"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"परेशान ना करें"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"सिर्फ़ प्राथमिकता"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"सिर्फ़ अलार्म"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"शाम को चालू की जाएगी"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सुबह तक चालू रहेगी"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> पर चालू की जाएगी"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> तक"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC बंद है"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC चालू है"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपके स्क्रीन पर दिखाई देने वाली हर सामग्री को कैप्चर करना शुरू कर देगी."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सभी साफ़ करें"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"परेशान न करें सुविधा की वजह से सूचनाएं नहीं दिखाई जा रही हैं"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"अब शुरू करें"</string>
<string name="empty_shade_text" msgid="708135716272867002">"कोई सूचना नहीं मिली"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. म्यूट करने के लिए टैप करें."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s की आवाज़ कम या ज़्यादा करने की सुविधा"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"कॉल अाैर सूचनाओं के लिए डिवाइस की घंटी बजेगी"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फ़ोन कॉल का आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कोई डिवाइस नहीं मिला"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"सूचना नियंत्रण"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"सूचना को स्नूज़ (थोड़ी देर के लिए चुप करना) करने के विकल्प"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पहले जैसा करें"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> के लिए याद दिलाया गया"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"बैटरी"</string>
<string name="clock" msgid="7416090374234785905">"घड़ी"</string>
<string name="headset" msgid="4534219457597457353">"हेडसेट"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"हेडफ़ोन कनेक्ट किए गए"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"हेडसेट कनेक्ट किया गया"</string>
<string name="data_saver" msgid="5037565123367048522">"डेटा बचाने की सेटिंग"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"दायां कुंजी कोड"</string>
<string name="left_icon" msgid="3096287125959387541">"बायां आइकॉन"</string>
<string name="right_icon" msgid="3952104823293824311">"दायां आइकॉन"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"टाइल जोड़ने के लिए दबाएं और खींचें"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"हटाने के लिए यहां खींचें और छोड़ें"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"आपके पास कम से कम 6 टाइल होनी चाहिए"</string>
<string name="qs_edit" msgid="2232596095725105230">"बदलाव करें"</string>
<string name="tuner_time" msgid="6572217313285536011">"समय"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"स्क्रीनशॉट"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"जगह"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"झटपट ऐप्स"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string>
<string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"बदलें"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"बैकग्राउंड में चल रहे ऐप्लिकेशन"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"बैटरी और डेटा खर्च की जानकारी के लिए छूएं"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"आप <xliff:g id="CARRIER">%s</xliff:g> के ज़रिए डेटा या इंटरनेट इस्तेमाल नहीं कर पाएंगे. इंटरनेट सिर्फ़ वाई-फ़ाई का इस्तेमाल करके चलेगा."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"आपको मोबाइल और इंटरनेट सेवा देने वाली कंपनी"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"ऐप की वजह से मंज़ूरी के अनुरोध को समझने में दिक्कत हो रही है, इसलिए सेटिंग से आपके जवाब की पुष्टि नहीं हो पा रही है."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> को <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- यह <xliff:g id="APP">%1$s</xliff:g> से सूचना पढ़ सकता है"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> को किसी भी ऐप्लिकेशन के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"मंज़ूरी दें"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"नामंज़ूर करें"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2c7e33c..c0dad6b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -34,7 +34,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Niska razina baterije"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Baterija je skoro prazna. Uključite Štednju baterije"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Preostalo <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Preostalo je <xliff:g id="PERCENTAGE">%s</xliff:g>, još otprilike <xliff:g id="TIME">%s</xliff:g> na temelju vaše upotrebe"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Preostalo je <xliff:g id="PERCENTAGE">%s</xliff:g>, još otprilike <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -74,11 +73,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimka zaslona"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spremanje snimke zaslona..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Spremanje snimke zaslona..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Spremanje snimke zaslona"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Snimka zaslona spremljena"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Dodirnite da biste vidjeli snimku zaslona"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Nije bilo moguće snimiti zaslon"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Prilikom spremanja snimke zaslona pojavio se problem"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Zaslon nije snimljen zbog ograničenog prostora za pohranu"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikacija ili vaša organizacija ne dopuštaju snimanje zaslona"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prijenosa datoteka"</string>
@@ -351,7 +351,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
@@ -435,7 +436,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> počet će snimati sve što se prikazuje na zaslonu."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši sve"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Način Ne uznemiravaj sakriva obavijesti"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Način Ne uznemiravaj sakriva obavijesti"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Započni sad"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nema obavijesti"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil se možda nadzire"</string>
@@ -541,7 +544,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste postavili na vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće – %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Čut će se zvučni signal poziva i obavijesti"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medijski izlaz"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz telefonskih poziva"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -630,6 +634,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrole obavijesti"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcije odgode obavijesti"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"PONIŠTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -695,6 +701,8 @@
<string name="battery" msgid="7498329822413202973">"Baterija"</string>
<string name="clock" msgid="7416090374234785905">"Sat"</string>
<string name="headset" msgid="4534219457597457353">"Slušalice"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slušalice su povezane"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Slušalice su povezane"</string>
<string name="data_saver" msgid="5037565123367048522">"Štednja podatkovnog prometa"</string>
@@ -729,11 +737,9 @@
<string name="right_keycode" msgid="708447961000848163">"Desni kôd tipke"</string>
<string name="left_icon" msgid="3096287125959387541">"Lijeva ikona"</string>
<string name="right_icon" msgid="3952104823293824311">"Desna ikona"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Zadržite i povucite za dodavanje pločica"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Povucite ovdje za uklanjanje"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Potrebno je barem 6 pločica"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
<string name="tuner_time" msgid="6572217313285536011">"Vrijeme"</string>
<string-array name="clock_options">
@@ -820,6 +826,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimke zaslona"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Savjeti"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije nije potrebno instalirati."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
@@ -837,12 +844,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zamijeni"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Izvođenje aplikacija u pozadini"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Dodirnite da biste vidjeli pojedinosti o potrošnji baterije i podatkovnom prometu"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Želite li isključiti mobilne podatke?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Nećete imati pristup mobilnim podacima ili internetu putem operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo putem Wi-Fi-ja."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"vaš mobilni operater"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Budući da aplikacija prekriva zahtjev za dopuštenje, Postavke ne mogu potvrditi vaš odgovor."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Želite li dopustiti aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> da prikazuje isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– može čitati informacije aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -850,4 +854,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Dopusti aplikaciji <xliff:g id="APP">%1$s</xliff:g> da prikazuje isječke iz bilo koje aplikacije"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Dopusti"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Odbij"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Dodirnite za zakazivanje štednje baterije"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Uključuje se automatski kada je razina baterije na <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, hvala"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Uključen je raspored štednje baterije"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Štednja baterije uključit će se automatski kad razina baterije padne ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Shvaćam"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index c937c3a..6766e4c 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Alacsony az energiaszint"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Az akkumulátor szintje alacsony. Kapcsolja be az akkumulátorkímélő módot."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> maradt"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> maradt, körülbelül <xliff:g id="TIME">%s</xliff:g> van hátra a használat alapján"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> maradt, körülbelül <xliff:g id="TIME">%s</xliff:g> van hátra"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Képernyőkép"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Képernyőkép mentése..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Képernyőkép mentése..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Képernyőkép mentése…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"A képernyőkép mentése sikerült"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Koppintson a képernyőkép megtekintéséhez"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Nem sikerült rögzíteni a képernyőképet"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Hiba történt a képernyőkép mentése során"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Nem menthet képernyőképet, mert kevés a tárhely"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Az alkalmazás vagy az Ön szervezete nem engedélyezi képernyőkép készítését"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-fájlátvitel beállításai"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Képernyővédő"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Tartsa lenyomva az ikonokat a további lehetőségek megjelenítéséhez"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne zavarjanak"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Csak prioritásos"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Csak ébresztések"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Be: naplemente"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Napfelkeltéig"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bekapcsolás: <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Eddig: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Az NFC ki van kapcsolva"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Az NFC be van kapcsolva"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkalmazás rögzíteni fog mindent, ami megjelenik a képernyőn."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne jelenjen meg többé"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Az összes törlése"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"A Ne zavarjanak mód elrejti az értesítéseket"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"A Ne zavarjanak mód elrejti az értesítéseket"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Indítás most"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nincs értesítés"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilját felügyelhetik"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Koppintson a rezgés beállításához."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Koppintson a némításhoz."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s hangerőszabályzók"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"A hívások és az értesítések hangjelzést adnak"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Médiakimenet"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonhívás-kimenet"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nem találhatók eszközök"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> – <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"értesítésvezérlők"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"értesítések halasztási beállításai"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VISSZAVONÁS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Elhalasztva: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Akkumulátor"</string>
<string name="clock" msgid="7416090374234785905">"Óra"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Fejhallgató csatlakoztatva"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset csatlakoztatva"</string>
<string name="data_saver" msgid="5037565123367048522">"Adatforgalom-csökkentő"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Képernyőképek"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Általános üzenetek"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Tárhely"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Tippek"</string>
<string name="instant_apps" msgid="6647570248119804907">"Azonnali alkalmazások"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Az azonnali alkalmazásokat nem kell telepíteni."</string>
<string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Engedélyezi a(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazásnak, hogy bármely alkalmazásból részletet jelenítsen meg"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Engedélyezés"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Elutasítás"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Koppintson az akkumulátorkímélő mód ütemezéséhez"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Automatikus bekapcsolás, ha az akkumulátor töltöttsége <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nem"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Akkumulátorkímélő mód ütemezése bekapcsolva"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Az akkumulátorkímélő mód automatikusan bekapcsol, ha az akkumulátor töltöttsége <xliff:g id="PERCENTAGE">%d</xliff:g>%% alá esik."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Beállítások"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Értem"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 0ea2d68..7037215 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ընթացիկ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ծանուցումներ"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Մարտկոցի լիցքը սպառվում է"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Մարտկոցի լիցքը սպառվում է։ Միացրեք մարտկոցի տնտեսումը։"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Մնաց <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Մարտկոցի լիցքը՝ <xliff:g id="PERCENTAGE">%s</xliff:g>, մնացել է մոտ <xliff:g id="TIME">%s</xliff:g>՝ օգտագործման եղանակից կախված"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Մարտկոցի լիցքը՝ <xliff:g id="PERCENTAGE">%s</xliff:g>, մնացել է մոտ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Մնացել է <xliff:g id="PERCENTAGE">%s</xliff:g>: Մարտկոցի տնտեսումը միացված է:"</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Հնարավոր չէ լիցքավորել USB-ի միջոցով: Օգտագործեք սարքի լիցքավորիչը:"</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Սարքը հնարավոր չէ լիցքավորել USB-ի միջոցով"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Օգտագործեք սարքի լիցքավորիչը"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Կարգավորումներ"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Միացնե՞լ մարտկոցի տնտեսումը"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Միացնել"</string>
@@ -76,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Էկրանի պատկեր"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Էկրանի պատկերը պահվում է…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Էկրանի պատկերը պահվում է..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Էկրանի պատկերը պահվում է"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Էկրանի պատկերը պահվեց"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Հպեք՝ էկրանի պատկերը տեսնելու համար"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Չհաջողվեց պահել էկրանի պատկերը"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Չհաջողվեց պահել էկրանի պատկերը"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Չհաջողվեց պահել էկրանի պատկերը անբավարար հիշողության պատճառով"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Հավելվածը կամ ձեր կազմակերպությունը չի թույլատրում էկրանի պատկերի ստացումը"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ֆայլերի փոխանցման ընտրանքներ"</string>
@@ -151,7 +148,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Միացված է:"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Միանում է:"</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -211,8 +207,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Ինքնաթիռի ռեժիմը միացված է:"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Ինքնաթիռի ռեժիմն անջատվեց:"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Ինքնաթիռի ռեժիմը միացավ:"</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"«Չանհանգստացնել» ռեժիմը միացված է:"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Չանհանգստացնել՝ ընդհանուր լուռ վիճակը:"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Չանհանգստացնել՝ միայն զարթուցիչ"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Չանհանգստացնել:"</string>
@@ -278,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Էկրանապահ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Լրացուցիչ կարգավորումները բացելու համար սեղմեք և պահեք այս պատկերակները"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Լրացուցիչ կարգավորումները բացելու համար հպեք և պահեք պատկերակները"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չանհանգստացնել"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string>
@@ -353,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Կմիացվի մայրամուտին"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Մինչև լուսաբաց"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Կմիացվի ժամը <xliff:g id="TIME">%s</xliff:g>-ին"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Մինչև <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-ն անջատված է"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-ն միացված է"</string>
@@ -437,8 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ծրագիրը կսկսի հավաքել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Այլևս ցույց չտալ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Մաքրել բոլորը"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
<skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"«Չանհանգստացնել» ռեժիմում ծանուցումները թաքցվում են"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Սկսել հիմա"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ծանուցումներ չկան"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Պրոֆիլը կարող է վերահսկվել"</string>
@@ -544,9 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s։ Հպեք՝ թրթռոցը միացնելու համար։"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s։ Հպեք՝ ձայնը անջատելու համար։"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Ձայնի ուժգնության կառավարներ` %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Զանգերի և ծանուցումների համար թրթռոցը միացված է"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Զանգերի և ծանուցումների համար ձայնն անջատած է"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Զանգերի և ծանուցումների համար ձայնը միացված է"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Մեդիա արտածում"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Հեռախոսազանգի հնչեցում"</string>
<string name="output_none_found" msgid="5544982839808921091">"Սարքեր չեն գտնվել"</string>
@@ -633,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ծանուցման կառավարներ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ծանուցման հետաձգման ընտրանքներ"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ՀԵՏԱՐԿԵԼ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Հետաձգվել է <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ով"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -696,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Մարտկոց"</string>
<string name="clock" msgid="7416090374234785905">"Ժամացույց"</string>
<string name="headset" msgid="4534219457597457353">"Ականջակալ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Ականջակալը կապակցված է"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Ականջակալը կապակցված է"</string>
<string name="data_saver" msgid="5037565123367048522">"Թրաֆիկի տնտեսում"</string>
@@ -730,8 +730,9 @@
<string name="right_keycode" msgid="708447961000848163">"Աջ ստեղնային կոդ"</string>
<string name="left_icon" msgid="3096287125959387541">"Ձախ պատկերակ"</string>
<string name="right_icon" msgid="3952104823293824311">"Աջ պատկերակ"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Քաշեք՝ սալիկներ ավելացնելու համար"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Պահեք և քաշեք՝ սալիկներ ավելացնելու համար"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Քաշեք այստեղ՝ հեռացնելու համար"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Հարկավոր է առնվազն 6 սալիկ"</string>
<string name="qs_edit" msgid="2232596095725105230">"Փոփոխել"</string>
<string name="tuner_time" msgid="6572217313285536011">"Ժամ"</string>
<string-array name="clock_options">
@@ -818,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Էկրանի պատկերներ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Ընդհանուր հաղորդագրություններ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Տարածք"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Հուշումներ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ակնթարթային հավելվածներ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթային հավելվածները տեղադրում չեն պահանջում։"</string>
<string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string>
@@ -835,7 +837,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Փոխարինել"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Ֆոնային ռեժիմում աշխատող հավելվածներ"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Հպեք՝ մարտկոցի և թրաֆիկի մանրամասները տեսնելու համար"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Անջատե՞լ բջջային ինտերնետը։"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Անջատե՞լ բջջային ինտերնետը"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> օպերատորի բջջային ինտերնետը հասանելի չի լինի: Համացանցից կարող եք օգտվել միայն Wi-Fi-ի միջոցով:"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"Ձեր"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Քանի որ ներածումն արգելափակված է ինչ-որ հավելվածի կողմից, Կարգավորումները չեն կարող հաստատել ձեր պատասխանը:"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Թույլատրե՞լ <xliff:g id="APP_0">%1$s</xliff:g> հավելվածին ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Կարող է կարդալ տեղեկություններ <xliff:g id="APP">%1$s</xliff:g> հավելվածից"</string>
@@ -843,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Թույլատրել <xliff:g id="APP">%1$s</xliff:g> հավելվածին ցուցադրել հատվածներ ցանկացած հավելվածից"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Թույլատրել"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Մերժել"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Հպեք՝ մարտկոցի տնտեսման ռեժիմը կարգավորելու համար"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Ավտոմատ միացնել, երբ մարտկոցի լիցքը դառնա <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ոչ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Մարտկոցի տնտեսման ռեժիմին ավտոմատ անցումը միացված է"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Մարտկոցի տնտեսման ռեժիմն ավտոմատ կմիանա, երբ մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%d</xliff:g>%%-ից պակասի:"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Կարգավորումներ"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Եղավ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index ac37819..d497c5c 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifikasi"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Baterai lemah"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Baterai hampir habis. Aktifkan Penghemat Baterai"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Tersisa <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Sisa <xliff:g id="PERCENTAGE">%s</xliff:g>, kira-kira <xliff:g id="TIME">%s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Sisa <xliff:g id="PERCENTAGE">%s</xliff:g>, kira-kira <xliff:g id="TIME">%s</xliff:g> lagi"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan screenshot..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan screenshot..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot sedang disimpan"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot disimpan"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tap untuk melihat screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Tidak dapat mengambil screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Terjadi masalah saat menyimpan screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Tidak dapat menyimpan screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Coba ambil screenshot lagi"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Tidak dapat menyimpan screenshot karena ruang penyimpanan terbatas"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Mengambil screenshot tidak diizinkan oleh aplikasi atau organisasi"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opsi transfer file USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Tap lama ikon untuk opsi lainnya"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Hanya untuk prioritas"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Hanya alarm"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aktif saat matahari terbenam"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Sampai matahari terbit"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktif pada <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Sampai <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dinonaktifkan"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC diaktifkan"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mulai menangkap apa saja yang ditampilkan pada layar Anda."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tampilkan lagi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hapus semua"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Mode Jangan Ganggu menyembunyikan notifikasi"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Kelola notifikasi"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Mode Jangan Ganggu menyembunyikan notifikasi"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Mulai sekarang"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Tidak ada pemberitahuan"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil dapat dipantau"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap untuk menyetel agar bergetar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap untuk menonaktifkan."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s kontrol volume"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Panggilan dan notifikasi akan berdering"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Keluaran media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Keluaran panggilan telepon"</string>
<string name="output_none_found" msgid="5544982839808921091">"Perangkat tidak ditemukan"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrol notifikasi"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opsi tunda notifikasi"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Tunda"</string>
<string name="snooze_undo" msgid="6074877317002985129">"URUNGKAN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Baterai"</string>
<string name="clock" msgid="7416090374234785905">"Jam"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Headphone terhubung"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset terhubung"</string>
<string name="data_saver" msgid="5037565123367048522">"Penghemat Kuota Internet"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshot"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Pesan Umum"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Penyimpanan"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Petunjuk"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikasi instan tidak perlu diinstal."</string>
<string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Izinkan <xliff:g id="APP">%1$s</xliff:g> menampilkan potongan dari aplikasi apa pun"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Izinkan"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Tolak"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tap untuk menjadwalkan Penghemat Baterai"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktifkan otomatis jika baterai tinggal <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Tidak, terima kasih"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Jadwal Penghemat Baterai diaktifkan"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Penghemat Baterai akan aktif otomatis jika baterai kurang dari <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Setelan"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index b86417c..8fdb4e7 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Áframhaldandi"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Tilkynningar"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Rafhlaðan er að tæmast"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Lítil hleðsla er á rafhlöðunni. Kveiktu á rafhlöðusparnaði"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> eftir"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> eftir, um það bil <xliff:g id="TIME">%s</xliff:g> eftir miðað við notkun"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> eftir, um það bil <xliff:g id="TIME">%s</xliff:g> eftir"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> eftir. Kveikt er á rafhlöðusparnaði."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Ekki er hægt að hlaða í gegnum USB. Notaðu hleðslutækið sem fylgdi tækinu þínu."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Ekki er hægt að hlaða í gegnum USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Notaðu hleðslutækið sem fylgdi tækinu þínu"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Stillingar"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Kveikja á rafhlöðusparnaði?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Kveikja"</string>
@@ -76,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjámynd"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Vistar skjámynd…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Vistar skjámynd…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Vistar skjámynd"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skjámynd vistuð"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Ýttu til skoða skjámyndina"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ekki tókst að taka skjámynd"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Vandamál kom upp við að vista skjámynd"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ekki tókst að vista skjámynd vegna takmarkaðs geymslupláss"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Forritið eða fyrirtækið þitt leyfir ekki skjámyndatöku"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Valkostir USB-skráaflutnings"</string>
@@ -151,7 +148,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Tenging virk."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Tengist."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -211,8 +207,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Kveikt á flugstillingu."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Slökkt á flugstillingu."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Kveikt á flugstillingu."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Kveikt á „Ónáðið ekki“."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Kveikt á „Ónáðið ekki“, algjör þögn."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Kveikt á „Ónáðið ekki“, aðeins vekjarar."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Ónáðið ekki."</string>
@@ -278,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Eftirréttaborð"</string>
<string name="start_dreams" msgid="5640361424498338327">"Skjávari"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Haltu þessum táknum inni til að sjá fleiri valkosti"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Haltu táknum inni til að sjá fleiri valkosti"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ónáðið ekki"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Aðeins forgangur"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Aðeins vekjarar"</string>
@@ -353,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kveikt við sólsetur"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til sólarupprásar"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kveikt klukkan <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Til klukkan <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Slökkt á NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Kveikt á NFC"</string>
@@ -437,8 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun fanga allt sem birtist á skjánum."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ekki sýna þetta aftur"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hreinsa allt"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
<skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"„Ónáðið ekki“ felur tilkynningar"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Byrja núna"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Engar tilkynningar"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Hugsanlega er fylgst með þessu sniði"</string>
@@ -544,9 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ýttu til að stilla á titring."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ýttu til að þagga."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s stýringar á hljóstyrk"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Titringur er virkur fyrir símtöl og tilkynningar"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Slökkt verður á hljóði símtala og tilkynninga"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Símtöl og tilkynningar heyrast"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Margmiðlunarúttak"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Úttak símtals"</string>
<string name="output_none_found" msgid="5544982839808921091">"Engin tæki fundust"</string>
@@ -633,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"tilkynningastýringar"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"þöggunarstillingar tilkynninga"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"AFTURKALLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Þaggað í <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -696,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Rafhlaða"</string>
<string name="clock" msgid="7416090374234785905">"Klukka"</string>
<string name="headset" msgid="4534219457597457353">"Höfuðtól"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Heyrnartól tengd"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Höfuðtól tengt"</string>
<string name="data_saver" msgid="5037565123367048522">"Gagnasparnaður"</string>
@@ -730,8 +730,9 @@
<string name="right_keycode" msgid="708447961000848163">"Lykiltákn til hægri"</string>
<string name="left_icon" msgid="3096287125959387541">"Tákn til vinstri"</string>
<string name="right_icon" msgid="3952104823293824311">"Tákn til hægri"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Dragðu til að bæta við reitum"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Haltu inni og dragðu til að bæta við reitum"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Dragðu hingað til að fjarlægja"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Reitirnir mega ekki vera færri en sex"</string>
<string name="qs_edit" msgid="2232596095725105230">"Breyta"</string>
<string name="tuner_time" msgid="6572217313285536011">"Tími"</string>
<string-array name="clock_options">
@@ -818,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skjámyndir"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Almenn skilaboð"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Geymslurými"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Vísbendingar"</string>
<string name="instant_apps" msgid="6647570248119804907">"Skyndiforrit"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Skyndiforrit þurfa ekki uppsetningu."</string>
<string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string>
@@ -835,7 +837,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Skipta út"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Forrit sem keyra í bakgrunni"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Ýttu til að fá upplýsingar um rafhlöðu- og gagnanotkun"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Slökkva á farsímagögnum?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Viltu slökkva á farsímagögnum?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Þú munt ekki hafa aðgang að gögnum eða internetinu í gegnum <xliff:g id="CARRIER">%s</xliff:g>. Aðeins verður hægt að tengjast internetinu með Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"símafyrirtækið þitt"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Stillingar geta ekki staðfest svarið þitt vegna þess að forrit er að fela heimildarbeiðni."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Viltu leyfa <xliff:g id="APP_0">%1$s</xliff:g> að sýna sneiðar úr <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Það getur lesið upplýsingar úr <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -843,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Leyfa <xliff:g id="APP">%1$s</xliff:g> að sýna sneiðar úr hvaða forriti sem er"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Leyfa"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Hafna"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Pikka til að stilla rafhlöðusparnað"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Kveikja sjálfkrafa þegar hleðsla rafhlöðunnar er <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nei, takk"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Kveikt á rafhlöðusparnaði"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Sjálfkrafa verður kveikt á rafhlöðusparnaði þegar hleðsla rafhlöðunnar fer niður fyrir <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Stillingar"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ég skil"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 7fa89f2..67f6942 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"In corso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Poca batteria"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batteria quasi scarica. Attiva Risparmio energetico"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> rimanente"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%s</xliff:g> circa"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. Tempo rimanente: <xliff:g id="TIME">%s</xliff:g> circa"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvataggio screenshot..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Salvataggio screenshot..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Salvataggio screenshot…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot salvato"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tocca per visualizzare lo screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Impossibile acquisire lo screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Si è verificato un problema durante il salvataggio dello screenshot"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossibile salvare lo screenshot a causa dello spazio di archiviazione limitato"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opzioni trasferimento file USB"</string>
@@ -350,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Attivata al tramonto"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fino all\'alba"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Attivata alle ore <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Fino alle ore <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC non attiva"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC attiva"</string>
@@ -434,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> inizierà ad acquisire tutto ciò che è visualizzato sul tuo schermo."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrare più"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Cancella tutto"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"La modalità Non disturbare nasconde le notifiche"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"La modalità Non disturbare nasconde le notifiche"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Avvia adesso"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nessuna notifica"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Il profilo potrebbe essere monitorato"</string>
@@ -540,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tocca per attivare la vibrazione."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tocca per disattivare l\'audio."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controlli del volume %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"L\'audio di chiamate e notifiche sarà attivo"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Uscita contenuti multimediali"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Uscita telefonate"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nessun dispositivo trovato"</string>
@@ -627,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"gestione delle notifiche"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opzioni di posticipazione notifiche"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posticipato di <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -690,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Batteria"</string>
<string name="clock" msgid="7416090374234785905">"Orologio"</string>
<string name="headset" msgid="4534219457597457353">"Auricolare"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Cuffie collegate"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auricolare collegato"</string>
<string name="data_saver" msgid="5037565123367048522">"Risparmio dati"</string>
@@ -813,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshot"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Messaggi generali"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Spazio di archiviazione"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Suggerimenti"</string>
<string name="instant_apps" msgid="6647570248119804907">"App istantanee"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Le app istantanee non richiedono l\'installazione."</string>
<string name="app_info" msgid="6856026610594615344">"Informazioni app"</string>
@@ -840,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Consenti all\'app <xliff:g id="APP">%1$s</xliff:g> di mostrare porzioni di qualsiasi app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Consenti"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Nega"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tocca per programmare il Risparmio energetico"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Attiva automaticamente quando la batteria arriva al <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"No grazie"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Pianificazione del Risparmio energetico attivata"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Il Risparmio energetico verrà attivato automaticamente quando la carica della batteria sarà inferiore a <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Impostazioni"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 8ea575d..5973b43 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -35,17 +35,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתמשך"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"הודעות"</string>
<string name="battery_low_title" msgid="6456385927409742437">"עוצמת הסוללה נמוכה"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"הסוללה חלשה: כדאי להפעיל את מצב החיסכון בסוללה"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>, נשארו בערך <xliff:g id="TIME">%s</xliff:g> על סמך השימוש במכשיר"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>, נשארו בערך <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>. הופעלה תכונת החיסכון בסוללה."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"לא ניתן לטעון באמצעות USB. ניתן להשתמש במטען שצורף למכשיר שלך."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"לא ניתן לטעון באמצעות USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"שימוש במטען שסופק עם המכשיר"</string>
<string name="battery_low_why" msgid="4553600287639198111">"הגדרות"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"להפעיל את תכונת החיסכון בסוללה?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"הפעל"</string>
@@ -78,11 +74,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"צילום מסך"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"שומר צילום מסך..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"שומר צילום מסך..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"מתבצעת שמירה של צילום המסך"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"צילום המסך נשמר"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"אפשר להקיש כדי להציג את צילום המסך"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"לא ניתן היה לבצע צילום מסך"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"התגלתה בעיה בשמירת צילום המסך"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"לא היה מספיק מקום לשמור את צילום המסך"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"האפליקציה או הארגון שלך אינם מתירים ליצור צילומי מסך"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"אפשרויות העברת קבצים ב-USB"</string>
@@ -153,7 +150,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"מחובר."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"מתחבר."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -213,8 +209,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"מצב טיסה מופעל."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"מצב טיסה נכבה."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"מצב טיסה הופעל."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"מצב \'נא לא להפריע\' פועל."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\'נא לא להפריע\' פועל. שקט מוחלט."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\'נא לא להפריע\' הופעל. התראות בלבד."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"נא לא להפריע."</string>
@@ -282,7 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"מזנון קינוחים"</string>
<string name="start_dreams" msgid="5640361424498338327">"שומר מסך"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"יש להקיש על הסמלים ולהחזיק אותם להצגת אפשרויות נוספות"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"יש ללחוץ על הסמלים לחיצה ארוכה כדי לראות אפשרויות נוספות"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"נא לא להפריע"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"עדיפות בלבד"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"התראות בלבד"</string>
@@ -359,7 +354,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"מופעל בשקיעה"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"עד הזריחה"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"מופעל בשעה <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"עד <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC מושבת"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC מופעל"</string>
@@ -443,7 +439,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> יתחיל להקליט את כל התוכן המוצג במסך שלך."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"אל תציג שוב"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"נקה הכל"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
<skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"התחל כעת"</string>
<string name="empty_shade_text" msgid="708135716272867002">"אין הודעות"</string>
@@ -550,9 +548,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. הקש כדי להעביר למצב רטט."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. הקש כדי להשתיק."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"בקרי עוצמת שמע של %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"שיחות והודעות ירטטו"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"שיחות והודעות יושתקו"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"שיחות והודעות ישמיעו צלצול"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"פלט מדיה"</string>
<string name="output_calls_title" msgid="8717692905017206161">"פלט שיחת טלפון"</string>
<string name="output_none_found" msgid="5544982839808921091">"לא נמצאו מכשירים"</string>
@@ -643,6 +640,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"בקרת הודעות"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"אפשרויות של דחיית הודעות לטיפול בהמשך"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ביטול"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"נדחה לטיפול בעוד <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -710,6 +709,8 @@
<string name="battery" msgid="7498329822413202973">"סוללה"</string>
<string name="clock" msgid="7416090374234785905">"שעון"</string>
<string name="headset" msgid="4534219457597457353">"אוזניות"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"אוזניות מחוברות"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"אוזניות מחוברות"</string>
<string name="data_saver" msgid="5037565123367048522">"חוסך הנתונים (Data Saver)"</string>
@@ -744,8 +745,9 @@
<string name="right_keycode" msgid="708447961000848163">"קוד מפתח ימני"</string>
<string name="left_icon" msgid="3096287125959387541">"סמל שמאלי"</string>
<string name="right_icon" msgid="3952104823293824311">"סמל ימני"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"ניתן לגרור כדי להוסיף או להסיר משבצות"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"יש ללחוץ ולגרור כדי להוסיף אריחים"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"גרור לכאן כדי להסיר"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"יש צורך בשישה אריחים לכל הפחות"</string>
<string name="qs_edit" msgid="2232596095725105230">"עריכה"</string>
<string name="tuner_time" msgid="6572217313285536011">"שעה"</string>
<string-array name="clock_options">
@@ -832,6 +834,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"צילומי מסך"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"הודעות כלליות"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"אחסון"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string>
<string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string>
@@ -849,7 +853,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"החלף"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"אפליקציות שפועלות ברקע"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"הקש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"לכבות את חבילת הגלישה?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"לכבות את חבילת הגלישה?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"לא תהיה לך גישה לנתונים או לאינטרנט באמצעות <xliff:g id="CARRIER">%s</xliff:g>. אינטרנט יהיה זמין רק באמצעות Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"הספק שלך"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"יש אפליקציה שמסתירה את בקשת ההרשאה, ולכן להגדרות אין אפשרות לאמת את התשובה."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"האם לאפשר ל-<xliff:g id="APP_0">%1$s</xliff:g> להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- תהיה לה אפשרות לקרוא מידע מ-<xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -857,4 +863,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"יש לאשר ל-<xliff:g id="APP">%1$s</xliff:g> להראות חלקים מכל אפליציה שהיא"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"אני רוצה לאשר"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"אני לא מרשה"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index e8b4c8d..b962972 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="6456385927409742437">"電池残量が少なくなっています"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"電池残量が少なくなっています。バッテリー セーバーを ON にしてください"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"残量が<xliff:g id="PERCENTAGE">%s</xliff:g>です"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"残量 <xliff:g id="PERCENTAGE">%s</xliff:g>、約 <xliff:g id="TIME">%s</xliff:g>(使用状況に基づく)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"残量 <xliff:g id="PERCENTAGE">%s</xliff:g>、約 <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"スクリーンショット"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"スクリーンショットを保存中..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"スクリーンショットを保存しています..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"スクリーンショットを保存しています"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"スクリーンショットを保存しました"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"タップするとスクリーンショットが表示されます"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"スクリーンショットを撮影できませんでした"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"スクリーンショットの保存中に問題が発生しました"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"空き容量が足りないため、スクリーンショットを保存できません"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"スクリーンショットの作成はアプリまたは組織で許可されていません"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USBファイル転送オプション"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"デザートケース"</string>
<string name="start_dreams" msgid="5640361424498338327">"スクリーン セーバー"</string>
<string name="ethernet_label" msgid="7967563676324087464">"イーサネット"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"アイコンを押し続けると、その他の項目が表示されます"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"マナーモード"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"優先する通知のみ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"アラームのみ"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"日の入りに ON"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"日の出まで"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> まで"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で、画面に表示されているコンテンツのキャプチャを開始します。"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"次回から表示しない"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"すべて消去"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"マナーモードでは通知が非表示になります"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"マナーモードでは通知が非表示になります"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"今すぐ開始"</string>
<string name="empty_shade_text" msgid="708135716272867002">"通知はありません"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"プロファイルが監視されている可能性があります"</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。タップしてバイブレーションに設定します。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。タップしてミュートします。"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s の音量調節"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"着信音と通知音が鳴ります"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"メディア出力"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話の出力"</string>
<string name="output_none_found" msgid="5544982839808921091">"デバイスが見つかりません"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"通知管理"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"通知スヌーズ設定"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"元に戻す"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"スヌーズ: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"電池"</string>
<string name="clock" msgid="7416090374234785905">"時計"</string>
<string name="headset" msgid="4534219457597457353">"ヘッドセット"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ヘッドホンを接続しました"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ヘッドセットを接続しました"</string>
<string name="data_saver" msgid="5037565123367048522">"データセーバー"</string>
@@ -814,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"スクリーンショット"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般メッセージ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ストレージ"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"ヒント"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps はインストールせずに利用できます。"</string>
<string name="app_info" msgid="6856026610594615344">"アプリ情報"</string>
@@ -841,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"すべてのアプリのスライスを表示することを「<xliff:g id="APP">%1$s</xliff:g>」に許可する"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"許可"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"拒否"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"タップしてバッテリー セーバーのスケジュールを設定"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"電池が <xliff:g id="PERCENTAGE">%d</xliff:g>%% になったら自動的に ON にする"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"いいえ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"バッテリー セーバーのスケジュール設定 ON"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"電池が <xliff:g id="PERCENTAGE">%d</xliff:g>%% を下回ると、バッテリー セーバーが自動的に ON になります。"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index d3e48df..f198fdf 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"მიმდინარე"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"შეტყობინებები"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ბატარეა იწურება"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ბატარეა იწურება. ჩართეთ ბატარეის დამზოგი"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"დარჩენილია <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"დარჩენილია <xliff:g id="PERCENTAGE">%s</xliff:g>, რაც დაახლოებით <xliff:g id="TIME">%s</xliff:g> არის, მოხმარების გათვალისწინებით"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"დარჩენილია <xliff:g id="PERCENTAGE">%s</xliff:g>, რაც დაახლოებით <xliff:g id="TIME">%s</xliff:g> არის"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"სკრინშოტის შენახვა…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ეკრანის სურათის შენახვა…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ეკრანის ანაბეჭდი შენახულია"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ეკრანის ანაბეჭდი შენახულია"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"შეეხეთ ეკრანის ანაბეჭდის სანახავად"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ვერ მოხერხდა ეკრანის ანაბეჭდის გადაღება"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ეკრანის ანაბეჭდის შენახვისას წარმოიქმნა პრობლემა"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ეკრანის ანაბეჭდის შენახვა ვერ მოხერხდა შეზღუდული მეხსიერების გამო"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ეკრანის ანაბეჭდების შექმნა არ არის ნებადართული აპის ან თქვენი ორგანიზაციის მიერ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ფაილის ტრანსფერის პარამეტრები"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"სადესერტო ყუთი"</string>
<string name="start_dreams" msgid="5640361424498338327">"ეკრანმზოგი"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ხანგრძლივად შეეხეთ ხატულებს დამატებითი ვარიანტებისთვის"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"არ შემაწუხოთ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"მხოლოდ პრიორიტეტული"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"მხოლოდ გაფრთხილებები"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ჩაირთოს მზის ჩასვლისას"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"მზის ამოსვლამდე"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ჩაირთოს <xliff:g id="TIME">%s</xliff:g>-ზე"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g>-მდე"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC გათიშულია"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ჩართულია"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> დაიწყებს იმ ყველაფრის აღბეჭდვას, რაც თქვენს ეკრანზე ჩანს."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"აღარ მაჩვენო"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ყველას გასუფთავება"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"„არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"„არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"დაწყება ახლავე"</string>
<string name="empty_shade_text" msgid="708135716272867002">"შეტყობინებები არ არის."</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"შესაძლოა პროფილზე ხორციელდებოდეს მონიტორინგი"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. შეეხეთ დასადუმებლად."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s-ის ხმის მართვის საშუალებები"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ზარები და შეტყობინებები ხმის თანხლებით იქნება"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"მედია გამომავალი"</string>
<string name="output_calls_title" msgid="8717692905017206161">"სატელეფონო ზარის გამომავალი სიგნალი"</string>
<string name="output_none_found" msgid="5544982839808921091">"მოწყობილობები ვერ მოიძებნა"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"შეტყობინებების მართვის საშუალებები"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"შეტყობინებების ჩაჩუმების ვარიანტები"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"მოქმედების გაუქმება"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ჩაჩუმებული იქნება <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"ბატარეა"</string>
<string name="clock" msgid="7416090374234785905">"საათი"</string>
<string name="headset" msgid="4534219457597457353">"ყურსაცვამი"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ყურსასმენები დაკავშირებულია"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ყურსაცვამი დაკავშირებულია"</string>
<string name="data_saver" msgid="5037565123367048522">"მონაცემთა დამზოგველი"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ეკრანის ანაბეჭდები"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ზოგადი შეტყობინებები"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"მეხსიერება"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"მინიშნებები"</string>
<string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string>
<string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>-ისთვის ფრაგმენტების ნებისმიერი აპიდან ჩვენების ნების დართვა"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"დაშვება"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"უარყოფა"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"შეეხეთ ბატარეის დამზოგის დასაგეგმად"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"ავტომატურად ჩაირთოს, როცა ბატარეა <xliff:g id="PERCENTAGE">%d</xliff:g>%%-ზეა"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"არა, გმადლობთ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"ბატარეის დამზოგის განრიგი ჩართულია"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"ბატარეის დამზოგი ავტომატურად ჩაირთვება, როცა ბატარეა ჩამოსცდება <xliff:g id="PERCENTAGE">%d</xliff:g>%%-ს."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"პარამეტრები"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"გასაგებია"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index e77109c..54ccf3c 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ағымдағы"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Хабарлар"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батарея заряды төмен"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батарея заряды аз. \"Battery Saver\" функциясын қосыңыз"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> қалды"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Пайдалану барысына байланысты <xliff:g id="PERCENTAGE">%s</xliff:g> заряд, шамамен <xliff:g id="TIME">%s</xliff:g> қалды"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> заряд, шамамен <xliff:g id="TIME">%s</xliff:g> қалды"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Скриншотты сақтауда…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Скриншотты сақтауда…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Скриншот сақталуда"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Скриншот сақталды"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Скриншотты көру үшін түртіңіз"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Скриншот жасалмады"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Скриншотты сақтау кезінде ақау болды"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Жадтағы шектеулі бос орынға байланысты скриншот сақталмайды"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Қолданба немесе ұйым скриншоттар түсіруге рұқсат етпейді"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB файлын жіберу опциялары"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Десерт жағдайы"</string>
<string name="start_dreams" msgid="5640361424498338327">"Экранды сақтау режимі"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Басқа опцияларды көру үшін белгішелерді түртіп ұстап тұрыңыз"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Мазаламау"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Маңыздылары ғана"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Тек дабылдар"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Күн батқанда қосу"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Күн шыққанға дейін"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> дейін"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өшірулі"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC қосулы"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілгеннің барлығын түсіре бастайды."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Қайта көрсетпеу"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Барлығын тазалау"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\"Мазаламау\" режимі хабарландыруларды жасырады"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"Мазаламау\" режимі хабарландыруларды жасыруда"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Қазір бастау"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Хабарландырулар жоқ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профиль бақылануы мүмкін"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Діріл режимін орнату үшін түртіңіз."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дыбысын өшіру үшін түртіңіз."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Дыбысты басқару элементтері: %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Қоңыраулар мен хабарландырулардың дыбыстық сигналы болады"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Meдиа шығысы"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Телефон қоңырау шығысы"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ешқандай құрылғы табылмады"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"хабарландыруларды басқару элементтері"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"хабарландыруды кідірту опциялары"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КЕРІ ҚАЙТАРУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> кідіртілді"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Батарея"</string>
<string name="clock" msgid="7416090374234785905">"Сағат"</string>
<string name="headset" msgid="4534219457597457353">"Құлақаспап жинағы"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Құлақаспап қосылды"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Құлақаспап жинағы қосылды"</string>
<string name="data_saver" msgid="5037565123367048522">"Трафикті үнемдеу"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Скриншоттар"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы хабарлар"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Жад"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Кеңестер"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Лездік қолданбаларды орнатудың қажеті жоқ."</string>
<string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> қолданбасына кез келген қолданбаның үзіндісін көрсетуге рұқсат беру"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Рұқсат беру"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Тыйым салу"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Түймені түртіп, Battery Saver функциясын реттеңіз"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Батарея заряды <xliff:g id="PERCENTAGE">%d</xliff:g>%% болғанда, автоматты түрде қосу"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Жоқ, рақмет"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Battery Saver кестесі қосылды"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Батарея заряды <xliff:g id="PERCENTAGE">%d</xliff:g>%% деңгейінен төмендегенде, Battery Saver автоматты түрде қосылады."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Параметрлер"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түсінікті"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index a85fcf7..a886e32 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"បន្ត"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ការជូនដំណឹង"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ជិតអស់ថ្មហើយ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"កម្រិតថ្មនៅសល់តិច។ សូមបើកកម្មវិធីសន្សំថ្ម"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g> អាចប្រើបានប្រហែល <xliff:g id="TIME">%s</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g> អាចប្រើបានប្រហែល <xliff:g id="TIME">%s</xliff:g> ទៀត"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"រូបថតអេក្រង់"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុងរក្សាទុករូបថតអេក្រង់…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"កំពុងរក្សាទុករូបថតអេក្រង់"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"បានរក្សាទុករូបថតអេក្រង់"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ចុចដើម្បីមើលរូបថតអេក្រង់របស់អ្នក"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"មិនអាចថតរូបអេក្រង់បានទេ"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"បានជួបបញ្ហាពេលកំពុងរក្សាទុករូបថតអេក្រង់"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"មិនអាចរក្សាទុករូបថតអេក្រង់បានទេ"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"សាកល្បងថតរូបថតអេក្រង់ម្តងទៀត"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"មិនអាចរក្សាទុករូបថតអេក្រង់បានទេ ដោយសារទំហំផ្ទុកមានកម្រិតទាប"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ការថតរូបអេក្រង់មិនត្រូវបានអនុញ្ញាតដោយកម្មវិធីនេះ ឬស្ថាប័នរបស់អ្នក"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"ជម្រើសផ្ទេរឯកសារតាមយូអេសប៊ី"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ករណី Dessert"</string>
<string name="start_dreams" msgid="5640361424498338327">"ធាតុរក្សាអេក្រង់"</string>
<string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិត"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ចុចរូបតំណាងឱ្យជាប់សម្រាប់ជម្រើសបន្ថែម"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"កុំរំខាន"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"អាទិភាពប៉ុណ្ណោះ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"បើកនៅពេលថ្ងៃលិច"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"រហូតដល់ពេលថ្ងៃរះ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"បានបិទ NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"បានបើក NFC"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹងចាប់ផ្ដើមចាប់យកអ្វីៗគ្រប់យ៉ាងដែលបង្ហាញលើអេក្រង់របស់អ្នក។"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"កុំបង្ហាញម្ដងទៀត"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"សម្អាតទាំងអស់"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"មុខងារកុំរំខានកំពុងលាក់ការជូនដំណឹង"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"គ្រប់គ្រងការជូនដំណឹង"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"មុខងារកុំរំខានកំពុងលាក់ការជូនដំណឹង"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"ចាប់ផ្ដើមឥឡូវ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"គ្មានការជូនដំណឹង"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ប្រវត្តិរូបអាចត្រូវបានតាមដាន"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s ។ ចុចដើម្បីកំណត់ឲ្យញ័រ។"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s ។ ចុចដើម្បីបិទសំឡេង។"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s របារបញ្ជាកម្រិតសំឡេង"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ការហៅទូរសព្ទ និងការជូនដំណឹងនឹងរោទ៍"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"លទ្ធផលមេឌៀ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"លទ្ធផលនៃការហៅទូរសព្ទ"</string>
<string name="output_none_found" msgid="5544982839808921091">"រកមិនឃើញឧបករណ៍ទេ"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ការគ្រប់គ្រងការជូនដំណឹង"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ជម្រើសផ្អាកការជូនដំណឹង"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ផ្អាក"</string>
<string name="snooze_undo" msgid="6074877317002985129">"មិនធ្វើវិញ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"បានផ្អាករយៈពេល <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"ថ្ម"</string>
<string name="clock" msgid="7416090374234785905">"នាឡិកា"</string>
<string name="headset" msgid="4534219457597457353">"កាស"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"បានភ្ជាប់កាស"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"បានភ្ជាប់កាស"</string>
<string name="data_saver" msgid="5037565123367048522">"កម្មវិធីសន្សំសំចៃទិន្នន័យ"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"រូបថតអេក្រង់"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"សារទូទៅ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ទំហំផ្ទុក"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"ការសម្រួល"</string>
<string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string>
<string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"អនុញ្ញាតឱ្យ <xliff:g id="APP">%1$s</xliff:g> បង្ហាញស្ថិតិប្រើប្រាស់ពីកម្មវិធីនានា"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"អនុញ្ញាត"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"បដិសេធ"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"ចុចដើម្បីកំណត់កាលវិភាគកម្មវិធីសន្សំថ្ម"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"បើកដោយស្វ័យប្រវត្តិ នៅពេលដែលថ្មនៅត្រឹម <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"ទេ អរគុណ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"កាលវិភាគកម្មវិធីសន្សំថ្មបានបើកហើយ"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"កម្មវិធីសន្សំថ្មនឹងបើកដោយស្វ័យប្រវត្តិ បន្ទាប់ពីថ្មនៅសល់តិចជាង <xliff:g id="PERCENTAGE">%d</xliff:g>%% ។"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"ការកំណត់"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"យល់ហើយ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index fc807c4..76343c3 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ಬ್ಯಾಟರಿ ಕಡಿಮೆ ಇದೆ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ಬ್ಯಾಟರಿ ಕಡಿಮೆ ಇದೆ. ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಮಾಡಿ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ಉಳಿದಿದೆ"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ಬಾಕಿ ಉಳಿದಿದೆ, ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ <xliff:g id="TIME">%s</xliff:g> ಉಳಿದಿದೆ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ಬಾಕಿ ಉಳಿದಿದೆ, <xliff:g id="TIME">%s</xliff:g> ಉಳಿದಿದೆ"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ಶಾಟ್ ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಸೆರೆಹಿಡಿಯಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸುವಲ್ಲಿ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಉಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಪುನಃ ತೆಗೆದುಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ಪರಿಮಿತ ಸಂಗ್ರಹಣೆ ಸ್ಥಳದ ಕಾರಣದಿಂದಾಗಿ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ಫೈಲ್ ವರ್ಗಾವಣೆ ಆಯ್ಕೆಗಳು"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ಡೆಸರ್ಟ್ ಕೇಸ್"</string>
<string name="start_dreams" msgid="5640361424498338327">"ಸ್ಕ್ರೀನ್ ಸೇವರ್"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ಇಥರ್ನೆಟ್"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ಐಕಾನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿಹಿಡಿಯಿರಿ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ಆದ್ಯತೆ ಮಾತ್ರ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ಸೂರ್ಯಾಸ್ತದಲ್ಲಿ"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ಸೂರ್ಯೋದಯದ ತನಕ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ಸಮಯದಲ್ಲಿ"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೂ"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೂ"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string>
@@ -433,7 +430,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"ನಿಮ್ಮ ಪರದೆಯ ಮೇಲೆ ಪ್ರದರ್ಶಿಸಲಾಗುವ ಎಲ್ಲವನ್ನೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಯು ಸೆರೆಹಿಡಿಯಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸು"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\"ಅಡಚಣೆ ಮಾಡಬೇಡ\" ಮೋಡ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡುತ್ತಿದೆ"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ಪ್ರೊಫೈಲ್ ಅನ್ನು ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ"</string>
@@ -539,7 +538,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಕಗಳು"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ರಿಂಗ್ ಆಗುತ್ತವೆ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"ಮೀಡಿಯಾ ಔಟ್ಪುಟ್"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ಫೋನ್ ಕರೆ ಔಟ್ಪುಟ್"</string>
<string name="output_none_found" msgid="5544982839808921091">"ಯಾವ ಸಾಧನಗಳೂ ಕಂಡುಬಂದಿಲ್ಲ"</string>
@@ -626,6 +626,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳು"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ಅಧಿಸೂಚನೆ ಸ್ನೂಜ್ ಆಯ್ಕೆಗಳು"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ಸ್ನೂಜ್"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ರದ್ದುಮಾಡಿ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ಗೆ ಸ್ನೂಜ್ ಮಾಡಲಾಗಿದೆ"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +690,8 @@
<string name="battery" msgid="7498329822413202973">"ಬ್ಯಾಟರಿ"</string>
<string name="clock" msgid="7416090374234785905">"ಗಡಿಯಾರ"</string>
<string name="headset" msgid="4534219457597457353">"ಹೆಡ್ಸೆಟ್"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ಹೆಡ್ಫೋನ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ಹೆಡ್ಸೆಟ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="data_saver" msgid="5037565123367048522">"ಡೇಟಾ ಸೇವರ್"</string>
@@ -723,11 +726,9 @@
<string name="right_keycode" msgid="708447961000848163">"ಬಲ ಕೀಕೋಡ್"</string>
<string name="left_icon" msgid="3096287125959387541">"ಎಡ ಐಕಾನ್"</string>
<string name="right_icon" msgid="3952104823293824311">"ಬಲ ಐಕಾನ್"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ಟೈಲ್ಗಳನ್ನು ಸೇರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ತೆಗೆದುಹಾಕಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"ನಿಮಗೆ ಕನಿಷ್ಠ 6 ಟೈಲ್ಗಳ ಅಗತ್ಯವಿದೆ"</string>
<string name="qs_edit" msgid="2232596095725105230">"ಎಡಿಟ್"</string>
<string name="tuner_time" msgid="6572217313285536011">"ಸಮಯ"</string>
<string-array name="clock_options">
@@ -814,6 +815,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳು"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ಸಾಮಾನ್ಯ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ಸಂಗ್ರಹಣೆ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string>
<string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
@@ -831,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"ಬದಲಿಸಿ"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"ನೀವು <xliff:g id="CARRIER">%s</xliff:g> ಮೂಲಕ ಡೇಟಾ ಅಥವಾ ಇಂಟರ್ನೆಟ್ಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. ಇಂಟರ್ನೆಟ್ ವೈ-ಫೈ ಮೂಲಕ ಮಾತ್ರ ಲಭ್ಯವಿರುತ್ತದೆ."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ನಿಮ್ಮ ವಾಹಕ"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಮರೆಮಾಚುತ್ತಿರುವ ಕಾರಣ, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು ತೋರಿಸಲು <xliff:g id="APP_0">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ಇದು <xliff:g id="APP">%1$s</xliff:g> ನಿಂದ ಮಾಹಿತಿಯನ್ನು ಓದಬಹುದು"</string>
@@ -844,4 +844,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಸ್ಲೈಸ್ಗಳನ್ನು ತೋರಿಸಲು <xliff:g id="APP">%1$s</xliff:g> ಅನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ಅನುಮತಿಸಿ"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ನಿರಾಕರಿಸಿ"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 92bd640..d830f90 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
<string name="battery_low_title" msgid="6456385927409742437">"배터리 부족"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"배터리가 부족합니다. 배터리 세이버를 사용 설정하세요"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> 남았습니다."</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> 남음, 내 사용량을 기준으로 약 <xliff:g id="TIME">%s</xliff:g> 남음"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> 남음, 약 <xliff:g id="TIME">%s</xliff:g> 남음"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"스크린샷"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"캡쳐화면 저장 중..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"캡쳐화면 저장 중..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"스크린샷을 저장하는 중입니다"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"스크린샷 저장됨"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"스크린샷을 확인하려면 탭하세요"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"스크린샷을 캡쳐하지 못함"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"스크린샷을 저장하는 중 문제가 발생했습니다"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"저장용량이 부족하여 스크린샷을 저장할 수 없습니다"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"앱이나 조직에서 스크린샷 촬영을 허용하지 않습니다."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 파일 전송 옵션"</string>
@@ -275,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"디저트 케이스"</string>
<string name="start_dreams" msgid="5640361424498338327">"화면 보호기"</string>
<string name="ethernet_label" msgid="7967563676324087464">"이더넷"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"추가 옵션을 보려면 아이콘을 길게 터치하세요."</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"알림 일시중지"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"중요 알림만"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"알람만"</string>
@@ -351,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"일몰에"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"일출까지"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>에"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g>까지"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 사용 중지됨"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 사용 설정됨"</string>
@@ -435,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>에서 화면에 표시된 모든 것을 캡처하기 시작합니다."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"다시 표시 안함"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"모두 지우기"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"알림 일시중지 기능으로 알림 숨기는 중"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"알림 일시중지 기능으로 알림 숨기는 중"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"시작하기"</string>
<string name="empty_shade_text" msgid="708135716272867002">"알림 없음"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"프로필이 모니터링될 수 있음"</string>
@@ -541,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. 탭하여 진동으로 설정하세요."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. 탭하여 음소거로 설정하세요."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s 볼륨 컨트롤"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"전화 및 알림 소리가 울립니다."</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"미디어 출력"</string>
<string name="output_calls_title" msgid="8717692905017206161">"전화 통화 출력"</string>
<string name="output_none_found" msgid="5544982839808921091">"기기를 찾을 수 없음"</string>
@@ -628,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"알림 관리"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"알림 일시 중지 옵션"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"실행취소"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> 동안 일시 중지됨"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"배터리"</string>
<string name="clock" msgid="7416090374234785905">"시계"</string>
<string name="headset" msgid="4534219457597457353">"헤드셋"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"헤드폰 연결됨"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"헤드셋 연결됨"</string>
<string name="data_saver" msgid="5037565123367048522">"데이터 절약 모드"</string>
@@ -814,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"스크린샷"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"저장공간"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"힌트"</string>
<string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
@@ -841,4 +849,15 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>에서 모든 앱의 슬라이스를 표시하도록 허용"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"허용"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"거부"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"탭하여 배터리 세이버 예약"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"사용 안함"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"배터리 세이버 예약 사용 설정됨"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"설정"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"확인"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index a239b15..5cb4fd7 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Учурдагы"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Эскертмелер"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батареянын кубаты аз"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батарея аз калды. Батареяны үнөмдөгүчтү күйгүзүңүз"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> калды"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> калды, колдонушуңузга караганда болжол менен дагы <xliff:g id="TIME">%s</xliff:g> бар"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> калды, болжол менен дагы <xliff:g id="TIME">%s</xliff:g> бар"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Скриншот сакталууда…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Скриншот сакталууда..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Скриншот сакталууда"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Скриншот сакталды"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Скриншотуңузду көрүү үчүн таптап коюңуз"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Скриншот тартылбай жатат"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Скриншотту сактоо учурунда көйгөй пайда болду"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Сактагычта бош орун аз болгондуктан скриншот сакталбай жатат"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Скриншот тартууга колдонмо же ишканаңыз тыюу салган."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB менен файл өткөрүү мүмкүнчүлүктөрү"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Десерт себети"</string>
<string name="start_dreams" msgid="5640361424498338327">"Көшөгө"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Кошумча параметрлерди ачуу үчүн сүрөтчөлөрдү басып, кармап туруңуз"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Тынчымды алба"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Шашылыш эскертмелер гана"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ойготкучтар гана"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Күн батканда күйөт"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Күн чыкканга чейин"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Саат <xliff:g id="TIME">%s</xliff:g> күйөт"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> чейин"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өчүрүлгөн"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC иштетилген"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранга чыккан нерсенин баарын сүрөткө тарта баштайт."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Экинчи көрсөтүлбөсүн"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Бардыгын тазалап салуу"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\"Тынчымды алба\" режими эскертмелерди жашырууда"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"Тынчымды алба\" режими эскертмелерди жашырууда"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Азыр баштоо"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Эскертмелер жок"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профилди көзөмөлдөсө болот"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дирилдөөгө коюу үчүн басыңыз."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Үнүн өчүрүү үчүн басыңыз."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s үндү башкаруу элементтери"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Чалуулар менен эскертмелердин үнү чыгарылат"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Медиа түзмөк"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Телефон чалуу"</string>
<string name="output_none_found" msgid="5544982839808921091">"Түзмөктөр табылган жок"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"эскертмелерди башкаруу каражаттары"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"эскертмени тындыруу опциялары"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КАЙТАРУУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> тындырылды"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Батарея"</string>
<string name="clock" msgid="7416090374234785905">"Саат"</string>
<string name="headset" msgid="4534219457597457353">"Гарнитура"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Гарнитуралар туташкан"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Гарнитура туташты"</string>
<string name="data_saver" msgid="5037565123367048522">"Дайындарды үнөмдөгүч"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Скриншоттор"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы билдирүүлөр"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Сактагыч"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Кеңештер"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string>
<string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> бардык колдонмолордун үлгүлөрүн көрсөтүүгө уруксат берүү"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Уруксат берүү"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Жок"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Батареяны үнөмдөгүчтүн тартибин жөндөө үчүн басыңыз"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Батареянын деңгээли <xliff:g id="PERCENTAGE">%d</xliff:g>%% жеткенде, автоматтык түрдө күйгүзүлсүн"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Жок, рахмат"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Батареяны үнөмдөгүчтүн тартиби күйгүзүлдү"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Батареянын деңгээли <xliff:g id="PERCENTAGE">%d</xliff:g>%% төмөндөгөндө, Батареяны үнөмдөгүч режими автоматтык түрдө күйөт."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Жөндөөлөр"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түшүндүм"</string>
</resources>
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index f7e2344..63bbe62 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -28,4 +28,7 @@
<!-- We have only space for one notification on phone landscape layouts. -->
<integer name="keyguard_max_notification_count">1</integer>
+
+ <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+ <integer name="navigation_bar_deadzone_orientation">1</integer>
</resources>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index e37ca1c..c59492f 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -24,6 +24,8 @@
<dimen name="brightness_mirror_height">96dp</dimen>
+ <!-- Width for the spacer, used between QS tiles. -->
+ <dimen name="qs_quick_tile_space_width">38dp</dimen>
<dimen name="qs_tile_margin_top">2dp</dimen>
<dimen name="qs_header_tooltip_height">24dp</dimen>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 572d3f4..5f5ba00 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ດຳເນີນຢູ່"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ການແຈ້ງເຕືອນ"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ແບັດເຕີຣີເຫຼືອໜ້ອຍ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ແບັດເຕີຣີເຫຼືອໜ້ອຍ. ກະລຸນາເປີດໃຊ້ຕົວປະຢັດແບັດເຕີຣີ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"ຍັງເຫຼືອ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"ຍັງເຫຼືອ <xliff:g id="PERCENTAGE">%s</xliff:g>, ປະມານ <xliff:g id="TIME">%s</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"ຍັງເຫຼືອ <xliff:g id="PERCENTAGE">%s</xliff:g>, ປະມານ <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ພາບໜ້າຈໍ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ກຳລັງບັນທຶກຮູບໜ້າຈໍ"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ກຳລັງບັນທຶກພາບໜ້າຈໍ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ກຳລັງບັນທຶກພາບໜ້າຈໍ"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ບັນທຶກຮູບໜ້າຈໍໄວ້ແລ້ວ"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ແຕະເພື່ອເບິ່ງພາບຖ່າຍໜ້າຈໍຂອງທ່ານ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ບໍ່ສາມາດຖ່າຍຮູບໜ້າຈໍໄດ້"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ເກີດບັນຫາໃນການບັນທຶກພາບໜ້າຈໍຂອງທ່ານ"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ບໍ່ສາມາດຖ່າຍຮູບໜ້າຈໍໄດ້ເນື່ອງຈາກພື້ນທີ່ຈັດເກັບຂໍ້ມູນມີຈຳກັດ"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ແອັບ ຫຼື ອົງກອນຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຖ່າຍຮູບໜ້າຈໍ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ໂຕເລືອກການຍ້າຍໄຟລ໌"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ກ່ອງຂອງຫວານ"</string>
<string name="start_dreams" msgid="5640361424498338327">"ພາບພັກໜ້າຈໍ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ແຕະໄອຄອນຄ້າງໄວ້ເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ຫ້າມລົບກວນ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ບຸລິມະສິດເທົ່ານັ້ນ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ໂມງປຸກເທົ່ານັ້ນ"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ເປີດຕອນຕາເວັນຕົກ"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ຈົນກວ່າຕາເວັນຂຶ້ນ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ເປີດຕອນ <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"ຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ຈະເລີ່ມບັນທຶກທຸກຢ່າງທີ່ສະແດງຜົນໃນໜ້າຈໍທ່ານ."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ບໍ່ຕ້ອງສະແດງອີກ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ລຶບລ້າງທັງໝົດ"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"ໂໝດຫ້າມລົບກວນຈະເຊື່ອງການແຈ້ງເຕືອນໄວ້"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ເລີ່ມດຽວນີ້"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ບໍ່ມີການແຈ້ງເຕືອນ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ໂປຣໄຟລ໌ອາດຖືກເຝົ້າຕິດຕາມຢູ່"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນເຕືອນ."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ແຕະເພື່ອປິດສຽງ."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"ການຄວບຄຸມສຽງ %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະມີສຽງ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"ມີເດຍເອົ້າພຸດ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ເອົ້າພຸດສາຍໂທອອກ"</string>
<string name="output_none_found" msgid="5544982839808921091">"ບໍ່ພົບອຸປະກອນ"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ການຄວບຄຸມການແຈ້ງເຕືອນ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ຕົວເລືອກການເລື່ອນການແຈ້ງເຕືອນ"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ຍົກເລີກ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ເລື່ອນໄປ <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ນາທີແລ້ວ"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"ແບັດເຕີຣີ"</string>
<string name="clock" msgid="7416090374234785905">"ໂມງ"</string>
<string name="headset" msgid="4534219457597457353">"ຊຸດຫູຟັງ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ເຊື່ອມຕໍ່ຊຸດຫູຟັງແລ້ວ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ເຊື່ອມຕໍ່ຊຸດຫູຟັງແລ້ວ"</string>
<string name="data_saver" msgid="5037565123367048522">"ຕົວປະຢັດຂໍ້ມູນ"</string>
@@ -812,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ຮູບຖ່າຍໜ້າຈໍ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ຂໍ້ຄວາມທົ່ວໄປ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ບ່ອນເກັບຂໍ້ມູນ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string>
<string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string>
@@ -839,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"ອະນຸຍາດ <xliff:g id="APP">%1$s</xliff:g> ເພື່ອສະແດງສະໄລ້ຈາກແອັບ"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ອະນຸຍາດ"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ປະຕິເສດ"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index fb73956..d7e0899 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -35,17 +35,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pranešimai"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Akumuliatorius senka"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Akumuliatorius senka. Įjunkite Akumuliatoriaus tausojimo priemonę"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Liko <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Liko: <xliff:g id="PERCENTAGE">%s</xliff:g> (atsižvelgiant į naudojimą liko maždaug <xliff:g id="TIME">%s</xliff:g>)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Liko: <xliff:g id="PERCENTAGE">%s</xliff:g> (liko maždaug <xliff:g id="TIME">%s</xliff:g>)"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Liko <xliff:g id="PERCENTAGE">%s</xliff:g>. Akumuliatoriaus tausojimo priemonė įjungta."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Negalima įkrauti naudojant USB. Naudokite originalų su įrenginiu pateiktą įkroviklį."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Negalima įkrauti naudojant USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Naudokite originalų su įrenginiu pateiktą įkroviklį"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nustatymai"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Įjungti Akumuliatoriaus tausojimo priemonę?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Įjungti"</string>
@@ -78,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrano kopija"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Išsaugoma ekrano kopija..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Išsaugoma ekrano kopija..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Ekrano kopija išsaugoma"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Ekrano kopija išsaugota"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Palieskite, kad peržiūrėtumėte ekrano kopiją"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Nepavyko užfiksuoti ekrano kopijos"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Išsaugant ekrano kopiją kilo problema"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Ekrano kopijos išsaugoti nepavyko"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Pabandykite padaryti ekrano kopiją dar kartą"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Negalima išsaugoti ekrano kopijos dėl ribotos saugyklos vietos"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Jūsų organizacijoje arba naudojant šią programą neleidžiama daryti ekrano kopijų"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB failo perdavimo parinktys"</string>
@@ -153,7 +148,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Prijungta."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Prisijungiama."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -213,8 +207,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Lėktuvo režimas įjungtas."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Lėktuvo režimas išjungtas."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lėktuvo režimas įjungtas."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Netrukdymo režimas įjungtas."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Įjungta funkcija „Netrukdyti“, visiška tyla."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Funkcija „Netrukdyti“ įjungta. Leidžiami tik signalai."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Netrukdyti."</string>
@@ -282,7 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Desertų dėklas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekrano užsklanda"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternetas"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Paspauskite ir palaikykite piktogramas, kad būtų parodyta daugiau parinkčių"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Palieskite ir palaikykite piktogramas, kad būtų parodyta daugiau parinkčių"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netrukdyti"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tik prioritetiniai įvykiai"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tik signalai"</string>
@@ -359,7 +352,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Per saulėlydį"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Iki saulėtekio"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Iki <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Iki <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"ALR"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"ALR išjungtas"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"ALR įjungtas"</string>
@@ -443,7 +436,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"„<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ pradės fiksuoti viską, kas rodoma jūsų ekrane."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Daugiau neberodyti"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Viską išvalyti"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Pranešimų tvarkymas"</string>
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
<skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"Pradėti dabar"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nėra įspėjimų"</string>
@@ -550,9 +544,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Palieskite, kad nustatytumėte vibravimą."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Palieskite, kad nutildytumėte."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Garsumo valdikliai: %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Skambučiai ir pranešimai vibruos"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Skambučiai ir pranešimai bus nutildyti"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Skambučiai ir pranešimai skambės"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medijos išvestis"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefono skambučių išvestis"</string>
<string name="output_none_found" msgid="5544982839808921091">"Įrenginių nerasta"</string>
@@ -643,6 +636,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"pranešimų valdikliai"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"pranešimų snaudimo parinktys"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snausti"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ANULIUOTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Nustatyta snausti <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -710,6 +704,8 @@
<string name="battery" msgid="7498329822413202973">"Akumuliatorius"</string>
<string name="clock" msgid="7416090374234785905">"Laikrodis"</string>
<string name="headset" msgid="4534219457597457353">"Ausinės"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Ausinės prijungtos"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Ausinės prijungtos"</string>
<string name="data_saver" msgid="5037565123367048522">"Duomenų taupymo priemonė"</string>
@@ -744,8 +740,9 @@
<string name="right_keycode" msgid="708447961000848163">"Klavišo kodas dešinėje"</string>
<string name="left_icon" msgid="3096287125959387541">"Piktograma kairėje"</string>
<string name="right_icon" msgid="3952104823293824311">"Piktograma dešinėje"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Nuvilkite, kad pridėtumėte išklotinės elementų"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Jei norite pridėti išklotinių, laikykite nuspaudę ir vilkite"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Vilkite čia, jei norite pašalinti"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Turi būti bent 6 išklotinės"</string>
<string name="qs_edit" msgid="2232596095725105230">"Redaguoti"</string>
<string name="tuner_time" msgid="6572217313285536011">"Laikas"</string>
<string-array name="clock_options">
@@ -832,6 +829,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekrano kopijos"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Bendrieji pranešimai"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Saugykla"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programėlės"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamų programėlių nereikia įdiegti."</string>
<string name="app_info" msgid="6856026610594615344">"Programos informacija"</string>
@@ -849,7 +848,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Pakeisti"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Programos, veikiančios fone"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Palieskite ir sužinokite išsamios informacijos apie akumuliatoriaus bei duomenų naudojimą"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Išjungti mobiliojo ryšio duomenis?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Išjungti mobiliojo ryšio duomenis?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Naudodamiesi „<xliff:g id="CARRIER">%s</xliff:g>“ paslaugomis neturėsite galimybės pasiekti duomenų arba interneto. Internetą galėsite naudoti tik prisijungę prie „Wi-Fi“."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"savo operatoriaus"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Kadangi programa užstoja leidimo užklausą, nustatymuose negalima patvirtinti jūsų atsakymo."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Leisti „<xliff:g id="APP_0">%1$s</xliff:g>“ rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Gali nuskaityti informaciją iš „<xliff:g id="APP">%1$s</xliff:g>“"</string>
@@ -857,4 +858,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Leisti „<xliff:g id="APP">%1$s</xliff:g>“ rodyti bet kurios programos fragmentus"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Leisti"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Neleisti"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 95cb656..d898ef6 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -34,17 +34,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Zems akumulatora enerģijas līmenis"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Akumulatora uzlādes līmenis ir zems. Ieslēdziet akumulatora jaudas taupīšanas režīmu."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Atlikuši <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Atlikušais laiks: <xliff:g id="PERCENTAGE">%s</xliff:g> — aptuveni <xliff:g id="TIME">%s</xliff:g> (ņemot vērā lietojumu)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Atlikušais laiks: <xliff:g id="PERCENTAGE">%s</xliff:g> — aptuveni <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Atlikuši <xliff:g id="PERCENTAGE">%s</xliff:g>. Ir ieslēgts akumulatora jaudas taupīšanas režīms."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Nevar veikt uzlādi, izmantojot USB. Izmantojiet ierīces komplektācijā iekļauto uzlādes ierīci."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Nevar veikt uzlādi, izmantojot USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Izmantojiet ierīces komplektācijā iekļauto uzlādes ierīci"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Iestatījumi"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Vai ieslēgt akumulatora jaudas taupīšanas režīmu?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Ieslēgt"</string>
@@ -77,11 +73,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrānuzņēmums"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saglabā ekrānuzņēmumu…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Notiek ekrānuzņēmuma saglabāšana..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Notiek ekrānuzņēmuma saglabāšana."</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Ekrānuzņēmums saglabāts"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Pieskarieties, lai skatītu ekrānuzņēmumu."</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Nevarēja uzņemt ekrānuzņēmumu"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Saglabājot ekrānuzņēmumu, radās problēma."</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Ekrānuzņēmumu neizdevās saglabāt."</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Mēģiniet izveidot jaunu ekrānuzņēmumu."</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Nevar saglabāt ekrānuzņēmumu, jo krātuvē nepietiek vietas."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Lietotne vai jūsu organizācija neatļauj veikt ekrānuzņēmumus."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB failu pārsūtīšanas opcijas"</string>
@@ -152,7 +147,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Savienojums ir izveidots."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Notiek savienojuma izveide..."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3,5G"</string>
@@ -212,8 +206,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Lidojuma režīms ir ieslēgts."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Lidojuma režīms ir izslēgts."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lidojuma režīms ir ieslēgts."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Režīms “Netraucēt” ir ieslēgts."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Ieslēgts režīms “Netraucēt”, pilnīgs klusums."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Ieslēgts režīms “Netraucēt”, atļauti tikai signāli."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Netraucēt."</string>
@@ -280,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Saldo ēdienu stends"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekrānsaudzētājs"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Tīkls Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Nospiediet uz ikonām un turiet, lai skatītu papildiespējas"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Lai skatītu papildiespējas, pieskarieties ikonām un turiet tās."</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netraucēt"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tikai prioritārie"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tikai signāli"</string>
@@ -356,7 +349,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Saulrietā"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Līdz saullēktam"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Plkst. <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Līdz plkst. <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Līdz <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ir atspējoti"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ir iespējoti"</string>
@@ -440,8 +433,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sāks uzņemt visu, kas tiks rādīts jūsu ekrānā."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Vairs nerādīt"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Dzēst visu"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Pārvaldīt paziņojumus"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Režīmā “Netraucēt” paziņojumi tiek paslēpti"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Sākt tūlīt"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nav paziņojumu"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilu var pārraudzīt"</string>
@@ -547,9 +540,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Pieskarieties, lai iestatītu vibrozvanu."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Pieskarieties, lai izslēgtu skaņu."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s skaļuma vadīklas"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Zvaniem un paziņojumiem tiks aktivizēta vibrācija."</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvanu un paziņojumu signāla skaņa būs izslēgta."</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Tiks atskaņots zvanu un paziņojumu signāls."</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Multivides izvade"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Tālruņa zvana izvade"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nav atrasta neviena ierīce"</string>
@@ -638,6 +630,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"paziņojumu vadīklas"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"paziņojumu atlikšanas opcijas"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Atlikt"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ATSAUKT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Atlikts: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -703,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Akumulators"</string>
<string name="clock" msgid="7416090374234785905">"Pulkstenis"</string>
<string name="headset" msgid="4534219457597457353">"Austiņas"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Austiņas ir pievienotas"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Austiņas ar mikrofonu ir pievienotas"</string>
<string name="data_saver" msgid="5037565123367048522">"Datu lietojuma samazinātājs"</string>
@@ -737,8 +732,9 @@
<string name="right_keycode" msgid="708447961000848163">"Taustiņu kods labajā pusē"</string>
<string name="left_icon" msgid="3096287125959387541">"Ikona kreisajā pusē"</string>
<string name="right_icon" msgid="3952104823293824311">"Ikona labajā pusē"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Velciet elementus, lai tos pievienotu"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Lai pievienotu elementus, pieturiet tos un velciet"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Lai noņemtu vienumus, velciet tos šeit."</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Nepieciešami vismaz 6 elementi"</string>
<string name="qs_edit" msgid="2232596095725105230">"Rediģēt"</string>
<string name="tuner_time" msgid="6572217313285536011">"Laiks"</string>
<string-array name="clock_options">
@@ -825,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekrānuzņēmumi"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Vispārīgi ziņojumi"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Krātuve"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Padomi"</string>
<string name="instant_apps" msgid="6647570248119804907">"Tūlītējās lietotnes"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Tūlītējām lietotnēm nav nepieciešama instalēšana."</string>
<string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string>
@@ -842,7 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Aizstāt"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Lietotnes, kas darbojas fonā"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Pieskarieties, lai skatītu detalizētu informāciju par akumulatora un datu lietojumu"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Vai izslēgt mobilos datus?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Vai izslēgt mobilos datus?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Izmantojot mobilo sakaru operatora <xliff:g id="CARRIER">%s</xliff:g> pakalpojumus, nevarēsiet piekļūt datiem vai internetam. Internetam varēsiet piekļūt, tikai izmantojot Wi-Fi savienojumu."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"jūsu mobilo sakaru operators"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Lietotne Iestatījumi nevar verificēt jūsu atbildi, jo cita lietotne aizsedz atļaujas pieprasījumu."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Vai atļaut lietotnei <xliff:g id="APP_0">%1$s</xliff:g> rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Var lasīt informāciju no lietotnes <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -850,4 +849,15 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Atļaut lietotnei <xliff:g id="APP">%1$s</xliff:g> rādīt sadaļas no jebkuras lietotnes"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Atļaut"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Neatļaut"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Pieskarieties, lai iestatītu akumulatora jaudas taupīšanas režīma grafiku"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nē, paldies"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Ieslēgts akumulatora enerģijas taupīšanas režīma grafiks"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Iestatījumi"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Labi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index eaf7b02..ad6cb883 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Во тек"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известувања"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батеријата е слаба"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батеријата е слаба. Вклучете го штедачот на батерија"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Преостануваат <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Преостануваат <xliff:g id="PERCENTAGE">%s</xliff:g>, уште околу <xliff:g id="TIME">%s</xliff:g> според користењето"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Преостануваат <xliff:g id="PERCENTAGE">%s</xliff:g>, уште околу <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Слика од екранот"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Сликата на екранот се зачувува..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Сликата на екранот се зачувува..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Сликата од екранот се зачувува"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Сликата од екранот е зачувана"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Допрете за да ја видите сликата од екранот"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Сликата од екранот не можеше да се сними"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Проблем при зачувувањето слика од екранот"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Не можеше да се зачува слика од екранот"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Повторно обидете се да направите слика од екранот"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Сликата од екранот не може да се зачува поради ограничена меморија"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Апликацијата или вашата организација не дозволува снимање слики од екранот"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Пренос на датотека со USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Заштитник на екран"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Допрете ги и задржете ги иконите за повеќе опции"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не вознемирувај"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетно"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Вклуч. на зајдисонце"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрејсонце"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ќе се вклучи во <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"До <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC е оневозможено"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC е овозможено"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе започне да презема сѐ што се прикажува на вашиот екран."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не покажувај повторно"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Исчисти сè"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"„Не вознемирувај“ ги крие известувањата"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Управувајте со известувањата"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"„Не вознемирувај“ ги крие известувањата"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Започни сега"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Нема известувања"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профилот можеби се следи"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Допрете за да се постави на вибрации."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Допрете за да се исклучи звукот."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Контроли на јачината на звукот за %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Повиците и известувањата ќе ѕвонат"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Излез за аудиовизуелни содржини"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Излез за телефонски повик"</string>
<string name="output_none_found" msgid="5544982839808921091">"Не се најдени уреди"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"контроли за известувањето"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"опции за одложување на известувањето"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Одложете"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ВРАТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Батерија"</string>
<string name="clock" msgid="7416090374234785905">"Часовник"</string>
<string name="headset" msgid="4534219457597457353">"Слушалки"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Слушалките се поврзани"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Слушалките се поврзани"</string>
<string name="data_saver" msgid="5037565123367048522">"Штедач на интернет"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Слики од екранот"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Општи пораки"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Капацитет"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Совети"</string>
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string>
<string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Дозволете <xliff:g id="APP">%1$s</xliff:g> да прикажува делови од која било апликација"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Дозволи"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Одбиј"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Допрете за да закажете „Штедач на батерија“"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Вклучи автоматски кога батеријата е на <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Не, фала"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Распоредот за „Штедач на батерија“ е вклучен"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Штедачот на батерија ќе се вклучи автоматски кога батеријата ќе падне под <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Поставки"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Сфатив"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 76b68be..aa6eecb 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"നടന്നുകൊണ്ടിരിക്കുന്നവ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"അറിയിപ്പുകൾ"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ബാറ്ററി കുറവാണ്"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ബാറ്ററി ചാർജ് കുറവാണ്. ബാറ്ററി ലാഭിക്കൽ ഓണാക്കുക"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ശേഷിക്കുന്നു"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> അവശേഷിക്കുന്നു, ഉപയോഗം അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%s</xliff:g> ശേഷിക്കുന്നു"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> അവശേഷിക്കുന്നു, ഏകദേശം <xliff:g id="TIME">%s</xliff:g> ശേഷിക്കുന്നു"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"സ്ക്രീൻഷോട്ട്"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"സ്ക്രീൻഷോട്ട് സംരക്ഷിച്ചു"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"സ്ക്രീൻഷോട്ട് കാണാൻ ടാപ്പ് ചെയ്യുക"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"സ്ക്രീൻഷോട്ട് എടുക്കാനായില്ല"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"സ്ക്രീൻഷോട്ട് സംരക്ഷിമ്പോൾ പ്രശ്നം നേരിട്ടു"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കാനായില്ല"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"സ്ക്രീൻഷോട്ട് എടുക്കാൻ വീണ്ടും ശ്രമിക്കുക"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"സ്റ്റോറേജ് ഇടം പരിമിതമായതിനാൽ സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കാനാകുന്നില്ല"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ഫയൽ കൈമാറൽ ഓപ്ഷനുകൾ"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ഡെസേർട്ട് കെയ്സ്"</string>
<string name="start_dreams" msgid="5640361424498338327">"സ്ക്രീൻ സേവർ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ഇതർനെറ്റ്"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"കൂടുതൽ ഓപ്ഷനുകൾക്കായി ഐക്കണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ശല്ല്യപ്പെടുത്തരുത്"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"മുൻഗണന മാത്രം"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"അലാറങ്ങൾ മാത്രം"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"സൂര്യാസ്തമയത്തിന്"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"സൂര്യോദയം വരെ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-ന്"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> വരെ"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> വരെ"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string>
@@ -433,7 +430,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"നിങ്ങളുടെ സ്ക്രീനിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്ന എല്ലാ കാര്യങ്ങളും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ക്യാപ്ചർ ചെയ്യുന്നത് ആരംഭിക്കും."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"വീണ്ടും കാണിക്കരുത്"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"എല്ലാം മായ്ക്കുക"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"അറിയിപ്പുകളെ \'ശല്യപ്പെടുത്തരുത്\' അദൃശ്യമാക്കുന്നു"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"അറിയിപ്പുകൾ മാനേജ് ചെയ്യുക"</string>
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ഇപ്പോൾ ആരംഭിക്കുക"</string>
<string name="empty_shade_text" msgid="708135716272867002">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"പ്രൊഫൈൽ നിരീക്ഷിക്കപ്പെടാം"</string>
@@ -539,7 +538,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ശബ്ദ നിയന്ത്രണങ്ങൾ"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"കോളുകളും അറിയിപ്പുകളും റിംഗ് ചെയ്യും"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"മീഡിയ ഔട്ട്പുട്ട്"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ഫോൺ കോൾ ഔട്ട്പുട്ട്"</string>
<string name="output_none_found" msgid="5544982839808921091">"ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല"</string>
@@ -626,6 +626,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"അറിയിപ്പ് നിയന്ത്രണങ്ങൾ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"അറിയിപ്പ് സ്നൂസ് ഓപ്ഷനുകൾ"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"സ്നൂസ് ചെയ്യുക"</string>
<string name="snooze_undo" msgid="6074877317002985129">"പഴയപടിയാക്കുക"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> സമയത്തേക്ക് സ്നൂസ് ചെയ്തു"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +690,8 @@
<string name="battery" msgid="7498329822413202973">"ബാറ്ററി"</string>
<string name="clock" msgid="7416090374234785905">"ക്ലോക്ക്"</string>
<string name="headset" msgid="4534219457597457353">"ഹെഡ്സെറ്റ്"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ഹെഡ്ഫോണുകൾ കണക്റ്റുചെയ്തു"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ഹെഡ്സെറ്റ് കണക്റ്റുചെയ്തു"</string>
<string name="data_saver" msgid="5037565123367048522">"ഡാറ്റ സേവർ"</string>
@@ -723,11 +726,9 @@
<string name="right_keycode" msgid="708447961000848163">"വലതുവശത്തെ കീകോഡ്"</string>
<string name="left_icon" msgid="3096287125959387541">"ഇടതുവശത്തെ ചിഹ്നം"</string>
<string name="right_icon" msgid="3952104823293824311">"വലതുവശത്തെ ചിഹ്നം"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ടൈലുകൾ ചേർക്കാൻ പിടിച്ച് ഇഴയ്ക്കുക"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"നീക്കംചെയ്യുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"നിങ്ങൾക്ക് ചുരുങ്ങിയത് 6 ടൈലുകൾ വേണം"</string>
<string name="qs_edit" msgid="2232596095725105230">"എഡിറ്റുചെയ്യുക"</string>
<string name="tuner_time" msgid="6572217313285536011">"സമയം"</string>
<string-array name="clock_options">
@@ -814,6 +815,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"സ്ക്രീൻഷോട്ടുകൾ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"പൊതുവായ സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"സ്റ്റോറേജ്"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string>
<string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string>
@@ -831,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"മാറ്റിസ്ഥാപിക്കുക"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"ആപ്പുകൾ പശ്ചാത്തലത്തിൽ റൺ ചെയ്യുന്നു"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"ബാറ്ററി, ഡാറ്റ ഉപയോഗം എന്നിവയുടെ വിശദാംശങ്ങളറിയാൻ ടാപ്പുചെയ്യുക"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"മൊബൈൽ ഡാറ്റ ഓഫാക്കണോ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"നിങ്ങൾക്ക് ഡാറ്റയിലേക്കുള്ള ആക്സസ് ഇല്ല അല്ലെങ്കിൽ <xliff:g id="CARRIER">%s</xliff:g> മുഖേനയുള്ള ഇന്റർനെറ്റില്ല. വൈഫൈ മുഖേനയുള്ള ഇന്റർനെറ്റ് മാത്രമേ ഉണ്ടായിരിക്കൂ."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"നിങ്ങളുടെ കാരിയർ"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"അനുമതി അഭ്യർത്ഥനയെ ഒരു ആപ്പ് മറയ്ക്കുന്നതിനാൽ, ക്രമീകരണത്തിന് നിങ്ങളുടെ പ്രതികരണം പരിശോധിച്ചുറപ്പിക്കാനാകില്ല."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g>-നെ അനുവദിക്കണോ?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ഇതിന് <xliff:g id="APP">%1$s</xliff:g>-ൽ നിന്ന് വിവരങ്ങൾ വായിക്കാനാകും"</string>
@@ -844,4 +844,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"ഏത് ആപ്പിൽ നിന്നും സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP">%1$s</xliff:g>-നെ അനുവദിക്കുക"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"അനുവദിക്കുക"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"നിരസിക്കുക"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 151e34a..ffc18f0 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -31,7 +31,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Гарсан"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Мэдэгдэл"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батерей дуусаж байна"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батерей бага байна. Тэжээл хэмнэгчийг асаана уу"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> үлдсэн"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> үлдсэн байна. Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%s</xliff:g>-н хугацаа үлдсэн"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> үлдсэн байна. Ойролцоогоор <xliff:g id="TIME">%s</xliff:g>-н хугацаа үлдсэн"</string>
@@ -71,11 +70,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Дэлгэцийн зураг дарах"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Дэлгэцийн агшинг хадгалж байна…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Дэлгэцийн агшинг хадгалж байна…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Дэлгэцээс дарсан зургийг хадгалж байна"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Дэлгэцээс дарсан зургийг хадгалсан"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Дэлгэцээс дарсан зургийг харах бол товшино уу"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Дэлгэцийн зургийг дарж чадсангүй"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Дэлгэцээс дарсан зургийг хадгалахад алдаа гарлаа"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Сангийн багтаамж бага байгаа тул дэлгэцээс дарсан зургийг хадгалах боломжгүй байна"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Таны апп, байгууллагад дэлгэцийн зураг авахыг зөвшөөрдөггүй"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB файл шилжүүлэх сонголт"</string>
@@ -271,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Амттаны хайрцаг"</string>
<string name="start_dreams" msgid="5640361424498338327">"Дэлгэц амраагч"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Бусад сонголтыг харахын тулд дүрс тэмдгийг удаан дарна уу"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Бүү саад бол"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Зөвхөн чухал зүйлс"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Зөвхөн сэрүүлэг"</string>
@@ -347,7 +346,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Нар жаргах үед"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Нар мандах хүртэл"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-д"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> хүртэл"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-г цуцалсан"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-г идэвхжүүлсэн"</string>
@@ -431,7 +431,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> таны дэлгэц дээр гаргасан бүх зүйлийн зургийг авч эхэлнэ."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Дахиж үл харуулах"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Бүгдийг арилгах"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Бүү саад бол горим мэдэгдлийг нууж байна"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Бүү саад бол горим мэдэгдлийг нууж байна"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Одоо эхлүүлэх"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Мэдэгдэл байхгүй"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профайлыг хянаж байж болзошгүй"</string>
@@ -537,7 +539,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Чичиргээнд тохируулахын тулд товшино уу."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дууг хаахын тулд товшино уу."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s түвшний хяналт"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Дуудлага болон мэдэгдэл дуугарна"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Медиа гаралт"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Утасны дуудлагын гаралт"</string>
<string name="output_none_found" msgid="5544982839808921091">"Төхөөрөмж олдсонгүй"</string>
@@ -624,6 +627,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"мэдэгдлийн удирдлага"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"мэдэгдэл түр хойшлуулагчийн сонголт"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"БУЦААХ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>-д түр хойшлуулсан"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -687,6 +692,8 @@
<string name="battery" msgid="7498329822413202973">"Зай"</string>
<string name="clock" msgid="7416090374234785905">"Цаг"</string>
<string name="headset" msgid="4534219457597457353">"Чихэвч"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Чихэвч холбогдсон"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Чихэвч холбогдсон"</string>
<string name="data_saver" msgid="5037565123367048522">"Өгөгдөл хамгаалагч"</string>
@@ -810,6 +817,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Дэлгэцийн зураг дарах"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Энгийн зурвас"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хадгалах сан"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Заавар"</string>
<string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string>
<string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string>
@@ -837,4 +845,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>-д дурын аппаас хэсэг харуулахыг зөвшөөрөх"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Зөвшөөрөх"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Татгалзах"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Тэжээл хэмнэгч онцлогийг хуваарилахын тулд товших"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Батерей <xliff:g id="PERCENTAGE">%d</xliff:g>%% болох үед автоматаар асаах"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Үгүй, баярлалаа"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Тэжээл хэмнэгч онцлогийн хуваарийг асаасан"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Батерей <xliff:g id="PERCENTAGE">%d</xliff:g>%%-с бага болсон үед Тэжээл хэмнэгч онцлог автоматаар асна."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Тохиргоо"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ойлголоо"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 46be695..13030ff 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"सुरु असलेले"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचना"</string>
<string name="battery_low_title" msgid="6456385927409742437">"बॅटरी कमी आहे"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"बॅटरी कमी आहे. बॅटरी सेव्हर चालू करा"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाकी, तुमच्या वापरावर आधारित सुमारे <xliff:g id="TIME">%s</xliff:g> शिल्लक"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाकी, सुमारे <xliff:g id="TIME">%s</xliff:g> शिल्लक"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रीनशॉट जतन करत आहे…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"स्क्रीनशॉट जतन करत आहे…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"स्क्रीनशॉट सेव्ह केला जात आहे"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"स्क्रीनशॉट सेव्ह केला"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"तुमचा स्क्रीनशॉट पाहण्यासाठी टॅप करा"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"स्क्रीनशॉट कॅप्चर करता आला नाही"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"स्क्रीनशॉट सेव्ह करताना समस्या आली"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"मर्यादित स्टोरेज जागेमुळे स्क्रीनशॉट सेव्ह करू शकत नाही"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"अॅप किंवा आपल्या संस्थेद्वारे स्क्रीनशॉट घेण्याची अनुमती नाही"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB फाईल स्थानांतरण पर्याय"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"मिष्ठान्न प्रकरण"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेव्हर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"इथरनेट"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"अधिक पर्यायांसाठी आयकनला स्पर्श करा आणि धरून ठेवा"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"व्यत्यय आणू नका"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवळ प्राधान्य"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवळ अलार्म"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"संध्याकाळी चालू असते"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयापर्यंत"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> वाजता चालू"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> पर्यंत"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC अक्षम केले आहे"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC सक्षम केले आहे"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपल्या स्क्रीनवर प्रदर्शित होणारी प्रत्येक गोष्ट कॅप्चर करणे प्रारंभ करेल."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"पुन्हा दर्शवू नका"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सर्व साफ करा"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"व्यत्यय आणू नका सूचना लपवत आहे"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"आता सुरू करा"</string>
<string name="empty_shade_text" msgid="708135716272867002">"सूचना नाहीत"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफाईलचे परीक्षण केले जाऊ शकते"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन सेट करण्यासाठी टॅप करा."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. नि:शब्द करण्यासाठी टॅप करा."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s व्हॉल्यूम नियंत्रण"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"कॉल अन्नि सूचना रिंग करा"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फोन कॉल आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कोणतीही डिव्हाइस सापडली नाहीत"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"सूचना नियंत्रणे"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"सूचना स्नूझ पर्याय"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पूर्ववत करा"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> साठी स्नूझ करा"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"बॅटरी"</string>
<string name="clock" msgid="7416090374234785905">"घड्याळ"</string>
<string name="headset" msgid="4534219457597457353">"हेडसेट"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"हेडफोन कनेक्ट केले"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"हेडसेट कनेक्ट केला"</string>
<string name="data_saver" msgid="5037565123367048522">"डेटा बचतकर्ता"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"उजवा कीकोड"</string>
<string name="left_icon" msgid="3096287125959387541">"डावे आयकन"</string>
<string name="right_icon" msgid="3952104823293824311">"उजवे आयकन"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"टाइल जोडण्यासाठी धरून ठेवा आणि ड्रॅग करा"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"काढण्यासाठी येथे ड्रॅग करा"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"तुम्हाला किमान ६ टाइलची गरज आहे"</string>
<string name="qs_edit" msgid="2232596095725105230">"संपादित करा"</string>
<string name="tuner_time" msgid="6572217313285536011">"वेळ"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"स्क्रीनशॉट"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सर्वसाधारण संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"संचय"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string>
<string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"पुनर्स्थित करा"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"अॅप्स बॅकग्राउंडमध्ये चालू आहेत"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"बॅटरी आणि डेटा वापराच्या तपशीलांसाठी टॅप करा"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"मोबाइल डेटा बंद करायचा?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"तुम्हाला <xliff:g id="CARRIER">%s</xliff:g> मधून डेटा किंवा इंटरनेटचा अॅक्सेस नसेल. इंटरनेट फक्त वाय-फाय मार्फत उपलब्ध असेल."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"तुमचा वाहक"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"अॅप परवानगी विनंती अस्पष्ट करत असल्याने, सेटिंग्ज तुमचा प्रतिसाद पडताळू शकत नाहीत."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवण्याची अनुमती द्यायची का?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ते <xliff:g id="APP">%1$s</xliff:g> ची माहिती वाचू शकते"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> ला कुठल्याही अॅपमधील तुकडे दाखवण्याची अनुमती द्या"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"अनुमती द्या"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"नकार द्या"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 319d71d..2b5c049 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateri lemah"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Bateri lemah. Hidupkan Penjimat Bateri"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> yang tinggal"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Tinggal <xliff:g id="PERCENTAGE">%s</xliff:g>, kira-kira <xliff:g id="TIME">%s</xliff:g> lagi berdasarkan penggunaan anda"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Tinggal <xliff:g id="PERCENTAGE">%s</xliff:g>, kira-kira <xliff:g id="TIME">%s</xliff:g> lagi"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Tangkapan skrin"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan skrin..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan skrin..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Tangkapan skrin sedang disimpan"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Tangkapan skrin disimpan"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Ketik untuk melihat tangkapan skrin anda"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Tidak dapat menangkap tangkapan skrin"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Masalah berlaku semasa menyimpan tangkapan skrin"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Tidak dapat menyimpan tangkapan skrin kerana ruang storan terhad"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Pengambilan tangkapan skrin tidak dibenarkan oleh apl atau organisasi anda"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Pilihan pemindahan fail USB"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Bekas Pencuci Mulut"</string>
<string name="start_dreams" msgid="5640361424498338327">"Penyelamat skrin"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Sentuh & tahan ikon untuk mendapatkan pilihan lanjut"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Keutamaan sahaja"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Penggera sahaja"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Dihidupkan pd senja"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hingga matahari terbit"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dilumpuhkan"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC didayakan"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mula mengabadikan semua yang dipaparkan pada skrin anda.."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tunjukkan lagi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Kosongkan semua"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Jangan Ganggu menyembunyikan pemberitahuan"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Jangan Ganggu menyembunyikan pemberitahuan"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Mulakan sekarang"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Tiada pemberitahuan"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil mungkin dipantau"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ketik untuk menetapkan pada getar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ketik untuk meredam."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s kawalan kelantangan"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Panggilan dan pemberitahuan akan berdering"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Output media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Output panggilan telefon"</string>
<string name="output_none_found" msgid="5544982839808921091">"Tiada peranti ditemui"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kawalan pemberitahuan"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"pilihan tunda pemberitahuan"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BUAT ASAL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Bateri"</string>
<string name="clock" msgid="7416090374234785905">"Jam"</string>
<string name="headset" msgid="4534219457597457353">"Set Kepala"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Fon kepala disambungkan"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Set kepala disambungkan"</string>
<string name="data_saver" msgid="5037565123367048522">"Penjimat Data"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Tangkapan skrin"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mesej Am"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storan"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Pembayang"</string>
<string name="instant_apps" msgid="6647570248119804907">"Apl Segera"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Apl segera tidak memerlukan pemasangan."</string>
<string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Benarkan <xliff:g id="APP">%1$s</xliff:g> menunjukkan hirisan daripada mana-mana apl"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Benarkan"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Tolak"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Ketik untuk menjadualkan Penjimat Bateri"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Hidupkan secara automatik apabila kuasa bateri adalah pada <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Tidak perlu"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Jadual Penjimat Bateri dihidupkan"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Penjimat Bateri akan dihidupkan secara automatik setelah kuasa bateri kurang daripada <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Tetapan"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index aca8489..6080a99 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"လက်ရှိအသုံးပြုမှု"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"အကြောင်းကြားချက်များ။"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ဘက်ထရီ အားနည်းနေ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ဘက်ထရီ အားနည်းနေပါပြီ။ ဘက်ထရီအားထိန်းကို ဖွင့်ပါ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်ရှိနေ"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်သည်၊ သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">%s</xliff:g> ခန့် ကျန်ပါသည်"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်သည်၊ <xliff:g id="TIME">%s</xliff:g> ခန့် ကျန်ပါသည်"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ဖန်သားပြင်ဓါတ်ပုံသိမ်းစဉ်.."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ဖန်သားပြင်ဓာတ်ပုံကို သိမ်းနေသည်"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ဖန်သားပြင်ဓာတ်ပုံကို သိမ်းပြီးပါပြီ"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ဖန်သားပြင်ဓာတ်ပုံကို ကြည့်ရန် တို့ပါ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်၍မရပါ"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ဖန်သားပြင်ဓာတ်ပုံကို သိမ်းရာတွင် ပြဿနာရှိနေသည်"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"မျက်နှာပြင်ပုံကို သိမ်း၍မရပါ"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"မျက်နှာပြင်ပုံကို ထပ်ရိုက်ကြည့်ပါ"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"သိုလှောင်ခန်းနေရာ အကန့်အသတ်ရှိသောကြောင့် ဖန်သားပြင်ဓာတ်ပုံကို သိမ်းဆည်း၍မရပါ"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ဖန်သားပြင်ဓာတ်ပုံရိုက်ကူးခြင်းကို ဤအက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ဖိုင်ပြောင်း ရွေးမှုများ"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"နေဝင်ချိန်၌ ဖွင့်ရန်"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"နေထွက်ချိန် အထိ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> တွင် ဖွင့်ရန်"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> အထိ"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> အထိ"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ကို ပိတ်ထားသည်"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ကို ဖွင့်ထားသည်"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"နောက်ထပ် မပြပါနှင့်"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"အားလုံး ဖယ်ရှားရန်"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"အကြောင်းကြားချက်များကို စီမံရန်"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"ယခု စတင်ပါ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"အကြောင်းကြားချက်များ မရှိ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s။ တုန်ခါခြင်းသို့ သတ်မှတ်ရန်တို့ပါ။"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s။ အသံတိတ်ရန် တို့ပါ။"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s အသံအတိုးအလျှော့ ခလုတ်များ"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များ အသံမြည်ပါမည်"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"မီဒီယာ အထွက်"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ဖုန်းလိုင်း အထွက်"</string>
<string name="output_none_found" msgid="5544982839808921091">"မည်သည့် စက်ပစ္စည်းမျှ မတွေ့ပါ"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"အကြောင်းကြားချက် ထိန်းချုပ်မှုများ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"အကြောင်းကြားချက်များကို ဆိုင်းငံ့ရန် ရွေးချယ်စရာများ"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ဆိုင်းထားရန်"</string>
<string name="snooze_undo" msgid="6074877317002985129">"တစ်ဆင့် နောက်ပြန်ပြန်ပါ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ဆိုင်းငံ့ရန်"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"ဘက်ထရီ"</string>
<string name="clock" msgid="7416090374234785905">"နာရီ"</string>
<string name="headset" msgid="4534219457597457353">"မိုက်ခွက်ပါနားကြပ်"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"နားကြပ်တပ်ဆင်ပြီးပါပြီ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"မိုက်ခွက်ပါနားကြပ်တပ်ဆင်ပြီးပါပြီ"</string>
<string name="data_saver" msgid="5037565123367048522">"ဒေတာချွေတာမှု"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"မျက်နှာပြင်ဓာတ်ပုံများ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"အထွေထွေ မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"သိုလှောင်မှုများ"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"အရိပ်အမြွက်များ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။"</string>
<string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"မည်သည့်အက်ပ်မဆိုမှ အချပ်များ ပြသရန်အတွက် <xliff:g id="APP">%1$s</xliff:g> ကို ခွင့်ပြုရန်"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ခွင့်ပြုရန်"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ငြင်းပယ်ရန်"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"\'ဘက်ထရီ အားထိန်း\' အချိန်သတ်မှတ်ရန် အတွက် တို့ပါ"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"ဘက်ထရီ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ရောက်သည့်အခါ အလိုအလျောက် ဖွင့်ပါ"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"မလိုပါ"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"\'ဘက်ထရီ အားထိန်း\' အစီအစဉ် ဖွင့်ထားသည်"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"ဘက်ထရီ <xliff:g id="PERCENTAGE">%d</xliff:g>%% အောက် နည်းသွားသည်နှင့် \'ဘက်ထရီ အားထိန်း\' အလိုအလျောက် ဖွင့်ပါမည်။"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"ဆက်တင်များ"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"ရပါပြီ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 131d668..7654b06 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varsler"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batterikapasiteten er lav"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Du har lite batteri. Slå på batterisparing"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> gjenstår"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> gjenstår, omtrent <xliff:g id="TIME">%s</xliff:g> igjen basert på bruken din"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> gjenstår, omtrent <xliff:g id="TIME">%s</xliff:g> igjen"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjermdump"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Lagrer skjermdumpen …"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Lagrer skjermdumpen …"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Skjermdumpen lagres"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skjermdumpen er lagret"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Trykk for å se skjermdumpen"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Kan ikke lagre skjermdumpen"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Det oppsto et problem under lagring av skjermdumpen"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kan ikke lagre skjermdumpen på grunn av begrenset lagringsplass"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Altern. for USB-filoverføring"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertmonter"</string>
<string name="start_dreams" msgid="5640361424498338327">"Skjermsparer"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Trykk og hold på ikonene for å se flere alternativer"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"«Ikke forstyrr»"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Bare prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Bare alarmer"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På ved solnedgang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til soloppgang"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På kl. <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Til <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er slått av"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er slått på"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar opp alt som vies på skjermen din."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ikke vis igjen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Fjern alt"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"«Ikke forstyrr» skjuler varsler"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"«Ikke forstyrr» skjuler varsler"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Start nå"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ingen varsler"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilen kan overvåkes"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trykk for å angi vibrasjon."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trykk for å slå av lyden."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s volumkontroller"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Anrop og varsler ringer"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medieutdata"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Utgang for telefonsamtaler"</string>
<string name="output_none_found" msgid="5544982839808921091">"Fant ingen enheter"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"varselinnstillinger"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"slumrealternativer for varsler"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANGRE"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Slumrer i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Batteri"</string>
<string name="clock" msgid="7416090374234785905">"Klokke"</string>
<string name="headset" msgid="4534219457597457353">"Hodetelefoner"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Øretelefoner er tilkoblet"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Hodetelefoner er tilkoblet"</string>
<string name="data_saver" msgid="5037565123367048522">"Datasparing"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skjermdumper"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Generelle meldinger"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hint"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Du trenger ikke å installere instant-apper."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Tillat at <xliff:g id="APP">%1$s</xliff:g> viser utsnitt fra alle apper"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Tillat"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Avvis"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Trykk for å planlegge batterisparing"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Slå på automatisk når batteriet er på <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nei takk"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Tidsplan for batterisparing er slått på"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batterisparing slås på automatisk når batteriet er lavere enn <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Innstillinger"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Greit"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index cc5eb4b..e30d8c3 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाहरू"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ब्याट्री कम छ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ब्याट्रीको स्तर न्यून छ। ब्याट्री सेभर सक्रिय गर्नुहोस्"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी, तपाईंको प्रयोगका आधारमा करिब <xliff:g id="TIME">%s</xliff:g> बाँकी छ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी, करिब <xliff:g id="TIME">%s</xliff:g> बाँकी छ"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रिनसट"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रिनसट बचत गर्दै…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"स्क्रिनसट बचत गर्दै…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"स्क्रिनसट सुरक्षित गरिँदै छ"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"स्क्रिनसट सुरक्षित गरियो"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"आफ्नो स्क्रिनसट हेर्न ट्याप गर्नुहोस्"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"स्क्रिनसट खिच्न सकिएन"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"स्क्रिनसट सुरक्षित गर्ने क्रममा समस्या आइपर्यो"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"स्क्रिनसट सुरक्षित गर्न सकिएन"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"स्क्रिनसट फेरि लिएर हेर्नुहोस्"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"भण्डारण ठाउँ सीमित भएका कारण स्क्रिनसट सुरक्षित गर्न सकिएन"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"उक्त अनुप्रयोग वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB फाइल सार्ने विकल्पहरू"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रिन सेभर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"थप विकल्पहरूका लागि आइकनहरूमा छोइराख्नुहोस्"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"बाधा नपुर्याउँनुहोस्"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"प्राथमिकता मात्र"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"अलार्महरू मात्र"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"सूर्यास्तमा सक्रिय"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयसम्म"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> मा सक्रिय"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC लाई असक्षम पारिएको छ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC लाई सक्षम पारिएको छ"</string>
@@ -433,7 +430,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले आफ्नो स्क्रीनमा प्रदर्शित हुने सबै खिच्न शुरू गर्नेछ।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"फेरि नदेखाउनुहोस्"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सबै हटाउनुहोस्"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"बाधा नपुर्याउनुहोस् मोडले सूचनाहरू लुकाइरहेको छ"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"सूचनाहरू व्यवस्थापन गर्नुहोस्"</string>
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"अहिले सुरु गर्नुहोस्"</string>
<string name="empty_shade_text" msgid="708135716272867002">"कुनै सूचनाहरू छैनन्"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफाइल अनुगमन हुन सक्छ"</string>
@@ -539,7 +538,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। कम्पन मोडमा सेट गर्न ट्याप गर्नुहोस्।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। म्यूट गर्न ट्याप गर्नुहोस्।"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s भोल्युमका नियन्त्रणहरू"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"कल तथा सूचनाहरू आउँदा घन्टी बज्ने छ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"मिडियाको आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फोन कलको आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कुनै पनि यन्त्र भेटिएन"</string>
@@ -626,6 +626,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"सूचना सम्बन्धी नियन्त्रणहरू"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"सूचना स्नुज गर्ने विकल्पहरू"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"स्नुज गर्नुहोस्"</string>
<string name="snooze_undo" msgid="6074877317002985129">"अनडू गर्नुहोस्"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> का लागि स्नुज गरियो"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +690,8 @@
<string name="battery" msgid="7498329822413202973">"ब्याट्री"</string>
<string name="clock" msgid="7416090374234785905">"घडी"</string>
<string name="headset" msgid="4534219457597457353">"हेडसेट"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"हेडफोनहरू जडान गरियो"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"हेडसेट जडान गरियो"</string>
<string name="data_saver" msgid="5037565123367048522">"डेटा सेभर"</string>
@@ -723,11 +726,9 @@
<string name="right_keycode" msgid="708447961000848163">"दायाँतिरको किकोड"</string>
<string name="left_icon" msgid="3096287125959387541">"बायाँतिर देखाउने आइकन"</string>
<string name="right_icon" msgid="3952104823293824311">"दायाँतिरको आइकन"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"टाइलहरू थप्न होल्ड गरी ड्र्याग गर्नुहोस्"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"हटाउनका लागि यहाँ तान्नुहोस्"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"तपाईंलाई कम्तीमा ६ वटा टाइलहरू चाहिन्छ"</string>
<string name="qs_edit" msgid="2232596095725105230">"सम्पादन गर्नुहोस्"</string>
<string name="tuner_time" msgid="6572217313285536011">"समय"</string>
<string-array name="clock_options">
@@ -814,6 +815,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"स्क्रिनशटहरू"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य सन्देशहरू"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"भण्डारण"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string>
<string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string>
@@ -831,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"प्रतिस्थापन गर्नुहोस्"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"पृष्ठभूमिमा चल्ने अनुप्रयोगहरू"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"ब्याट्री र डेटाका प्रयोग सम्बन्धी विवरणहरूका लागि ट्याप गर्नुहोस्"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"तपाईंको <xliff:g id="CARRIER">%s</xliff:g> मार्फत डेटा वा इन्टरनेटमाथि पहुँच हुने छैन। Wi-Fi मार्फत मात्र इन्टरनेट उपलब्ध हुने छ।"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"तपाईंको सेवा प्रदायक"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"कुनै अनुप्रयोगको कारणले अनुमतिसम्बन्धी अनुरोध बुझ्न गाह्रो भइरहेकोले सेटिङहरूले तपाईंको प्रतिक्रिया प्रमाणित गर्न सक्दैनन्।"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> लाई <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन अनुमति दिने हो?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- यसले <xliff:g id="APP">%1$s</xliff:g> बाट जानकारी पढ्न सक्छ"</string>
@@ -844,4 +844,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"अन्य अनुप्रयोगबाट <xliff:g id="APP">%1$s</xliff:g> मा स्लाइसहरू देखाउन अनुमति दिनुहोस्"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"अनुमति दिनुहोस्"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"अस्वीकार गर्नु…"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 6cbdfae..6d74cc6 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actief"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batterij is bijna leeg"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"De batterij is bijna leeg. Schakel Batterijbesparing in."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> resterend"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> resterend, nog ongeveer <xliff:g id="TIME">%s</xliff:g> over op basis van je gebruik"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> resterend, nog ongeveer <xliff:g id="TIME">%s</xliff:g> over"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot opslaan..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot opslaan..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Screenshot wordt opgeslagen"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot opgeslagen"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Tik om je screenshot te bekijken"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Kan geen screenshot maken"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Er is een probleem opgetreden bij het opslaan van het screenshot"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kan screenshot niet opslaan vanwege beperkte opslagruimte"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Het maken van screenshots wordt niet toegestaan door de app of je organisatie"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opties voor USB-bestandsoverdracht"</string>
@@ -348,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan bij zonsondergang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot zonsopgang"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is uitgeschakeld"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is ingeschakeld"</string>
@@ -432,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> gaat alles vastleggen dat wordt weergegeven op je scherm."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Niet opnieuw weergeven"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Alles wissen"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'Niet storen\' verbergt meldingen"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'Niet storen\' verbergt meldingen"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Nu starten"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Geen meldingen"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profiel kan worden gecontroleerd"</string>
@@ -538,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om in te stellen op trillen."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te dempen."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s-volumeknoppen"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Beltoon gaat over bij oproepen en meldingen"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Uitvoer van telefoongesprek"</string>
<string name="output_none_found" msgid="5544982839808921091">"Geen apparaten gevonden"</string>
@@ -625,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"beheeropties voor meldingen"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"snooze-opties voor meldingen"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ONGEDAAN MAKEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozefunctie <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> actief"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Batterij"</string>
<string name="clock" msgid="7416090374234785905">"Klok"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Hoofdtelefoon aangesloten"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset aangesloten"</string>
<string name="data_saver" msgid="5037565123367048522">"Databesparing"</string>
@@ -811,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Algemene berichten"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Opslag"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant-apps hoeven niet te worden geïnstalleerd."</string>
<string name="app_info" msgid="6856026610594615344">"App-info"</string>
@@ -838,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> toestaan om segmenten van apps weer te geven"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Toestaan"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Weigeren"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tikken om Batterijbesparing in te schakelen"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Automatisch inschakelen wanneer de batterijstatus <xliff:g id="PERCENTAGE">%d</xliff:g>%% is"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nee"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Batterijbesparing is ingeschakeld"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batterijbesparing wordt automatisch ingeschakeld wanneer de batterijstatus lager is dan <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellingen"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 30ec2d5..e25f0b1 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -33,24 +33,17 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ଚାଲୁଅଛି"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ବିଜ୍ଞପ୍ତି"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ବ୍ୟାଟେରୀ କମ୍ ଅଛି"</string>
- <!-- no translation found for battery_low_title_hybrid (6268991275887381595) -->
- <skip />
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବାକି ଅଛି"</string>
- <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) -->
- <skip />
- <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) -->
- <skip />
- <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) -->
- <skip />
- <string name="invalid_charger" msgid="4549105996740522523">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।\nକେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
- <string name="invalid_charger_title" msgid="3515740382572798460">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।"</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"କେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବଳକା ଅଛି, ଆପଣଙ୍କ ବ୍ୟବହାର ଅନୁସାରେ ବ୍ୟାଟେରୀ ପାଖାପାଖି <xliff:g id="TIME">%s</xliff:g> ସମୟ ଚାଲିବ"</string>
+ <string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବଳକା ଅଛି, <xliff:g id="TIME">%s</xliff:g> ସମୟ ଚାଲିପାରେ"</string>
+ <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବାକି ଅଛି। ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ଅଛି।"</string>
+ <string name="invalid_charger" msgid="2741987096648693172">"USB ଦ୍ଵାରା ଚାର୍ଜ କରିହେବନାହିଁ। ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ଥିବା ଚାର୍ଜର୍କୁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"USB ଦ୍ଵାରା ଚାର୍ଜ କରିହେବନାହିଁ"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ଥିବା ଚାର୍ଜର୍କୁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ସେଟିଙ୍ଗ"</string>
- <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) -->
- <skip />
+ <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ କରିବେ?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ଅନ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for battery_saver_start_action (8187820911065797519) -->
- <skip />
+ <string name="battery_saver_start_action" msgid="8187820911065797519">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ କରନ୍ତୁ"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ସେଟିଙ୍ଗ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ୱାଇ-ଫାଇ"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରୀନ୍"</string>
@@ -60,47 +53,33 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ୍"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ଇନପୁଟ୍ ପଦ୍ଧତି ସେଟ୍ କରନ୍ତୁ"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ଫିଜିକଲ୍ କୀ’ବୋର୍ଡ୍"</string>
- <!-- no translation found for usb_device_permission_prompt (1825685909587559679) -->
- <skip />
- <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) -->
- <skip />
- <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) -->
- <skip />
- <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) -->
- <skip />
+ <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> ଆକ୍ସେସ୍ କରିବାକୁ <xliff:g id="APPLICATION">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> ଆକ୍ସେସ୍ କରିବାକୁ <xliff:g id="APPLICATION">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="usb_device_confirm_prompt" msgid="7440562274256843905">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> ନିୟନ୍ତ୍ରଣ କରିବାକୁ <xliff:g id="APPLICATION">%1$s</xliff:g> ଖୋଲିବେ?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> ନିୟନ୍ତ୍ରଣ କରିବାକୁ <xliff:g id="APPLICATION">%1$s</xliff:g> ଖୋଲିବେ?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ଇନଷ୍ଟଲ୍ ହୋଇଥିବା କୌଣସି ଆପ୍ ଏହି USB ଆକ୍ସେସୋରୀରେ କାମ କରେନାହିଁ। ଏହି ଆକ୍ସେସୋରୀ ବିଷୟରେ <xliff:g id="URL">%1$s</xliff:g>ରେ ଅଧିକ ଜାଣନ୍ତୁ"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USB ଆକ୍ସେସରୀ"</string>
<string name="label_view" msgid="6304565553218192990">"ଦେଖନ୍ତୁ"</string>
- <!-- no translation found for always_use_device (4015357883336738417) -->
- <skip />
- <!-- no translation found for always_use_accessory (3257892669444535154) -->
- <skip />
+ <string name="always_use_device" msgid="4015357883336738417">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> କନେକ୍ଟ ଥିବାବେଳେ <xliff:g id="APPLICATION">%1$s</xliff:g> ସର୍ବଦା ଖୋଲନ୍ତୁ"</string>
+ <string name="always_use_accessory" msgid="3257892669444535154">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> କନେକ୍ଟ ଥିବାବେଳେ <xliff:g id="APPLICATION">%1$s</xliff:g> ସର୍ବଦା ଖୋଲନ୍ତୁ"</string>
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"କମ୍ପ୍ୟୁଟର୍ର RSA କୀ\' ଆଙ୍ଗୁଠି ଚିହ୍ନ ହେଉଛି:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ସବୁବେଳେ ଏହି କମ୍ପ୍ୟୁଟର୍ରୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
- <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) -->
- <skip />
+ <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ସମ୍ପ୍ରତି ସାଇନ୍-ଇନ୍ କରିଥିବା ୟୁଜର୍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍ରେ ସାଇନ୍-ଇନ୍ କରନ୍ତୁ।"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string>
- <!-- no translation found for global_action_screenshot (8329831278085426283) -->
- <skip />
+ <string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string>
- <!-- no translation found for screenshot_saving_text (2545047868936087248) -->
+ <string name="screenshot_saved_title" msgid="5637073968117370753">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ ହୋଇଛି"</string>
+ <string name="screenshot_saved_text" msgid="7574667448002050363">"ସ୍କ୍ରୀନଶଟ୍ ଦେଖିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
<skip />
- <!-- no translation found for screenshot_saved_title (5637073968117370753) -->
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
<skip />
- <!-- no translation found for screenshot_saved_text (7574667448002050363) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (9096484883063264803) -->
- <skip />
- <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) -->
- <skip />
- <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) -->
- <skip />
- <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) -->
- <skip />
+ <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ସୀମିତ ଷ୍ଟୋରେଜ୍ ସ୍ପେସ୍ ହେତୁ ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ ହୋଇପାରିବ ନାହିଁ"</string>
+ <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ଆପ୍ କିମ୍ବା ସଂସ୍ଥା ଦ୍ୱାରା ସ୍କ୍ରୀନଶଟ୍ ନେବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ର ବିକଳ୍ପ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"ଏକ ମିଡିଆ ପ୍ଲେୟାର୍ (MTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"ଏକ କ୍ୟାମେରା (PTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
@@ -108,18 +87,15 @@
<string name="accessibility_back" msgid="567011538994429120">"ଫେରନ୍ତୁ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ହୋମ୍"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ମେନୁ"</string>
- <!-- no translation found for accessibility_accessibility_button (7601252764577607915) -->
- <skip />
- <!-- no translation found for accessibility_rotate_button (7402949513740253006) -->
- <skip />
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"ଆକ୍ସେସିବିଲିଟୀ"</string>
+ <string name="accessibility_rotate_button" msgid="7402949513740253006">"ସ୍କ୍ରୀନ୍କୁ ଘୁରାନ୍ତୁ"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"କ୍ୟାମେରା"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ଫୋନ୍"</string>
<string name="accessibility_voice_assist_button" msgid="487611083884852965">"ଭଏସ୍ ସହାୟକ"</string>
<string name="accessibility_unlock_button" msgid="128158454631118828">"ଅନଲକ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) -->
- <skip />
+ <string name="accessibility_waiting_for_fingerprint" msgid="4808860050517462885">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ପାଇଁ ଅପେକ୍ଷା କରିଛି"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ଆଙ୍ଗୁଠିଚିହ୍ନ ବ୍ୟବହାର ନକରି ଅନଲକ୍ କରନ୍ତୁ"</string>
<string name="unlock_label" msgid="8779712358041029439">"ଅନଲକ୍"</string>
<string name="phone_label" msgid="2320074140205331708">"ଫୋନ୍ ଖୋଲନ୍ତୁ"</string>
@@ -127,14 +103,10 @@
<string name="camera_label" msgid="7261107956054836961">"କ୍ୟାମେରା ଖୋଲନ୍ତୁ"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ନୂଆ ଟାସ୍କ ଲେଆଉଟ୍ ଚୟନ କରନ୍ତୁ"</string>
<string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ଆପ୍ଲିକେଶନ୍ ଆଇକନ୍"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ହେଲ୍ପ ମେସେଜ୍ କ୍ଷେତ୍ର"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ଜୁମ୍ କରି ସ୍କ୍ରୀନ୍କୁ ଛୋଟରୁ ବଡ଼ କରନ୍ତୁ।"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string>
@@ -175,40 +147,34 @@
<string name="accessibility_desc_off" msgid="6475508157786853157">"ଅଫ୍।"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"ସଂଯୁକ୍ତ।"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"ସଂଯୋଗ କରୁଛି।"</string>
- <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
- <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
- <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
- <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
- <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <string name="accessibility_data_connection_4g_plus" msgid="3032226872470658661">"4G+"</string>
- <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
- <string name="accessibility_data_connection_lte_plus" msgid="361876866906946007">"LTE+"</string>
- <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
- <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ରୋମିଙ୍ଗ"</string>
- <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ଏଜ୍"</string>
+ <string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
+ <string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
+ <string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
+ <string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
+ <string name="data_connection_3_5g_plus" msgid="7570783890290275297">"4G+"</string>
+ <string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
+ <string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
+ <string name="data_connection_lte" msgid="2694876797724028614">"LTE"</string>
+ <string name="data_connection_lte_plus" msgid="3423013208570937424">"LTE+"</string>
+ <string name="data_connection_cdma" msgid="4677985502159869585">"CDMA"</string>
+ <string name="data_connection_roaming" msgid="6037232010953697354">"ରୋମିଙ୍ଗ"</string>
+ <string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ୱାଇ-ଫାଇ"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"କୌଣସି SIM ନାହିଁ।"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ମୋବାଇଲ୍ ଡାଟା"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ମୋବାଇଲ୍ ଡାଟା ଅନ୍"</string>
+ <string name="cell_data_off" msgid="5287705247512911922">"ମୋବାଇଲ୍ ଡାଟା ଅଫ୍ ଅଛି"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ଅନ୍।"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"କୌଣସି SIM କାର୍ଡ ନାହିଁ।"</string>
- <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳାଯାଉଛି।"</string>
+ <string name="carrier_network_change_mode" msgid="8149202439957837762">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳୁଛି"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ବ୍ୟାଟେରୀ ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା ଅଛି।"</string>
- <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) -->
- <skip />
+ <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ବ୍ୟାଟେରୀ ଚାର୍ଜ ହେଉଛି, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ଶତକଡ଼ା।"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ।"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"ବିଜ୍ଞପ୍ତି"</string>
- <!-- no translation found for accessibility_overflow_action (5681882033274783311) -->
- <skip />
+ <string name="accessibility_overflow_action" msgid="5681882033274783311">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଦେଖନ୍ତୁ"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ସକ୍ଷମ।"</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS ପ୍ରାପ୍ତ କରୁଛି।"</string>
@@ -222,8 +188,7 @@
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ।"</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ କରିଦିଆଗଲା।"</string>
<string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ସମସ୍ତ ସମ୍ପ୍ରତି ଆପ୍ଲିକେଶନଗୁଡ଼ିକ ଖାରଜ କରାଯାଇଛି।"</string>
- <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) -->
- <skip />
+ <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ଆପ୍ଲିକେଶନ୍ ସୂଚନା ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ଆରମ୍ଭ ହେଉଛି।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string>
@@ -231,8 +196,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ସେଟିଙ୍ଗ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string>
- <!-- no translation found for accessibility_desc_work_lock (4288774420752813383) -->
- <skip />
+ <string name="accessibility_desc_work_lock" msgid="4288774420752813383">"ୱର୍କ ଲକ୍ ସ୍କ୍ରୀନ୍"</string>
<string name="accessibility_desc_close" msgid="7479755364962766729">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି।"</string>
@@ -243,7 +207,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଗୁରୁତ୍ୱର୍ଣ୍ଣ।"</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ।"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଆଲାର୍ମ।"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ।"</string>
@@ -266,8 +230,7 @@
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"ଅଧିକ ସମୟ।"</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"କମ୍ ସମୟ।"</string>
<string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅଫ୍ ଅଛି।"</string>
- <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) -->
- <skip />
+ <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ଅନୁପଲବ୍ଧ।"</string>
<string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string>
<string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ବନ୍ଦ ଅଛି।"</string>
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string>
@@ -280,27 +243,21 @@
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"ୱର୍କ ମୋଡ୍ ଅନ୍।"</string>
<string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"ୱର୍କ ମୋଡ୍କୁ ଅଫ୍ କରାଯାଇଛି।"</string>
<string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"ୱର୍କ ମୋଡ୍କୁ ଅନ୍ କରାଯାଇଛି।"</string>
- <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) -->
- <skip />
- <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) -->
- <skip />
+ <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ଡାଟା ସେଭର୍ ଅଫ୍ କରାଗଲା।"</string>
+ <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ଡାଟା ସେଭର୍ ଅନ୍ କରାଗଲା।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ଡିସ୍ପ୍ଲେ ଉଜ୍ଜ୍ୱଳତା"</string>
- <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
- <skip />
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ଚାର୍ଜ କରାଯାଉଛି"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ମୋବାଇଲ୍ ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ଆପଣ ସେଟ୍ କରିଥିବା ଡାଟାର ସୀମାରେ ପହଞ୍ଚିଲେ। ଆପଣ ଆଉ ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରୁନାହାଁନ୍ତି।\n\nଯଦି ଆପଣ ପୁଣି ଆରମ୍ଭ କରନ୍ତି, ଡାଟା ବ୍ୟବହାର ପାଇଁ ଆପଣଙ୍କୁ ଦେୟ ଲାଗୁ କରାଯାଇ ପାରେ।"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ଖୋଜାଯାଉଛି"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ଦ୍ୱାରା ଲୋକେଶନ୍ ସେଟ୍ କରାଯାଇଛି"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"ଲୋକେଶନ୍ ଅନୁରୋଧ ସକ୍ରିୟ ଅଛି"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string>
- <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) -->
- <skip />
+ <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
<item quantity="other">ଭିତରେ ଆଉ <xliff:g id="NUMBER_1">%s</xliff:g>ଟି ଅଧିକ ବିଜ୍ଞପ୍ତି ରହିଛି।</item>
<item quantity="one">ଭିତରେ ଆଉ <xliff:g id="NUMBER_0">%s</xliff:g>ଟି ଅଧିକ ବିଜ୍ଞପ୍ତି ରହିଛି।</item>
@@ -316,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ଡେଜର୍ଟ କେସ୍"</string>
<string name="start_dreams" msgid="5640361424498338327">"ସ୍କ୍ରୀନ୍ ସେଭର୍"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ଇଥରନେଟ୍"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆଇକନ୍କୁ ସ୍ପର୍ଶ କରି ଧରିରଖନ୍ତୁ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\""</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"କେବଳ ପ୍ରାଥମିକତା"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"କେବଳ ଆଲାର୍ମ"</string>
@@ -326,21 +282,15 @@
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ବ୍ଲୁ-ଟୁଥ୍ (<xliff:g id="NUMBER">%d</xliff:g>ଟି ଡିଭାଇସ୍)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ବ୍ଲୁ-ଟୁଥ୍ ଅଫ୍"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ପେୟାର୍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
- <skip />
- <!-- no translation found for quick_settings_bluetooth_secondary_label_transient (4551281899312150640) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ବ୍ୟାଟେରୀ"</string>
+ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ଅଡିଓ"</string>
+ <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ହେଡସେଟ୍"</string>
+ <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ଇନପୁଟ୍"</string>
+ <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ଅନ୍ ହେଉଛି…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"ସ୍କ୍ରୀନ୍କୁ ଅଟୋ-ରୋଟେଟ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) -->
- <skip />
+ <string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> ମୋଡ୍"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ଘୂର୍ଣ୍ଣନ ଲକ୍ ହୋଇଛି"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ପୋର୍ଟ୍ରେଟ୍"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍"</string>
@@ -361,8 +311,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ୱାଇ-ଫାଇ ଅଫ୍"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ୱାଇ-ଫାଇ ଅନ୍ ଅଛି"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for quick_settings_wifi_secondary_label_transient (7748206246119760554) -->
- <skip />
+ <string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ଅନ୍ ହେଉଛି…"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"କାଷ୍ଟ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ନାମହୀନ ଡିଭାଇସ୍"</string>
@@ -375,64 +324,50 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"ଅଧିକ ସେଟିଙ୍ଗ"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"ହୋଇଗଲା"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ସଂଯୁକ୍ତ"</string>
- <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
- <skip />
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"କନେକ୍ଟ ରହିଛି, ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ସଂଯୋଗ କରୁଛି..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ଟିଥରିଙ୍ଗ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ହଟସ୍ପଟ୍"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (8010579363691405477) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="8010579363691405477">"ଅନ୍ ହେଉଛି…"</string>
+ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="5672131949987422420">"ଡାଟା ସେଭର୍ ଅନ୍ ଅଛି"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d ଡିଭାଇସ୍ଗୁଡ଼ିକ</item>
+ <item quantity="one">%d ଡିଭାଇସ୍</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ବିଜ୍ଞପ୍ତି"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ଫ୍ଲାଶ୍ଲାଇଟ"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ମୋବାଇଲ୍ ଡାଟା"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ଡାଟାର ବ୍ୟବହାର"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ଅବଶିଷ୍ଟ ଡାଟା"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ସୀମାଠାରୁ ଅଧିକ"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ସୀମା"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ଚେତାବନୀ"</string>
- <!-- no translation found for quick_settings_work_mode_label (7608026833638817218) -->
- <skip />
+ <string name="quick_settings_work_mode_label" msgid="7608026833638817218">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"ରାତି ଆଲୋକ"</string>
- <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ସୂର୍ଯ୍ୟାସ୍ତ ବେଳେ ଅନ୍ ହେବ"</string>
+ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ସୂର୍ଯ୍ୟୋଦୟ ପର୍ଯ୍ୟନ୍ତ"</string>
+ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ରେ ଅନ୍ ହେବ"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
<skip />
- <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
- <skip />
- <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) -->
- <skip />
- <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) -->
- <skip />
- <!-- no translation found for quick_settings_nfc_label (9012153754816969325) -->
- <skip />
- <!-- no translation found for quick_settings_nfc_off (6883274004315134333) -->
- <skip />
- <!-- no translation found for quick_settings_nfc_on (6680317193676884311) -->
- <skip />
- <!-- no translation found for recents_empty_message (808480104164008572) -->
- <skip />
- <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) -->
- <skip />
+ <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
+ <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="recents_empty_message" msgid="808480104164008572">"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ଆପଣ ସୁବୁକିଛି ଖାଲି କରିଦେଇଛନ୍ତି"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ଆପ୍ଲିକେଶନ୍ ସୂଚନା"</string>
<string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> କୁ ଆରମ୍ଭ କରାଯାଇପାରିଲା ନାହିଁ।"</string>
- <!-- no translation found for recents_launch_disabled_message (1624523193008871793) -->
- <skip />
- <!-- no translation found for recents_stack_action_button_label (6593727103310426253) -->
- <skip />
- <!-- no translation found for recents_drag_hint_message (2649739267073203985) -->
- <skip />
+ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ସୁରକ୍ଷିତ-ମୋଡ୍ରେ ଅକ୍ଷମ ଅଟେ।"</string>
+ <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ସବୁ ଖାଲି କରନ୍ତୁ"</string>
+ <string name="recents_drag_hint_message" msgid="2649739267073203985">"ସ୍ପ୍ଲିଟ୍ ସ୍କ୍ରୀନ୍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏଠାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ଭୂସମାନ୍ତର ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ଭୂଲମ୍ବ ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"କଷ୍ଟମ୍ କରି ଭାଗ କରନ୍ତୁ"</string>
- <!-- no translation found for recents_accessibility_split_screen_top (9056056469282256287) -->
- <skip />
- <!-- no translation found for recents_accessibility_split_screen_left (8987144699630620019) -->
- <skip />
- <!-- no translation found for recents_accessibility_split_screen_right (275069779299592867) -->
- <skip />
+ <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ସ୍କ୍ରୀନ୍କୁ ଉପର ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ସ୍କ୍ରୀନ୍କୁ ବାମ ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ସ୍କ୍ରୀନ୍କୁ ଡାହାଣ ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ଚାର୍ଜ ହୋଇଗଲା"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ଚାର୍ଜ କରାଯାଉଛି"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାକୁ ଆଉ <xliff:g id="CHARGING_TIME">%s</xliff:g> ଅଛି"</string>
@@ -441,20 +376,16 @@
<string name="description_target_search" msgid="3091587249776033139">"ସର୍ଚ୍ଚ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ଉପରକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ।"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ବାମକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for zen_priority_introduction (1149025108714420281) -->
- <skip />
- <!-- no translation found for zen_alarms_introduction (4934328096749380201) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"ଆଲାର୍ମ, ରିମାଇଣ୍ଡର୍, ଇଭେଣ୍ଟ ଏବଂ ଆପଣ ନିର୍ଦ୍ଦିଷ୍ଟ କରିଥିବା କଲର୍ଙ୍କ ବ୍ୟତୀତ ଆପଣଙ୍କ ଧ୍ୟାନ ଅନ୍ୟ କୌଣସି ଧ୍ୱନୀ ଏବଂ ଭାଇବ୍ରେଶନ୍ରେ ଆକର୍ଷଣ କରାଯିବନାହିଁ। ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଏବଂ ଗେମ୍ ସମେତ ନିଜେ ଚଲାଇବାକୁ ବାଛିଥିବା ଅନ୍ୟ ସବୁକିଛି ଆପଣ ଶୁଣିପାରିବେ।"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"ଆଲାର୍ମ ବ୍ୟତୀତ ଆପଣଙ୍କ ଧ୍ୟାନ ଅନ୍ୟ କୌଣସି ଧ୍ୱନୀ ଏବଂ ଭାଇବ୍ରେଶନ୍ରେ ଆକର୍ଷଣ କରାଯିବନାହିଁ। ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଏବଂ ଗେମ୍ ସମେତ ନିଜେ ଚଲାଇବାକୁ ବାଛିଥିବା ଅନ୍ୟ ସବୁକିଛି ଆପଣ ଶୁଣିପାରିବେ।"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) -->
- <skip />
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ଆଲାର୍ମ, ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଏବଂ ଗେମ୍ ସମେତ ଏହା ଦ୍ୱାରା ସମସ୍ତ ଧ୍ୱନୀ ଏବଂ ଭାଇବ୍ରେଶନ୍ ଅବରୋଧ ହୁଏ। ଆପଣ ତଥାପି ଫୋନ୍ କଲ୍ କରିପାରିବେ।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ଆଲାର୍ମ, ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଓ ଗେମ୍ସ ସମେତ ଏହାଦ୍ୱାରା ସମସ୍ତ ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଶନ୍ ଅବରୋଧ ହୁଏ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ନିମ୍ନରେ କମ୍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍ କରନ୍ତୁ"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"ଅନଲକ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for do_disclosure_generic (5615898451805157556) -->
- <skip />
+ <string name="do_disclosure_generic" msgid="5615898451805157556">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ।"</string>
<string name="do_disclosure_with_name" msgid="5640615509915445501">"ଏହି ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି"</string>
<string name="phone_hint" msgid="4872890986869209950">"ଫୋନ୍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<string name="voice_hint" msgid="8939888732119726665">"ଭଏସ୍ ସହାୟକ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
@@ -466,12 +397,9 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"ସମ୍ପୂର୍ଣ୍ଣ\nନୀରବ"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"କେବଳ\nପ୍ରାଥମିକତା"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"କେବଳ\nଆଲାର୍ମ"</string>
- <!-- no translation found for keyguard_indication_charging_time (2056340799276374421) -->
- <skip />
- <!-- no translation found for keyguard_indication_charging_time_fast (7767562163577492332) -->
- <skip />
- <!-- no translation found for keyguard_indication_charging_time_slowly (3769655133567307069) -->
- <skip />
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଚାର୍ଜ ହେଉଛି (ପୂର୍ଣ୍ଣ ହେବା ପାଇଁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ବଳକା ଅଛି)"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଶୀଘ୍ର ଚାର୍ଜ ହେଉଛି (ପୂର୍ଣ୍ଣ ହେବା ପାଇଁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ବଳକା ଅଛି)"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଧୀରେ ଚାର୍ଜ ହେଉଛି (ପୂର୍ଣ୍ଣ ହେବା ପାଇଁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ବଳକା ଅଛି)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ୟୁଜର୍ ବଦଳାନ୍ତୁ, ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -499,214 +427,137 @@
<string name="user_remove_user_title" msgid="4681256956076895559">"ୟୁଜରଙ୍କୁ ବାହାର କରିବେ?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"ଏହି ୟୁଜରଙ୍କ ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହେବ।"</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"ବାହାର କରନ୍ତୁ"</string>
- <!-- no translation found for battery_saver_notification_title (8614079794522291840) -->
- <skip />
+ <string name="battery_saver_notification_title" msgid="8614079794522291840">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ଅଛି"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for battery_saver_notification_action_text (132118784269455533) -->
- <skip />
+ <string name="battery_saver_notification_action_text" msgid="132118784269455533">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅଫ୍ କରନ୍ତୁ"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ରେ ପ୍ରଦର୍ଶିତ ହେଉଥିବା ସମସ୍ତ ବସ୍ତୁକୁ କ୍ୟାପଚର୍ କରିବା ଆରମ୍ଭ ହୋଇଯିବ।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ପ୍ରୋଫାଇଲ୍ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ।"</string>
<string name="vpn_footer" msgid="2388611096129106812">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string>
<string name="branded_vpn_footer" msgid="2168111859226496230">"ନେଟ୍ୱର୍କକୁ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ"</string>
- <!-- no translation found for quick_settings_disclosure_management_monitoring (6645176135063957394) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_managed_profile_monitoring (8973606847896650284) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_vpns (8170318392053156330) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) -->
- <skip />
- <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) -->
- <skip />
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="quick_settings_disclosure_management_monitoring" msgid="6645176135063957394">"ଆପଣଙ୍କ ସଂସ୍ଥା ଏହି ଡିଭାଇସକୁ ପରିଚାଳନା କରନ୍ତି ଏବଂ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string>
+ <string name="quick_settings_disclosure_named_management_monitoring" msgid="370622174777570853">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଏହି ଡିଭାଇସକୁ ପରିଚାଳନା କରନ୍ତି ଏବଂ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରନ୍ତି"</string>
+ <string name="quick_settings_disclosure_management_named_vpn" msgid="1085137869053332307">"ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ ଏବଂ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_named_management_named_vpn" msgid="6290456493852584017">"ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ଏବଂ <xliff:g id="VPN_APP">%2$s</xliff:g>ରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_management" msgid="3294967280853150271">"ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ"</string>
+ <string name="quick_settings_disclosure_named_management" msgid="1059403025094542908">"ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି"</string>
+ <string name="quick_settings_disclosure_management_vpns" msgid="3698767349925266482">"ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ ଏବଂ VPNଗୁଡ଼ିକରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_named_management_vpns" msgid="7777821385318891527">"ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ଏବଂ VPNଗୁଡ଼ିକରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="5125463987558278215">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ଆପଣଙ୍କ ସଂସ୍ଥା ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string>
+ <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string>
+ <string name="quick_settings_disclosure_monitoring" msgid="679658227269205728">"ନେଟୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string>
+ <string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"ଡିଭାଇସ୍ VPNଗୁଡ଼ିକରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"ୱର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ଡିଭାଇସ୍ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ"</string>
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ଡିଭାଇସ୍ ପରିଚାଳନା"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ପ୍ରୋଫାଇଲ୍ ନୀରିକ୍ଷଣ"</string>
<string name="monitoring_title" msgid="169206259253048106">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ"</string>
- <!-- no translation found for monitoring_subtitle_vpn (876537538087857300) -->
- <skip />
- <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) -->
- <skip />
- <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) -->
- <skip />
+ <string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
+ <string name="monitoring_subtitle_network_logging" msgid="3341264304793193386">"ନେଟୱର୍କ ଲଗିଙ୍ଗ"</string>
+ <string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA ସର୍ଟିଫିକେଟ୍"</string>
<string name="disable_vpn" msgid="4435534311510272506">"VPN ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ବିଛିନ୍ନ କରନ୍ତୁ"</string>
- <!-- no translation found for monitoring_button_view_policies (100913612638514424) -->
- <skip />
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
- <!-- no translation found for monitoring_description_management_ca_certificate (5202023784131001751) -->
- <skip />
- <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) -->
- <skip />
- <!-- no translation found for monitoring_description_ca_certificate (7886985418413598352) -->
- <skip />
- <!-- no translation found for monitoring_description_management_network_logging (7184005419733060736) -->
- <skip />
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
- <!-- no translation found for monitoring_description_managed_profile_named_vpn (1427905889862420559) -->
- <skip />
- <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) -->
- <skip />
+ <string name="monitoring_button_view_policies" msgid="100913612638514424">"ପଲିସୀ ଦେଖନ୍ତୁ"</string>
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ଆପଣଙ୍କ ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉଛି।.\n\nଆପଣଙ୍କ ଆଡମିନ୍ ସେଟିଙ୍ଗ, କର୍ପୋରେଟ୍ ଆକ୍ସେସ୍, ଆପ୍, ଆପଣଙ୍କ ଡିଭାଇସ୍ ସମ୍ବନ୍ଧୀୟ ଡାଟା ଏବଂ ଆପଣଙ୍କ ଡିଭାଇସର ଲୋକେଶନ୍ ନିରୀକ୍ଷଣ ଓ ପରିଚାଳନା କରିପାରନ୍ତି।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉଛି।\n\nଆପଣଙ୍କ ଆଡମିନ୍ ସେଟିଙ୍ଗ, କର୍ପୋରେଟ୍ ଆକ୍ସେସ୍, ଆପ୍, ଆପଣଙ୍କ ଡିଭାଇସ୍ ସମ୍ବନ୍ଧୀୟ ଡାଟା ଏବଂ ଆପଣଙ୍କ ଡିଭାଇସର ଲୋକେଶନ୍ ନିରୀକ୍ଷଣ ଓ ପରିଚାଳନା କରିପାରନ୍ତି।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ଏହି ଡିଭାଇସରେ ଆପଣଙ୍କ ସଂସ୍ଥା ଏକ ସର୍ଟିଫିକେଟ୍ ଅଥରିଟି ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି। ଆପଣଙ୍କ ସୁରକ୍ଷିତ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କିମ୍ବା ସଂଶୋଧନ କରାଯାଇ ପାରେ।"</string>
+ <string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ଆପଣଙ୍କ ସଂସ୍ଥା ଏକ ସର୍ଟିଫିକେଟ୍ ଅଥରିଟି ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି। ଆପଣଙ୍କ ସୁରକ୍ଷିତ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କିମ୍ବା ସଂଶୋଧନ କରାଯାଇ ପାରେ।"</string>
+ <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ଏହି ଡିଭାଇସରେ ଏକ ସର୍ଟିଫିକେଟ୍ ଅଥରିଟି ଇନଷ୍ଟଲ୍ କରାଯାଇଛି। ଆପଣଙ୍କ ସୁରକ୍ଷିତ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କିମ୍ବା ସଂଶୋଧନ କରାଯାଇ ପାରେ।"</string>
+ <string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ଆପଣଙ୍କ ଆଡମିନ୍ ନେଟୱର୍କ ଲଗଇନ୍ କରିବା ଅନ୍ କରିଛନ୍ତି, ଯାହା ଆପଣଙ୍କ ଡିଭାଇସରେ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରେ।"</string>
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ଆପଣ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ଆପଣ <xliff:g id="VPN_APP_0">%1$s</xliff:g> ଏବଂ <xliff:g id="VPN_APP_1">%2$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ଆପଣଙ୍କ ଡିଭାଇସ୍ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।"</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"ଆପଣଙ୍କ ଡିଭାଇସ୍ ପରିଚାଳନା କରିବାକୁ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> ବ୍ୟବହାର କରନ୍ତି।"</string>
- <!-- no translation found for monitoring_description_do_body (3639594537660975895) -->
- <skip />
+ <string name="monitoring_description_do_body" msgid="3639594537660975895">"ଆପଣଙ୍କ ଆଡମିନ୍ ସେଟିଙ୍ଗ, କର୍ପୋରେଟ୍ ଆକ୍ସେସ୍, ଆପ୍, ଆପଣଙ୍କ ଡିଭାଇସ୍ ସମ୍ବନ୍ଧୀୟ ଡାଟା ଏବଂ ଆପଣଙ୍କ ଡିଭାଇସର ଲୋକେଶନ୍ ନିରୀକ୍ଷଣ ଓ ପରିଚାଳନା କରିପାରନ୍ତି।"</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
<string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"ଆପଣ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ ଅଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କର ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
- <!-- no translation found for monitoring_description_vpn_settings_separator (1933186756733474388) -->
- <skip />
- <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) -->
- <skip />
- <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) -->
- <skip />
- <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) -->
- <skip />
- <!-- no translation found for monitoring_description_network_logging (7223505523384076027) -->
- <skip />
+ <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
+ <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ"</string>
+ <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
+ <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"ମୁକ୍ତ ବିଶ୍ୱସ୍ତ କ୍ରୀଡେନଶିଆଲ୍"</string>
+ <string name="monitoring_description_network_logging" msgid="7223505523384076027">"ଆପଣଙ୍କ ଆଡମିନ୍ ନେଟ୍ୱର୍କ ଲଗଇନ୍ କରିବା ଅନ୍ କରିଛନ୍ତି, ଯାହା ଆପଣଙ୍କ ଡିଭାଇସରେ ଟ୍ରାଫିକ୍ ନିରୀକ୍ଷଣ କରେ।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
<string name="monitoring_description_vpn" msgid="4445150119515393526">"ଏକ VPN ସଂଯୋଗ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଆପଣ ଗୋଟିଏ ଆପକୁ ଅନୁମତି ଦେଲେ।\n\nଏହି ଆପ୍ ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଓ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
- <!-- no translation found for monitoring_description_vpn_profile_owned (2958019119161161530) -->
- <skip />
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉଛି।\n\nଆପଣଙ୍କ ଆଡମିନ୍ ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରିବେ।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।.\n\nଆପଣ ଏକ VPNରେ ମଧ୍ୟ ସଂଯୁକ୍ତ, ଯାହା ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
- <!-- no translation found for monitoring_description_app (1828472472674709532) -->
- <skip />
+ <string name="monitoring_description_app" msgid="1828472472674709532">"ଆପଣ <xliff:g id="APPLICATION">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<string name="monitoring_description_app_personal" msgid="484599052118316268">"ଆପଣ <xliff:g id="APPLICATION">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ଆପଣ <xliff:g id="APPLICATION">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ ଅଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
- <!-- no translation found for monitoring_description_app_work (4612997849787922906) -->
- <skip />
- <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) -->
- <skip />
- <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) -->
- <skip />
- <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) -->
- <skip />
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉଛି। ପ୍ରୋଫାଇଲଟି <xliff:g id="APPLICATION">%2$s</xliff:g> ସହ ସଂଯୁକ୍ତ ଅଛି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉଛି। ପ୍ରୋଫାଇଲଟି <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ସହ ସଂଯୁକ୍ତ ଅଛି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।\n\nଆପଣ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>ରେ ମଧ୍ୟ ସଂଯୁକ୍ତ, ଯାହା ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ନେଟୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"<xliff:g id="USER_NAME">%1$s</xliff:g>ଙ୍କ ପାଇଁ ଅନଲକ୍ କରାଯାଇଛି"</string>
+ <string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> ଚାଲୁଛି"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ଯେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଆପଣ ମାନୁଆଲୀ ଅନଲକ୍ କରିନାହାନ୍ତି, ସେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଡିଭାଇସ୍ ଲକ୍ ରହିବ"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"ବିଜ୍ଞପ୍ତିକୁ ଶୀଘ୍ର ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"ଅନଲକ୍ କରିବା ପୁର୍ବରୁ ସେମାନଙ୍କୁ ଦେଖନ୍ତୁ"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"ନାହିଁ, ଥାଉ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <!-- no translation found for volume_zen_end_now (6930243045593601084) -->
- <skip />
+ <string name="volume_zen_end_now" msgid="6930243045593601084">"ବର୍ତ୍ତମାନ ଅଫ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_volume_settings" msgid="4915364006817819212">"ସାଉଣ୍ଡ ସେଟିଙ୍ଗ"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ବଢ଼ାନ୍ତୁ"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ଛୋଟ କରନ୍ତୁ"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ଆଉଟପୁଟ୍ ଡିଭାଇସ୍କୁ ଯାଆନ୍ତୁ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ସ୍କ୍ରିନକୁ ପିନ୍ କରାଯାଇଛି"</string>
- <!-- no translation found for screen_pinning_description (8909878447196419623) -->
- <skip />
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
- <!-- no translation found for screen_pinning_description_accessible (426190689254018656) -->
- <skip />
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description" msgid="8909878447196419623">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବାକୁ ସ୍ପର୍ଶ କରି ଧରିରଖନ୍ତୁ ଓ ଦେଖନ୍ତୁ।"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବା ପାଇଁ ହୋମ୍ ଓ ବ୍ୟାକ୍ ବଟନ୍କୁ ଧରିରଖନ୍ତୁ।"</string>
+ <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଓଭରଭ୍ୟୁକୁ ଧରିରଖନ୍ତୁ।"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବା ପର୍ଯ୍ୟନ୍ତ ହୋମ୍କୁ ଦାବିଧରନ୍ତୁ।"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ଏହି ସ୍କ୍ରୀନ୍କୁ ଅନପିନ୍ କରିବା ପାଇଁ, ବ୍ୟାକ୍ ଏବଂ ଓଭରଭ୍ୟୁ ବଟନ୍କୁ ଦାବିଧରନ୍ତୁ"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ଏହି ସ୍କ୍ରୀନ୍କୁ ଅନପିନ୍ କରିବା ପାଇଁ, ବ୍ୟାକ୍ ଏବଂ ହୋମ୍ ବଟନ୍କୁ ଦାବିଧରନ୍ତୁ"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ବୁଝିଲି"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ନାହିଁ, ଥାଉ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ସ୍କ୍ରୀନ୍କୁ ପିନ୍ କରାଗଲା"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ସ୍କ୍ରୀନ୍ ଅନପିନ୍ ହୋଇଗଲା"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ଲୁଚାନ୍ତୁ"</string>
<string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ଆପଣ ନିଜ ୱର୍କ ପ୍ରୋଫାଇଲ୍ ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"କଲ୍ କରନ୍ତୁ"</string>
<string name="stream_system" msgid="7493299064422163147">"ସିଷ୍ଟମ୍"</string>
- <!-- no translation found for stream_ring (8213049469184048338) -->
- <skip />
- <!-- no translation found for stream_music (9086982948697544342) -->
- <skip />
+ <string name="stream_ring" msgid="8213049469184048338">"ରିଙ୍ଗ"</string>
+ <string name="stream_music" msgid="9086982948697544342">"ମିଡିଆ"</string>
<string name="stream_alarm" msgid="5209444229227197703">"ଆଲାର୍ମ"</string>
- <!-- no translation found for stream_notification (2563720670905665031) -->
+ <string name="stream_notification" msgid="2563720670905665031">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ବ୍ଲୁ-ଟୁଥ୍"</string>
+ <string name="stream_dtmf" msgid="2447177903892477915">"ଡୁଆଲ୍ ମଲ୍ଟି ଟୋନ୍ ଫ୍ରିକ୍ୱେନ୍ସୀ"</string>
+ <string name="stream_accessibility" msgid="301136219144385106">"ଆକ୍ସେସିବିଲିଟୀ"</string>
+ <string name="ring_toggle_title" msgid="3281244519428819576">"କଲ୍"</string>
+ <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ରିଙ୍ଗ"</string>
+ <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ଭାଇବ୍ରେଟ୍"</string>
+ <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ମ୍ୟୁଟ୍"</string>
+ <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। ଅନମ୍ୟୁଟ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। ଭାଇବ୍ରେଟ୍ ସେଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍ ମ୍ୟୁଟ୍ କରାଯାଇପାରେ।"</string>
+ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। ମ୍ୟୁଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍ ମ୍ୟୁଟ୍ କରାଯାଇପାରେ।"</string>
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ଭାଇବ୍ରେଟରେ ସେଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। ମ୍ୟୁଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ଭଲ୍ୟୁମ୍ ନିୟନ୍ତ୍ରଣ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
<skip />
- <!-- no translation found for stream_bluetooth_sco (2055645746402746292) -->
- <skip />
- <!-- no translation found for stream_dtmf (2447177903892477915) -->
- <skip />
- <!-- no translation found for stream_accessibility (301136219144385106) -->
- <skip />
- <!-- no translation found for ring_toggle_title (3281244519428819576) -->
- <skip />
- <!-- no translation found for volume_ringer_status_normal (4273142424125855384) -->
- <skip />
- <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) -->
- <skip />
- <!-- no translation found for volume_ringer_status_silent (6896394161022916369) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
- <skip />
- <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
- <skip />
- <!-- no translation found for volume_dialog_title (7272969888820035876) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
- <skip />
- <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
- <skip />
- <!-- no translation found for output_title (5355078100792942802) -->
- <skip />
- <!-- no translation found for output_calls_title (8717692905017206161) -->
- <skip />
- <!-- no translation found for output_none_found (5544982839808921091) -->
- <skip />
- <!-- no translation found for output_none_found_service_off (8631969668659757069) -->
- <skip />
- <!-- no translation found for output_service_bt (6224213415445509542) -->
- <skip />
- <!-- no translation found for output_service_wifi (3749735218931825054) -->
- <skip />
- <!-- no translation found for output_service_bt_wifi (4486837869988770896) -->
- <skip />
+ <string name="output_title" msgid="5355078100792942802">"ମିଡିଆ ଆଉଟପୁଟ୍"</string>
+ <string name="output_calls_title" msgid="8717692905017206161">"ଫୋନ୍ କଲ୍ ଆଉଟପୁଟ୍"</string>
+ <string name="output_none_found" msgid="5544982839808921091">"କୌଣସି ଡିଭାଇସ୍ ମିଳିଲା ନାହିଁ"</string>
+ <string name="output_none_found_service_off" msgid="8631969668659757069">"କୌଣସି ଡିଭାଇସ୍ ମିଳିଲା ନାହିଁ। <xliff:g id="SERVICE">%1$s</xliff:g> ଅନ୍ କରି ଦେଖନ୍ତୁ"</string>
+ <string name="output_service_bt" msgid="6224213415445509542">"ବ୍ଲୁ-ଟୁଥ୍"</string>
+ <string name="output_service_wifi" msgid="3749735218931825054">"ୱାଇ-ଫାଇ"</string>
+ <string name="output_service_bt_wifi" msgid="4486837869988770896">"ବ୍ଲୁ-ଟୁଥ୍ ଓ ୱାଇ-ଫାଇ"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍"</string>
<string name="show_battery_percentage" msgid="5444136600512968798">"ଏମ୍ବେଡ୍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
<string name="show_battery_percentage_summary" msgid="3215025775576786037">"ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
<string name="quick_settings" msgid="10042998191725428">"ଦ୍ରୁତ ସେଟିଙ୍ଗ"</string>
<string name="status_bar" msgid="4877645476959324760">"ଷ୍ଟାଟସ୍ ବାର୍"</string>
<string name="overview" msgid="4018602013895926956">"ଅବଲୋକନ"</string>
- <!-- no translation found for demo_mode (2532177350215638026) -->
- <skip />
+ <string name="demo_mode" msgid="2532177350215638026">"ସିଷ୍ଟମ୍ UI ଡେମୋ ମୋଡ୍"</string>
<string name="enable_demo_mode" msgid="4844205668718636518">"ଡେମୋ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="show_demo_mode" msgid="2018336697782464029">"ଡେମୋ ମୋଡ୍ ଦେଖାନ୍ତୁ"</string>
<string name="status_bar_ethernet" msgid="5044290963549500128">"ଇଥରନେଟ୍"</string>
@@ -738,397 +589,278 @@
<string name="enable_bluetooth_title" msgid="5027037706500635269">"ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ କରିବେ?"</string>
<string name="enable_bluetooth_message" msgid="9106595990708985385">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ କୀ’ବୋର୍ଡ ସଂଯୋଗ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ପ୍ରଥମେ ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ କରିବାକୁ ହେବ।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ଅନ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for show_silently (6841966539811264192) -->
- <skip />
- <!-- no translation found for block (2734508760962682611) -->
- <skip />
- <!-- no translation found for do_not_silence (6878060322594892441) -->
- <skip />
- <!-- no translation found for do_not_silence_block (4070647971382232311) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings (3207312268609236827) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) -->
- <skip />
- <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) -->
- <skip />
- <!-- no translation found for power_notification_controls_description (4372459941671353358) -->
- <skip />
- <!-- no translation found for notification_header_default_channel (7506845022070889909) -->
- <skip />
- <!-- no translation found for notification_channel_disabled (344536703863700565) -->
- <skip />
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
- <!-- no translation found for inline_keep_showing (8945102997083836858) -->
- <skip />
- <!-- no translation found for inline_stop_button (4172980096860941033) -->
- <skip />
- <!-- no translation found for inline_keep_button (6665940297019018232) -->
- <skip />
- <!-- no translation found for inline_keep_showing_app (1723113469580031041) -->
- <skip />
- <!-- no translation found for notification_unblockable_desc (1037434112919403708) -->
- <skip />
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="show_silently" msgid="6841966539811264192">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିରବରେ ଦେଖାନ୍ତୁ"</string>
+ <string name="block" msgid="2734508760962682611">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ବ୍ଲକ୍ କରନ୍ତୁ"</string>
+ <string name="do_not_silence" msgid="6878060322594892441">"ନିରବ କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="do_not_silence_block" msgid="4070647971382232311">"ନିରବ କିମ୍ବା ବ୍ଲକ୍ କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="tuner_full_importance_settings" msgid="3207312268609236827">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍"</string>
+ <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"ଅନ୍"</string>
+ <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"ଅଫ୍"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍ରେ, ଆପଣ ଏକ ଆପ୍ ବିଜ୍ଞପ୍ତି ପାଇଁ 0 ରୁ 5 ଗୁରୁତ୍ୱ ସ୍ତର ସେଟ୍ କରିହେବେ। \n\n"<b>"ସ୍ତର 5"</b>" \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 4"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 3"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 2"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 1"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n- ଲକ୍ ସ୍କ୍ରୀନ୍ ଓ ଷ୍ଟାଟସ୍ ବାର୍ରୁ ଲୁଚାନ୍ତୁ \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ନିମ୍ନରେ ଦେଖାନ୍ତୁ \n\n"<b>"ସ୍ତର 0"</b>" \n- ଆପରୁ ସମସ୍ତ ବିଜ୍ଞପ୍ତି ବ୍ଲକ୍ କରନ୍ତୁ"</string>
+ <string name="notification_header_default_channel" msgid="7506845022070889909">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="notification_channel_disabled" msgid="344536703863700565">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଆପଣ ଆଉ ଦେଖିବାକୁ ପାଇବେନାହିଁ।"</string>
+ <string name="notification_channel_minimized" msgid="1664411570378910931">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ମିନିମାଇଜ୍ ହୋଇଯିବ"</string>
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"ସାଧାରଣତଃ ଆପଣ ଏହି ବିଜ୍ଞପ୍ତିକୁ ଖାରଜ କରିଦିଅନ୍ତି। \n ସେଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
+ <string name="inline_keep_showing" msgid="8945102997083836858">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
+ <string name="inline_stop_button" msgid="4172980096860941033">"ବିଜ୍ଞପ୍ତିକୁ ଦେଖାଇବା ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="inline_keep_button" msgid="6665940297019018232">"ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ"</string>
+ <string name="inline_minimize_button" msgid="966233327974702195">"ଛୋଟ କରନ୍ତୁ"</string>
+ <string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
+ <string name="notification_unblockable_desc" msgid="1037434112919403708">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ବନ୍ଦ କରିହେବ ନାହିଁ"</string>
+ <string name="notification_appops_camera_active" msgid="730959943016785931">"କ୍ୟାମେରା"</string>
+ <string name="notification_appops_microphone_active" msgid="1546319728924580686">"ମାଇକ୍ରୋଫୋନ୍"</string>
+ <string name="notification_appops_overlay_active" msgid="633813008357934729">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ଦେଖାଦେବ"</string>
+ <plurals name="notification_appops" formatted="false" msgid="1258122060887196817">
+ <item quantity="other">ଏହି ଆପ୍ <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> ଓ <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>।</item>
+ <item quantity="one"> ଏହି ଆପ୍ <xliff:g id="PERFORMING_ACTIVITY_0">%1$s</xliff:g>।</item>
+ </plurals>
+ <plurals name="notification_using" formatted="false" msgid="2211008461429037973">
+ <item quantity="other">, <xliff:g id="PERFORMING_ACTIVITY_1">%1$s</xliff:g> ଓ <xliff:g id="PERFORMING_ACTIVITY_2">%2$s</xliff:g>କୁ ବ୍ୟବହାର କରୁଛି</item>
+ <item quantity="one">, <xliff:g id="PERFORMING_ACTIVITY_0">%1$s</xliff:g>କୁ ବ୍ୟବହାର କରୁଛି</item>
+ </plurals>
+ <string name="notification_appops_settings" msgid="1028328314935908050">"ସେଟିଙ୍ଗ"</string>
+ <string name="notification_appops_ok" msgid="602562195588819631">"ଠିକ୍ ଅଛି"</string>
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ ଖୋଲା ଯାଇଛି"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ ବନ୍ଦ ହୋଇଛି"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ଏହି ଚ୍ୟାନେଲରୁ ବିଜ୍ଞପ୍ତିକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ଅଧିକ ସେଟିଙ୍ଗ"</string>
- <!-- no translation found for notification_app_settings (420348114670768449) -->
- <skip />
+ <string name="notification_app_settings" msgid="420348114670768449">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string>
<string name="notification_done" msgid="5279426047273930175">"ହୋଇଗଲା"</string>
- <!-- no translation found for inline_undo (558916737624706010) -->
+ <string name="inline_undo" msgid="558916737624706010">"ପୂର୍ବସ୍ଥାନକୁ ଫେରାଇଆଣନ୍ତୁ"</string>
+ <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="notification_menu_gear_description" msgid="2204480013726775108">"ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ"</string>
+ <string name="notification_menu_snooze_description" msgid="3653669438131034525">"ବିଜ୍ଞପ୍ତି ସ୍ନୁଜ୍ ବିକଳ୍ପ"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
<skip />
- <!-- no translation found for notification_menu_accessibility (2046162834248888553) -->
- <skip />
- <!-- no translation found for notification_menu_gear_description (2204480013726775108) -->
- <skip />
- <!-- no translation found for notification_menu_snooze_description (3653669438131034525) -->
- <skip />
- <!-- no translation found for snooze_undo (6074877317002985129) -->
- <skip />
- <!-- no translation found for snoozed_for_time (2390718332980204462) -->
- <skip />
- <!-- no translation found for snoozeHourOptions (2124335842674413030) -->
- <!-- no translation found for snoozeMinuteOptions (4127251700591510196) -->
- <!-- no translation found for battery_panel_title (7944156115535366613) -->
- <skip />
+ <string name="snooze_undo" msgid="6074877317002985129">"ପୂର୍ବାବସ୍ଥାକୁ ଫେରାଇ ଆଣନ୍ତୁ"</string>
+ <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ପାଇଁ ସ୍ନୁଜ୍ କରାଗଲା"</string>
+ <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
+ <item quantity="other">%d ଘଣ୍ଟା</item>
+ <item quantity="one">%d ଘଣ୍ଟା</item>
+ </plurals>
+ <plurals name="snoozeMinuteOptions" formatted="false" msgid="4127251700591510196">
+ <item quantity="other">%d ମିନିଟ୍</item>
+ <item quantity="one">%d ମିନିଟ୍</item>
+ </plurals>
+ <string name="battery_panel_title" msgid="7944156115535366613">"ବ୍ୟାଟେରୀ ବ୍ୟବହାର"</string>
<string name="battery_detail_charging_summary" msgid="1279095653533044008">"ଚାର୍ଜ କରାଯିବାବେଳେ ବ୍ୟାଟେରୀ ସେଭର୍ ଉପଲବ୍ଧ ନଥାଏ"</string>
<string name="battery_detail_switch_title" msgid="6285872470260795421">"ବ୍ୟାଟେରୀ ସେଭର୍"</string>
<string name="battery_detail_switch_summary" msgid="9049111149407626804">"କାର୍ଯ୍ୟଦକ୍ଷତା ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରେ"</string>
- <!-- no translation found for keyboard_key_button_template (6230056639734377300) -->
- <skip />
- <!-- no translation found for keyboard_key_home (2243500072071305073) -->
- <skip />
- <!-- no translation found for keyboard_key_back (2337450286042721351) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) -->
- <skip />
- <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) -->
- <skip />
- <!-- no translation found for keyboard_key_tab (3871485650463164476) -->
- <skip />
- <!-- no translation found for keyboard_key_space (2499861316311153293) -->
- <skip />
- <!-- no translation found for keyboard_key_enter (5739632123216118137) -->
- <skip />
- <!-- no translation found for keyboard_key_backspace (1559580097512385854) -->
- <skip />
- <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) -->
- <skip />
- <!-- no translation found for keyboard_key_media_stop (2859963958595908962) -->
- <skip />
- <!-- no translation found for keyboard_key_media_next (1894394911630345607) -->
- <skip />
- <!-- no translation found for keyboard_key_media_previous (4256072387192967261) -->
- <skip />
- <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) -->
- <skip />
- <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) -->
- <skip />
- <!-- no translation found for keyboard_key_page_up (5654098530106845603) -->
- <skip />
- <!-- no translation found for keyboard_key_page_down (8720502083731906136) -->
- <skip />
- <!-- no translation found for keyboard_key_forward_del (1391451334716490176) -->
- <skip />
- <!-- no translation found for keyboard_key_move_home (2765693292069487486) -->
- <skip />
- <!-- no translation found for keyboard_key_move_end (5901174332047975247) -->
- <skip />
- <!-- no translation found for keyboard_key_insert (8530501581636082614) -->
- <skip />
- <!-- no translation found for keyboard_key_num_lock (5052537581246772117) -->
- <skip />
- <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) -->
- <skip />
+ <string name="keyboard_key_button_template" msgid="6230056639734377300">"ବଟନ୍ <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="keyboard_key_home" msgid="2243500072071305073">"ହୋମ୍"</string>
+ <string name="keyboard_key_back" msgid="2337450286042721351">"ଫେରନ୍ତୁ"</string>
+ <string name="keyboard_key_dpad_up" msgid="5584144111755734686">"ଉପର"</string>
+ <string name="keyboard_key_dpad_down" msgid="7331518671788337815">"ତଳ"</string>
+ <string name="keyboard_key_dpad_left" msgid="1346446024676962251">"ବାମ"</string>
+ <string name="keyboard_key_dpad_right" msgid="3317323247127515341">"ଡାହାଣ"</string>
+ <string name="keyboard_key_dpad_center" msgid="2566737770049304658">"କେନ୍ଦ୍ର"</string>
+ <string name="keyboard_key_tab" msgid="3871485650463164476">"ଟ୍ୟାବ୍"</string>
+ <string name="keyboard_key_space" msgid="2499861316311153293">"ସ୍ପେସ୍"</string>
+ <string name="keyboard_key_enter" msgid="5739632123216118137">"ଏଣ୍ଟର୍"</string>
+ <string name="keyboard_key_backspace" msgid="1559580097512385854">"ବ୍ୟାକସ୍ପେସ୍"</string>
+ <string name="keyboard_key_media_play_pause" msgid="3861975717393887428">"ପ୍ଲେ କରନ୍ତୁ/ପଜ୍ କରନ୍ତୁ"</string>
+ <string name="keyboard_key_media_stop" msgid="2859963958595908962">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="keyboard_key_media_next" msgid="1894394911630345607">"ପରବର୍ତ୍ତୀ"</string>
+ <string name="keyboard_key_media_previous" msgid="4256072387192967261">"ପୂର୍ବବର୍ତ୍ତୀ"</string>
+ <string name="keyboard_key_media_rewind" msgid="2654808213360820186">"ରିୱାଇଣ୍ଡ"</string>
+ <string name="keyboard_key_media_fast_forward" msgid="3849417047738200605">"ଫାଷ୍ଟ ଫର୍ୱାର୍ଡ"</string>
+ <string name="keyboard_key_page_up" msgid="5654098530106845603">"ଉପର ପୃଷ୍ଠା"</string>
+ <string name="keyboard_key_page_down" msgid="8720502083731906136">"ତଳ ପୃଷ୍ଠା"</string>
+ <string name="keyboard_key_forward_del" msgid="1391451334716490176">"ଡିଲିଟ୍"</string>
+ <string name="keyboard_key_move_home" msgid="2765693292069487486">"ହୋମ୍"</string>
+ <string name="keyboard_key_move_end" msgid="5901174332047975247">"ସମାପ୍ତ"</string>
+ <string name="keyboard_key_insert" msgid="8530501581636082614">"ଇନ୍ସର୍ଟ"</string>
+ <string name="keyboard_key_num_lock" msgid="5052537581246772117">"ନମ୍ବର ଲକ୍"</string>
+ <string name="keyboard_key_numpad_template" msgid="8729216555174634026">"ନମ୍ବରପ୍ୟାଡ୍ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"ସିଷ୍ଟମ୍"</string>
<string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"ହୋମ୍"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"ସମ୍ପ୍ରତି"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ଫେରନ୍ତୁ"</string>
- <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) -->
- <skip />
+ <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"କୀ\'ବୋର୍ଡ ଶର୍ଟକଟ୍"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ଇନପୁଟ୍ ପଦ୍ଧତି ବଦଳାନ୍ତୁ"</string>
+ <string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ଆପ୍ଲିକେଶନ୍"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ସହାୟତା"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ବ୍ରାଉଜର୍"</string>
+ <string name="keyboard_shortcut_group_applications_contacts" msgid="2064197111278436375">"ଯୋଗାଯୋଗ"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"ଇମେଲ୍"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="638701213803242744">"SMS"</string>
- <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) -->
- <skip />
- <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) -->
- <skip />
- <!-- no translation found for tuner_full_zen_title (4540823317772234308) -->
- <skip />
- <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) -->
- <skip />
- <!-- no translation found for volume_dnd_silent (4363882330723050727) -->
- <skip />
+ <string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"ମ୍ୟୁଜିକ୍"</string>
+ <string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
+ <string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"କ୍ୟାଲେଣ୍ଡର୍"</string>
+ <string name="tuner_full_zen_title" msgid="4540823317772234308">"ଭଲ୍ୟୁମ୍ କଣ୍ଟ୍ରୋଲ୍ ସହ ଦେଖାନ୍ତୁ"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="volume_dnd_silent" msgid="4363882330723050727">"ଭଲ୍ୟୁମ ବଟନ୍ ଶର୍ଟକଟ୍"</string>
<string name="volume_up_silent" msgid="7141255269783588286">"ଭଲ୍ୟୁମ୍ ବଢ଼ାଇ \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\"ରୁ ବାହାରି ଯାଆନ୍ତୁ"</string>
<string name="battery" msgid="7498329822413202973">"ବ୍ୟାଟେରୀ"</string>
<string name="clock" msgid="7416090374234785905">"ଘଣ୍ଟା"</string>
<string name="headset" msgid="4534219457597457353">"ହେଡସେଟ୍"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ହେଡଫୋନ୍ ସଂଯୁକ୍ତ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ହେଡସେଟ୍ ସଂଯୁକ୍ତ"</string>
<string name="data_saver" msgid="5037565123367048522">"ଡାଟା ସେଭର୍"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"ଡାଟା ସେଭର୍ ଅନ୍ ଅଛି"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"ଡାଟା ସେଭର୍ ଅଫ୍ ଅଛି"</string>
- <!-- no translation found for switch_bar_on (1142437840752794229) -->
- <skip />
- <!-- no translation found for switch_bar_off (8803270596930432874) -->
- <skip />
- <!-- no translation found for nav_bar (1993221402773877607) -->
- <skip />
- <!-- no translation found for nav_bar_layout (3664072994198772020) -->
- <skip />
- <!-- no translation found for left_nav_bar_button_type (8555981238887546528) -->
- <skip />
- <!-- no translation found for right_nav_bar_button_type (2481056627065649656) -->
- <skip />
- <!-- no translation found for nav_bar_default (8587114043070993007) -->
- <skip />
- <!-- no translation found for nav_bar_buttons:0 (1545641631806817203) -->
- <!-- no translation found for nav_bar_buttons:1 (5742013440802239414) -->
- <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
- <!-- no translation found for nav_bar_buttons:3 (8175437057325747277) -->
- <!-- no translation found for nav_bar_layouts:0 (8077901629964902399) -->
- <!-- no translation found for nav_bar_layouts:1 (8256205964297588988) -->
- <!-- no translation found for nav_bar_layouts:2 (8719936228094005878) -->
- <!-- no translation found for nav_bar_layouts:3 (586019486955594690) -->
- <!-- no translation found for menu_ime (4998010205321292416) -->
- <skip />
- <!-- no translation found for save (2311877285724540644) -->
- <skip />
+ <string name="switch_bar_on" msgid="1142437840752794229">"ଅନ୍"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"ଅଫ୍"</string>
+ <string name="nav_bar" msgid="1993221402773877607">"ନାଭିଗେଶନ୍ ବାର୍"</string>
+ <string name="nav_bar_layout" msgid="3664072994198772020">"ଲେଆଉଟ୍"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"ସମ୍ପୂର୍ଣ୍ଣ ବାମ ବଟନ୍ ପ୍ରକାର"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"ସମ୍ପୂର୍ଣ୍ଣ ଡାହାଣ ବଟନ୍ ପ୍ରକାର"</string>
+ <string name="nav_bar_default" msgid="8587114043070993007">"(ଡିଫଲ୍ଟ)"</string>
+ <string-array name="nav_bar_buttons">
+ <item msgid="1545641631806817203">"କ୍ଲିପ୍ବୋର୍ଡ"</item>
+ <item msgid="5742013440802239414">"କୀ\'କୋଡ୍"</item>
+ <item msgid="1951959982985094069">"ଘୁରାଇବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ, କୀ’ବୋର୍ଡର ଭାଷା ପରିବର୍ତ୍ତନ ସୁବିଧା"</item>
+ <item msgid="8175437057325747277">"କିଛିନୁହେଁ"</item>
+ </string-array>
+ <string-array name="nav_bar_layouts">
+ <item msgid="8077901629964902399">"ସାମାନ୍ୟ"</item>
+ <item msgid="8256205964297588988">"କମ୍ପାକ୍ଟ"</item>
+ <item msgid="8719936228094005878">"ବାମକୁ-ଆଉଜେଇବା"</item>
+ <item msgid="586019486955594690">"ଡାହାଣକୁ-ଆଉଜେଇବା"</item>
+ </string-array>
+ <string name="menu_ime" msgid="4998010205321292416">"କୀ\'ବୋର୍ଡ ବଦଳକାରୀ"</string>
+ <string name="save" msgid="2311877285724540644">"ସେଭ୍ କରନ୍ତୁ"</string>
<string name="reset" msgid="2448168080964209908">"ରିସେଟ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for adjust_button_width (6138616087197632947) -->
- <skip />
- <!-- no translation found for clipboard (1313879395099896312) -->
- <skip />
- <!-- no translation found for accessibility_key (5701989859305675896) -->
- <skip />
- <!-- no translation found for left_keycode (2010948862498918135) -->
- <skip />
- <!-- no translation found for right_keycode (708447961000848163) -->
- <skip />
- <!-- no translation found for left_icon (3096287125959387541) -->
- <skip />
- <!-- no translation found for right_icon (3952104823293824311) -->
- <skip />
- <!-- no translation found for drag_to_add_tiles (7058945779098711293) -->
- <skip />
- <!-- no translation found for drag_to_remove_tiles (3361212377437088062) -->
- <skip />
- <!-- no translation found for qs_edit (2232596095725105230) -->
- <skip />
- <!-- no translation found for tuner_time (6572217313285536011) -->
- <skip />
- <!-- no translation found for clock_options:0 (5965318737560463480) -->
- <!-- no translation found for clock_options:1 (1427801730816895300) -->
- <!-- no translation found for clock_options:2 (3830170141562534721) -->
- <!-- no translation found for battery_options:0 (3160236755818672034) -->
- <!-- no translation found for battery_options:1 (2139628951880142927) -->
- <!-- no translation found for battery_options:2 (3327323682209964956) -->
- <!-- no translation found for other (4060683095962566764) -->
- <skip />
- <!-- no translation found for accessibility_divider (5903423481953635044) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) -->
- <skip />
- <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) -->
- <skip />
- <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) -->
- <skip />
- <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) -->
- <skip />
+ <string name="adjust_button_width" msgid="6138616087197632947">"ବଟନ୍ର ମୋଟେଇ ଆଡ୍ଜଷ୍ଟ କରନ୍ତୁ"</string>
+ <string name="clipboard" msgid="1313879395099896312">"କ୍ଲିପ୍ବୋର୍ଡ"</string>
+ <string name="accessibility_key" msgid="5701989859305675896">"କଷ୍ଟମ୍ ନାଭିଗେଶନ୍ ବଟନ୍"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"ବାମ କୀ\'କୋଡ୍"</string>
+ <string name="right_keycode" msgid="708447961000848163">"ଡାହାଣ କୀ\'କୋଡ୍"</string>
+ <string name="left_icon" msgid="3096287125959387541">"ବାମ ଆଇକନ୍"</string>
+ <string name="right_icon" msgid="3952104823293824311">"ଡାହାଣ ଆଇକନ୍"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ଟାଇଲ୍ ଯୋଡ଼ିବା ପାଇଁ ଦାବିଧରି ଟାଣନ୍ତୁ"</string>
+ <string name="drag_to_remove_tiles" msgid="3361212377437088062">"ବାହାର କରିବାକୁ ଏଠାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"ଆପଣଙ୍କର ଅତିକମରେ 6ଟି ଟାଇଲ୍ ଆବଶ୍ୟକ"</string>
+ <string name="qs_edit" msgid="2232596095725105230">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
+ <string name="tuner_time" msgid="6572217313285536011">"ସମୟ"</string>
+ <string-array name="clock_options">
+ <item msgid="5965318737560463480">"ଘଣ୍ଟା, ମିନିଟ୍ ଏବଂ ସେକେଣ୍ଡ ଦେଖାନ୍ତୁ"</item>
+ <item msgid="1427801730816895300">"ଘଣ୍ଟା ଏବଂ ମିନିଟ୍ ଦେଖାନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
+ <item msgid="3830170141562534721">"ଏହି ଆଇକନ୍ ଦେଖାନ୍ତୁ ନାହିଁ"</item>
+ </string-array>
+ <string-array name="battery_options">
+ <item msgid="3160236755818672034">"ସର୍ବଦା ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</item>
+ <item msgid="2139628951880142927">"ଚାର୍ଜ କରାଯିବାବେଳେ ଶତକଡ଼ା ଦେଖାନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
+ <item msgid="3327323682209964956">"ଏହି ଆଇକନ୍ ଦେଖାନ୍ତୁ ନାହିଁ"</item>
+ </string-array>
+ <string name="other" msgid="4060683095962566764">"ଅନ୍ୟାନ୍ୟ"</string>
+ <string name="accessibility_divider" msgid="5903423481953635044">"ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନ ବିଭାଜକ"</string>
+ <string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ବାମ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_left_70" msgid="3612060638991687254">"ବାମ ପଟକୁ 70% କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_left_50" msgid="1248083470322193075">"ବାମ ପଟକୁ 50% କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_left_30" msgid="543324403127069386">"ବାମ ପଟେ 30%"</string>
+ <string name="accessibility_action_divider_right_full" msgid="4639381073802030463">"ଡାହାଣ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_top_full" msgid="5357010904067731654">"ଉପର ଆଡ଼କୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_top_70" msgid="5090779195650364522">"ଉପର ଆଡ଼କୁ 70% କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"ଉପର ଆଡ଼କୁ 50% କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"ଉପର ଆଡ଼କୁ 30% କରନ୍ତୁ"</string>
+ <string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"ତଳ ଅଂଶର ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string>
+ <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"ଅବସ୍ଥାନ <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>। ଏଡିଟ୍ କରିବାକୁ ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>। ଯୋଡ଼ିବା ପାଇଁ ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"ଅବସ୍ଥିତି <xliff:g id="POSITION">%1$d</xliff:g>। ଚୟନ କରିବାକୁ ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ନିଅନ୍ତୁ"</string>
+ <string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ବାହାର କରିଦିଅନ୍ତୁ"</string>
+ <string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g>କୁ ଅବସ୍ଥାନ <xliff:g id="POSITION">%2$d</xliff:g>ରେ ଯୋଡ଼ାଗଲା"</string>
+ <string name="accessibility_qs_edit_tile_removed" msgid="8584304916627913440">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ବାହାର କରିଦିଆଗଲା"</string>
+ <string name="accessibility_qs_edit_tile_moved" msgid="4343693412689365038">"<xliff:g id="TILE_NAME">%1$s</xliff:g> କୁ ଅବସ୍ଥାନ <xliff:g id="POSITION">%2$d</xliff:g> କୁ ନିଆଗଲା"</string>
+ <string name="accessibility_desc_quick_settings_edit" msgid="8073587401747016103">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ଏଡିଟର୍।"</string>
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ବିଜ୍ଞପ୍ତି: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
- <!-- no translation found for dock_forced_resizable (5914261505436217520) -->
- <skip />
- <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) -->
- <skip />
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <string name="dock_forced_resizable" msgid="5914261505436217520">"ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନରେ ଆପ୍ କାମ କରିନପାରେ।"</string>
+ <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ଆପ୍ ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ କାମ ନକରିପାରେ।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ ଲଞ୍ଚ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ବନ୍ଦ କରନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"ଆଲାର୍ମ ସେଟ୍।"</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"<xliff:g id="ID_1">%s</xliff:g> ଭାବରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି"</string>
- <string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"କୌଣସି ଇଣ୍ଟରନେଟ୍ ନାହିଁ"</string>
+ <string name="data_connection_no_internet" msgid="4503302451650972989">"କୌଣସି ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ନାହିଁ"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ସେଟିଙ୍ଗର କ୍ରମ ସଂଶୋଧନ କରନ୍ତୁ।"</string>
- <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) -->
- <skip />
- <!-- no translation found for tuner_lock_screen (5755818559638850294) -->
- <skip />
+ <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"ପୃଷ୍ଠା <xliff:g id="ID_1">%1$d</xliff:g> ମୋଟ <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"ଲକ୍ ସ୍କ୍ରୀନ୍"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"ବଢ଼ାନ୍ତୁ"</string>
- <!-- no translation found for pip_phone_minimize (1079119422589131792) -->
+ <string name="pip_phone_minimize" msgid="1079119422589131792">"ଛୋଟ କରନ୍ତୁ"</string>
+ <string name="pip_phone_close" msgid="8416647892889710330">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="pip_phone_settings" msgid="8080777499521528521">"ସେଟିଙ୍ଗ"</string>
+ <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ଖାରଜ କରିବାକୁ ତଳକୁ ଟାଣନ୍ତୁ"</string>
+ <string name="pip_menu_title" msgid="4707292089961887657">"ମେନୁ"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> \"ଛବି-ଭିତରେ-ଛବି\"ରେ ଅଛି"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ଏହି ବୈଶିଷ୍ଟ୍ୟ <xliff:g id="NAME">%s</xliff:g> ବ୍ୟବହାର ନକରିବାକୁ ଯଦି ଆପଣ ଚାହାଁନ୍ତି, ସେଟିଙ୍ଗ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏହା ଅଫ୍ କରିଦିଅନ୍ତୁ।"</string>
+ <string name="pip_play" msgid="1417176722760265888">"ପ୍ଲେ କରନ୍ତୁ"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"ପଜ୍ କରନ୍ତୁ"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ପରବର୍ତ୍ତୀକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"ପୂର୍ବବର୍ତ୍ତୀକୁ ଛାଡ଼ନ୍ତୁ"</string>
+ <string name="thermal_shutdown_title" msgid="4458304833443861111">"ଗରମ ହେତୁ ଫୋନ୍ ଅଫ୍ କରିଦିଆଗଲା"</string>
+ <string name="thermal_shutdown_message" msgid="9006456746902370523">"ଆପଣଙ୍କ ଫୋନ୍ ବର୍ତ୍ତମାନ ସାମାନ୍ୟ ଅବସ୍ଥାରେ ଚାଲୁଛି"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ଆପଣଙ୍କ ଫୋନ୍ ବହୁତ ଗରମ ଥିଲା, ତେଣୁ ଏହାକୁ ଥଣ୍ଡା କରାଯିବାକୁ ଅଫ୍ କରିଦିଆଗଲା। ଆପଣଙ୍କ ଫୋନ୍ ବର୍ତ୍ତମାନ ସାମାନ୍ୟ ଅବସ୍ଥାରେ ଚାଲୁଛି।\n\nଆପଣଙ୍କ ଫୋନ୍ ଅଧିକ ଗରମ ହୋଇଯାଇପାରେ ଯଦି ଆପଣ:\n • ରିସୋର୍ସ-ଇଣ୍ଟେନସିଭ୍ ଆପ୍ (ଯେପରିକି ଗେମିଙ୍ଗ, ଭିଡିଓ, କିମ୍ବା ନେଭିଗେସନ୍ ଆପ୍) ବ୍ୟବହାର କରନ୍ତି\n • ବଡ ଫାଇଲ୍ ଡାଉନଲୋଡ୍ କିମ୍ବା ଅପଲୋଡ୍ କରନ୍ତି\n • ଅଧିକ ତାପମାତ୍ରାରେ ଆପଣଙ୍କ ଫୋନ୍ ବ୍ୟବହାର କରନ୍ତି"</string>
+ <string name="high_temp_title" msgid="4589508026407318374">"ଫୋନ୍ ଗରମ ହୋଇଯାଉଛି"</string>
+ <string name="high_temp_notif_message" msgid="5642466103153429279">"ଫୋନ୍ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର୍ ସୀମିତ ଭାବେ କାମ କରିଥାଏ"</string>
+ <string name="high_temp_dialog_message" msgid="6840700639374113553">"ଆପଣଙ୍କ ଫୋନ୍ ସ୍ୱଚାଳିତ ଭାବେ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ତଥାପି ନିଜ ଫୋନ୍ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ୍ ଥଣ୍ଡା ହୋଇଯିବାପରେ, ଏହା ସାମାନ୍ୟ ଭାବେ ଚାଲିବ।"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ବାମ ଶର୍ଟକଟ୍"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ଡାହାଣ ଶର୍ଟକଟ୍"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"ବାମ ଶର୍ଟକଟ୍ ମଧ୍ୟ ଅନଲକ୍ କରେ"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"ଡାହାଣ ଶର୍ଟକଟ୍ ମଧ୍ୟ ଅନଲକ୍ କରେ"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"କିଛିନୁହେଁ"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> ଲଞ୍ଚ କରନ୍ତୁ"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"ଅନ୍ୟାନ୍ୟ ଆପ୍"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"ବୃତ୍ତ"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"ଯୁକ୍ତ"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"ବିଯୁକ୍ତ"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"ବାମ"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"ଡାହାଣ"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"ମେନୁ"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> ଆପ୍"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"ଆଲର୍ଟ"</string>
+ <string name="notification_channel_battery" msgid="5786118169182888462">"ବ୍ୟାଟେରୀ"</string>
+ <string name="notification_channel_screenshot" msgid="6314080179230000938">"ସ୍କ୍ରୀନଶଟ୍"</string>
+ <string name="notification_channel_general" msgid="4525309436693914482">"ସାଧାରଣ ମେସେଜ୍"</string>
+ <string name="notification_channel_storage" msgid="3077205683020695313">"ଷ୍ଟୋରେଜ୍"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
<skip />
- <!-- no translation found for pip_phone_close (8416647892889710330) -->
- <skip />
- <!-- no translation found for pip_phone_settings (8080777499521528521) -->
- <skip />
- <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) -->
- <skip />
- <!-- no translation found for pip_menu_title (4707292089961887657) -->
- <skip />
- <!-- no translation found for pip_notification_title (3204024940158161322) -->
- <skip />
- <!-- no translation found for pip_notification_message (5619512781514343311) -->
- <skip />
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
- <!-- no translation found for thermal_shutdown_title (4458304833443861111) -->
- <skip />
- <!-- no translation found for thermal_shutdown_message (9006456746902370523) -->
- <skip />
- <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) -->
- <skip />
- <!-- no translation found for high_temp_title (4589508026407318374) -->
- <skip />
- <!-- no translation found for high_temp_notif_message (5642466103153429279) -->
- <skip />
- <!-- no translation found for high_temp_dialog_message (6840700639374113553) -->
- <skip />
- <!-- no translation found for lockscreen_shortcut_left (2182769107618938629) -->
- <skip />
- <!-- no translation found for lockscreen_shortcut_right (3328683699505226536) -->
- <skip />
- <!-- no translation found for lockscreen_unlock_left (2043092136246951985) -->
- <skip />
- <!-- no translation found for lockscreen_unlock_right (1529992940510318775) -->
- <skip />
- <!-- no translation found for lockscreen_none (4783896034844841821) -->
- <skip />
- <!-- no translation found for tuner_launch_app (1527264114781925348) -->
- <skip />
- <!-- no translation found for tuner_other_apps (4726596850501162493) -->
- <skip />
- <!-- no translation found for tuner_circle (2340998864056901350) -->
- <skip />
- <!-- no translation found for tuner_plus (6792960658533229675) -->
- <skip />
- <!-- no translation found for tuner_minus (4806116839519226809) -->
- <skip />
- <!-- no translation found for tuner_left (8404287986475034806) -->
- <skip />
- <!-- no translation found for tuner_right (6222734772467850156) -->
- <skip />
- <!-- no translation found for tuner_menu (191640047241552081) -->
- <skip />
- <!-- no translation found for tuner_app (3507057938640108777) -->
- <skip />
- <!-- no translation found for notification_channel_alerts (4496839309318519037) -->
- <skip />
- <!-- no translation found for notification_channel_battery (5786118169182888462) -->
- <skip />
- <!-- no translation found for notification_channel_screenshot (6314080179230000938) -->
- <skip />
- <!-- no translation found for notification_channel_general (4525309436693914482) -->
- <skip />
- <!-- no translation found for notification_channel_storage (3077205683020695313) -->
- <skip />
- <!-- no translation found for instant_apps (6647570248119804907) -->
- <skip />
- <!-- no translation found for instant_apps_message (8116608994995104836) -->
- <skip />
+ <string name="instant_apps" msgid="6647570248119804907">"ଇନଷ୍ଟାଣ୍ଟ ଆପ୍"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ଇନଷ୍ଟାଣ୍ଟ ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାର ଆବଶ୍ୟକତା ନାହିଁ"</string>
<string name="app_info" msgid="6856026610594615344">"ଆପ୍ ସୂଚନା"</string>
- <!-- no translation found for go_to_web (2650669128861626071) -->
+ <string name="go_to_web" msgid="2650669128861626071">"ବ୍ରାଉଜର୍କୁ ଯାଆନ୍ତୁ"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"ମୋବାଇଲ୍ ଡାଟା"</string>
+ <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%s</xliff:g> — <xliff:g id="ID_2">%s</xliff:g>"</string>
+ <string name="wifi_is_off" msgid="1838559392210456893">"ୱାଇ-ଫାଇ ଅଫ୍ ଅଛି"</string>
+ <string name="bt_is_off" msgid="2640685272289706392">"ବ୍ଲୁ-ଟୁଥ୍ ଅଫ୍ ଅଛି"</string>
+ <string name="dnd_is_off" msgid="6167780215212497572">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ଅଛି"</string>
+ <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"ଏକ (<xliff:g id="ID_1">%s</xliff:g>) ନିୟମ ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ କରାଗଲା।"</string>
+ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"ଏକ ଆପ୍ (<xliff:g id="ID_1">%s</xliff:g>) ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରାଗଲା।"</string>
+ <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"ଏକ ସ୍ୱଚାଳିତ ନିୟମ କିମ୍ବା ଆପ୍ ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରାଗଲା।"</string>
+ <string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
+ <string name="qs_dnd_keep" msgid="1825009164681928736">"ଧରି ରଖନ୍ତୁ"</string>
+ <string name="qs_dnd_replace" msgid="8019520786644276623">"ବଦଳାନ୍ତୁ"</string>
+ <string name="running_foreground_services_title" msgid="381024150898615683">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡରେ ଆପ୍ ଚାଲୁଛି"</string>
+ <string name="running_foreground_services_msg" msgid="6326247670075574355">"ବ୍ୟାଟେରୀ ଏବଂ ଡାଟା ବ୍ୟବହାର ଉପରେ ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"ମୋବାଇଲ୍ ଡାଟା ବନ୍ଦ କରିବେ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> ଦ୍ଵାରା ଆପଣଙ୍କର ଡାଟା କିମ୍ବା ଇଣ୍ଟରନେଟ୍କୁ ଆକ୍ସେସ୍ ନାହିଁ। ଇଣ୍ଟରନେଟ୍ କେବଳ ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ ଉପଲବ୍ଧ ହେବ।"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ଆପଣଙ୍କ କେରିଅର୍"</string>
+ <string name="touch_filtered_warning" msgid="8671693809204767551">"ଗୋଟିଏ ଆପ୍ ଏକ ଅନୁମତି ଅନୁରୋଧକୁ ଦେଖିବାରେ ବାଧା ଦେଉଥିବାରୁ, ସେଟିଙ୍ଗ ଆପଣଙ୍କ ଉତ୍ତରକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ।"</string>
+ <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP_0">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="slice_permission_text_1" msgid="3514586565609596523">"- ଏହା <xliff:g id="APP">%1$s</xliff:g>ରୁ ସୂଚନାକୁ ପଢ଼ିପାରିବ"</string>
+ <string name="slice_permission_text_2" msgid="3146758297471143723">"- ଏହା <xliff:g id="APP">%1$s</xliff:g> ଭିତରେ କାମ କରିପାରିବ"</string>
+ <string name="slice_permission_checkbox" msgid="7986504458640562900">"ଯେକୌଣସି ଆପ୍ରେ ସ୍ଲାଇସ୍କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="slice_permission_allow" msgid="2340244901366722709">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="slice_permission_deny" msgid="7683681514008048807">"ଅସ୍ଵୀକାର କରନ୍ତୁ"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
<skip />
- <!-- no translation found for mobile_data (7094582042819250762) -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
<skip />
- <!-- no translation found for wifi_is_off (1838559392210456893) -->
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
<skip />
- <!-- no translation found for bt_is_off (2640685272289706392) -->
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
<skip />
- <!-- no translation found for dnd_is_off (6167780215212497572) -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
<skip />
- <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) -->
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
<skip />
- <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) -->
- <skip />
- <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) -->
- <skip />
- <!-- no translation found for qs_dnd_until (3469471136280079874) -->
- <skip />
- <!-- no translation found for qs_dnd_keep (1825009164681928736) -->
- <skip />
- <!-- no translation found for qs_dnd_replace (8019520786644276623) -->
- <skip />
- <!-- no translation found for running_foreground_services_title (381024150898615683) -->
- <skip />
- <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
- <skip />
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ମୋବାଇଲ୍ ଡାଟା ଅଫ୍ କରିବେ?"</string>
- <!-- no translation found for touch_filtered_warning (8671693809204767551) -->
- <skip />
- <!-- no translation found for slice_permission_title (7465009437851044444) -->
- <skip />
- <!-- no translation found for slice_permission_text_1 (3514586565609596523) -->
- <skip />
- <!-- no translation found for slice_permission_text_2 (3146758297471143723) -->
- <skip />
- <!-- no translation found for slice_permission_checkbox (7986504458640562900) -->
- <skip />
- <!-- no translation found for slice_permission_allow (2340244901366722709) -->
- <skip />
- <!-- no translation found for slice_permission_deny (7683681514008048807) -->
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-or/strings_car.xml b/packages/SystemUI/res/values-or/strings_car.xml
new file mode 100644
index 0000000..9235b9b
--- /dev/null
+++ b/packages/SystemUI/res/values-or/strings_car.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="unknown_user_label" msgid="4323896111737677955">"ଅଜଣା"</string>
+ <string name="start_driving" msgid="864023351402918991">"ଗାଡ଼ି ଚଲାଇବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-or/strings_tv.xml b/packages/SystemUI/res/values-or/strings_tv.xml
index 2048def..2174dc9 100644
--- a/packages/SystemUI/res/values-or/strings_tv.xml
+++ b/packages/SystemUI/res/values-or/strings_tv.xml
@@ -19,11 +19,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for notification_channel_tv_pip (134047986446577723) -->
- <skip />
- <!-- no translation found for pip_notification_unknown_title (6289156118095849438) -->
- <skip />
- <!-- no translation found for pip_close (3480680679023423574) -->
- <skip />
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"ଛବି-ଭିତରେ-ଛବି"</string>
+ <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(କୌଣସି ଟାଇଟଲ୍ ପ୍ରୋଗ୍ରାମ୍ ନାହିଁ)"</string>
+ <string name="pip_close" msgid="3480680679023423574">"PIP ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 58f441b..3489132 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ਜਾਰੀ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ਸੂਚਨਾਵਾਂ"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ਬੈਟਰੀ ਘੱਟ ਹੈ"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"ਬੈਟਰੀ ਘੱਟ ਹੈ। ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕਰੋ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬਾਕੀ"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬਾਕੀ, ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%s</xliff:g> ਬਾਕੀ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬਾਕੀ, ਲਗਭਗ <xliff:g id="TIME">%s</xliff:g> ਬਾਕੀ"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ਆਪਣਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਕੈਪਚਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ ਆਈ"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ਸੀਮਿਤ ਸਟੋਰੇਜ ਹੋਣ ਕਾਰਨ ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਚੋਣਾਂ"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ਡੈਜ਼ਰਟ ਕੇਸ"</string>
<string name="start_dreams" msgid="5640361424498338327">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ਈਥਰਨੈਟ"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਪ੍ਰਤੀਕ ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ਕੇਵਲ ਤਰਜੀਹੀ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ਕੇਵਲ ਅਲਾਰਮ"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ਸੂਰਜ ਛਿਪਣ \'ਤੇ ਚਾਲੂ"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ਸੂਰਜ ਚੜ੍ਹਨ ਤੱਕ"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ਵਜੇ ਚਾਲੂ"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> ਤੱਕ"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਮੋਡ ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾ ਰਿਹਾ ਹੈ"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ਹੁਣ ਚਾਲੂ ਕਰੋ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ਥਰਥਰਾਹਟ \'ਤੇ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਲਈ ਘੰਟੀ ਵੱਜੇਗੀ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"ਮੀਡੀਆ ਆਊਟਪੁੱਟ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ਫ਼ੋਨ ਕਾਲ ਆਊਟਪੁੱਟ"</string>
<string name="output_none_found" msgid="5544982839808921091">"ਕੋਈ ਡੀਵਾਈਸ ਨਹੀਂ ਮਿਲੇ"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ਸੂਚਨਾ ਕੰਟਰੋਲ"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ਸੂਚਨਾ ਸਨੂਜ਼ ਵਿਕਲਪ"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ਲਈ ਸਨੂਜ਼ ਕੀਤਾ ਗਿਆ"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"ਬੈਟਰੀ"</string>
<string name="clock" msgid="7416090374234785905">"ਘੜੀ"</string>
<string name="headset" msgid="4534219457597457353">"ਹੈੱਡਸੈੱਟ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ਹੈੱਡਫ਼ੋਨ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ਹੈੱਡਸੈੱਟ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="data_saver" msgid="5037565123367048522">"ਡਾਟਾ ਸੇਵਰ"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"ਸੱਜਾ ਕੀ-ਕੋਡ"</string>
<string name="left_icon" msgid="3096287125959387541">"ਖੱਬਾ ਪ੍ਰਤੀਕ"</string>
<string name="right_icon" msgid="3952104823293824311">"ਸੱਜਾ ਪ੍ਰਤੀਕ"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ਟਾਇਲਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਰੱਖੋ ਅਤੇ ਘਸੀਟੋ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ਹਟਾਉਣ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ 6 ਟਾਇਲਾਂ ਦੀ ਲੋੜ ਪਵੇਗੀ"</string>
<string name="qs_edit" msgid="2232596095725105230">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="tuner_time" msgid="6572217313285536011">"ਸਮਾਂ"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ਆਮ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ਸਟੋਰੇਜ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string>
<string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"ਬਦਲੋ"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀਆਂ ਐਪਾਂ"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"ਬੈਟਰੀ ਅਤੇ ਡਾਟਾ ਵਰਤੋਂ ਸਬੰਧੀ ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"ਕੀ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"ਤੁਸੀਂ <xliff:g id="CARRIER">%s</xliff:g> ਰਾਹੀਂ ਡਾਟੇ ਜਾਂ ਇੰਟਰਨੈੱਟ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕੋਗੇ। ਇੰਟਰਨੈੱਟ ਸਿਰਫ਼ ਵਾਈ-ਫਾਈ ਰਾਹੀਂ ਉਪਲਬਧ ਹੋਵੇਗਾ।"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ਤੁਹਾਡਾ ਕੈਰੀਅਰ"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"ਕਿਸੇ ਐਪ ਵੱਲੋਂ ਇਜਾਜ਼ਤ ਬੇਨਤੀ ਨੂੰ ਢਕੇ ਜਾਣ ਕਾਰਨ ਸੈਟਿੰਗਾਂ ਤੁਹਾਡੇ ਜਵਾਬ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ।"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"ਕੀ <xliff:g id="APP_0">%1$s</xliff:g> ਨੂੰ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੇਣੇ ਹਨ?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ਇਹ <xliff:g id="APP">%1$s</xliff:g> ਵਿੱਚੋਂ ਜਾਣਕਾਰੀ ਪੜ੍ਹ ਸਕਦਾ ਹੈ"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> ਨੂੰ ਕਿਸੇ ਵੀ ਐਪ ਵਿੱਚੋਂ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦਿਓ"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ਕਰਨ ਦਿਓ"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 79d9d6a..f1767a2 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -35,7 +35,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Niski poziom baterii"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Niski poziom naładowania baterii. Włącz Oszczędzanie baterii"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Pozostało <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Pozostało <xliff:g id="PERCENTAGE">%s</xliff:g>, jeszcze około <xliff:g id="TIME">%s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Pozostało <xliff:g id="PERCENTAGE">%s</xliff:g>, jeszcze około <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -75,11 +74,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Zrzut ekranu"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Zapisywanie zrzutu ekranu..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Zapisywanie zrzutu ekranu..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Zapisywanie zrzutu ekranu"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Zrzut ekranu został zapisany"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Kliknij, by zobaczyć zrzut ekranu"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Nie udało się wykonać zrzutu ekranu"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Podczas zapisywania zrzutu ekranu wystąpił błąd"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Nie można zapisać zrzutu ekranu, bo brakuje miejsca w pamięci"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB – opcje przesyłania plików"</string>
@@ -354,7 +354,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Włącz o zachodzie"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do wschodu słońca"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Włącz o <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"Komunikacja NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Komunikacja NFC jest wyłączona"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Komunikacja NFC jest włączona"</string>
@@ -438,7 +439,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> będzie zapisywać wszystko, co wyświetli się na ekranie."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nie pokazuj ponownie"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ukryj wszystkie"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"W trybie Nie przeszkadzać powiadomienia są ukrywane"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"W trybie Nie przeszkadzać powiadomienia są ukrywane"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Rozpocznij teraz"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Brak powiadomień"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil może być monitorowany"</string>
@@ -544,7 +547,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Kliknij, by włączyć wibracje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Kliknij, by wyciszyć."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Sterowanie głośnością: %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Dzwonek przy połączeniach i powiadomieniach"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Wyjście multimediów"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Wyjście dla połączeń telefonicznych"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nie znaleziono urządzeń"</string>
@@ -635,6 +639,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"sterowanie powiadomieniami"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcje odkładania powiadomień"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"COFNIJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odłożono na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -702,6 +708,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Zegar"</string>
<string name="headset" msgid="4534219457597457353">"Zestaw słuchawkowy"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Słuchawki są podłączone"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Zestaw słuchawkowy jest podłączony"</string>
<string name="data_saver" msgid="5037565123367048522">"Oszczędzanie danych"</string>
@@ -736,11 +744,9 @@
<string name="right_keycode" msgid="708447961000848163">"Prawy klawisz"</string>
<string name="left_icon" msgid="3096287125959387541">"Lewa ikona"</string>
<string name="right_icon" msgid="3952104823293824311">"Prawa ikona"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Przytrzymaj i przeciągnij, by dodać kafelki"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Przeciągnij tutaj, by usunąć"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Potrzebnych jest co najmniej sześć kafelków"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edytuj"</string>
<string name="tuner_time" msgid="6572217313285536011">"Godzina"</string>
<string-array name="clock_options">
@@ -827,6 +833,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Zrzuty ekranu"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Wiadomości"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pamięć wewnętrzna"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Wskazówki"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikacje błyskawiczne"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacji błyskawicznych nie trzeba instalować."</string>
<string name="app_info" msgid="6856026610594615344">"O aplikacji"</string>
@@ -844,12 +851,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zastąp"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Aplikacje działające w tle"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Kliknij, by wyświetlić szczegóły wykorzystania baterii i użycia danych"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Wyłączyć mobilną transmisję danych?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Nie będziesz mieć dostępu do transmisji danych ani internetu przez operatora <xliff:g id="CARRIER">%s</xliff:g>. Internet będzie dostępny tylko przez Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"Twój operator"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Aplikacja Ustawienia nie może zweryfikować Twojej odpowiedzi, ponieważ inna aplikacja zasłania prośbę o udzielenie uprawnień."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Zezwolić aplikacji <xliff:g id="APP_0">%1$s</xliff:g> na pokazywanie wycinków z aplikacji <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Może odczytywać informacje z aplikacji <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -857,4 +861,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Zezwalaj aplikacji <xliff:g id="APP">%1$s</xliff:g> na pokazywanie wycinków z dowolnych aplikacji"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Zezwól"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Odmów"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Kliknij, by zaplanować działanie oszczędzania baterii"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Włącz automatycznie, gdy poziom naładowania baterii wynosi <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nie"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Harmonogram oszczędzania baterii jest aktywny"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Oszczędzanie baterii włączy się automatycznie, gdy poziom naładowania baterii spadnie poniżej <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ustawienia"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 080f7e4..b01e155 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateria fraca"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"A bateria está com pouca carga. Ative a Economia de bateria"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restantes"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante(s), cerca de <xliff:g id="TIME">%s</xliff:g> com base no seu uso"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante(s), cerca de <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvando captura de tela..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Salvando captura de tela..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"A captura de tela está sendo salva"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Captura de tela salva"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toque para ver sua captura de tela"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Não foi possível fazer a captura de tela"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problema encontrado ao salvar captura de tela"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Falha ao salvar a captura de tela"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Tente fazer a captura de tela novamente"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Não é possível salvar a captura de tela, porque não há espaço suficiente"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"O app ou a organização não permitem capturas de tela"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string>
@@ -275,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Toque nos ícones e mantenha-os pressionados para ver mais opções"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string>
@@ -351,7 +348,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ativ. ao pôr do sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até o nascer do sol"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Até <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string>
@@ -435,7 +432,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"O modo \"Não perturbe\" está ocultando as notificações"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Gerenciar notificações"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"O modo \"Não perturbe\" está ocultando as notificações"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorado"</string>
@@ -541,7 +539,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Chamadas e notificações emitirão um toque"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string>
@@ -628,6 +627,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controles de notificação"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opções de adiamento de notificação"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Adiar"</string>
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +691,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Relógio"</string>
<string name="headset" msgid="4534219457597457353">"Fone de ouvido"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Fones de ouvido conectados"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Fone de ouvido conectado"</string>
<string name="data_saver" msgid="5037565123367048522">"Economia de dados"</string>
@@ -725,11 +727,9 @@
<string name="right_keycode" msgid="708447961000848163">"Código de tecla à direita"</string>
<string name="left_icon" msgid="3096287125959387541">"Ícone à esquerda"</string>
<string name="right_icon" msgid="3952104823293824311">"Ícone à direita"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Mantenha pressionado e arraste para adicionar blocos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arraste aqui para remover"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"É preciso haver pelo menos seis blocos"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
<string name="tuner_time" msgid="6572217313285536011">"Horas"</string>
<string-array name="clock_options">
@@ -816,6 +816,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de tela"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Dicas"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
@@ -833,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituir"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps sendo executados em segundo plano"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Desativar os dados móveis?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Você não terá acesso a dados ou à Internet por meio da operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"sua operadora"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Como um app está ocultando uma solicitação de permissão, as configurações não podem verificar sua resposta."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Permitir que <xliff:g id="APP_0">%1$s</xliff:g> mostre partes do app <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Pode ler informações do app <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -846,4 +844,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que <xliff:g id="APP">%1$s</xliff:g> mostre partes de qualquer app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Negar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Toque para programar o recurso \"Economia de bateria\""</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Ativar automaticamente quando a bateria estiver em <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Não"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Programação do recurso \"Economia de bateria\" ativada"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"O recurso \"Economia de bateria\" será ativado automaticamente depois que a bateria ficar abaixo de <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index d2adb24..8653c11 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateria fraca"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"A bateria está fraca. Ativar a Poupança de dados"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. Cerca de <xliff:g id="TIME">%s</xliff:g> restante(s) com base na sua utilização."</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. Cerca de <xliff:g id="TIME">%s</xliff:g> restante(s)."</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de ecrã"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"A guardar captura de ecrã..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"A guardar captura de ecrã..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"A guardar a captura de ecrã…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Captura de ecrã guardada"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toque para ver a captura de ecrã."</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Não foi possível obter a captura de ecrã."</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Foi encontrado um problema ao guardar a captura de ecrã."</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Não foi possível gravar a captura de ecrã"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Experimente voltar a efetuar a captura de ecrã."</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Não é possível guardar a captura de ecrã devido a espaço de armazenamento limitado."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"A aplicação ou a sua entidade não permitem tirar capturas de ecrã"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opções de transm. de fich. USB"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ativ. ao pôr-do-sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até ao nascer do sol"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativada à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"O NFC está desativado"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"O NFC está ativado"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"O(a) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vai começar a captar tudo o que é apresentado no ecrã."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar de novo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"O modo Não incomodar está a ocultar as notificações."</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Gerir notificações"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"O modo Não incomodar está a ocultar as notificações."</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Começar agora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorizado"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para ativar a vibração."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para desativar o som."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controlos de volume de %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"As chamadas e as notificações tocam."</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Saída de som multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de som de chamada telefónica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo encontrado."</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controlos de notificação"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opções de suspensão de notificações"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Suspender"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ANULAR"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Suspensa por <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Relógio"</string>
<string name="headset" msgid="4534219457597457353">"Ausc. com microfone integrado"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auscultadores ligados"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auscultadores com microfone integrado ligados"</string>
<string name="data_saver" msgid="5037565123367048522">"Poupança de dados"</string>
@@ -811,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de ecrã"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Sugestões"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicações instantâneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"As Aplicações instantâneas não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações da aplicação"</string>
@@ -838,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que a aplicação <xliff:g id="APP">%1$s</xliff:g> mostre partes de qualquer aplicação"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Recusar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tocar para agendar a Poupança de bateria"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Ative automaticamente quando o nível de bateria estiver a <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Não, obrigado"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Poupança de bateria agendada ativada"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"A Poupança de bateria é ativada automaticamente quando o nível de bateria está abaixo de <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Definições"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Compreendi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 080f7e4..b01e155 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateria fraca"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"A bateria está com pouca carga. Ative a Economia de bateria"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restantes"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante(s), cerca de <xliff:g id="TIME">%s</xliff:g> com base no seu uso"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante(s), cerca de <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvando captura de tela..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Salvando captura de tela..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"A captura de tela está sendo salva"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Captura de tela salva"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Toque para ver sua captura de tela"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Não foi possível fazer a captura de tela"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problema encontrado ao salvar captura de tela"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Falha ao salvar a captura de tela"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Tente fazer a captura de tela novamente"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Não é possível salvar a captura de tela, porque não há espaço suficiente"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"O app ou a organização não permitem capturas de tela"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string>
@@ -275,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Toque nos ícones e mantenha-os pressionados para ver mais opções"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string>
@@ -351,7 +348,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ativ. ao pôr do sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até o nascer do sol"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Até <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string>
@@ -435,7 +432,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"O modo \"Não perturbe\" está ocultando as notificações"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Gerenciar notificações"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"O modo \"Não perturbe\" está ocultando as notificações"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorado"</string>
@@ -541,7 +539,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Chamadas e notificações emitirão um toque"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string>
@@ -628,6 +627,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"controles de notificação"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opções de adiamento de notificação"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Adiar"</string>
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +691,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Relógio"</string>
<string name="headset" msgid="4534219457597457353">"Fone de ouvido"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Fones de ouvido conectados"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Fone de ouvido conectado"</string>
<string name="data_saver" msgid="5037565123367048522">"Economia de dados"</string>
@@ -725,11 +727,9 @@
<string name="right_keycode" msgid="708447961000848163">"Código de tecla à direita"</string>
<string name="left_icon" msgid="3096287125959387541">"Ícone à esquerda"</string>
<string name="right_icon" msgid="3952104823293824311">"Ícone à direita"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Mantenha pressionado e arraste para adicionar blocos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arraste aqui para remover"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"É preciso haver pelo menos seis blocos"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
<string name="tuner_time" msgid="6572217313285536011">"Horas"</string>
<string-array name="clock_options">
@@ -816,6 +816,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de tela"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Dicas"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
@@ -833,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituir"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Apps sendo executados em segundo plano"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Desativar os dados móveis?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Você não terá acesso a dados ou à Internet por meio da operadora <xliff:g id="CARRIER">%s</xliff:g>. A Internet só estará disponível via Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"sua operadora"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Como um app está ocultando uma solicitação de permissão, as configurações não podem verificar sua resposta."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Permitir que <xliff:g id="APP_0">%1$s</xliff:g> mostre partes do app <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Pode ler informações do app <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -846,4 +844,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permitir que <xliff:g id="APP">%1$s</xliff:g> mostre partes de qualquer app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permitir"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Negar"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Toque para programar o recurso \"Economia de bateria\""</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Ativar automaticamente quando a bateria estiver em <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Não"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Programação do recurso \"Economia de bateria\" ativada"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"O recurso \"Economia de bateria\" será ativado automaticamente depois que a bateria ficar abaixo de <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 08f27f1..24bcd97 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -34,7 +34,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfășurare"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Bateria este aproape descărcată"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Bateria este aproape descărcată. Activați Economisirea bateriei."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Procent rămas din baterie: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Procent rămas din baterie <xliff:g id="PERCENTAGE">%s</xliff:g>, în baza utilizării, timp aproximativ rămas <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Procent rămas din baterie <xliff:g id="PERCENTAGE">%s</xliff:g>, timp aproximativ rămas <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -74,11 +73,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Captură de ecran"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Se salv. captura de ecran..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Se salvează captura de ecran..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Captura de ecran este în curs de salvare"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Captură de ecran salvată"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Atingeți pentru a vedea captura de ecran"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Captura de ecran nu a putut fi realizată"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Problemă întâmpinată la salvarea capturii de ecran"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Nu s-a putut salva captura de ecran"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Încercați să faceți din nou o captură de ecran"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Captura de ecran nu poate fi salvată din cauza spațiului de stocare limitat"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opțiuni pentru transferul de fișiere prin USB"</string>
@@ -277,8 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina cu dulciuri"</string>
<string name="start_dreams" msgid="5640361424498338327">"Economizor de ecran"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Atingeți lung pictogramele pentru mai multe opțiuni"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nu deranja"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Numai cu prioritate"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Numai alarme"</string>
@@ -354,7 +351,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activată la apus"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Până la răsărit"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activată la <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Până la <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Până la <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Serviciul NFC este dezactivat"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Serviciul NFC este activat"</string>
@@ -438,7 +435,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va începe să captureze tot ceea ce se afișează pe ecran."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nu se mai afișează"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ștergeți toate notificările"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Funcția Nu deranja ascunde notificările"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Gestionați notificările"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Funcția Nu deranja ascunde notificările"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Începeți acum"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Nicio notificare"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profilul poate fi monitorizat"</string>
@@ -544,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Atingeți pentru a seta pe vibrații."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Atingeți pentru a dezactiva sunetul."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Comenzi de volum pentru %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Apelurile și notificările vor suna"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Ieșire media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Ieșire apel telefonic"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nu s-a găsit niciun dispozitiv"</string>
@@ -633,6 +632,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"comenzile notificării"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opțiuni de amânare a notificării"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Amânați"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ANULAȚI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Amânată <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -698,6 +698,8 @@
<string name="battery" msgid="7498329822413202973">"Baterie"</string>
<string name="clock" msgid="7416090374234785905">"Ceas"</string>
<string name="headset" msgid="4534219457597457353">"Set căști-microfon"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Căștile sunt conectate"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Setul căști-microfon este conectat"</string>
<string name="data_saver" msgid="5037565123367048522">"Economizor de date"</string>
@@ -821,6 +823,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturi de ecran"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mesaje generale"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Stocare"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Indicii"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicații instantanee"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplicațiile instantanee nu necesită instalare."</string>
<string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string>
@@ -848,4 +851,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Permiteți <xliff:g id="APP">%1$s</xliff:g> să afișeze porțiuni din orice aplicație"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Permiteți"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Refuzați"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Atingeți pentru a programa Economisirea energiei"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Activați automat când bateria este la <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nu, mulțumesc"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"S-a activat programarea pentru Economisirea bateriei"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Economisirea bateriei se va activa automat imediat ce bateria scade sub <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Setări"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index b34144a..8b21901 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -35,17 +35,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Батарея почти разряжена"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батарея почти разряжена. Включите режим энергосбережения."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Осталось: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Заряд батареи – <xliff:g id="PERCENTAGE">%s</xliff:g>, осталось примерно <xliff:g id="TIME">%s</xliff:g> при текущем уровне использования."</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Заряд батареи – <xliff:g id="PERCENTAGE">%s</xliff:g>, осталось примерно <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Уровень заряда батареи: <xliff:g id="PERCENTAGE">%s</xliff:g>. Включен режим энергосбережения."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Невозможно выполнить зарядку через USB. Используйте зарядное устройство из комплекта."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Невозможно выполнить зарядку через USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Используйте зарядное устройство из комплекта."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Настройки"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Включить режим энергосбережения?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Включить"</string>
@@ -78,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Сохранение..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Сохранение..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Сохранение…"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Скриншот сохранен"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Нажмите, чтобы увидеть скриншот."</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ошибка при сохранении скриншота"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Не удалось сохранить скриншот."</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Не удалось сохранить скриншот"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Попробуйте сделать скриншот снова."</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Не удалось сохранить скриншот: недостаточно места."</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Не удалось сделать скриншот: нет разрешения от приложения или организации."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Параметры передачи через USB"</string>
@@ -153,7 +148,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Подключено"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Соединение."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3,5G"</string>
@@ -215,8 +209,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Режим полета включен."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Режим полета отключен."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Режим полета включен."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Режим \"Не беспокоить\" включен"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Не беспокоить, полная тишина."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Не беспокоить – только будильник."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Не беспокоить."</string>
@@ -284,7 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Коробка со сладостями"</string>
<string name="start_dreams" msgid="5640361424498338327">"Заставка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Чтобы открыть другие параметры, нажмите на значок и удерживайте его."</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Чтобы открыть другие параметры, нажмите на значок и удерживайте его"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не беспокоить"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Только важные"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Только будильник"</string>
@@ -361,7 +354,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Включить на закате"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До рассвета"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Включить в <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"До <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"Модуль NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Модуль NFC отключен"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Модуль NFC включен"</string>
@@ -445,8 +438,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Приложение <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> получит доступ к изображению на экране устройства."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Больше не показывать"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Очистить все"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Настроить уведомления"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"В режиме \"Не беспокоить\" уведомления не приходят"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Начать"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Нет уведомлений"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Действия в профиле могут отслеживаться"</string>
@@ -552,9 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Нажмите, чтобы включить вибрацию."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Нажмите, чтобы выключить звук."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s: регулировка громкости"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Для звонков и уведомлений включен вибросигнал."</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Для звонков и уведомлений отключен звук."</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Для звонков и уведомлений включен звук."</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Выход мультимедиа"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Выход телефонных вызовов"</string>
<string name="output_none_found" msgid="5544982839808921091">"Устройств не найдено"</string>
@@ -645,6 +637,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g>: <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"настройки уведомлений"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"параметры отсрочки уведомлений"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Отложить"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЕНИТЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -712,6 +705,8 @@
<string name="battery" msgid="7498329822413202973">"Батарея"</string>
<string name="clock" msgid="7416090374234785905">"Часы"</string>
<string name="headset" msgid="4534219457597457353">"Гарнитура"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Наушники подключены"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Гарнитура подключена"</string>
<string name="data_saver" msgid="5037565123367048522">"Экономия трафика"</string>
@@ -746,8 +741,9 @@
<string name="right_keycode" msgid="708447961000848163">"Код клавиши \"Вправо\""</string>
<string name="left_icon" msgid="3096287125959387541">"Значок \"Влево\""</string>
<string name="right_icon" msgid="3952104823293824311">"Значок \"Вправо\""</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Перетащите нужные элементы"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Перетащите нужные элементы"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Чтобы удалить, перетащите сюда"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Должно остаться не менее 6 элементов"</string>
<string name="qs_edit" msgid="2232596095725105230">"Изменить"</string>
<string name="tuner_time" msgid="6572217313285536011">"Время"</string>
<string-array name="clock_options">
@@ -834,6 +830,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Скриншоты"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Сообщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Подсказки"</string>
<string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string>
<string name="app_info" msgid="6856026610594615344">"О приложении"</string>
@@ -851,7 +848,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Заменить"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Приложения, работающие в фоновом режиме"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Нажмите, чтобы проверить энергопотребление и трафик"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Отключить мобильный Интернет?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Отключить мобильный Интернет?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"У вас не будет доступа к данным и Интернету через оператора \"<xliff:g id="CARRIER">%s</xliff:g>\". Вы сможете установить интернет-соединение только по сети Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ваш оператор"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Невозможно принять ваше согласие, поскольку запрос скрыт другим приложением."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Разрешить приложению \"<xliff:g id="APP_0">%1$s</xliff:g>\" показывать фрагменты приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– Ему станут доступны данные из приложения \"<xliff:g id="APP">%1$s</xliff:g>\"."</string>
@@ -859,4 +858,15 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Разрешить приложению \"<xliff:g id="APP">%1$s</xliff:g>\" показывать фрагменты других приложений"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Да"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Нет"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Нажмите, чтобы настроить режим энергосбережения"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Отмена"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Автоматический переход в режим энергосбережения включен"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Открыть настройки"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"ОК"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 74082e8..63b14d7 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දැනට පවතින"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"දැනුම්දීම්"</string>
<string name="battery_low_title" msgid="6456385927409742437">"බැටරිය අඩුය"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"බැටරිය අඩුයි. බැටරි සුරැකුම ක්රියාත්මක කරන්න"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ඉතිරිව තිබේ"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> ඉතිරිව ඇත, ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">%s</xliff:g> පමණ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> ඉතිරිව ඇත, <xliff:g id="TIME">%s</xliff:g> පමණ ඇත"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"තිර රුව"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"තිර රුව සුරකිමින්…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"තිර රුව සුරැකෙමින් පවතී…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"තිර රුව සුරකිමින් පවතී"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"තිර රුව සුරකින ලදී"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ඔබගේ තිර රුව බැලීමට තට්ටු කරන්න"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"තිර රුව ග්රහණය කිරීමට නොහැකි විය"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"තිර රුව සුරකින අතරතුර ගැටලුවක් ඇති විය"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"සීමිත ගබඩා ඉඩ නිසා තිර රුව සුරැකිය නොහැකිය"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"තිර රූ ගැනීමට යෙදුම හෝ ඔබගේ සංවිධානය ඉඩ නොදේ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ගොනු හුවමාරු විකල්ප"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"අතුරුපස අවස්තාව"</string>
<string name="start_dreams" msgid="5640361424498338327">"තිර සුරැකුම"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"තවත් විකල්ප සඳහා නිරූපක ස්පර්ශ කර අල්ලාගෙන සිටින්න"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"බාධා නොකරන්න"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ප්රමුඛතාව පමණයි"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"එලාම පමණි"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"හිරු බැසීමේදී ක්රි."</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"හිරු නගින තෙක්"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ට ක්රියාත්මකයි"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> තෙක්"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC අබලයි"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC සබලයි"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"ඔබගේ තීරයේ දර්ශනය වන සෑම දෙයම <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ලබාගැනීම ආරම්භ කරන ලදි."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"නැවත නොපෙන්වන්න"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"සියල්ල හිස් කරන්න"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"බාධා නොකරන්න දැනුම්දීම් සඟවමින්"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"බාධා නොකරන්න දැනුම්දීම් සඟවමින්"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"දැන් අරඹන්න"</string>
<string name="empty_shade_text" msgid="708135716272867002">"දැනුම්දීම් නැත"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ඇතැම් විට පැතිකඩ නිරීක්ෂණය කරන ලදි"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. කම්පනය කිරීමට සකස් කිරීමට තට්ටු කරන්න."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"හඬ පරිමා පාලන %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"ඇමතුම් සහ දැනුම්දීම් නාද වනු ඇත"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"මාධ්ය ප්රතිදානය"</string>
<string name="output_calls_title" msgid="8717692905017206161">"දුරකථන ඇමතුම් ප්රතිදානය"</string>
<string name="output_none_found" msgid="5544982839808921091">"උපාංග හමු නොවිණි"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"දැනුම්දීම් පාලන"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"දැනුම්දීම් මදක් නතර කිරීමේ විකල්ප"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"අස් කරන්න"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ක් මදක් නතර කරන ලදී"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"බැටරිය"</string>
<string name="clock" msgid="7416090374234785905">"ඔරලෝසුව"</string>
<string name="headset" msgid="4534219457597457353">"හෙඩ්සෙට්"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"හෙඩ්ෆෝන් සම්බන්ධ කළ"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"හෙඩ්සෙට් සම්බන්ධ කළ"</string>
<string name="data_saver" msgid="5037565123367048522">"දත්ත සුරැකුම"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"තිර රු"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"පොදු පණිවිඩ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ගබඩාව"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"ඉඟි"</string>
<string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string>
<string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"ඕනෑම යෙදුමකින් කොටස් පෙන්වීමට <xliff:g id="APP">%1$s</xliff:g> හට ඉඩ දෙන්න"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"ඉඩ දෙන්න"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ප්රතික්ෂේප කර."</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"බැටරි සුරැකුම කාලසටහන්ගත කිරීමට තට්ටු කරන්න"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"බැටරිය <xliff:g id="PERCENTAGE">%d</xliff:g>%% වූ විට ස්වයංක්රියව ක්රියාත්මක කරන්න"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"එපා ස්තූතියි"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"බැටරි සුරැකුම් කාලසටහන ක්රියාත්මකයි"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"බැටරිය <xliff:g id="PERCENTAGE">%d</xliff:g>%%ට වඩා අඩු වූ පසු බැටරි සුරැකුම ස්වයංක්රියව ක්රියාත්මක කරනු ඇත."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"සැකසීම්"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"තේරුණා"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 9b5fc1f..d2e9d3c 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -35,7 +35,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batéria je takmer vybitá"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batéria je takmer vybitá. Zapnite Šetrič batérie."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Zostáva <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Zostáva <xliff:g id="PERCENTAGE">%s</xliff:g>, približne <xliff:g id="TIME">%s</xliff:g> v závislosti od intenzity využitia"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Zostáva <xliff:g id="PERCENTAGE">%s</xliff:g>, približne <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -75,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Snímka obrazovky"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Prebieha ukladanie snímky obrazovky..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Prebieha ukladanie snímky obrazovky..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Ukladá sa snímka obrazovky"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Snímka obrazovky bola uložená"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Klepnutím zobrazíte snímku obrazovky"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Snímku obrazovky sa nepodarilo zachytiť"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Pri ukladaní snímky obrazovky sa vyskytol problém"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Snímku obrazovky sa nepodarilo uložiť"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Skúste snímku urobiť znova"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Snímka obrazovky sa nedá uložiť z dôvodu nedostatku miesta v úložisku"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti prenosu súborov USB"</string>
@@ -279,8 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Pult s dezertami"</string>
<string name="start_dreams" msgid="5640361424498338327">"Šetrič obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Pridržaním ikon zobrazíte ďalšie možnosti"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušiť"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Iba prioritné"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Iba budíky"</string>
@@ -357,7 +354,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Zapne sa pri západe slnka"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do východu slnka"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Zapne sa o <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je deaktivované"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je aktivované"</string>
@@ -441,7 +438,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikácia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávať všetok obsah zobrazený na vašej obrazovke."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nabudúce nezobrazovať"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Vymazať všetko"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Režim Nerušiť skrýva upozornenia"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Spravovať upozornenia"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Režim Nerušiť skrýva upozornenia"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Spustiť"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Žiadne upozornenia"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil môže byť monitorovaný"</string>
@@ -547,7 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrovanie."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Ovládacie prvky hlasitosti %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Hovory a upozornenia budú vyzváňať"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Výstup médií"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonického hovoru"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenašli sa žiadne zariadenia"</string>
@@ -638,6 +637,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ovládacie prvky pre upozornenia"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"možnosti stlmenia upozornení"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Stlmiť"</string>
<string name="snooze_undo" msgid="6074877317002985129">"SPÄŤ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Stlmené na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -705,6 +705,8 @@
<string name="battery" msgid="7498329822413202973">"Batéria"</string>
<string name="clock" msgid="7416090374234785905">"Hodiny"</string>
<string name="headset" msgid="4534219457597457353">"Náhlavná súprava"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slúchadlá pripojené"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Náhlavná súprava pripojená"</string>
<string name="data_saver" msgid="5037565123367048522">"Šetrič dát"</string>
@@ -828,6 +830,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snímky obrazovky"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Všeobecné správy"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Úložisko"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Tipy"</string>
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikácie"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikácie nevyžadujú inštaláciu."</string>
<string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string>
@@ -855,4 +858,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Povoliť aplikácii <xliff:g id="APP">%1$s</xliff:g> zobrazovať rezy z ľubovoľnej aplikácie"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Povoliť"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Zamietnuť"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Klepnutím naplánujete aktivovanie Šetriča batérie"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Zapnúť automaticky, keď batéria klesne pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nie, vďaka"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Plánované aktivovanie Šetriča batérie bolo zapnuté"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Keď batéria klesne pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%, automaticky sa aktivujte Šetrič batérie."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavenia"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Dobre"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e515e47..b983d96 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -35,7 +35,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Akumulator je skoraj izpraznjen"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Akumulator je skoraj izpraznjen. Vklopite varčevanje z energijo akumulatorja"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Še <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Še <xliff:g id="PERCENTAGE">%s</xliff:g>, glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Še <xliff:g id="PERCENTAGE">%s</xliff:g>, na voljo imate še približno <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -75,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Posnetek zaslona"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Shranjev. posnetka zaslona ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Shranjevanje posnetka zaslona ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Shranjevanje posnetka zaslona"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Posnetek zaslona je shranjen"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Dotaknite se, če si želite ogledati posnetek zaslona"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Posnetka zaslona ni bilo mogoče shraniti"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Pri shranjevanju posnetka zaslona je prišlo do težave"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Posnetka zaslona ni bilo mogoče shraniti"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Poskusite znova ustvariti posnetek zaslona"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Shranjevanje posnetka zaslona ni mogoče zaradi omejenega prostora za shranjevanje"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikacija ali vaša organizacija ne dovoljuje posnetkov zaslona"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti prenosa datotek prek USB-ja"</string>
@@ -279,8 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina za sladice"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ohranjeval. zaslona"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Pridržite ikone, če si želite ogledati več možnosti"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne moti"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prednostno"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -357,7 +354,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ob sončnem zahodu"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do sončnega vzhoda"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Vklop ob <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Tehnologija NFC je onemogočena"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Tehnologija NFC je omogočena"</string>
@@ -441,7 +438,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bo začela zajemati vse, kar je prikazano na zaslonu."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Tega ne prikaži več"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši vse"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Način »ne moti« skriva obvestila"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Upravljanje obvestil"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Način »ne moti« skriva obvestila"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Začni zdaj"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ni obvestil"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil je morda nadziran"</string>
@@ -547,7 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dotaknite se, če želite nastaviti vibriranje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dotaknite se, če želite izklopiti zvok."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Kontrolniki glasnosti za %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Zvonjenje bo vklopljeno za klice in obvestila"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Izhod predstavnosti"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izhod telefonskih klicev"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ni naprav"</string>
@@ -638,6 +637,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrolniki obvestil"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"možnosti preložitve obvestil"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Preloži"</string>
<string name="snooze_undo" msgid="6074877317002985129">"RAZVELJAVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Preloženo za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -705,6 +705,8 @@
<string name="battery" msgid="7498329822413202973">"Akumulator"</string>
<string name="clock" msgid="7416090374234785905">"Ura"</string>
<string name="headset" msgid="4534219457597457353">"Slušalke z mikrofonom"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Slušalke priključene"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Slušalke z mikrofonom priključene"</string>
<string name="data_saver" msgid="5037565123367048522">"Varčevanje s podatki"</string>
@@ -828,6 +830,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Posnetki zaslona"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Splošna sporočila"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Shramba"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Namigi"</string>
<string name="instant_apps" msgid="6647570248119804907">"Nenamestljive aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Nenamestljivih aplikacij ni treba namestiti."</string>
<string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
@@ -855,4 +858,15 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Dovoli, da aplikacija <xliff:g id="APP">%1$s</xliff:g> prikaže izreze iz poljubne aplikacije"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Dovoli"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Zavrni"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Dotaknite se za načrtovanje varčevanja z energijo akumulatorja"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, hvala"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Urnik varčevanja z energijo akumulatorja je vklopljen"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavitve"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"V redu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index ce3ef80..5519a27 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Në vazhdim"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Njoftimet"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Niveli i baterisë është i ulët"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Niveli i baterisë është i ulët. Aktivizo \"Kursyesin e baterisë\""</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Ka mbetur edhe <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> të mbetura, rreth <xliff:g id="TIME">%s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> të mbetura, rreth <xliff:g id="TIME">%s</xliff:g> të mbetura"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Pamja e ekranit"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Po ruan pamjen e ekranit..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Po ruan pamjen e ekranit…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Pamja e ekranit po ruhet"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Pamja e ekranit u ruajt"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Trokit për të parë pamjen e ekranit"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Pamja e ekranit nuk mund të regjistrohej"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"U ndesh një problem gjatë ruajtjes së pamjes së ekranit"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Pamja e ekranit nuk mund të ruhej"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Provo ta nxjerrësh përsëri pamjen e ekranit"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Pamja e ekranit nuk mund të ruhet për shkak të hapësirës ruajtëse të kufizuar"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opsionet e transferimit të dosjeve të USB-së"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"\"Kutia e ëmbëlsirës\""</string>
<string name="start_dreams" msgid="5640361424498338327">"Mbrojtësi i ekranit"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Trokit dhe mbaj prekur ikonat për më shumë opsione"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mos shqetëso"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vetëm me prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vetëm alarmet"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Në perëndim të diellit"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Deri në lindje të diellit"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktive në <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC është çaktivizuar"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC është aktivizuar"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> do të fillojë të regjistrojë çdo gjë që shfaqet në ekran."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Mos e shfaq sërish"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Pastroji të gjitha"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Modaliteti \"Mos shqetëso\" po fsheh njoftimet"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Menaxho njoftimet"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Modaliteti \"Mos shqetëso\" po fsheh njoftimet"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Fillo tani"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Asnjë njoftim"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profili mund të monitorohet"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trokit për ta vendosur në dridhje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trokit për ta çaktivizuar."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Kontrollet e volumit %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Do të bjerë zilja për telefonatat dhe njoftimet"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Dalja e pajisjes"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Dalja e telefonatës"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nuk u gjet asnjë pajisje"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrollet e njoftimit"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"opsionet e shtyrjes së njoftimit"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Shty alarmin"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ZHBËJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"U shty për <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Bateria"</string>
<string name="clock" msgid="7416090374234785905">"Ora"</string>
<string name="headset" msgid="4534219457597457353">"Kufjet me mikrofon"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Kufjet u lidhën"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Kufjet me mikrofon u lidhën"</string>
<string name="data_saver" msgid="5037565123367048522">"Kursyesi i të dhënave"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Pamjet e ekranit"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mesazhe të përgjithshme"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Hapësira ruajtëse"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Sugjerimet"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikacionet e çastit"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacionet e çastit nuk kërkojnë instalim."</string>
<string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Lejo <xliff:g id="APP">%1$s</xliff:g> për të shfaqur pjesë nga çdo aplikacion"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Lejo"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Refuzo"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Trokit për të planifikuar \"Kursyesin e baterisë\""</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktivizo automatikisht kur bateria është në <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Jo"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Planifikimi i \"Kursyesit të baterisë\" është aktivizuar"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"\"Kursyesi i baterisë\" do të aktivizohet automatikisht kur bateria të jetë nën <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Cilësimet"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"E kuptova"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 8e36119..dd35850 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -34,17 +34,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Ниво напуњености батерије је низак"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Батерија је скоро празна. Укључите Уштеду батерије"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Још <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Још <xliff:g id="PERCENTAGE">%s</xliff:g>, на основу коришћења остало је око <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Још <xliff:g id="PERCENTAGE">%s</xliff:g>, остало је око <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Још <xliff:g id="PERCENTAGE">%s</xliff:g>. Уштеда батерије је укључена."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Пуњење преко USB-а није успело. Користите пуњач који сте добили уз уређај."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Пуњење преко USB-а није успело"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Користите пуњач који сте добили уз уређај"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Подешавања"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Желите ли да укључите Уштеду батерије?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Укључи"</string>
@@ -77,11 +73,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Снимак екрана"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Чување снимка екрана..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Чување снимка екрана..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Снимак екрана се чува"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Снимак екрана је сачуван"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Додирните да бисте видели снимак екрана"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Не можете да направите снимак екрана"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Дошло је до проблема при чувању снимка екрана"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Чување снимка екрана није успело"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Пробајте да поново направите снимак екрана"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Чување снимка екрана није успело због ограниченог меморијског простора"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Апликација или организација не дозвољавају прављење снимака екрана"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Опције USB преноса датотека"</string>
@@ -152,7 +147,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Повезано је."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Повезивање."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -212,8 +206,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Режим рада у авиону је укључен."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Режим рада у авиону је искључен."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Режим рада у авиону је укључен."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Режим Не узнемиравај је укључен."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Подешавање Не узнемиравај је укључено, потпуна тишина."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Подешавање Не узнемиравај је укључено, само аларми."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Не узнемиравај."</string>
@@ -280,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Витрина са посластицама"</string>
<string name="start_dreams" msgid="5640361424498338327">"Чувар екрана"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Притисните и задржите иконе за још опција"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Додирните и задржите иконе за још опција"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не узнемиравај"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетни прекиди"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string>
@@ -356,7 +349,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Укључује се по заласку сунца"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изласка сунца"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Укључује се у <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"До <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC је онемогућен"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC је омогућен"</string>
@@ -440,8 +433,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ће почети да снима све што се приказује на екрану."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не приказуј поново"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Обриши све"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Управљајте обавештењима"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Режим Не узнемиравај крије обавештења"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Започни одмах"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Нема обавештења"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профил се можда надгледа"</string>
@@ -547,9 +540,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Додирните да бисте подесили на вибрацију."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Додирните да бисте искључили звук."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Контроле за јачину звука за %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Вибрација за позиве и обавештења је укључена"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Мелодија звона за позиве и обавештење је искључена"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Мелодија звона за позиве и обавештења је укључена"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Излаз медија"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Излаз за телефонски позив"</string>
<string name="output_none_found" msgid="5544982839808921091">"Није пронађен ниједан уређај"</string>
@@ -638,6 +630,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"контроле обавештења"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"опције за одлагање обавештења"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Одложи"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ОПОЗОВИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено је за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -703,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Батерија"</string>
<string name="clock" msgid="7416090374234785905">"Сат"</string>
<string name="headset" msgid="4534219457597457353">"Наглавне слушалице"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Слушалице су повезане"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Наглавне слушалице су повезане"</string>
<string name="data_saver" msgid="5037565123367048522">"Уштеда података"</string>
@@ -737,8 +732,9 @@
<string name="right_keycode" msgid="708447961000848163">"Десно дугме за кôд тастера"</string>
<string name="left_icon" msgid="3096287125959387541">"Лева икона"</string>
<string name="right_icon" msgid="3952104823293824311">"Десна икона"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Превуците да бисте додали плочице"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Задржите и превуците да бисте додали плочице"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Превуците овде да бисте уклонили"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Треба да изаберете најмање 6 плочица"</string>
<string name="qs_edit" msgid="2232596095725105230">"Измени"</string>
<string name="tuner_time" msgid="6572217313285536011">"Време"</string>
<string-array name="clock_options">
@@ -825,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Снимци екрана"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Опште поруке"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Меморијски простор"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Савети"</string>
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string>
<string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string>
@@ -842,7 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замени"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Апликације покренуте у позадини"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Додирните за детаље о батерији и потрошњи података"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Желите да онемогућите мобилне податке?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Желите ли да искључите мобилне податке?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Нећете имати приступ подацима или интернету преко мобилног оператера <xliff:g id="CARRIER">%s</xliff:g>. Интернет ће бити доступан само преко Wi-Fi везе."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"мобилни оператер"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Подешавања не могу да верификују ваш одговор јер апликација скрива захтев за дозволу."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Желите ли да дозволите апликацији <xliff:g id="APP_0">%1$s</xliff:g> да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"– Може да чита податке из апликације <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -850,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Дозволите апликацији <xliff:g id="APP">%1$s</xliff:g> да приказује исечке из било које апликације"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Дозволи"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Одбиј"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Додирните да бисте направили распоред за уштеду батерије"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Укључује се аутоматски када је батерија на <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Не, хвала"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Распоред за уштеду батерије је укључен"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Уштеда батерије ће се аутоматски укључивати када батерија падне испод <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Подешавања"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Важи"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index bf08031..e1fb706 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Aviseringar"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Lågt batteri"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batterinivån är låg. Aktivera batterisparläge"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> kvar"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> återstår, cirka <xliff:g id="TIME">%s</xliff:g> kvar utifrån din användning"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> återstår, cirka <xliff:g id="TIME">%s</xliff:g> kvar"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skärmdump"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skärmdumpen sparas ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Skärmdumpen sparas ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Skärmdumpen sparas"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skärmdumpen har sparats"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Visa skärmdumpen genom att trycka här"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Det gick inte att ta en skärmdump"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Det gick inte att spara skärmdumpen"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller organisationen tillåter inte att du tar skärmdumpar"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Överföringsalternativ"</string>
@@ -348,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På från solnedgången"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Till soluppgången"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På från <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Till <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC är inaktiverat"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC är aktiverat"</string>
@@ -432,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar en bild av allt som visas på skärmen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Visa inte igen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Rensa alla"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Aviseringar döljs av Stör ej"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Aviseringar döljs av Stör ej"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Starta nu"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Inga aviseringar"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Det kan hända att profilen övervakas"</string>
@@ -538,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryck här om du vill aktivera vibrationsläget."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryck här om du vill stänga av ljudet."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Volymkontroller för %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Ljudet sätts på för samtal och aviseringar"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medieuppspelning"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Utdata för samtal"</string>
<string name="output_none_found" msgid="5544982839808921091">"Inga enheter hittades"</string>
@@ -625,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"inställningar för aviseringar"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"alternativ för att snooza aviseringar"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ÅNGRA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozad i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Batteri"</string>
<string name="clock" msgid="7416090374234785905">"Klocka"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Hörlurar anslutna"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Headset anslutet"</string>
<string name="data_saver" msgid="5037565123367048522">"Databesparing"</string>
@@ -811,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skärmdumpar"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Allmänna meddelanden"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Tips"</string>
<string name="instant_apps" msgid="6647570248119804907">"Snabbappar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
@@ -838,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Tillåt att bitar av vilken app som helst visas i <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Tillåt"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Neka"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Tryck för att skapa ett schema för batterisparläget"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Aktivera automatiskt när batterinivån är på <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Nej tack"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Schema för Batterisparläge aktiverat"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batterisparläget aktiveras automatiskt när batterinivån är under <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Inställningar"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 4cfa448..570234e 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Inaendelea"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Arifa"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Betri inaisha"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Chaji imepungua. Washa Kiokoa Betri"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Imebakisha <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Imesalia <xliff:g id="PERCENTAGE">%s</xliff:g>, itadumu takribani <xliff:g id="TIME">%s</xliff:g> kulingana na jinsi unavyotumia"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Imesalia <xliff:g id="PERCENTAGE">%s</xliff:g>, itadumu takribani <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Picha ya skrini"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Inahifadhi picha ya skrini..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Inahifadhi picha ya skrini..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Inahifadhi picha ya skrini"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Imehifadhi picha ya skrini"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Gusa ili utazame picha ya skrini uliyohifadhi"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Imeshindwa kupiga picha ya skrini"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Hitilafu imetokea wakati wa kuhifadhi picha ya skrini"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Imeshindwa kuhifadhi picha ya skrini"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Jaribu kupiga picha ya skrini tena"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Imeshindwa kuhifadhi picha ya skrini kwa sababu nafasi haitoshi"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Programu au shirika lako halikuruhusu kupiga picha za skrini"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Machaguo ya uhamisho wa faili la USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Sanduku la Vitindamlo"</string>
<string name="start_dreams" msgid="5640361424498338327">"Taswira ya skrini"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Gusa na ushikilie aikoni ili upate chaguo zaidi"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Usinisumbue"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kipaumbele tu"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kengele pekee"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Itawashwa machweo"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hadi macheo"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Itawashwa saa <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Hadi <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hadi <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC imezimwa"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC imewashwa"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> itaanza kupiga picha kila kitu kinachoonyeshwa kwenye skrini yako."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Usionyeshe tena"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Futa zote"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Kipengele cha Usinisumbue kinaficha arifa"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Dhibiti arifa"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Kipengele cha Usinisumbue kinaficha arifa"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Anza sasa"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Hakuna arifa"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Huenda wasifu ukafuatiliwa"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Gusa ili uweke mtetemo."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Gusa ili usitishe."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Vidhibiti %s vya sauti"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Itatoa mlio arifa ikitumwa au simu ikipigwa"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Vifaa vya kutoa maudhui"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Vifaa vya kutoa sauti ya simu"</string>
<string name="output_none_found" msgid="5544982839808921091">"Hakuna vifaa vilivyopatikana"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"vidhibiti vya arifa"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"chaguo za kuahirisha arifa"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Ahirisha"</string>
<string name="snooze_undo" msgid="6074877317002985129">"TENDUA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Imeahirishwa kwa <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Betri"</string>
<string name="clock" msgid="7416090374234785905">"Saa"</string>
<string name="headset" msgid="4534219457597457353">"Vifaa vya sauti"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Imeunganisha spika za masikioni"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Imeunganisha vifaa vya sauti"</string>
<string name="data_saver" msgid="5037565123367048522">"Kiokoa Data"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Picha za skrini"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Ujumbe wa Jumla"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Hifadhi"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Vidokezo"</string>
<string name="instant_apps" msgid="6647570248119804907">"Programu Zinazofunguka Papo Hapo"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Huhitaji kusakinisha programu zinazofunguka papo hapo."</string>
<string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Ruhusu <xliff:g id="APP">%1$s</xliff:g> ionyeshe vipengee kutoka programu yoyote"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Ruhusu"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Kataa"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Gusa ili uratibu wakati wa kuwasha Kiokoa Betri"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Weka kiokoa betri kiwake kiotomatiki wakati chaji ya betri imefika <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Hapana, asante"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Imewasha Kiokoa Betri kilichoratibiwa"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Kiokoa Betri kitawaka kiotomatiki baada ya chaji ya betri kufika chini ya <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Mipangilio"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Nimeelewa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml
index 67dabdb..f91af03 100644
--- a/packages/SystemUI/res/values-sw600dp/config.xml
+++ b/packages/SystemUI/res/values-sw600dp/config.xml
@@ -35,4 +35,7 @@
<!-- Animation duration when using long press on recents to dock -->
<integer name="long_press_dock_anim_duration">290</integer>
+ <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+ <integer name="navigation_bar_deadzone_orientation">0</integer>
+
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 39bba21..419c288 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"செயலில் இருக்கும்"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"அறிவிப்புகள்"</string>
<string name="battery_low_title" msgid="6456385927409742437">"பேட்டரி குறைவு"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"பேட்டரி குறைவாக உள்ளது. பேட்டரி சேமிப்பானை ஆன் செய்யவும்"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> உள்ளது"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> பேட்டரி மீதமுள்ளது. உங்கள் உபயோகத்தைப் பொறுத்து, இதைச் சுமார் <xliff:g id="TIME">%s</xliff:g> மணி நேரத்திற்குப் பயன்படுத்தலாம்"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> மீதமுள்ளது, இதைச் சுமார் <xliff:g id="TIME">%s</xliff:g> மணி நேரத்திற்குப் பயன்படுத்தலாம்"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ஸ்கிரீன் ஷாட்"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"ஸ்கிரீன் ஷாட் சேமிக்கப்படுகிறது"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"ஸ்கிரீன் ஷாட் சேமிக்கப்பட்டது"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"ஸ்கிரீன்ஷாட்டைப் பார்க்க, தட்டவும்"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"ஸ்கிரீன் ஷாட் எடுக்க முடியவில்லை"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"ஸ்கிரீன்ஷாட்டைச் சேமிப்பதில் சிக்கல் ஏற்பட்டது"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, பயன்பாடு அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB கோப்பு இடமாற்ற விருப்பங்கள்"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string>
<string name="start_dreams" msgid="5640361424498338327">"ஸ்கிரீன் சேவர்"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"மேலும் விருப்பங்களைக் காண, ஐகான்களைத் தொட்டுப் பிடிக்கவும்"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்யாதே"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"முதன்மை மட்டும்"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"அலாரங்கள் மட்டும்"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"மாலையில் ஆன் செய்"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"சூரிய உதயம் வரை"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>க்கு ஆன் செய்"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> மணி வரை"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC முடக்கப்பட்டது"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC இயக்கப்பட்டது"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"திரையில் காட்டப்படும் அனைத்தையும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> படமெடுக்கும்."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"மீண்டும் காட்டாதே"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"எல்லாவற்றையும் அழி"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'தொந்தரவு செய்ய வேண்டாம்\' பயன்முறையானது அறிவிப்புகளைக் காட்டாமல் மறைக்கிறது"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"இப்போது தொடங்கு"</string>
<string name="empty_shade_text" msgid="708135716272867002">"அறிவிப்புகள் இல்லை"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"சுயவிவரம் கண்காணிக்கப்படலாம்"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும்."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ஒலியடக்க, தட்டவும்."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ஒலியளவுக் கட்டுப்பாடுகள்"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியெழுப்பும்"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"மீடியா வெளியீடு"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ஃபோன் அழைப்பு வெளியீடு"</string>
<string name="output_none_found" msgid="5544982839808921091">"சாதனங்கள் எதுவும் இல்லை"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"அறிவிப்புக் கட்டுப்பாடுகள்"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"அறிவிப்பை உறக்கநிலையாக்கும் விருப்பங்கள்"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"செயல்தவிர்"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"உறக்கநிலையில் வைத்திருந்த நேரம்: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"பேட்டரி"</string>
<string name="clock" msgid="7416090374234785905">"கடிகாரம்"</string>
<string name="headset" msgid="4534219457597457353">"ஹெட்செட்"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ஹெட்ஃபோன்கள் இணைக்கப்பட்டன"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ஹெட்செட் இணைக்கப்பட்டது"</string>
<string name="data_saver" msgid="5037565123367048522">"டேட்டா சேமிப்பான்"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"வலப்புற விசைக்குறியீடு"</string>
<string name="left_icon" msgid="3096287125959387541">"இடப்புற ஐகான்"</string>
<string name="right_icon" msgid="3952104823293824311">"வலப்புற ஐகான்"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"கட்டங்களைச் சேர்க்க, அவற்றைப் பிடித்து இழுக்கவும்"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"அகற்ற, இங்கே இழுக்கவும்"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"குறைந்தது 6 கட்டங்கள் தேவை"</string>
<string name="qs_edit" msgid="2232596095725105230">"மாற்று"</string>
<string name="tuner_time" msgid="6572217313285536011">"நேரம்"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ஸ்கிரீன் ஷாட்டுகள்"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"பொதுச் செய்திகள்"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"சேமிப்பிடம்"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் பயன்பாடுகள்"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string>
<string name="app_info" msgid="6856026610594615344">"ஆப்ஸ் தகவல்"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"மாற்று"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"பின்னணியில் இயங்கும் பயன்பாடுகள்"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"பேட்டரி மற்றும் தரவு உபயோக விவரங்களைக் காண, தட்டவும்"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"மொபைல் டேட்டாவை ஆஃப் செய்யவா?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> மொபைல் நிறுவனத்தின் மூலம் டேட்டா அல்லது இணையத்தை உங்களால் பயன்படுத்த முடியாது. வைஃபை வழியாக மட்டுமே இணையத்தைப் பயன்படுத்த முடியும்."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"உங்கள் மொபைல் நிறுவனம்"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"அனுமதிக் கோரிக்கையைப் பயன்பாடு மறைப்பதால், அமைப்புகளால் உங்கள் பதிலைச் சரிபார்க்க முடியாது."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> பயன்பாட்டை, <xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க அனுமதிக்கவா?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- இது, <xliff:g id="APP">%1$s</xliff:g> பயன்பாட்டிலிருந்து தகவலைப் படிக்கும்"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"எல்லா பயன்பாட்டிலிருந்தும் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP">%1$s</xliff:g> பயன்பாட்டை அனுமதி"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"அனுமதி"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"நிராகரி"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 5c9fec6..5f71c99 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"కొనసాగుతున్నవి"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"నోటిఫికేషన్లు"</string>
<string name="battery_low_title" msgid="6456385927409742437">"బ్యాటరీ తక్కువగా ఉంది"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"బ్యాటరీ తక్కువగా ఉంది. బ్యాటరీ సేవర్ని ఆన్ చేయండి"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది, మీ ఉపయోగం ఆధారంగా దాదాపు <xliff:g id="TIME">%s</xliff:g> ఉండవచ్చు"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది, దాదాపు <xliff:g id="TIME">%s</xliff:g> ఉండవచ్చు"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"స్క్రీన్షాట్"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"స్క్రీన్షాట్ సేవ్ చేయబడుతోంది"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"స్క్రీన్షాట్ సేవ్ చేయబడింది"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"మీ స్క్రీన్షాట్ను వీక్షించడానికి నొక్కండి"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"స్క్రీన్షాట్ను క్యాప్చర్ చేయడం సాధ్యపడలేదు"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"స్క్రీన్షాట్ని సేవ్ చేస్తున్నప్పుడు సమస్య ఏర్పడింది"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"స్క్రీన్షాట్ని సేవ్ చేయడం సాధ్యం కాలేదు"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"స్క్రీన్షాట్ తీయడానికి మళ్లీ ప్రయత్నించండి"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"నిల్వ స్థలం పరిమితంగా ఉన్న కారణంగా స్క్రీన్షాట్ను సేవ్ చేయడం సాధ్యపడదు"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"స్క్రీన్షాట్లు తీయడానికి యాప్ లేదా మీ సంస్థ అనుమతించలేదు"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ఫైల్ బదిలీ ఎంపికలు"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"డెజర్ట్ కేస్"</string>
<string name="start_dreams" msgid="5640361424498338327">"స్క్రీన్ సేవర్"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ఈథర్నెట్"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"మరిన్ని ఎంపికల కోసం చిహ్నాలను నొక్కి, పట్టుకోండి"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"అంతరాయం కలిగించవద్దు"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ప్రాధాన్యత మాత్రమే"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"అలారాలు మాత్రమే"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"సూర్యాస్తమయానికి"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"సూర్యోదయం వరకు"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>కి"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC నిలిపివేయబడింది"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ప్రారంభించబడింది"</string>
@@ -433,7 +430,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> మీ స్క్రీన్పై కనిపించే ప్రతిదాన్ని క్యాప్చర్ చేయడం ప్రారంభిస్తుంది."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"మళ్లీ చూపవద్దు"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"అన్నీ క్లియర్ చేయండి"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"అంతరాయం కలిగించవద్దు నోటిఫికేషన్లను దాస్తుంది"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"నోటిఫికేషన్లను నిర్వహించండి"</string>
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ఇప్పుడే ప్రారంభించు"</string>
<string name="empty_shade_text" msgid="708135716272867002">"నోటిఫికేషన్లు లేవు"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"ప్రొఫైల్ని పర్యవేక్షించవచ్చు"</string>
@@ -539,7 +538,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. వైబ్రేట్ అయ్యేలా సెట్ చేయడం కోసం నొక్కండి."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. మ్యూట్ చేయడానికి నొక్కండి."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s వాల్యూమ్ నియంత్రణలు"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"కాల్లు మరియు నోటిఫికేషన్లు రింగ్ అవుతాయి"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"మీడియా అవుట్పుట్"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ఫోన్ కాల్ అవుట్పుట్"</string>
<string name="output_none_found" msgid="5544982839808921091">"పరికరాలు ఏవీ కనుగొనబడలేదు"</string>
@@ -626,6 +626,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"నోటిఫికేషన్ నియంత్రణలు"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"నోటిఫికేషన్ తాత్కాలిక ఆపివేత ఎంపికలు"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"తాత్కాలికంగా ఆపివేయి"</string>
<string name="snooze_undo" msgid="6074877317002985129">"చర్య రద్దు చేయి"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> వరకు తాత్కాలికంగా ఆపివేయబడింది"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +690,8 @@
<string name="battery" msgid="7498329822413202973">"బ్యాటరీ"</string>
<string name="clock" msgid="7416090374234785905">"గడియారం"</string>
<string name="headset" msgid="4534219457597457353">"హెడ్సెట్"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"హెడ్ఫోన్లు కనెక్ట్ చేయబడ్డాయి"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"హెడ్సెట్ కనెక్ట్ చేయబడింది"</string>
<string name="data_saver" msgid="5037565123367048522">"డేటా సేవర్"</string>
@@ -723,11 +726,9 @@
<string name="right_keycode" msgid="708447961000848163">"కుడివైపు ఉన్న కీకోడ్"</string>
<string name="left_icon" msgid="3096287125959387541">"ఎడమ వైపు చిహ్నం"</string>
<string name="right_icon" msgid="3952104823293824311">"కుడివైపు ఉన్న చిహ్నం"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"టైల్లను జోడించడం కోసం పట్టుకుని, లాగండి"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"తీసివేయడానికి ఇక్కడికి లాగండి"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"మీ వద్ద కనీసం 6 టైల్లు ఉండాలి"</string>
<string name="qs_edit" msgid="2232596095725105230">"సవరించు"</string>
<string name="tuner_time" msgid="6572217313285536011">"సమయం"</string>
<string-array name="clock_options">
@@ -814,6 +815,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"స్క్రీన్షాట్లు"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"సాధారణ సందేశాలు"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"నిల్వ"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"తక్షణ అనువర్తనాలు"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string>
<string name="app_info" msgid="6856026610594615344">"యాప్ సమాచారం"</string>
@@ -831,12 +834,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"భర్తీ చేయి"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"నేపథ్యంలో అమలు అవుతున్న ఆప్లు"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"బ్యాటరీ మరియు డేటా వినియోగ వివరాల కోసం నొక్కండి"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"మొబైల్ డేటాని ఆఫ్ చేయాలా?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"మీకు <xliff:g id="CARRIER">%s</xliff:g> ద్వారా డేటా లేదా ఇంటర్నెట్కు యాక్సెస్ ఉండదు. Wi-Fi ద్వారా మాత్రమే ఇంటర్నెట్ అందుబాటులో ఉంటుంది."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"మీ క్యారియర్"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"అనుమతి అభ్యర్థనకు ఒక యాప్ అడ్డు తగులుతున్నందున సెట్టింగ్లు మీ ప్రతిస్పందనను ధృవీకరించలేకపోయాయి."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించడానికి <xliff:g id="APP_0">%1$s</xliff:g>ని అనుమతించండి?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- ఇది <xliff:g id="APP">%1$s</xliff:g> నుండి సమాచారాన్ని చదువుతుంది"</string>
@@ -844,4 +844,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"ఏ యాప్ నుండి అయినా స్లైస్లను చూపించడానికి <xliff:g id="APP">%1$s</xliff:g>ని అనుమతించండి"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"అనుమతించు"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"తిరస్కరించు"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index d3aa426..6794a09 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
<string name="battery_low_title" msgid="6456385927409742437">"แบตเตอรี่เหลือน้อย"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"แบตเตอรี่เหลือน้อย โปรดเปิดโหมดประหยัดแบตเตอรี่"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"เหลืออีก <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"เหลือ <xliff:g id="PERCENTAGE">%s</xliff:g> หรืออีกราว <xliff:g id="TIME">%s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"เหลือ <xliff:g id="PERCENTAGE">%s</xliff:g> หรืออีกราว <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"ภาพหน้าจอ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"กำลังบันทึกภาพหน้าจอ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"กำลังบันทึกภาพหน้าจอ..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"กำลังบันทึกภาพหน้าจอ"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"บันทึกภาพหน้าจอแล้ว"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"แตะเพื่อดูภาพหน้าจอ"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"จับภาพหน้าจอไม่ได้"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"พบปัญหาขณะบันทึกภาพหน้าจอ"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"บันทึกภาพหน้าจอไม่ได้"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ลองถ่ายภาพหน้าจออีกครั้ง"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"บันทึกภาพหน้าจอไม่ได้เนื่องจากพื้นที่เก็บข้อมูลมีจำกัด"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"ตัวเลือกการถ่ายโอนไฟล์ USB"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ชั้นแสดงของหวาน"</string>
<string name="start_dreams" msgid="5640361424498338327">"โปรแกรมรักษาหน้าจอ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"อีเทอร์เน็ต"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"แตะไอคอนค้างไว้เพื่อดูตัวเลือกอื่นๆ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ห้ามรบกวน"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"เฉพาะเรื่องสำคัญ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"เฉพาะปลุกเท่านั้น"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"เปิดตอนพระอาทิตย์ตก"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"จนพระอาทิตย์ขึ้น"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"เปิดเวลา <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"จนถึง <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"จนถึง <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ถูกปิดใช้งาน"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"เปิดใช้งาน NFC แล้ว"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> จะเริ่มจับภาพทุกอย่างที่แสดงบนหน้าจอ"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ไม่ต้องแสดงข้อความนี้อีก"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ล้างทั้งหมด"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"โหมดห้ามรบกวนซ่อนการแจ้งเตือนอยู่"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"จัดการการแจ้งเตือน"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"โหมดห้ามรบกวนซ่อนการแจ้งเตือนอยู่"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"เริ่มเลย"</string>
<string name="empty_shade_text" msgid="708135716272867002">"ไม่มีการแจ้งเตือน"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"อาจมีการตรวจสอบโปรไฟล์"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s แตะเพื่อตั้งค่าให้สั่น"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s แตะเพื่อปิดเสียง"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"ตัวควบคุมระดับเสียง %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"สายเรียกเข้าและการแจ้งเตือนจะส่งเสียง"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"เอาต์พุตสื่อ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"เอาต์พุตการโทรออก"</string>
<string name="output_none_found" msgid="5544982839808921091">"ไม่พบอุปกรณ์"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"ส่วนควบคุมการแจ้งเตือน"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"ตัวเลือกการปิดเสียงแจ้งเตือนชั่วคราว"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ปิดเสียงเตือนชั่วคราว"</string>
<string name="snooze_undo" msgid="6074877317002985129">"เลิกทำ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ปิดเสียงเตือนชั่วคราวไว้เป็นเวลา <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"แบตเตอรี่"</string>
<string name="clock" msgid="7416090374234785905">"นาฬิกา"</string>
<string name="headset" msgid="4534219457597457353">"ชุดหูฟัง"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"เชื่อมต่อหูฟังแล้ว"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"เชื่อมต่อชุดหูฟังแล้ว"</string>
<string name="data_saver" msgid="5037565123367048522">"โปรแกรมประหยัดอินเทอร์เน็ต"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"ภาพหน้าจอ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ข้อความทั่วไป"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"พื้นที่เก็บข้อมูล"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"คำแนะนำ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant App"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps ไม่ต้องใช้การติดตั้ง"</string>
<string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"อนุญาตให้ <xliff:g id="APP">%1$s</xliff:g> แสดงส่วนต่างๆ จากแอปใดก็ได้"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"อนุญาต"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"ปฏิเสธ"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"แตะเพื่อตั้งเวลาโหมดประหยัดแบตเตอรี่"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"เปิดโดยอัตโนมัติเมื่อแบตเตอรี่เหลือ <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"ไม่เป็นไร"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"เปิดใช้กำหนดเวลาโหมดประหยัดแบตเตอรี่อยู่"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"โหมดประหยัดแบตเตอรี่จะเปิดโดยอัตโนมัติเมื่อแบตเตอรี่เหลือไม่ถึง <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"การตั้งค่า"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"รับทราบ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ea73df8..f812956 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Mahina na ang baterya"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Paubos na ang baterya. I-on ang Pangtipid sa Baterya"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> na lang ang natitira"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> na lang ang natitira, humigit-kumulang <xliff:g id="TIME">%s</xliff:g> ang natitira batay sa iyong paggamit"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> na lang ang natitira, humigit-kumulang <xliff:g id="TIME">%s</xliff:g> ang natitira"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> na lang ang natitira. Naka-on ang Pangtipid sa Baterya."</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"Hindi makapag-charge sa pamamagitan ng USB. Gamitin ang charger na kasama ng iyong device."</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"Hindi makapag-charge sa pamamagitan ng USB"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"Gamitin ang charger na kasama ng iyong device"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Mga Setting"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"I-on ang Pangtipid sa Baterya?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"I-on"</string>
@@ -76,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Sine-save ang screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Sine-save ang screenshot…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Sine-save ang screenshot"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Na-save ang screenshot"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"I-tap upang tingnan ang iyong screenshot"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Hindi makunan ng screenshot"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Nagkaproblema habang sine-save ang screenshot"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Hindi ma-save ang screenshot"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Subukang kumuhang muli ng screenshot"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Hindi ma-save ang screenshot dahil sa limitadong espasyo ng storage"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Hindi pinahihintulutan ng app o ng iyong organisasyon ang pagkuha ng mga screenshot"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opsyon paglipat ng USB file"</string>
@@ -151,7 +146,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Nakakonekta."</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Kumokonekta."</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -211,8 +205,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Naka-on ang Airplane mode."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Na-off ang Airplane mode."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Na-on ang Airplane mode."</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"Naka-on ang huwag istorbohin."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Naka-on ang huwag gambalain, ganap na katahimikan."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Naka-on ang huwag istorbohin, mga alarm lang."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Huwag istorbohin."</string>
@@ -278,7 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Pindutin nang matagal ang mga icon para sa higit pang opsyon"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Pindutin nang matagal ang mga icon para sa higit pang opsyon"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Huwag istorbohin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priyoridad lang"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Mga alarm lang"</string>
@@ -353,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Mao-on sa sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hanggang mag-umaga"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Mao-on sa ganap na <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Hanggang <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hanggang <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Naka-disable ang NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Naka-enable ang NFC"</string>
@@ -437,8 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Sisimulan ng i-capture ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang lahat ng ipinapakita sa iyong screen."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Huwag ipakitang muli"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"I-clear lahat"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
- <skip />
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Pamahalaan ang mga notification"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Itinatago ng Huwag Istorbohin ang mga notification"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Magsimula ngayon"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Walang mga notification"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Maaaring subaybayan ang profile"</string>
@@ -544,9 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. I-tap upang itakda na mag-vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. I-tap upang i-mute."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Mga kontrol ng volume ng %s"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Magva-vibrate ang mga tawag at notification"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Mamu-mute ang mga tawag at notification"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Magri-ring ang mga tawag at notification"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Output ng media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Output ng tawag sa telepono"</string>
<string name="output_none_found" msgid="5544982839808921091">"Walang nakitang device"</string>
@@ -633,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"mga kontrol ng notification"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"mga opsyon sa pag-snooze ng notification"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"I-snooze"</string>
<string name="snooze_undo" msgid="6074877317002985129">"I-UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Na-snooze ng <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -696,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Baterya"</string>
<string name="clock" msgid="7416090374234785905">"Orasan"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Nakakonekta ang mga headphone"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Nakakonekta ang headset"</string>
<string name="data_saver" msgid="5037565123367048522">"Data Saver"</string>
@@ -730,8 +725,9 @@
<string name="right_keycode" msgid="708447961000848163">"Kanang keycode"</string>
<string name="left_icon" msgid="3096287125959387541">"Icon ng kaliwa"</string>
<string name="right_icon" msgid="3952104823293824311">"Icon ng kanan"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Mag-drag upang magdagdag ng mga tile"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Pindutin nang matagal at i-drag para magdagdag ng mga tile"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"I-drag dito upang alisin"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Kailangan mo ng hindi bababa sa 6 na tile"</string>
<string name="qs_edit" msgid="2232596095725105230">"I-edit"</string>
<string name="tuner_time" msgid="6572217313285536011">"Oras"</string>
<string-array name="clock_options">
@@ -818,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Mga Screenshot"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Mga Pangkalahatang Mensahe"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Mga Hint"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Hindi kailangang i-install ang mga instant na app."</string>
<string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string>
@@ -835,7 +832,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Palitan"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Tumatakbo ang mga app sa background"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"I-tap para sa mga detalye tungkol sa paggamit ng baterya at data"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"I-off ang mobile data?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"I-off ang mobile data?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Hindi ka magkaka-access sa data o internet sa pamamagitan ng <xliff:g id="CARRIER">%s</xliff:g>. Available lang ang internet sa pamamagitan ng Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ang iyong carrier"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Hindi ma-verify ng Mga Setting ang iyong tugon dahil may app na tumatakip sa isang kahilingan sa pagpapahintulot."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Payagan ang <xliff:g id="APP_0">%1$s</xliff:g> na ipakita ang mga slice ng <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Nakakabasa ito ng impormasyon mula sa <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -843,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Payagan ang <xliff:g id="APP">%1$s</xliff:g> na ipakita ang mga slice mula sa anumang app"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Payagan"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Tanggihan"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"I-tap para iiskedyul ang Pangtipid sa Baterya"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Awtomatikong i-on kapag <xliff:g id="PERCENTAGE">%d</xliff:g>%% na ang baterya"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Hindi, salamat na lang"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Na-on ang iskedyul ng Pangtipid sa Baterya"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Awtomatikong mao-on ang Pangtipid sa Baterya kapag mas mababa na sa <xliff:g id="PERCENTAGE">%d</xliff:g>%% ang baterya."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Mga Setting"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 6c86cf4..06d0500 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sürüyor"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirimler"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Pil gücü düşük"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Pil az. Pil Tasarrufu\'nu açın"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> kaldı"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> kaldı (kullanımınıza göre yaklaşık <xliff:g id="TIME">%s</xliff:g>)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> (yaklaşık <xliff:g id="TIME">%s</xliff:g>) kaldı"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekran görüntüsü"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ekran görüntüsü kaydediliyor..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ekran görüntüsü kaydediliyor..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Ekran görüntüsü kaydediliyor"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Ekran görüntüsü kaydedildi"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Ekran görüntünüzü görmek için dokunun"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Ekran görüntüsü alınamadı"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Ekran görüntüsü kaydedilirken sorun oluştu"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Ekran görüntüsü kaydedilemedi"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Tekrar ekran görüntüsü almayı deneyin"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Depolama alanı sınırlı olduğundan ekran görüntüsü kaydedilemiyor"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Uygulama veya kuruluşunuz, ekran görüntüsü alınmasına izin vermiyor."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB dosya aktarım seçenekleri"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Tatlı Kutusu"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekran koruyucu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Daha fazla seçenek için simgelere dokunun ve basılı tutun"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Rahatsız etmeyin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnızca öncelikliler"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnızca alarmlar"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Gün batımı açılacak"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Gün doğumuna kadar"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Şu saatte açılacak: <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Şu saate kadar: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Şu saate kadar: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC devre dışı"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC etkin"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ekranınızda görüntülenen her şeyi kaydetmeye başlayacak."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Bir daha gösterme"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tümünü temizle"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Bildirimleri yönet"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Şimdi başlat"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Bildirim yok"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil izlenebilir"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Titreşime ayarlamak için dokunun."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sesi kapatmak için dokunun."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s ses denetimleri"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Çağrılar ve bildirimler zili çaldıracak"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medya çıkışı"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefon çağrısı çıkışı"</string>
<string name="output_none_found" msgid="5544982839808921091">"Cihaz bulunamadı"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"Bildirim kontrolleri"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"bildirim erteleme seçenekleri"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Ertele"</string>
<string name="snooze_undo" msgid="6074877317002985129">"GERİ AL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> süreyle ertelendi"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Pil"</string>
<string name="clock" msgid="7416090374234785905">"Saat"</string>
<string name="headset" msgid="4534219457597457353">"Mikrofonlu kulaklık"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Mikrofonlu kulaklık bağlı"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Mikrofonlu kulaklık bağlı"</string>
<string name="data_saver" msgid="5037565123367048522">"Veri Tasarrufu"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekran görüntüleri"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Genel Mesajlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Depolama alanı"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"İpuçları"</string>
<string name="instant_apps" msgid="6647570248119804907">"Hazır Uygulamalar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Hazır uygulamaların yüklenmesi gerekmez."</string>
<string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> uygulamasının tüm uygulamalardan dilimleri göstermesine izin ver"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"İzin ver"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Reddet"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Pil Tasarrufunu programlamak için dokunun"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Pil %%<xliff:g id="PERCENTAGE">%d</xliff:g> düzeyinin altına düştüğünde otomatik olarak aç"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Hayır, teşekkürler"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Pil Tasarruf programı açık"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Pil %%<xliff:g id="PERCENTAGE">%d</xliff:g> düzeyinin altına düştüğünde Pil Tasarrufu otomatik olarak açılacaktır."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 59957fe..0be01d6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -35,7 +35,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Низький рівень заряду акумулятора"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Акумулятор майже розрядився. Увімкніть режим економії заряду акумулятора"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Залишилося <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"На основі використання залишилося <xliff:g id="PERCENTAGE">%s</xliff:g> – близько <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Залишилося <xliff:g id="PERCENTAGE">%s</xliff:g> – близько <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -75,11 +74,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Знімок екрана"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Збереження знімка екрана..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Збереження знімка екрана..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Знімок екрана зберігається"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Знімок екрана збережено"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Торкніться, щоб переглянути знімок екрана"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Не вдалося зробити знімок екрана"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Не вдалося зберегти знімок екрана"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Не вдалося зберегти знімок екрана"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Спробуйте зробити знімок екрана ще раз"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Не вдалося зберегти знімок екрана через обмежений обсяг пам’яті"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Додаток або адміністратор вашої організації не дозволяють робити знімки екрана"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Парам.передав.файлів через USB"</string>
@@ -356,7 +354,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Вмикається ввечері"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До сходу сонця"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Вмикається о <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"До <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC вимкнено"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ввімкнено"</string>
@@ -440,7 +438,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> отримає доступ до всіх даних, які відображаються на вашому екрані."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Більше не показувати"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Очистити все"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"У режимі \"Не турбувати\" сповіщення ховаються"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Керувати сповіщеннями"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"У режимі \"Не турбувати\" сповіщення ховаються"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Почати зараз"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Сповіщень немає"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Профіль може відстежуватись"</string>
@@ -546,7 +545,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Торкніться, щоб налаштувати вібросигнал."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Торкніться, щоб вимкнути звук."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Регуляторів гучності: %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Звуковий сигнал для викликів і сповіщень увімкнено"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Вивід медіа-вмісту"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Вивід телефонного виклику"</string>
<string name="output_none_found" msgid="5544982839808921091">"Пристроїв не знайдено"</string>
@@ -637,6 +637,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"елементи керування сповіщеннями"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"параметри відкладення сповіщень"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Відкласти"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ВІДМІНИТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Відкладено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -704,6 +705,8 @@
<string name="battery" msgid="7498329822413202973">"Акумулятор"</string>
<string name="clock" msgid="7416090374234785905">"Годинник"</string>
<string name="headset" msgid="4534219457597457353">"Гарнітура"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Навушники під’єднано"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Гарнітуру під’єднано"</string>
<string name="data_saver" msgid="5037565123367048522">"Заощадження трафіку"</string>
@@ -738,11 +741,9 @@
<string name="right_keycode" msgid="708447961000848163">"Код клавіші праворуч"</string>
<string name="left_icon" msgid="3096287125959387541">"Значок ліворуч"</string>
<string name="right_icon" msgid="3952104823293824311">"Значок праворуч"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Натисніть і перетягніть, щоб додати фрагменти"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Перетягніть сюди, щоб видалити"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Потрібно принаймні 6 фрагментів"</string>
<string name="qs_edit" msgid="2232596095725105230">"Редагувати"</string>
<string name="tuner_time" msgid="6572217313285536011">"Час"</string>
<string-array name="clock_options">
@@ -829,6 +830,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Знімки екрана"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Загальні повідомлення"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Пам’ять"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Поради"</string>
<string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string>
<string name="app_info" msgid="6856026610594615344">"Про додаток"</string>
@@ -846,12 +848,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замінити"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Додатки, які працюють у фоновому режимі"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Торкніться, щоб перевірити використання акумулятора й трафік"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Вимкнути мобільне передавання даних?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Ви не матимете доступу до даних чи Інтернету через оператора <xliff:g id="CARRIER">%s</xliff:g>. Інтернет буде доступний лише через Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"ваш оператор"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Не вдається підтвердити вашу відповідь у налаштуваннях, оскільки інший додаток заступає запит на дозвіл."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Дозволити додатку <xliff:g id="APP_0">%1$s</xliff:g> показувати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Має доступ до інформації з додатка <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -859,4 +858,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Дозволити додатку <xliff:g id="APP">%1$s</xliff:g> показувати фрагменти будь-якого додатка"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Дозволити"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Відмовити"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Торкніться, щоб увімкнути автоматичний режим економії заряду акумулятора"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Вмикати автоматично, коли рівень знижується до <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Ні, дякую"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Автоматичний режим економії заряду акумулятора ввімкнено"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Режим економії заряду акумулятора вмикатиметься автоматично, коли рівень нижчий за <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Налаштування"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 73d5f48..dede878 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"جاری"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اطلاعات"</string>
<string name="battery_low_title" msgid="6456385927409742437">"بیٹری کم ہے"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"بیٹری کم ہے۔ بیٹری سیور آن کریں"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی ہے"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی، آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%s</xliff:g> باقی ہے"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی، تقریباً <xliff:g id="TIME">%s</xliff:g> باقی ہے"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"اسکرین شاٹ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"اسکرین شاٹ محفوظ ہو رہا ہے…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"اسکرین شاٹ محفوظ ہو رہا ہے…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"اسکرین شاٹ محفوظ کیا جا رہا ہے"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"اسکرین شاٹ محفوظ ہو گیا"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"اپنا اسکرین شاٹ دیکھنے کیلئے تھپتھپائیں"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"اسکرین شاٹ کیپچر نہیں ہو سکا"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"اسکرین شاٹ محفوظ کرتے وقت مسئلہ پیش آ گیا"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"اسٹوریج کی محدود جگہ کی وجہ سے اسکرین شاٹ کو محفوظ نہیں کیا جا سکتا"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ایپ یا آپ کی تنظیم کی جانب سے اسکرین شاٹس لینے کی اجازت نہیں ہے"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB فائل منتقل کرنیکے اختیارات"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"ڈیزرٹ کیس"</string>
<string name="start_dreams" msgid="5640361424498338327">"اسکرین سیور"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ایتھرنیٹ"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"مزید اختیارات کے لیے آئیکنز کو ٹچ کریں اور دبائیں رکھیں"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ڈسٹرب نہ کریں"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"صرف ترجیحی"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"صرف الارمز"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"غروب آفتاب کے وقت آن ہوگی"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"طلوع آفتاب تک"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"آن ہوگی بوقت <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> بجے تک"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیر فعال ہے"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال ہے"</string>
@@ -433,7 +433,10 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> آپ کی اسکرین پر ڈسپلے ہونے والی ہر چیز کو کیپچر کرنا شروع کر دیگی۔"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"دوبارہ نہ دکھائیں"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"سبھی کو صاف کریں"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"\'ڈسٹرب نہ کریں\' اطلاعات کو چھپا رہی ہے"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
+ <skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"ابھی شروع کریں"</string>
<string name="empty_shade_text" msgid="708135716272867002">"کوئی اطلاعات نہیں ہیں"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"پروفائل کو مانیٹر کیا جا سکتا ہے"</string>
@@ -539,7 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s والیوم کے کنٹرولز"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"کالز اور اطلاعات کی گھنٹی بجے گی"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"میڈیا آؤٹ پٹ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"فون کال کا آؤٹ پٹ"</string>
<string name="output_none_found" msgid="5544982839808921091">"کوئی آلہ نہیں ملا"</string>
@@ -626,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"اطلاع کے کنٹرولز"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"اطلاع اسنوز کرنے کے اختیارات"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"کالعدم کریں"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> کیلئے اسنوز کیا گیا"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"بیٹری"</string>
<string name="clock" msgid="7416090374234785905">"گھڑی"</string>
<string name="headset" msgid="4534219457597457353">"ہیڈ سیٹ"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ہیڈ فونز منسلک ہیں"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ہیڈ سیٹ منسلک ہے"</string>
<string name="data_saver" msgid="5037565123367048522">"ڈیٹا سیور"</string>
@@ -723,11 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"دائيں جانب کا کی کوڈ"</string>
<string name="left_icon" msgid="3096287125959387541">"بائیں جانب کا آئیکن"</string>
<string name="right_icon" msgid="3952104823293824311">"دائيں جانب کا آئيکن"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"ٹائلز شامل کرنے کے لئے پکڑ کر گھسیٹیں"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ہٹانے کیلئے یہاں گھسیٹیں؟"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"آپ کو کم از کم 6 ٹائلز کی ضرورت ہے"</string>
<string name="qs_edit" msgid="2232596095725105230">"ترمیم کریں"</string>
<string name="tuner_time" msgid="6572217313285536011">"وقت"</string>
<string-array name="clock_options">
@@ -814,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"اسکرین شاٹس"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"عمومی پیغامات"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"اسٹوریج"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string>
<string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string>
@@ -831,12 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"بدلیں"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"ایپس پس منظر میں چل رہی ہیں"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"بیٹری اور ڈیٹا استعمال کے بارے میں تفصیلات کے لیے تھپتھپائیں"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"موبائل ڈیٹا آف کریں؟"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"آپ کو <xliff:g id="CARRIER">%s</xliff:g> کے ذریعے ڈیٹا یا انٹرنیٹ تک رسائی حاصل نہیں ہوگی۔ انٹرنیٹ صرف Wi-Fi کے ذریعے دستیاب ہوگا۔"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"آپ کا کریئر"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"چونکہ ایک ایپ اجازت کی درخواست کو مبہم کر رہی ہے، لہذا ترتیبات آپ کے جواب کی توثیق نہیں کر سکتی ہیں۔"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> کو <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانے کی اجازت دیں؟"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- یہ <xliff:g id="APP">%1$s</xliff:g> کی معلومات پڑھ سکتا ہے"</string>
@@ -844,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> کو کسی بھی ایپ سے سلائسز دکھانے کی اجازت دیں"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"اجازت دیں"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"مسترد کریں"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 66b1af0..a923151 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Hali bajarilmagan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Eslatmalar"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batareya quvvati kam qoldi"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Batareya quvvati kam qoldi. Quvvat tejash rejimini yoqing."</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> qoldi"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> (joriy holatda taxminan <xliff:g id="TIME">%s</xliff:g> qoldi)"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> (taxminan <xliff:g id="TIME">%s</xliff:g> qoldi)"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinshot"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinshot saqlanmoqda…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinshot saqlanmoqda…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Skrinshot saqlanmoqda"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Skrinshot saqlandi"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Skrinshotni ochish uchun bosing"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Skrinshot saqlanmadi"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Skrinshotni saqlashda muammo yuz berdi"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Xotirada joy kamligi uchun skrinshot saqlanmadi"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB fayl ko‘chirish moslamalari"</string>
@@ -105,7 +105,7 @@
<string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string>
- <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ilova ikonkasi"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ilova belgisi"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yordam xabari"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kattalashtirish tugmasi mosligi."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kattaroq ekran uchun kichikroqni kattalashtirish."</string>
@@ -350,7 +350,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kunbotarda yoqish"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Quyosh chiqqunicha"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> da yoqish"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> gacha"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC o‘chiq"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC yoniq"</string>
@@ -434,7 +435,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilovasi qurilma ekranidagi har qanday tasvirni ko‘rishni boshlaydi."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Boshqa ko‘rsatilmasin"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hammasini tozalash"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Boshlash"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Bildirishnomalar yo‘q"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Profil kuzatilishi mumkin"</string>
@@ -540,7 +543,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tebranishni yoqish uchun ustiga bosing."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ovozsiz qilish uchun ustiga bosing."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s tovush balandligi tugmalari"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Chaqiruvlar va bildirishnomalar jiringlaydi"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media chiqishi"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefon chaqiruvlari"</string>
<string name="output_none_found" msgid="5544982839808921091">"Hech qanday qurilma topilmadi"</string>
@@ -627,6 +631,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"bildirishnoma sozlamalari"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"bildirishnomalarni kechiktirish parametrlari"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BEKOR QILISH"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> muddatga kechiktirildi"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -690,6 +696,8 @@
<string name="battery" msgid="7498329822413202973">"Batareya"</string>
<string name="clock" msgid="7416090374234785905">"Soat"</string>
<string name="headset" msgid="4534219457597457353">"Audio moslama"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Quloqchinlar ulandi"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Audio moslama ulandi"</string>
<string name="data_saver" msgid="5037565123367048522">"Trafik tejash"</string>
@@ -813,6 +821,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skrinshotlar"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Umumiy xabarlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Xotira"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Maslahatlar"</string>
<string name="instant_apps" msgid="6647570248119804907">"Darhol ochiladigan ilovalar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Darhol ochiladigan ilovalarni o‘rnatish shart emas."</string>
<string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string>
@@ -840,4 +849,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> ilovasiga boshqa ilovalardan fragmentlarni ko‘rsatishga ruxsat berish"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Ruxsat"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Rad etish"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Quvvat tejash rejimini rejalashtirish uchun bosing"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% bo‘lganda avtomatik yoqish"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Kerak emas"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Quvvat tejash rejimi jadvali yoqildi"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% bo‘lganda, quvvat tejash rejimi avtomatik ravishda yoqiladi."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Sozlamalar"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 7fac87a..97a36dd 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Pin yếu"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Pin yếu. Bật Trình tiết kiệm pin"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Còn lại <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Còn lại <xliff:g id="PERCENTAGE">%s</xliff:g>, còn khoảng <xliff:g id="TIME">%s</xliff:g> dựa trên mức sử dụng của bạn"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Còn lại <xliff:g id="PERCENTAGE">%s</xliff:g>, còn khoảng <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Ảnh chụp màn hình"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Đang lưu ảnh chụp màn hình..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Đang lưu ảnh chụp màn hình..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Đang lưu ảnh chụp màn hình"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Đã lưu ảnh chụp màn hình"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Nhấn để xem ảnh chụp màn hình của bạn"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Không thể chụp ảnh màn hình"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Đã xảy ra sự cố khi lưu ảnh chụp màn hình"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Không thể lưu ảnh chụp màn hình do giới hạn dung lượng bộ nhớ"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ứng dụng hoặc tổ chức của bạn không cho phép chụp ảnh màn hình"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Tùy chọn truyền tệp USB"</string>
@@ -273,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Tủ trưng bày bánh ngọt"</string>
<string name="start_dreams" msgid="5640361424498338327">"Trình bảo vệ m.hình"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Chạm và giữ các biểu tượng để xem thêm tùy chọn khác"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Không làm phiền"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Chỉ ưu tiên"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Chỉ báo thức"</string>
@@ -349,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Bật khi trời tối"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Cho đến khi trời sáng"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bật vào lúc <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Cho đến <xliff:g id="TIME">%s</xliff:g>"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC đã được tắt"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC đã được bật"</string>
@@ -433,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ bắt đầu chụp mọi thứ hiển thị trên màn hình."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Không hiển thị lại"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Xóa tất cả"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Chế độ Không làm phiền sẽ ẩn thông báo"</string>
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Chế độ Không làm phiền đang ẩn thông báo"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Bắt đầu ngay"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Không có thông báo nào"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Hồ sơ có thể được giám sát"</string>
@@ -539,7 +541,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Nhấn để đặt chế độ rung."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Nhấn để tắt tiếng."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"Điều khiển âm lượng %s"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Cuộc gọi và thông báo sẽ đổ chuông"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Đầu ra phương tiện"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Đầu ra cuộc gọi điệnt thoại"</string>
<string name="output_none_found" msgid="5544982839808921091">"Không tìm thấy thiết bị nào"</string>
@@ -626,6 +629,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"điều khiển thông báo"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"Tùy chọn báo lại thông báo"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"HOÀN TÁC"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Báo lại sau <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +694,8 @@
<string name="battery" msgid="7498329822413202973">"Pin"</string>
<string name="clock" msgid="7416090374234785905">"Đồng hồ"</string>
<string name="headset" msgid="4534219457597457353">"Tai nghe"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Đã kết nối tai nghe"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Đã kết nối tai nghe"</string>
<string name="data_saver" msgid="5037565123367048522">"Trình tiết kiệm dữ liệu"</string>
@@ -812,6 +819,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Ảnh chụp màn hình"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Thông báo chung"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Bộ nhớ"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Gợi ý"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ứng dụng tức thì"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ứng dụng tức thì không yêu cầu cài đặt."</string>
<string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string>
@@ -839,4 +847,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Cho phép <xliff:g id="APP">%1$s</xliff:g> hiển thị các lát từ mọi ứng dụng"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Cho phép"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Từ chối"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Nhấn để lên lịch Trình tiết kiệm pin"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Tự động bật khi pin ở mức <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Không, cảm ơn"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Đã bật Trình tiết kiệm pin được lên lịch"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Trình tiết kiệm pin sẽ tự động bật khi mức pin thấp hơn <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Cài đặt"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b0d08d4..b5f7088 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -33,17 +33,13 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="6456385927409742437">"电池电量偏低"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"电池电量不足,请开启省电模式"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"剩余<xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"剩余电量:<xliff:g id="PERCENTAGE">%s</xliff:g>;根据您的使用情况,大约还可使用 <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"剩余电量:<xliff:g id="PERCENTAGE">%s</xliff:g>;大约还可使用 <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"剩余 <xliff:g id="PERCENTAGE">%s</xliff:g>。省电模式已开启。"</string>
- <!-- no translation found for invalid_charger (2741987096648693172) -->
- <skip />
- <!-- no translation found for invalid_charger_title (2836102177577255404) -->
- <skip />
- <!-- no translation found for invalid_charger_text (6480624964117840005) -->
- <skip />
+ <string name="invalid_charger" msgid="2741987096648693172">"无法通过 USB 充电。请使用设备随附的充电器。"</string>
+ <string name="invalid_charger_title" msgid="2836102177577255404">"无法通过 USB 充电"</string>
+ <string name="invalid_charger_text" msgid="6480624964117840005">"使用设备随附的充电器"</string>
<string name="battery_low_why" msgid="4553600287639198111">"设置"</string>
<string name="battery_saver_confirmation_title" msgid="2052100465684817154">"要开启省电模式吗?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"开启"</string>
@@ -76,11 +72,12 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"屏幕截图"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在保存屏幕截图..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在保存屏幕截图..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"正在保存屏幕截图"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"已保存屏幕截图"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"点按即可查看您的屏幕截图"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"无法抓取屏幕截图"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"保存屏幕截图时出现问题"</string>
+ <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
+ <skip />
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"由于存储空间有限,无法保存屏幕截图"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"此应用或您所在的单位不允许进行屏幕截图"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB文件传输选项"</string>
@@ -151,7 +148,6 @@
<string name="accessibility_desc_connected" msgid="8366256693719499665">"已连接。"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"正在连接。"</string>
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
- <string name="data_connection_1x" msgid="396105635197711584">"1 X"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
<string name="data_connection_3_5g" msgid="5218328297191657602">"3.5G"</string>
@@ -211,8 +207,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"飞行模式开启。"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"飞行模式已关闭。"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"飞行模式已开启。"</string>
- <!-- no translation found for accessibility_quick_settings_dnd_priority_on (5836205286254617194) -->
- <skip />
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="5836205286254617194">"“勿扰”模式已开启。"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"勿扰模式已开启,阻止全部通知。"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"勿扰模式已开启,仅限闹钟。"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"勿扰。"</string>
@@ -278,7 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"甜品盒"</string>
<string name="start_dreams" msgid="5640361424498338327">"屏保"</string>
<string name="ethernet_label" msgid="7967563676324087464">"有线网络"</string>
- <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"按住相应图标即可查看更多选项"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"触摸并按住相应图标即可查看更多选项"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"勿扰"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"仅限优先事项"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"仅限闹钟"</string>
@@ -353,7 +348,8 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落时开启"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出时关闭"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"在<xliff:g id="TIME">%s</xliff:g> 开启"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"在<xliff:g id="TIME">%s</xliff:g> 关闭"</string>
+ <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
+ <skip />
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已启用"</string>
@@ -365,7 +361,7 @@
<string name="recents_launch_error_message" msgid="2969287838120550506">"无法启动<xliff:g id="APP">%s</xliff:g>。"</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>已在安全模式下停用。"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"在此处拖动即可使用分屏功能"</string>
+ <string name="recents_drag_hint_message" msgid="2649739267073203985">"拖动到此处即可使用分屏功能"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自定义分割"</string>
@@ -437,7 +433,9 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>将开始截取您的屏幕上显示的所有内容。"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不再显示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
- <!-- no translation found for dnd_suppressing_shade_text (7986451830430707907) -->
+ <!-- no translation found for manage_notifications_text (8035284146227267681) -->
+ <skip />
+ <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
<skip />
<string name="media_projection_action_text" msgid="8470872969457985954">"立即开始"</string>
<string name="empty_shade_text" msgid="708135716272867002">"没有通知"</string>
@@ -544,9 +542,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。点按即可设为振动。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。点按即可设为静音。"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控件"</string>
- <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"有来电和通知时会振动"</string>
- <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有来电和通知时会静音"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"有来电和通知时会响铃"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"媒体输出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通话输出"</string>
<string name="output_none_found" msgid="5544982839808921091">"未找到任何设备"</string>
@@ -633,6 +630,8 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g><xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"通知设置"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"通知延后选项"</string>
+ <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"撤消"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延后 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -696,6 +695,8 @@
<string name="battery" msgid="7498329822413202973">"电池"</string>
<string name="clock" msgid="7416090374234785905">"时钟"</string>
<string name="headset" msgid="4534219457597457353">"耳机"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"已连接到耳机"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"已连接到耳机"</string>
<string name="data_saver" msgid="5037565123367048522">"流量节省程序"</string>
@@ -730,8 +731,9 @@
<string name="right_keycode" msgid="708447961000848163">"向右键码"</string>
<string name="left_icon" msgid="3096287125959387541">"向左图标"</string>
<string name="right_icon" msgid="3952104823293824311">"向右图标"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"拖动即可添加图块"</string>
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"按住并拖动即可添加图块"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"拖动到此处即可移除"</string>
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"您至少需要 6 个图块"</string>
<string name="qs_edit" msgid="2232596095725105230">"修改"</string>
<string name="tuner_time" msgid="6572217313285536011">"时间"</string>
<string-array name="clock_options">
@@ -818,6 +820,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"屏幕截图"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"常规消息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"存储空间"</string>
+ <!-- no translation found for notification_channel_hints (7323870212489152689) -->
+ <skip />
<string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"应用信息"</string>
@@ -835,7 +839,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"替换"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"在后台运行的应用"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"点按即可详细了解电量和流量消耗情况"</string>
- <string name="data_usage_disable_mobile" msgid="5116269981510015864">"要关闭移动数据网络吗?"</string>
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"要关闭移动数据网络吗?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"您将无法通过<xliff:g id="CARRIER">%s</xliff:g>获取移动数据访问权限或连接到互联网。您只能通过 WLAN 连接到互联网。"</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"您的运营商"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"由于某个应用遮挡了权限请求界面,因此“设置”应用无法验证您的回应。"</string>
<string name="slice_permission_title" msgid="7465009437851044444">"要允许“<xliff:g id="APP_0">%1$s</xliff:g>”显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块吗?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- 可以读取“<xliff:g id="APP">%1$s</xliff:g>”中的信息"</string>
@@ -843,4 +849,18 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"允许“<xliff:g id="APP">%1$s</xliff:g>”显示任何应用的图块"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"允许"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"拒绝"</string>
+ <!-- no translation found for auto_saver_title (1217959994732964228) -->
+ <skip />
+ <!-- no translation found for auto_saver_text (6324376061044218113) -->
+ <skip />
+ <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
+ <skip />
+ <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
+ <skip />
+ <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
+ <skip />
+ <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 8218aac..338f6ab 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"持續進行"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="6456385927409742437">"電量低"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"電量不足。請開啟省電模式"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"剩餘 <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"電量剩餘 <xliff:g id="PERCENTAGE">%s</xliff:g>,根據您的使用情況,剩餘時間大約 <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"電量剩餘 <xliff:g id="PERCENTAGE">%s</xliff:g>,剩餘時間大約 <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷取畫面..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在儲存螢幕擷取畫面..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"正在儲存螢幕擷取畫面"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"螢幕擷取畫面已儲存"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"輕按即可查看螢幕擷取畫面"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"無法擷取螢幕畫面"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"儲存螢幕擷取畫面時發生問題"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"無法儲存螢幕擷取畫面"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"請再次嘗試拍攝螢幕擷取畫面"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"由於儲存空間有限,因此無法儲存螢幕擷取畫面"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"應用程式或您的機構不允許擷取螢幕畫面"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 檔案傳輸選項"</string>
@@ -275,8 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="7967563676324087464">"以太網"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"按住圖示即可查看更多選項"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"請勿騷擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"只限優先"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"只限鬧鐘"</string>
@@ -351,7 +348,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落時開啟"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出時關閉"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"在<xliff:g id="TIME">%s</xliff:g>開啟"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"在<xliff:g id="TIME">%s</xliff:g>關閉"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"結束時間:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string>
@@ -435,7 +432,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取您的螢幕上顯示的內容。"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不用再顯示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"「請勿騷擾」模式目前隱藏通知"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"管理通知"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"「請勿騷擾」模式目前隱藏通知"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"立即開始"</string>
<string name="empty_shade_text" msgid="708135716272867002">"沒有通知"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"個人檔案可能受到監控"</string>
@@ -541,7 +539,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕按即可設為震動。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕按即可設為靜音。"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控制項"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"有來電和通知時會發出鈴聲"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"媒體輸出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string>
<string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string>
@@ -628,6 +627,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"通知控制項"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"通知延後選項"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"延後"</string>
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -691,6 +691,8 @@
<string name="battery" msgid="7498329822413202973">"電池"</string>
<string name="clock" msgid="7416090374234785905">"時鐘"</string>
<string name="headset" msgid="4534219457597457353">"耳機"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"已連接至耳機"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"已連接至耳機"</string>
<string name="data_saver" msgid="5037565123367048522">"數據節省模式"</string>
@@ -814,6 +816,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string>
<string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資料"</string>
@@ -841,4 +844,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"允許「<xliff:g id="APP">%1$s</xliff:g>」顯示任何應用程式的快訊"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"允許"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"拒絕"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"輕按即可預定省電模式自動開啟時間"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"在電量為 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"不用了,謝謝"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"已預定省電模式開啟時間"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"省電模式將會在電量低於 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟。"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index aadb50b..ad6b52e 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="6456385927409742437">"電池電力不足"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"電池電量偏低,請開啟節約耗電量模式"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"僅剩 <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"電力剩餘 <xliff:g id="PERCENTAGE">%s</xliff:g>,根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"電力剩餘 <xliff:g id="PERCENTAGE">%s</xliff:g>,剩餘時間大約還有 <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷取畫面…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在儲存螢幕擷取畫面…"</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"正在儲存螢幕擷取畫面"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"螢幕擷取畫面已儲存"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"輕觸即可查看螢幕擷取畫面"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"無法擷取螢幕畫面"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"儲存螢幕擷取畫面時發生問題"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"無法儲存螢幕擷取畫面"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"請再次嘗試拍攝螢幕擷取畫面"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"由於儲存空間有限,因此無法儲存螢幕擷取畫面"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"這個應用程式或貴機構不允許擷取螢幕畫面"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 檔案傳輸選項"</string>
@@ -273,8 +271,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
- <!-- no translation found for quick_settings_header_onboarding_text (8030309023792936283) -->
- <skip />
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"按住圖示即可查看更多選項"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先通知"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string>
@@ -349,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"於日落時開啟"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"於日出時關閉"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"開啟時間:<xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"關閉時間:<xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"結束時間:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string>
@@ -433,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取你的螢幕上顯示的內容。"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不要再顯示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"「零打擾」模式正在隱藏通知"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"管理通知"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"「零打擾」模式正在隱藏通知"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"立即開始"</string>
<string name="empty_shade_text" msgid="708135716272867002">"沒有通知"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"設定檔可能會受到監控"</string>
@@ -539,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕觸即可設為震動。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕觸即可設為靜音。"</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"「%s」音量控制項"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"有來電和通知時會響鈴"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"媒體輸出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string>
<string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string>
@@ -626,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"通知控制項"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"通知延後選項"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"延後"</string>
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -689,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"電池"</string>
<string name="clock" msgid="7416090374234785905">"時鐘"</string>
<string name="headset" msgid="4534219457597457353">"耳機"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"已與耳機連線"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"已與耳機連線"</string>
<string name="data_saver" msgid="5037565123367048522">"數據節省模式"</string>
@@ -812,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string>
<string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string>
@@ -839,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"允許「<xliff:g id="APP">%1$s</xliff:g>」顯示任何應用程式的區塊"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"允許"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"拒絕"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"輕觸即可排定節約耗電量模式自動開啟的情況"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"在電量 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"不用了,謝謝"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"已按照排定開啟節約耗電量模式"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"節約耗電量模式會在電量低於 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟。"</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"我知道了"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 346a134..0319d12 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -33,7 +33,6 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Izaziso"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Ibhethri liphansi"</string>
- <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Ibhethri liphansi. Vula isilondolozi sebhethri"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> okusele"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%s</xliff:g> okusele, cishe u-<xliff:g id="TIME">%s</xliff:g> osele ngokusukela ekusebenziseni kwakho"</string>
<string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%s</xliff:g> okusele, cishe u-<xliff:g id="TIME">%s</xliff:g> osele"</string>
@@ -73,11 +72,10 @@
<string name="global_action_screenshot" msgid="8329831278085426283">"Isithombe-skrini"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ilondoloz umfanekiso weskrini..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ilondoloz umfanekiso weskrini..."</string>
- <string name="screenshot_saving_text" msgid="2545047868936087248">"Umfanekiso weskrini uyalondolozwa"</string>
<string name="screenshot_saved_title" msgid="5637073968117370753">"Isithombe-skrini silondoloziwe"</string>
<string name="screenshot_saved_text" msgid="7574667448002050363">"Thepha ukuze ubuke isithombe-skrini sakho"</string>
- <string name="screenshot_failed_title" msgid="9096484883063264803">"Yehlulekile ukuthwebula umfanekiso weskrini"</string>
- <string name="screenshot_failed_to_save_unknown_text" msgid="8844781948876286488">"Inkinga ivelile ngenkathi ilondoloza isithombe sikrini"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Ayikwazanga ukulondoloza isithombe-skrini"</string>
+ <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Zama ukuthatha isithombe-skrini futhi"</string>
<string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ayikwazi ukulondoloza isithombe-skrini ngenxa yesikhala sesitoreji esikhawulelwe"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ukuthatha izithombe-skrini akuvunyelwe uhlelo lokusebenza noma inhlangano yakho"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Okukhethwa kokudluliswa kwefayela ye-USB"</string>
@@ -348,7 +346,7 @@
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kuvulwe ekushoneni kwelanga"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuze kube sekuphumeni kwelanga"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kuvulwe ngo-<xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"I-NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"I-NFC ikhutshaziwe"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"I-NFC inikwe amandla"</string>
@@ -432,7 +430,8 @@
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> izoqala ukuthwebula yonke into eboniswa kusikrini sakho."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ungabonisi futhi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Sula konke"</string>
- <string name="dnd_suppressing_shade_text" msgid="7986451830430707907">"Ukungaphazamisi kufihle izaziso"</string>
+ <string name="manage_notifications_text" msgid="8035284146227267681">"Phatha izaziso"</string>
+ <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Ukungaphazamisi kufihle izaziso"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Qala manje"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Azikho izaziso"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"Iphrofayela ingaqashwa"</string>
@@ -538,7 +537,8 @@
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Thepha ukuze usethele ekudlidlizeni."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Thepha ukuze uthulise."</string>
<string name="volume_dialog_title" msgid="7272969888820035876">"%s izilawuli zevolomu"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="6144469689490528338">"Amakholi nezaziso zizokhala"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Okukhiphayo kwemidiya"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Okukhiphayo kwekholi yefoni"</string>
<string name="output_none_found" msgid="5544982839808921091">"Awekho amadivayisi atholiwe"</string>
@@ -625,6 +625,7 @@
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"izilawuli zesaziso"</string>
<string name="notification_menu_snooze_description" msgid="3653669438131034525">"izinketho zokusnuza zesaziso"</string>
+ <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snuza"</string>
<string name="snooze_undo" msgid="6074877317002985129">"HLEHLISA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Kusnuzwe u-<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -688,6 +689,8 @@
<string name="battery" msgid="7498329822413202973">"Ibhethri"</string>
<string name="clock" msgid="7416090374234785905">"Iwashi"</string>
<string name="headset" msgid="4534219457597457353">"Ama-earphone"</string>
+ <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
+ <skip />
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Amahedfoni axhunyiwe"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Ama-earphone axhunyiwe"</string>
<string name="data_saver" msgid="5037565123367048522">"Iseva yedatha"</string>
@@ -722,11 +725,9 @@
<string name="right_keycode" msgid="708447961000848163">"Ikhodi yokhiye yangakwesokudla"</string>
<string name="left_icon" msgid="3096287125959387541">"Isithonjana esingakwesokunxele"</string>
<string name="right_icon" msgid="3952104823293824311">"Isithonjana sangakwesokudla"</string>
- <!-- no translation found for drag_to_add_tiles (230586591689084925) -->
- <skip />
+ <string name="drag_to_add_tiles" msgid="230586591689084925">"Bamba uphinde uhudule ukuze ungeze amathayela"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Hudulela lapha ukuze ususe"</string>
- <!-- no translation found for drag_to_remove_disabled (2390968976638993382) -->
- <skip />
+ <string name="drag_to_remove_disabled" msgid="2390968976638993382">"Udinga okungenani amathayela angu-6"</string>
<string name="qs_edit" msgid="2232596095725105230">"Hlela"</string>
<string name="tuner_time" msgid="6572217313285536011">"Isikhathi"</string>
<string-array name="clock_options">
@@ -813,6 +814,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Izithombe-skrini"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Imilayezo ejwayelekile"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Isitoreji"</string>
+ <string name="notification_channel_hints" msgid="7323870212489152689">"Ukubonisa"</string>
<string name="instant_apps" msgid="6647570248119804907">"Izinhlelo zokusebenza ezisheshayo"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa."</string>
<string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string>
@@ -830,12 +832,9 @@
<string name="qs_dnd_replace" msgid="8019520786644276623">"Buyisela"</string>
<string name="running_foreground_services_title" msgid="381024150898615683">"Izinhlelo zokusebenza zisebenza ngasemuva"</string>
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Thepha ngemininingwane ekusetshenzisweni kwebhethri nedatha"</string>
- <!-- no translation found for mobile_data_disable_title (1068272097382942231) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message (4756541658791493506) -->
- <skip />
- <!-- no translation found for mobile_data_disable_message_default_carrier (6078110473451946831) -->
- <skip />
+ <string name="mobile_data_disable_title" msgid="1068272097382942231">"Vala idatha yeselula?"</string>
+ <string name="mobile_data_disable_message" msgid="4756541658791493506">"Ngeke ube nokufinyelela kudatha noma ku-inthanethi nge-<xliff:g id="CARRIER">%s</xliff:g>. I-inthanethi izotholakala kuphela nge-Wi-Fi."</string>
+ <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"inkampani yakho yenethiwekhi"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"Ngoba uhlelo lokusebenza lusitha isicelo semvume, Izilungiselelo azikwazi ukuqinisekisa impendulo yakho."</string>
<string name="slice_permission_title" msgid="7465009437851044444">"Vumela i-<xliff:g id="APP_0">%1$s</xliff:g> ukuthi ibonise izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>?"</string>
<string name="slice_permission_text_1" msgid="3514586565609596523">"- Ingafunda ulwazi kusukela ku-<xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -843,4 +842,11 @@
<string name="slice_permission_checkbox" msgid="7986504458640562900">"Vumela i-<xliff:g id="APP">%1$s</xliff:g> ukuthi ikubonise izingcezu kusukela kunoma iluphi uhlelo lokusebenza"</string>
<string name="slice_permission_allow" msgid="2340244901366722709">"Vumela"</string>
<string name="slice_permission_deny" msgid="7683681514008048807">"Yenqaba"</string>
+ <string name="auto_saver_title" msgid="1217959994732964228">"Thepha ukuze ushejuli isilondolozi sebhethri"</string>
+ <string name="auto_saver_text" msgid="6324376061044218113">"Ukuze uvule ngokuzenzakalelayo uma ibhethri liku-<xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+ <string name="no_auto_saver_action" msgid="8086002101711328500">"Cha ngiyabonga"</string>
+ <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Ishejuli yesilondolozi sebhethri ivuliwe"</string>
+ <string name="auto_saver_enabled_text" msgid="874711029884777579">"Isilondolozi sebhethri sizovuleka ngokuzenzakalelayo uma ibhethri lifika ngaphansi kuka-<xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+ <string name="open_saver_setting_action" msgid="8314624730997322529">"Izilungiselelo"</string>
+ <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ngiyezwa"</string>
</resources>
diff --git a/packages/SystemUI/res/values/attrs_car.xml b/packages/SystemUI/res/values/attrs_car.xml
index b1097c3..5e4bd79 100644
--- a/packages/SystemUI/res/values/attrs_car.xml
+++ b/packages/SystemUI/res/values/attrs_car.xml
@@ -27,6 +27,13 @@
<attr name="categories" format="string"/>
<!-- package names that will be added as extras to the fired intents -->
<attr name="packages" format="string" />
+ <!-- Alpha value to used when in selected state. Defaults 1f -->
+ <attr name="selectedAlpha" format="float" />
+ <!-- Alpha value to used when in un-selected state. Defaults 0.7f -->
+ <attr name="unselectedAlpha" format="float" />
+ <!-- Render a "more" icon. Defaults true -->
+ <attr name="useMoreIcon" format="boolean" />
+
</declare-styleable>
@@ -39,4 +46,11 @@
<!-- start the intent as a broad cast instead of an activity if true-->
<attr name="broadcast" format="boolean"/>
</declare-styleable>
+
+ <!-- Custom attributes to configure hvac values -->
+ <declare-styleable name="TemperatureView">
+ <attr name="hvacAreaId" format="integer"/>
+ <attr name="hvacPropertyId" format="integer"/>
+ <attr name="hvacTempFormat" format="string"/>
+ </declare-styleable>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index f76603b..f49d3de4 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -45,9 +45,6 @@
interface. This name is in the ComponentName flattened format (package/class) -->
<string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.StatusBar</string>
- <!-- Component name of launcher service for overview to connect to -->
- <string name="config_overviewServiceComponent" translatable="false">com.android.launcher3/com.android.quickstep.TouchInteractionService</string>
-
<!-- Whether or not we show the number in the bar. -->
<bool name="config_statusBarShowNumber">false</bool>
@@ -96,6 +93,9 @@
<integer name="navigation_bar_deadzone_hold">333</integer>
<integer name="navigation_bar_deadzone_decay">333</integer>
+ <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+ <integer name="navigation_bar_deadzone_orientation">0</integer>
+
<bool name="config_dead_zone_flash">false</bool>
<!-- Whether to enable dimming navigation buttons when wallpaper is not visible, should be
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index ff3f696..84ca657 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -270,13 +270,15 @@
<!-- The width of the panel that holds the quick settings. -->
<dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>
+ <dimen name="volume_dialog_panel_transparent_padding">8dp</dimen>
+
<!-- the amount the volume panel should be offset at the end from the view next to it (or
the screen edge, in portrait-->
<dimen name="volume_dialog_base_margin">8dp</dimen>
<dimen name="volume_dialog_panel_width">64dp</dimen>
- <dimen name="volume_dialog_slider_height">108dp</dimen>
+ <dimen name="volume_dialog_slider_height">116dp</dimen>
<dimen name="volume_dialog_row_height">252dp</dimen>
@@ -286,7 +288,7 @@
<dimen name="volume_dialog_spacer">4dp</dimen>
- <dimen name="volume_dialog_slider_margin_top">22dp</dimen>
+ <dimen name="volume_dialog_slider_margin_top">14dp</dimen>
<dimen name="volume_dialog_slider_margin_bottom">-2dp</dimen>
@@ -294,6 +296,8 @@
<dimen name="volume_dialog_settings_icon_size">16dp</dimen>
+ <dimen name="volume_dialog_elevation">9dp</dimen>
+
<!-- Gravity for the notification panel -->
<integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top -->
@@ -313,10 +317,14 @@
<dimen name="pull_span_min">25dp</dimen>
<dimen name="qs_tile_height">106dp</dimen>
+ <dimen name="qs_tile_layout_margin_side">9dp</dimen>
<dimen name="qs_tile_margin_horizontal">18dp</dimen>
<dimen name="qs_tile_margin_vertical">24dp</dimen>
+ <dimen name="qs_tile_margin_top_bottom">12dp</dimen>
<dimen name="qs_tile_margin_top">18dp</dimen>
<dimen name="qs_quick_tile_size">48dp</dimen>
+ <!-- Width for the spacer, used between QS tiles. -->
+ <dimen name="qs_quick_tile_space_width">0dp</dimen>
<dimen name="qs_quick_tile_padding">12dp</dimen>
<dimen name="qs_header_gear_translation">16dp</dimen>
<dimen name="qs_header_tile_margin_horizontal">0dp</dimen>
@@ -732,8 +740,6 @@
<dimen name="volume_expander_margin_end">2dp</dimen>
<dimen name="volume_expander_margin_top">6dp</dimen>
- <dimen name="volume_panel_elevation">8dp</dimen>
-
<!-- Padding between icon and text for managed profile toast -->
<dimen name="managed_profile_toast_padding">4dp</dimen>
diff --git a/packages/SystemUI/res/values/dimens_car.xml b/packages/SystemUI/res/values/dimens_car.xml
index 5679dd2..6caed61 100644
--- a/packages/SystemUI/res/values/dimens_car.xml
+++ b/packages/SystemUI/res/values/dimens_car.xml
@@ -32,6 +32,8 @@
<dimen name="car_navigation_button_width">64dp</dimen>
<dimen name="car_navigation_bar_width">760dp</dimen>
+ <dimen name="car_left_navigation_bar_width">96dp</dimen>
+ <dimen name="car_right_navigation_bar_width">96dp</dimen>
<dimen name="car_page_indicator_dot_diameter">12dp</dimen>
<dimen name="car_page_indicator_margin_bottom">24dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index d3a55e8..da6ecc3 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -191,16 +191,14 @@
<string name="screenshot_saving_ticker">Saving screenshot\u2026</string>
<!-- Notification title displayed when a screenshot is being saved to the Gallery. [CHAR LIMIT=50] -->
<string name="screenshot_saving_title">Saving screenshot\u2026</string>
- <!-- Notification text displayed when a screenshot is being saved to the Gallery. [CHAR LIMIT=100] -->
- <string name="screenshot_saving_text">Screenshot is being saved</string>
<!-- Notification title displayed when a screenshot is saved to the Gallery. [CHAR LIMIT=50] -->
<string name="screenshot_saved_title">Screenshot saved</string>
<!-- Notification text displayed when a screenshot is saved to the Gallery. [CHAR LIMIT=100] -->
<string name="screenshot_saved_text">Tap to view your screenshot</string>
<!-- Notification title displayed when we fail to take a screenshot. [CHAR LIMIT=50] -->
- <string name="screenshot_failed_title">Couldn\'t capture screenshot</string>
+ <string name="screenshot_failed_title">Couldn\'t save screenshot</string>
<!-- Notification text displayed when we fail to save a screenshot for unknown reasons. [CHAR LIMIT=100] -->
- <string name="screenshot_failed_to_save_unknown_text">Problem encountered while saving screenshot</string>
+ <string name="screenshot_failed_to_save_unknown_text">Try taking screenshot again</string>
<!-- Notification text displayed when we fail to save a screenshot. [CHAR LIMIT=100] -->
<string name="screenshot_failed_to_save_text">Can\'t save screenshot due to limited storage space</string>
<!-- Notification text displayed when we fail to take a screenshot. [CHAR LIMIT=100] -->
@@ -1055,8 +1053,11 @@
<!-- The text to clear all notifications. [CHAR LIMIT=60] -->
<string name="clear_all_notifications_text">Clear all</string>
+ <!-- The text for the manage notifications link. [CHAR LIMIT=40] -->
+ <string name="manage_notifications_text">Manage notifications</string>
+
<!-- The text to show in the notifications shade when dnd is suppressing notifications. [CHAR LIMIT=100] -->
- <string name="dnd_suppressing_shade_text">Do Not disturb is hiding notifications</string>
+ <string name="dnd_suppressing_shade_text">Do Not Disturb is hiding notifications</string>
<!-- Media projection permission dialog action text. [CHAR LIMIT=60] -->
<string name="media_projection_action_text">Start now</string>
@@ -1334,6 +1335,11 @@
<string name="volume_ringer_status_vibrate">Vibrate</string>
<string name="volume_ringer_status_silent">Mute</string>
+ <!-- Shown in the header of quick settings to indicate to the user that their phone ringer is on vibrate. [CHAR_LIMIT=NONE] -->
+ <string name="qs_status_phone_vibrate">Phone on vibrate</string>
+ <!-- Shown in the header of quick settings to indicate to the user that their phone ringer is on silent (muted). [CHAR_LIMIT=NONE] -->
+ <string name="qs_status_phone_muted">Phone muted</string>
+
<string name="volume_stream_muted" translatable="false">%s silent</string>
<string name="volume_stream_vibrate" translatable="false">%s vibrate</string>
<string name="volume_stream_suppressed" translatable="false">%1$s silent — %2$s</string>
@@ -1349,7 +1355,7 @@
<string name="volume_dialog_title">%s volume controls</string>
- <string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring</string>
+ <string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring (<xliff:g id="volume level" example="56">%1$s</xliff:g>)</string>
<string name="output_title">Media output</string>
<string name="output_calls_title">Phone call output</string>
@@ -1747,6 +1753,10 @@
<!-- Name of the headset in status bar [CHAR LIMIT=30] -->
<string name="headset">Headset</string>
+ <!-- Accessibility description for long click on a quick settings tile - this is used in the
+ context of the sentence "double tap and hold to _Open settings_" [CHAR LIMIT=NONE] -->
+ <string name="accessibility_long_click_tile">Open settings</string>
+
<!-- Accessibility description of headphones icon [CHAR LIMIT=NONE] -->
<string name="accessibility_status_bar_headphones">Headphones connected</string>
@@ -2095,6 +2105,8 @@
<string name="notification_channel_general">General Messages</string>
<!-- Title for the notification channel for problems with storage (i.e. low disk). [CHAR LIMIT=NONE] -->
<string name="notification_channel_storage">Storage</string>
+ <!-- Title for the notification channel for hints and suggestions. [CHAR LIMIT=NONE] -->
+ <string name="notification_channel_hints">Hints</string>
<!-- App label of the instant apps notification [CHAR LIMIT=60] -->
<string name="instant_apps">Instant Apps</string>
@@ -2185,4 +2197,25 @@
<string-array name="recents_onboarding_blacklisted_packages" translatable="false">
</string-array>
+ <!-- The title of the notification to suggest enabling automatic battery saver. [CHAR LIMIT=NONE]-->
+ <string name="auto_saver_title">Tap to schedule Battery Saver</string>
+
+ <!-- The content of the notification to suggest enabling automatic battery saver. [CHAR LIMIT=NONE]-->
+ <string name="auto_saver_text">Turn on automatically when battery is at <xliff:g id="percentage">%d</xliff:g>%%</string>
+
+ <!-- An action on the notification to suggest enabling automatic battery saver: Do not turn on automatic battery saver. [CHAR LIMIT=NONE]-->
+ <string name="no_auto_saver_action">No thanks</string>
+
+ <!-- The title of the dialog that tells that scheduled (i.e. automatic) battery saver has been turned on. [CHAR LIMIT=NONE]-->
+ <string name="auto_saver_enabled_title">Battery Saver schedule turned on</string>
+
+ <!-- The content of the dialog that tells that scheduled (i.e. automatic) battery saver has been turned on. [CHAR LIMIT=NONE]-->
+ <string name="auto_saver_enabled_text">Battery Saver will turn on automatically once battery goes below <xliff:g id="percentage">%d</xliff:g>%%.</string>
+
+ <!-- An action on the dialog that tells that scheduled (i.e. automatic) battery saver: open the battery saver setting. [CHAR LIMIT=NONE]-->
+ <string name="open_saver_setting_action">Settings</string>
+
+ <!-- An action on the dialog that tells that scheduled (i.e. automatic) battery saver: user acknowledges and closes the dialog. [CHAR LIMIT=NONE]-->
+ <string name="auto_saver_okay_action">Got it</string>
+
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
index 14767f1..20d1418 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
@@ -19,6 +19,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
@@ -106,11 +107,12 @@
return createDrawableFromBitmap(tdIcon, userId, desc);
}
if (desc.getIconResource() != 0) {
- // TODO: Use task context here
try {
- return createBadgedDrawable(
- mContext.getDrawable(desc.getIconResource()), userId, desc);
- } catch (Resources.NotFoundException e) {
+ Context packageContext = mContext.createPackageContextAsUser(
+ taskKey.getPackageName(), 0, UserHandle.of(userId));
+ return createBadgedDrawable(packageContext.getDrawable(desc.getIconResource()),
+ userId, desc);
+ } catch (Resources.NotFoundException|PackageManager.NameNotFoundException e) {
Log.e(TAG, "Could not find icon drawable from resource", e);
}
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
index 6bddbe0..6af89fc 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java
@@ -80,6 +80,13 @@
return this.baseIntent.getComponent();
}
+ public String getPackageName() {
+ if (this.baseIntent.getComponent() != null) {
+ return this.baseIntent.getComponent().getPackageName();
+ }
+ return this.baseIntent.getPackage();
+ }
+
@Override
public boolean equals(Object o) {
if (!(o instanceof TaskKey)) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index 62b5004..5b4d652 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -137,6 +137,10 @@
mCancelAction = cancelAction;
}
+ public boolean hasDismissActions() {
+ return mDismissAction != null || mCancelAction != null;
+ }
+
public void cancelDismissAction() {
setOnDismissAction(null, null);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 10ba7f6..9a26b35 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -16,6 +16,9 @@
package com.android.keyguard;
+import android.animation.LayoutTransition;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
import android.annotation.ColorInt;
import android.app.PendingIntent;
import android.arch.lifecycle.LiveData;
@@ -31,6 +34,7 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
+import android.view.animation.Animation;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -39,9 +43,11 @@
import com.android.internal.graphics.ColorUtils;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.tuner.TunerService;
+import com.android.systemui.util.wakelock.WakeLock;
import java.util.HashMap;
import java.util.List;
@@ -158,10 +164,9 @@
button = new KeyguardSliceButton(mContext);
button.setTextColor(blendedColor);
button.setTag(itemTag);
- } else {
- mRow.removeView(button);
+ final int viewIndex = i - (mHasHeader ? 1 : 0);
+ mRow.addView(button, viewIndex);
}
- mRow.addView(button);
PendingIntent pendingIntent = null;
if (rc.getPrimaryAction() != null) {
@@ -335,20 +340,77 @@
public static class Row extends LinearLayout {
+ private static final long ROW_ANIM_DURATION = 350;
+ private final WakeLock mAnimationWakeLock;
+
public Row(Context context) {
- super(context);
+ this(context, null);
}
public Row(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
public Row(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ this(context, attrs, defStyleAttr, 0);
}
public Row(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mAnimationWakeLock = WakeLock.createPartial(context, "slice animation");
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ LayoutTransition transition = new LayoutTransition();
+ transition.setDuration(ROW_ANIM_DURATION);
+ transition.setStagger(LayoutTransition.CHANGING, ROW_ANIM_DURATION);
+ transition.setStagger(LayoutTransition.CHANGE_APPEARING, ROW_ANIM_DURATION);
+ transition.setStagger(LayoutTransition.CHANGE_DISAPPEARING, ROW_ANIM_DURATION);
+
+ PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1);
+ PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1);
+ ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null,
+ left, right);
+ transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator);
+ transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator);
+ transition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
+ Interpolators.ACCELERATE_DECELERATE);
+ transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING,
+ Interpolators.ACCELERATE_DECELERATE);
+ transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, ROW_ANIM_DURATION);
+
+ ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f);
+ transition.setAnimator(LayoutTransition.APPEARING, appearAnimator);
+ transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN);
+
+ ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f);
+ transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
+ transition.setDuration(LayoutTransition.DISAPPEARING, ROW_ANIM_DURATION / 2);
+ transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator);
+
+ transition.setAnimateParentHierarchy(false);
+ setLayoutTransition(transition);
+
+ // This view is visible in AOD, which means that the device will sleep if we
+ // don't hold a wake lock. We want to enter doze only after all views have reached
+ // their desired positions.
+ setLayoutAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ mAnimationWakeLock.acquire();
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ mAnimationWakeLock.release();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+
+ }
+ });
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 8a4f324..ce16efb 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -54,7 +54,6 @@
private static final int MARQUEE_DELAY_MS = 2000;
private final LockPatternUtils mLockPatternUtils;
- private final AlarmManager mAlarmManager;
private final IActivityManager mIActivityManager;
private final float mSmallClockScale;
private final float mWidgetPadding;
@@ -123,7 +122,6 @@
public KeyguardStatusView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mIActivityManager = ActivityManager.getService();
mLockPatternUtils = new LockPatternUtils(getContext());
mHandler = new Handler(Looper.myLooper());
@@ -223,10 +221,7 @@
}
private void refresh() {
- AlarmManager.AlarmClockInfo nextAlarm =
- mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
- Patterns.update(mContext, nextAlarm != null);
-
+ Patterns.update(mContext);
refreshTime();
}
@@ -301,20 +296,16 @@
// DateFormat.getBestDateTimePattern is extremely expensive, and refresh is called often.
// This is an optimization to ensure we only recompute the patterns when the inputs change.
private static final class Patterns {
- static String dateViewSkel;
static String clockView12;
static String clockView24;
static String cacheKey;
- static void update(Context context, boolean hasAlarm) {
+ static void update(Context context) {
final Locale locale = Locale.getDefault();
final Resources res = context.getResources();
- dateViewSkel = res.getString(hasAlarm
- ? R.string.abbrev_wday_month_day_no_year_alarm
- : R.string.abbrev_wday_month_day_no_year);
final String clockView12Skel = res.getString(R.string.clock_12hr_format);
final String clockView24Skel = res.getString(R.string.clock_24hr_format);
- final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel;
+ final String key = locale.toString() + clockView12Skel + clockView24Skel;
if (key.equals(cacheKey)) return;
clockView12 = DateFormat.getBestDateTimePattern(locale, clockView12Skel);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index d24675c..1bab36b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -68,7 +68,6 @@
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.util.Log;
-import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -88,6 +87,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
@@ -400,16 +400,9 @@
// Hack level over 9000: Because the subscription id is not yet valid when we see the
// first update in handleSimStateChange, we need to force refresh all all SIM states
// so the subscription id for them is consistent.
- ArrayList<SubscriptionInfo> changedSubscriptions = new ArrayList<>();
- for (int i = 0; i < subscriptionInfos.size(); i++) {
- SubscriptionInfo info = subscriptionInfos.get(i);
- boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex());
- if (changed) {
- changedSubscriptions.add(info);
- }
- }
- for (int i = 0; i < changedSubscriptions.size(); i++) {
- SimData data = mSimDatas.get(changedSubscriptions.get(i).getSubscriptionId());
+ List<Integer> changedSubscriptionIds = refreshSimState(subscriptionInfos);
+ for (int i = 0; i < changedSubscriptionIds.size(); i++) {
+ SimData data = mSimDatas.get(changedSubscriptionIds.get(i));
for (int j = 0; j < mCallbacks.size(); j++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
if (cb != null) {
@@ -1846,34 +1839,56 @@
};
/**
- * @return true if and only if the state has changed for the specified {@code slotId}
+ * @return A list of changed subscriptions, maybe empty but never null
*/
- private boolean refreshSimState(int subId, int slotId) {
+ private List<Integer> refreshSimState(final List<SubscriptionInfo> activeSubscriptionInfos) {
// This is awful. It exists because there are two APIs for getting the SIM status
// that don't return the complete set of values and have different types. In Keyguard we
// need IccCardConstants, but TelephonyManager would only give us
// TelephonyManager.SIM_STATE*, so we retrieve it manually.
final TelephonyManager tele = TelephonyManager.from(mContext);
- int simState = tele.getSimState(slotId);
- State state;
- try {
- state = State.intToState(simState);
- } catch(IllegalArgumentException ex) {
- Log.w(TAG, "Unknown sim state: " + simState);
- state = State.UNKNOWN;
+ ArrayList<Integer> changedSubscriptionIds = new ArrayList<>();
+ HashSet<Integer> activeSubIds = new HashSet<>();
+
+ for (SubscriptionInfo info : activeSubscriptionInfos) {
+ int subId = info.getSubscriptionId();
+ int slotId = info.getSimSlotIndex();
+ int simState = tele.getSimState(slotId);
+ State state;
+ try {
+ state = State.intToState(simState);
+ } catch(IllegalArgumentException ex) {
+ Log.w(TAG, "Unknown sim state: " + simState);
+ state = State.UNKNOWN;
+ }
+
+ SimData data = mSimDatas.get(subId);
+ final boolean changed;
+ if (data == null) {
+ data = new SimData(state, slotId, subId);
+ mSimDatas.put(subId, data);
+ changed = true; // no data yet; force update
+ } else {
+ changed = data.simState != state;
+ data.simState = state;
+ }
+ if (changed) {
+ changedSubscriptionIds.add(subId);
+ }
+
+ activeSubIds.add(subId);
}
- SimData data = mSimDatas.get(subId);
- final boolean changed;
- if (data == null) {
- data = new SimData(state, slotId, subId);
- mSimDatas.put(subId, data);
- changed = true; // no data yet; force update
- } else {
- changed = data.simState != state;
- data.simState = state;
+
+ for (SimData data : mSimDatas.values()) {
+ if (!activeSubIds.contains(data.subId) && data.simState != State.ABSENT) {
+ // for the inactive subscriptions, reset state to ABSENT
+ data.simState = State.ABSENT;
+ changedSubscriptionIds.add(data.subId);
+ }
}
- return changed;
+
+ return changedSubscriptionIds;
}
public static boolean isSimPinSecure(IccCardConstants.State state) {
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index a59c97e..a4f8d8c 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -24,11 +24,13 @@
import android.graphics.RectF;
import android.graphics.Region.Op;
import android.os.AsyncTask;
+import android.os.Handler;
import android.os.Trace;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.WindowManager;
@@ -45,6 +47,7 @@
private static final String GL_LOG_TAG = "ImageWallpaperGL";
private static final boolean DEBUG = false;
private static final String PROPERTY_KERNEL_QEMU = "ro.kernel.qemu";
+ private static final long DELAY_FORGET_WALLPAPER = 5000;
private WallpaperManager mWallpaperManager;
private DrawableEngine mEngine;
@@ -69,6 +72,10 @@
}
class DrawableEngine extends Engine {
+ private final Runnable mUnloadWallpaperCallback = () -> {
+ unloadWallpaper(false /* forgetSize */);
+ };
+
Bitmap mBackground;
int mBackgroundWidth = -1, mBackgroundHeight = -1;
int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1;
@@ -331,6 +338,7 @@
}
drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
+ scheduleUnloadWallpaper();
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
@@ -433,6 +441,9 @@
mBackgroundHeight = -1;
}
+ final Surface surface = getSurfaceHolder().getSurface();
+ surface.hwuiDestroy();
+
mLoader = new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... params) {
@@ -442,6 +453,12 @@
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
+ private void scheduleUnloadWallpaper() {
+ Handler handler = getMainThreadHandler();
+ handler.removeCallbacks(mUnloadWallpaperCallback);
+ handler.postDelayed(mUnloadWallpaperCallback, DELAY_FORGET_WALLPAPER);
+ }
+
@Override
protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
super.dump(prefix, fd, out, args);
diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
index a4af6b2..8e59842 100644
--- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
@@ -22,6 +22,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
import android.graphics.Rect;
import android.os.Binder;
import android.os.Handler;
@@ -39,6 +40,7 @@
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.recents.ISystemUiProxy;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.GraphicBufferCompat;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.CallbackController;
@@ -50,6 +52,7 @@
import java.util.ArrayList;
import java.util.List;
+import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP;
import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType;
/**
@@ -57,6 +60,8 @@
*/
public class OverviewProxyService implements CallbackController<OverviewProxyListener>, Dumpable {
+ private static final String ACTION_QUICKSTEP = "android.intent.action.QUICKSTEP_SERVICE";
+
public static final String TAG_OPS = "OverviewProxyService";
public static final boolean DEBUG_OVERVIEW_PROXY = false;
private static final long BACKOFF_MILLIS = 5000;
@@ -64,15 +69,17 @@
private final Context mContext;
private final Handler mHandler;
private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser;
- private final ComponentName mLauncherComponentName;
+ private final ComponentName mRecentsComponentName;
private final DeviceProvisionedController mDeviceProvisionedController
= Dependency.get(DeviceProvisionedController.class);
private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>();
+ private final Intent mQuickStepIntent;
private IOverviewProxy mOverviewProxy;
private int mConnectionBackoffAttempts;
private CharSequence mOnboardingText;
private @InteractionType int mInteractionFlags;
+ private boolean mIsEnabled;
private ISystemUiProxy mSysUiProxy = new ISystemUiProxy.Stub() {
@@ -127,14 +134,23 @@
});
}
} finally {
+ Prefs.putInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS, mInteractionFlags);
Binder.restoreCallingIdentity(token);
}
}
};
- private final BroadcastReceiver mLauncherAddedReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mLauncherStateChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ updateEnabledState();
+
+ // When launcher service is disabled, reset interaction flags because it is inactive
+ if (!isEnabled()) {
+ mInteractionFlags = 0;
+ Prefs.remove(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS);
+ }
+
// Reconnect immediately, instead of waiting for resume to arrive.
startConnectionToCurrentUser();
}
@@ -191,19 +207,23 @@
mContext = context;
mHandler = new Handler();
mConnectionBackoffAttempts = 0;
- mLauncherComponentName = ComponentName
- .unflattenFromString(context.getString(R.string.config_overviewServiceComponent));
+ mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
+ com.android.internal.R.string.config_recentsComponentName));
+ mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
+ .setPackage(mRecentsComponentName.getPackageName());
+ mInteractionFlags = Prefs.getInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS, 0);
// Listen for the package update changes.
if (SystemServicesProxy.getInstance(context)
.isSystemUser(mDeviceProvisionedController.getCurrentUser())) {
+ updateEnabledState();
mDeviceProvisionedController.addCallback(mDeviceProvisionedCallback);
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addDataScheme("package");
- filter.addDataSchemeSpecificPart(mLauncherComponentName.getPackageName(),
+ filter.addDataSchemeSpecificPart(mRecentsComponentName.getPackageName(),
PatternMatcher.PATTERN_LITERAL);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- mContext.registerReceiver(mLauncherAddedReceiver, filter);
+ mContext.registerReceiver(mLauncherStateChangedReceiver, filter);
}
}
@@ -219,15 +239,20 @@
disconnectFromLauncherService();
// If user has not setup yet or already connected, do not try to connect
- if (!mDeviceProvisionedController.isCurrentUserSetup()) {
+ if (!mDeviceProvisionedController.isCurrentUserSetup() || !isEnabled()) {
return;
}
mHandler.removeCallbacks(mConnectionRunnable);
- Intent launcherServiceIntent = new Intent();
- launcherServiceIntent.setComponent(mLauncherComponentName);
- boolean bound = mContext.bindServiceAsUser(launcherServiceIntent,
- mOverviewServiceConnection, Context.BIND_AUTO_CREATE,
- UserHandle.of(mDeviceProvisionedController.getCurrentUser()));
+ Intent launcherServiceIntent = new Intent(ACTION_QUICKSTEP)
+ .setPackage(mRecentsComponentName.getPackageName());
+ boolean bound = false;
+ try {
+ bound = mContext.bindServiceAsUser(launcherServiceIntent,
+ mOverviewServiceConnection, Context.BIND_AUTO_CREATE,
+ UserHandle.of(mDeviceProvisionedController.getCurrentUser()));
+ } catch (SecurityException e) {
+ Log.e(TAG_OPS, "Unable to bind because of security error", e);
+ }
if (!bound) {
// Retry after exponential backoff timeout
final long timeoutMs = (long) Math.scalb(BACKOFF_MILLIS, mConnectionBackoffAttempts);
@@ -240,6 +265,7 @@
public void addCallback(OverviewProxyListener listener) {
mConnectionCallbacks.add(listener);
listener.onConnectionChanged(mOverviewProxy != null);
+ listener.onInteractionFlagsChanged(mInteractionFlags);
}
@Override
@@ -247,6 +273,14 @@
mConnectionCallbacks.remove(listener);
}
+ public boolean shouldShowSwipeUpUI() {
+ return isEnabled() && ((mInteractionFlags & FLAG_DISABLE_SWIPE_UP) == 0);
+ }
+
+ public boolean isEnabled() {
+ return mIsEnabled;
+ }
+
public IOverviewProxy getProxy() {
return mOverviewProxy;
}
@@ -280,6 +314,11 @@
}
}
+ private void updateEnabledState() {
+ mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent, 0,
+ ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(TAG_OPS + " state:");
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index 1a9655e..7f7a769 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -53,7 +53,9 @@
Key.NUM_APPS_LAUNCHED,
Key.HAS_SEEN_RECENTS_ONBOARDING,
Key.SEEN_RINGER_GUIDANCE_COUNT,
- Key.QS_HAS_TURNED_OFF_MOBILE_DATA
+ Key.QS_HAS_TURNED_OFF_MOBILE_DATA,
+ Key.TOUCHED_RINGER_TOGGLE,
+ Key.QUICK_STEP_INTERACTION_FLAGS
})
public @interface Key {
@Deprecated
@@ -91,6 +93,8 @@
String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed";
String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData";
+ String TOUCHED_RINGER_TOGGLE = "TouchedRingerToggle";
+ String QUICK_STEP_INTERACTION_FLAGS = "QuickStepInteractionFlags";
}
public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 2c0e95b..a61ce8c 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -29,30 +29,16 @@
import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
-import android.util.TimingsTraceLog;
import android.util.Log;
+import android.util.TimingsTraceLog;
-import com.android.systemui.globalactions.GlobalActionsComponent;
-import com.android.systemui.keyboard.KeyboardUI;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.media.RingtonePlayer;
-import com.android.systemui.pip.PipUI;
import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginManager;
-import com.android.systemui.power.PowerUI;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.shortcut.ShortcutKeyDispatcher;
-import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowManager;
-import com.android.systemui.usb.StorageNotification;
import com.android.systemui.util.NotificationChannels;
-import com.android.systemui.util.leak.GarbageMonitor;
-import com.android.systemui.volume.VolumeUI;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -99,6 +85,10 @@
mServices[i].onBootCompleted();
}
}
+
+ IntentFilter localeChangedFilter = new IntentFilter(
+ Intent.ACTION_LOCALE_CHANGED);
+ registerReceiver(mLocaleChangeReceiver, localeChangedFilter);
}
}, filter);
} else {
@@ -249,4 +239,14 @@
public SystemUI[] getServices() {
return mServices;
}
+
+ private final BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
+ // Update names of SystemUi notification channels
+ NotificationChannels.createAll(context);
+ }
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 391843c..039e7b5 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -31,6 +31,7 @@
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.statusbar.KeyguardIndicationController;
+import com.android.systemui.statusbar.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.NotificationEntryManager;
import com.android.systemui.statusbar.NotificationGutsManager;
import com.android.systemui.statusbar.NotificationListener;
@@ -130,6 +131,8 @@
providers.put(NotificationGroupManager.class, NotificationGroupManager::new);
providers.put(NotificationMediaManager.class, () -> new NotificationMediaManager(context));
providers.put(NotificationGutsManager.class, () -> new NotificationGutsManager(context));
+ providers.put(NotificationBlockingHelperManager.class,
+ () -> new NotificationBlockingHelperManager(context));
providers.put(NotificationRemoteInputManager.class,
() -> new NotificationRemoteInputManager(context));
providers.put(SmartReplyConstants.class,
diff --git a/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java
index 245d240..9459ce1 100644
--- a/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java
@@ -21,6 +21,8 @@
import com.android.systemui.Dependency.DependencyProvider;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.NotificationEntryManager;
+import com.android.systemui.statusbar.car.CarFacetButtonController;
+import com.android.systemui.statusbar.car.hvac.HvacController;
/**
* Class factory to provide car specific SystemUI components.
@@ -32,5 +34,7 @@
super.injectDependencies(providers, context);
providers.put(NotificationEntryManager.class,
() -> new CarNotificationEntryManager(context));
+ providers.put(CarFacetButtonController.class, () -> new CarFacetButtonController(context));
+ providers.put(HvacController.class, () -> new HvacController(context));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
index e18ac74..cdf4ba7 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
@@ -16,6 +16,9 @@
package com.android.systemui.classifier;
+import android.os.Build;
+import android.os.SystemProperties;
+import android.util.Log;
import android.view.MotionEvent;
import java.util.ArrayList;
@@ -49,13 +52,18 @@
public class AnglesClassifier extends StrokeClassifier {
private HashMap<Stroke, Data> mStrokeMap = new HashMap<>();
+ public static final boolean VERBOSE = SystemProperties.getBoolean("debug.falsing_log.ang",
+ Build.IS_DEBUGGABLE);
+
+ private static String TAG = "ANG";
+
public AnglesClassifier(ClassifierData classifierData) {
mClassifierData = classifierData;
}
@Override
public String getTag() {
- return "ANG";
+ return TAG;
}
@Override
@@ -170,18 +178,31 @@
public float getAnglesVariance() {
float anglesVariance = getAnglesVariance(mSumSquares, mSum, mCount);
+ if (VERBOSE) {
+ FalsingLog.i(TAG, "getAnglesVariance: (first pass) " + anglesVariance);
+ FalsingLog.i(TAG, " - mFirstLength=" + mFirstLength);
+ FalsingLog.i(TAG, " - mLength=" + mLength);
+ }
if (mFirstLength < mLength / 2f) {
anglesVariance = Math.min(anglesVariance, mFirstAngleVariance
+ getAnglesVariance(mSecondSumSquares, mSecondSum, mSecondCount));
+ if (VERBOSE) FalsingLog.i(TAG, "getAnglesVariance: (second pass) " + anglesVariance);
}
return anglesVariance;
}
public float getAnglesPercentage() {
if (mAnglesCount == 0.0f) {
+ if (VERBOSE) FalsingLog.i(TAG, "getAnglesPercentage: count==0, result=1");
return 1.0f;
}
- return (Math.max(mLeftAngles, mRightAngles) + mStraightAngles) / mAnglesCount;
+ final float result = (Math.max(mLeftAngles, mRightAngles) + mStraightAngles) / mAnglesCount;
+ if (VERBOSE) {
+ FalsingLog.i(TAG, "getAnglesPercentage: left=" + mLeftAngles + " right="
+ + mRightAngles + " straight=" + mStraightAngles + " count=" + mAnglesCount
+ + " result=" + result);
+ }
+ return result;
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java b/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
index 6883dd0..5f6c1b7 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
@@ -20,8 +20,6 @@
public static float evaluate(float value, int type) {
final boolean secureUnlock = type == Classifier.BOUNCER_UNLOCK;
float evaluation = 0.0f;
- if (value > 0.05) evaluation++;
- if (value > 0.10) evaluation++;
if (value > 0.20) evaluation++;
if (value > 0.40 && !secureUnlock) evaluation++;
if (value > 0.80 && !secureUnlock) evaluation++;
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
index 6df72b1..66f0cf6 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
@@ -16,6 +16,8 @@
package com.android.systemui.classifier;
+import android.os.Build;
+import android.os.SystemProperties;
import android.view.MotionEvent;
import java.util.ArrayList;
@@ -34,6 +36,10 @@
* should be in this interval.
*/
public class SpeedAnglesClassifier extends StrokeClassifier {
+ public static final boolean VERBOSE = SystemProperties.getBoolean("debug.falsing_log.spd_ang",
+ Build.IS_DEBUGGABLE);
+ public static final String TAG = "SPD_ANG";
+
private HashMap<Stroke, Data> mStrokeMap = new HashMap<>();
public SpeedAnglesClassifier(ClassifierData classifierData) {
@@ -42,7 +48,7 @@
@Override
public String getTag() {
- return "SPD_ANG";
+ return TAG;
}
@Override
@@ -135,14 +141,24 @@
}
public float getAnglesVariance() {
- return mSumSquares / mCount - (mSum / mCount) * (mSum / mCount);
+ final float v = mSumSquares / mCount - (mSum / mCount) * (mSum / mCount);
+ if (VERBOSE) {
+ FalsingLog.i(TAG, "getAnglesVariance: sum^2=" + mSumSquares
+ + " count=" + mCount + " result=" + v);
+ }
+ return v;
}
public float getAnglesPercentage() {
if (mAnglesCount == 0.0f) {
return 1.0f;
}
- return (mAcceleratingAngles) / mAnglesCount;
+ final float v = (mAcceleratingAngles) / mAnglesCount;
+ if (VERBOSE) {
+ FalsingLog.i(TAG, "getAnglesPercentage: angles=" + mAcceleratingAngles
+ + " count=" + mAnglesCount + " result=" + v);
+ }
+ return v;
}
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
index 4b15fbc..3577c0f 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
@@ -18,8 +18,8 @@
import android.content.Context;
import android.content.pm.PackageManager;
-import android.hardware.fingerprint.FingerprintDialog;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
+import android.hardware.biometrics.BiometricDialog;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -48,7 +48,7 @@
private FingerprintDialogView mDialogView;
private WindowManager mWindowManager;
- private IFingerprintDialogReceiver mReceiver;
+ private IBiometricDialogReceiver mReceiver;
private boolean mDialogShowing;
private Handler mHandler = new Handler() {
@@ -97,7 +97,7 @@
}
@Override
- public void showFingerprintDialog(Bundle bundle, IFingerprintDialogReceiver receiver) {
+ public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
if (DEBUG) Log.d(TAG, "showFingerprintDialog");
// Remove these messages as they are part of the previous client
mHandler.removeMessages(MSG_FINGERPRINT_ERROR);
@@ -139,7 +139,7 @@
Log.w(TAG, "Dialog already showing");
return;
}
- mReceiver = (IFingerprintDialogReceiver) args.arg2;
+ mReceiver = (IBiometricDialogReceiver) args.arg2;
mDialogView.setBundle((Bundle)args.arg1);
mWindowManager.addView(mDialogView, mDialogView.getLayoutParams());
mDialogShowing = true;
@@ -147,6 +147,9 @@
private void handleFingerprintAuthenticated() {
if (DEBUG) Log.d(TAG, "handleFingerprintAuthenticated");
+ mDialogView.announceForAccessibility(
+ mContext.getResources().getText(
+ com.android.internal.R.string.fingerprint_authenticated));
handleHideDialog(false /* userCanceled */);
}
@@ -174,7 +177,7 @@
}
if (userCanceled) {
try {
- mReceiver.onDialogDismissed(FingerprintDialog.DISMISSED_REASON_USER_CANCEL);
+ mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_USER_CANCEL);
} catch (RemoteException e) {
Log.e(TAG, "RemoteException when hiding dialog", e);
}
@@ -190,7 +193,7 @@
return;
}
try {
- mReceiver.onDialogDismissed(FingerprintDialog.DISMISSED_REASON_NEGATIVE);
+ mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_NEGATIVE);
} catch (RemoteException e) {
Log.e(TAG, "Remote exception when handling negative button", e);
}
@@ -203,7 +206,7 @@
return;
}
try {
- mReceiver.onDialogDismissed(FingerprintDialog.DISMISSED_REASON_POSITIVE);
+ mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_POSITIVE);
} catch (RemoteException e) {
Log.e(TAG, "Remote exception when handling positive button", e);
}
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
index ebdc703..95258b0 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
@@ -23,7 +23,7 @@
import android.graphics.PorterDuff;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
-import android.hardware.fingerprint.FingerprintDialog;
+import android.hardware.biometrics.BiometricDialog;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -55,7 +55,8 @@
private static final String TAG = "FingerprintDialogView";
- private static final int ANIMATION_DURATION = 250; // ms
+ private static final int ANIMATION_DURATION_SHOW = 250; // ms
+ private static final int ANIMATION_DURATION_AWAY = 350; // ms
private static final int STATE_NONE = 0;
private static final int STATE_FINGERPRINT = 1;
@@ -162,14 +163,29 @@
mLastState = STATE_NONE;
updateFingerprintIcon(STATE_FINGERPRINT);
- title.setText(mBundle.getCharSequence(FingerprintDialog.KEY_TITLE));
+ title.setText(mBundle.getCharSequence(BiometricDialog.KEY_TITLE));
title.setSelected(true);
- subtitle.setText(mBundle.getCharSequence(FingerprintDialog.KEY_SUBTITLE));
- description.setText(mBundle.getCharSequence(FingerprintDialog.KEY_DESCRIPTION));
- negative.setText(mBundle.getCharSequence(FingerprintDialog.KEY_NEGATIVE_TEXT));
+
+ final CharSequence subtitleText = mBundle.getCharSequence(BiometricDialog.KEY_SUBTITLE);
+ if (subtitleText == null) {
+ subtitle.setVisibility(View.GONE);
+ } else {
+ subtitle.setVisibility(View.VISIBLE);
+ subtitle.setText(subtitleText);
+ }
+
+ final CharSequence descriptionText = mBundle.getCharSequence(BiometricDialog.KEY_DESCRIPTION);
+ if (descriptionText == null) {
+ subtitle.setVisibility(View.VISIBLE);
+ description.setVisibility(View.GONE);
+ } else {
+ description.setText(mBundle.getCharSequence(BiometricDialog.KEY_DESCRIPTION));
+ }
+
+ negative.setText(mBundle.getCharSequence(BiometricDialog.KEY_NEGATIVE_TEXT));
final CharSequence positiveText =
- mBundle.getCharSequence(FingerprintDialog.KEY_POSITIVE_TEXT);
+ mBundle.getCharSequence(BiometricDialog.KEY_POSITIVE_TEXT);
positive.setText(positiveText); // needs to be set for marquee to work
if (positiveText != null) {
positive.setVisibility(View.VISIBLE);
@@ -185,13 +201,13 @@
public void run() {
mLayout.animate()
.alpha(1f)
- .setDuration(ANIMATION_DURATION)
+ .setDuration(ANIMATION_DURATION_SHOW)
.setInterpolator(mLinearOutSlowIn)
.withLayer()
.start();
mDialog.animate()
.translationY(0)
- .setDuration(ANIMATION_DURATION)
+ .setDuration(ANIMATION_DURATION_SHOW)
.setInterpolator(mLinearOutSlowIn)
.withLayer()
.start();
@@ -221,13 +237,13 @@
public void run() {
mLayout.animate()
.alpha(0f)
- .setDuration(ANIMATION_DURATION)
+ .setDuration(ANIMATION_DURATION_AWAY)
.setInterpolator(mLinearOutSlowIn)
.withLayer()
.start();
mDialog.animate()
.translationY(mAnimationTranslationOffset)
- .setDuration(ANIMATION_DURATION)
+ .setDuration(ANIMATION_DURATION_AWAY)
.setInterpolator(mLinearOutSlowIn)
.withLayer()
.withEndAction(endActionRunnable)
@@ -255,7 +271,7 @@
mErrorText.setTextColor(mErrorTextColor);
mErrorText.setContentDescription(message);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_CLEAR_MESSAGE),
- FingerprintDialog.HIDE_DIALOG_DELAY);
+ BiometricDialog.HIDE_DIALOG_DELAY);
}
public void showHelpMessage(String message) {
@@ -265,7 +281,7 @@
public void showErrorMessage(String error) {
showTemporaryMessage(error);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_HIDE_DIALOG,
- false /* userCanceled */), FingerprintDialog.HIDE_DIALOG_DELAY);
+ false /* userCanceled */), BiometricDialog.HIDE_DIALOG_DELAY);
}
private void updateFingerprintIcon(int newState) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index b8411e2..9464105 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -611,6 +611,9 @@
@Override
public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice,
int bluetoothProfile) { }
+
+ @Override
+ public void onProfileAudioStateChanged(int bluetoothProfile, int state) { }
}
private final class BluetoothErrorListener implements Utils.ErrorListener {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index a1b17e4..d6e59c7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -27,7 +27,6 @@
import android.app.ActivityManager;
import android.app.AlarmManager;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.trust.TrustManager;
@@ -235,6 +234,9 @@
// answer whether the input should be restricted)
private boolean mShowing;
+ // AOD is enabled and status bar is in AOD state.
+ private boolean mAodShowing;
+
// display id of the secondary display on which we have put a keyguard window
private int mSecondaryDisplayShowing = INVALID_DISPLAY;
@@ -664,7 +666,7 @@
@Override
public void onSecondaryDisplayShowingChanged(int displayId) {
synchronized (KeyguardViewMediator.this) {
- setShowingLocked(mShowing, displayId, false);
+ setShowingLocked(mShowing, mAodShowing, displayId, false);
}
}
};
@@ -707,10 +709,10 @@
setShowingLocked(!shouldWaitForProvisioning()
&& !mLockPatternUtils.isLockScreenDisabled(
KeyguardUpdateMonitor.getCurrentUser()),
- mSecondaryDisplayShowing, true /* forceCallbacks */);
+ mAodShowing, mSecondaryDisplayShowing, true /* forceCallbacks */);
} else {
// The system's keyguard is disabled or missing.
- setShowingLocked(false, mSecondaryDisplayShowing, true);
+ setShowingLocked(false, mAodShowing, mSecondaryDisplayShowing, true);
}
mStatusBarKeyguardViewManager =
@@ -1311,7 +1313,7 @@
if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) {
if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted");
// Without this, settings is not enabled until the lock screen first appears
- setShowingLocked(false);
+ setShowingLocked(false, mAodShowing);
hideLocked();
return;
}
@@ -1713,10 +1715,12 @@
playSound(mTrustedSoundId);
}
- private void updateActivityLockScreenState(boolean showing, int secondaryDisplayShowing) {
+ private void updateActivityLockScreenState(boolean showing, boolean aodShowing,
+ int secondaryDisplayShowing) {
mUiOffloadThread.submit(() -> {
try {
- ActivityManager.getService().setLockScreenShown(showing, secondaryDisplayShowing);
+ ActivityManager.getService().setLockScreenShown(showing, aodShowing,
+ secondaryDisplayShowing);
} catch (RemoteException e) {
}
});
@@ -1740,7 +1744,7 @@
if (DEBUG) Log.d(TAG, "handleShow");
}
- setShowingLocked(true);
+ setShowingLocked(true, mAodShowing);
mStatusBarKeyguardViewManager.show(options);
mHiding = false;
mWakeAndUnlocking = false;
@@ -1849,7 +1853,7 @@
}
mWakeAndUnlocking = false;
- setShowingLocked(false);
+ setShowingLocked(false, mAodShowing);
mDismissCallbackRegistry.notifyDismissSucceeded();
mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration);
resetKeyguardDonePendingLocked();
@@ -1909,7 +1913,7 @@
Trace.beginSection("KeyguardViewMediator#handleVerifyUnlock");
synchronized (KeyguardViewMediator.this) {
if (DEBUG) Log.d(TAG, "handleVerifyUnlock");
- setShowingLocked(true);
+ setShowingLocked(true, mAodShowing);
mStatusBarKeyguardViewManager.dismissAndCollapse();
}
Trace.endSection();
@@ -2064,6 +2068,10 @@
pw.print(" mDrawnCallback: "); pw.println(mDrawnCallback);
}
+ public void setAodShowing(boolean aodShowing) {
+ setShowingLocked(mShowing, aodShowing);
+ }
+
private static class StartKeyguardExitAnimParams {
long startTime;
@@ -2075,20 +2083,23 @@
}
}
- private void setShowingLocked(boolean showing) {
- setShowingLocked(showing, mSecondaryDisplayShowing, false /* forceCallbacks */);
+ private void setShowingLocked(boolean showing, boolean aodShowing) {
+ setShowingLocked(showing, aodShowing, mSecondaryDisplayShowing,
+ false /* forceCallbacks */);
}
- private void setShowingLocked(
- boolean showing, int secondaryDisplayShowing, boolean forceCallbacks) {
- final boolean notifyDefaultDisplayCallbacks = showing != mShowing || forceCallbacks;
+ private void setShowingLocked(boolean showing, boolean aodShowing, int secondaryDisplayShowing,
+ boolean forceCallbacks) {
+ final boolean notifyDefaultDisplayCallbacks = showing != mShowing
+ || aodShowing != mAodShowing || forceCallbacks;
if (notifyDefaultDisplayCallbacks || secondaryDisplayShowing != mSecondaryDisplayShowing) {
mShowing = showing;
+ mAodShowing = aodShowing;
mSecondaryDisplayShowing = secondaryDisplayShowing;
if (notifyDefaultDisplayCallbacks) {
notifyDefaultDisplayCallbacks(showing);
}
- updateActivityLockScreenState(showing, secondaryDisplayShowing);
+ updateActivityLockScreenState(showing, aodShowing, secondaryDisplayShowing);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 3ba3d0e..a0bdcd0 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -284,14 +284,19 @@
// Defer the update of the current movement bounds until after the user finishes
// touching the screen
} else {
- final Rect toMovementBounds = mMenuState == MENU_STATE_FULL
- ? expandedMovementBounds
- : normalMovementBounds;
- animateToOffset(animatingBounds, toMovementBounds,
- fromImeAdjustment,
- fromImeAdjustment ? mIsImeShowing : mIsShelfShowing,
- // Shelf height serves as an offset, but does not change movement bounds.
- fromImeAdjustment ? mImeOffset : mShelfHeight);
+ final int adjustedOffset = Math.max(mIsImeShowing ? mImeHeight + mImeOffset : 0,
+ mIsShelfShowing ? mShelfHeight : 0);
+ Rect normalAdjustedBounds = new Rect();
+ mSnapAlgorithm.getMovementBounds(mNormalBounds, insetBounds, normalAdjustedBounds,
+ adjustedOffset);
+ Rect expandedAdjustedBounds = new Rect();
+ mSnapAlgorithm.getMovementBounds(mExpandedBounds, insetBounds,
+ expandedAdjustedBounds, adjustedOffset);
+ final Rect toAdjustedBounds = mMenuState == MENU_STATE_FULL
+ ? expandedAdjustedBounds
+ : normalAdjustedBounds;
+
+ animateToOffset(animatingBounds, toAdjustedBounds);
}
}
@@ -313,23 +318,16 @@
}
}
- private void animateToOffset(Rect animatingBounds, Rect toMovementBounds,
- boolean fromImeAdjustment, boolean showing, int offset) {
+ private void animateToOffset(Rect animatingBounds, Rect toAdjustedBounds) {
final Rect bounds = new Rect(animatingBounds);
- if (showing) {
- // IME/shelf visible, apply the IME/shelf offset if the space allows for it
- final int calculatedOffset = toMovementBounds.bottom - Math.max(toMovementBounds.top,
- toMovementBounds.bottom - offset);
- bounds.offset(0,
- Math.min(0, toMovementBounds.bottom - calculatedOffset - bounds.top));
- } else {
- // IME/shelf hidden
- if (bounds.top >= (mMovementBounds.bottom - offset)) {
- bounds.offset(0, toMovementBounds.bottom - bounds.top -
- // Counter going back home from search where keyboard is up.
- (fromImeAdjustment ? mShelfHeight : 0));
- }
+ if (toAdjustedBounds.bottom < mMovementBounds.bottom
+ && bounds.top < toAdjustedBounds.bottom) {
+ return;
}
+ bounds.offset(0, toAdjustedBounds.bottom - bounds.top);
+ // In landscape mode, PIP window can go offset while launching IME. We want to align the
+ // the top of the PIP window with the top of the movement bounds in that case.
+ bounds.offset(0, Math.max(0, mMovementBounds.top - bounds.top));
mMotionHelper.animateToOffset(bounds);
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 8d93157..49b00ce 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -21,9 +21,6 @@
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioAttributes;
@@ -52,15 +49,18 @@
private static final String TAG_BATTERY = "low_battery";
private static final String TAG_TEMPERATURE = "high_temp";
+ private static final String TAG_AUTO_SAVER = "auto_saver";
private static final int SHOWING_NOTHING = 0;
private static final int SHOWING_WARNING = 1;
private static final int SHOWING_INVALID_CHARGER = 3;
+ private static final int SHOWING_AUTO_SAVER_SUGGESTION = 4;
private static final String[] SHOWING_STRINGS = {
"SHOWING_NOTHING",
"SHOWING_WARNING",
"SHOWING_SAVER",
"SHOWING_INVALID_CHARGER",
+ "SHOWING_AUTO_SAVER_SUGGESTION",
};
private static final String ACTION_SHOW_BATTERY_SETTINGS = "PNW.batterySettings";
@@ -74,6 +74,18 @@
"PNW.dismissedThermalShutdownWarning";
private static final String ACTION_SHOW_START_SAVER_CONFIRMATION =
BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION;
+ private static final String ACTION_SHOW_AUTO_SAVER_SUGGESTION =
+ BatterySaverUtils.ACTION_SHOW_AUTO_SAVER_SUGGESTION;
+ private static final String ACTION_DISMISS_AUTO_SAVER_SUGGESTION =
+ "PNW.dismissAutoSaverSuggestion";
+
+ private static final String ACTION_ENABLE_AUTO_SAVER =
+ "PNW.enableAutoSaver";
+ private static final String ACTION_AUTO_SAVER_NO_THANKS =
+ "PNW.autoSaverNoThanks";
+
+ private static final String SETTINGS_ACTION_OPEN_BATTERY_SAVER_SETTING =
+ "android.settings.BATTERY_SAVER_SETTINGS";
private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
@@ -98,9 +110,11 @@
private long mLowWarningThreshold;
private long mSevereWarningThreshold;
private boolean mWarning;
+ private boolean mShowAutoSaverSuggestion;
private boolean mPlaySound;
private boolean mInvalidCharger;
private SystemUIDialog mSaverConfirmation;
+ private SystemUIDialog mSaverEnabledConfirmation;
private boolean mHighTempWarning;
private SystemUIDialog mHighTempDialog;
private SystemUIDialog mThermalShutdownDialog;
@@ -119,12 +133,19 @@
pw.print("mInvalidCharger="); pw.println(mInvalidCharger);
pw.print("mShowing="); pw.println(SHOWING_STRINGS[mShowing]);
pw.print("mSaverConfirmation="); pw.println(mSaverConfirmation != null ? "not null" : null);
+ pw.print("mSaverEnabledConfirmation=");
+ pw.println(mSaverEnabledConfirmation != null ? "not null" : null);
pw.print("mHighTempWarning="); pw.println(mHighTempWarning);
pw.print("mHighTempDialog="); pw.println(mHighTempDialog != null ? "not null" : null);
pw.print("mThermalShutdownDialog=");
pw.println(mThermalShutdownDialog != null ? "not null" : null);
}
+ private int getLowBatteryAutoTriggerDefaultLevel() {
+ return mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryAutoTriggerDefaultLevel);
+ }
+
@Override
public void update(int batteryLevel, int bucket, long screenOffTime) {
mBatteryLevel = batteryLevel;
@@ -151,7 +172,6 @@
mSevereWarningThreshold = severeThreshold;
}
-
private void updateNotification() {
if (DEBUG) Slog.d(TAG, "updateNotification mWarning=" + mWarning + " mPlaySound="
+ mPlaySound + " mInvalidCharger=" + mInvalidCharger);
@@ -161,9 +181,14 @@
} else if (mWarning) {
showWarningNotification();
mShowing = SHOWING_WARNING;
+ } else if (mShowAutoSaverSuggestion) {
+ showAutoSaverSuggestionNotification();
+ mShowing = SHOWING_AUTO_SAVER_SUGGESTION;
} else {
mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, UserHandle.ALL);
mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, UserHandle.ALL);
+ mNoMan.cancelAsUser(TAG_AUTO_SAVER,
+ SystemMessage.NOTE_AUTO_SAVER_SUGGESTION, UserHandle.ALL);
mShowing = SHOWING_NOTHING;
}
}
@@ -229,6 +254,28 @@
mNoMan.notifyAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, n, UserHandle.ALL);
}
+ private void showAutoSaverSuggestionNotification() {
+ final Notification.Builder nb =
+ new Notification.Builder(mContext, NotificationChannels.HINTS)
+ .setSmallIcon(R.drawable.ic_power_saver)
+ .setWhen(0)
+ .setShowWhen(false)
+ .setContentTitle(mContext.getString(R.string.auto_saver_title))
+ .setContentText(mContext.getString(R.string.auto_saver_text,
+ getLowBatteryAutoTriggerDefaultLevel()));
+ nb.setContentIntent(pendingBroadcast(ACTION_ENABLE_AUTO_SAVER));
+ nb.setDeleteIntent(pendingBroadcast(ACTION_DISMISS_AUTO_SAVER_SUGGESTION));
+ nb.addAction(0,
+ mContext.getString(R.string.no_auto_saver_action),
+ pendingBroadcast(ACTION_AUTO_SAVER_NO_THANKS));
+
+ SystemUI.overrideNotificationAppName(mContext, nb, false);
+
+ final Notification n = nb.build();
+ mNoMan.notifyAsUser(
+ TAG_AUTO_SAVER, SystemMessage.NOTE_AUTO_SAVER_SUGGESTION, n, UserHandle.ALL);
+ }
+
private String getHybridContentString(String percentage) {
return PowerUtil.getBatteryRemainingStringFormatted(
mContext,
@@ -238,8 +285,8 @@
}
private PendingIntent pendingBroadcast(String action) {
- return PendingIntent.getBroadcastAsUser(mContext,
- 0, new Intent(action), 0, UserHandle.CURRENT);
+ return PendingIntent.getBroadcastAsUser(mContext, 0,
+ new Intent(action).setPackage(mContext.getPackageName()), 0, UserHandle.CURRENT);
}
private static Intent settings(String action) {
@@ -394,6 +441,16 @@
updateNotification();
}
+ private void showAutoSaverSuggestion() {
+ mShowAutoSaverSuggestion = true;
+ updateNotification();
+ }
+
+ private void dismissAutoSaverSuggestion() {
+ mShowAutoSaverSuggestion = false;
+ updateNotification();
+ }
+
@Override
public void userSwitched() {
updateNotification();
@@ -405,22 +462,53 @@
d.setTitle(R.string.battery_saver_confirmation_title);
d.setMessage(com.android.internal.R.string.battery_saver_description);
d.setNegativeButton(android.R.string.cancel, null);
- d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverModeNoConfirmation);
+ d.setPositiveButton(R.string.battery_saver_confirmation_ok,
+ (dialog, which) -> setSaverMode(true, false));
d.setShowForAllUsers(true);
- d.setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- mSaverConfirmation = null;
- }
- });
+ d.setOnDismissListener((dialog) -> mSaverConfirmation = null);
d.show();
mSaverConfirmation = d;
}
+ private void showAutoSaverEnabledConfirmation() {
+ if (mSaverEnabledConfirmation != null) return;
+
+ // Open the Battery Saver setting page.
+ final Intent actionBatterySaverSetting =
+ new Intent(SETTINGS_ACTION_OPEN_BATTERY_SAVER_SETTING)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ final SystemUIDialog d = new SystemUIDialog(mContext);
+ d.setTitle(R.string.auto_saver_enabled_title);
+ d.setMessage(mContext.getString(R.string.auto_saver_enabled_text,
+ getLowBatteryAutoTriggerDefaultLevel()));
+
+ // Negative == "got it". Just close the dialog. Battery saver has already been enabled.
+ d.setNegativeButton(R.string.auto_saver_okay_action, null);
+ d.setPositiveButton(R.string.open_saver_setting_action, (dialog, which) ->
+ mContext.startActivity(actionBatterySaverSetting));
+ d.setShowForAllUsers(true);
+ d.setOnDismissListener((dialog) -> mSaverEnabledConfirmation = null);
+ d.show();
+ mSaverEnabledConfirmation = d;
+ }
+
+
private void setSaverMode(boolean mode, boolean needFirstTimeWarning) {
BatterySaverUtils.setPowerSaveMode(mContext, mode, needFirstTimeWarning);
}
+ private void scheduleAutoBatterySaver() {
+ int autoTriggerThreshold = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel);
+ if (autoTriggerThreshold == 0) {
+ autoTriggerThreshold = 15;
+ }
+
+ BatterySaverUtils.scheduleAutoBatterySaver(mContext, autoTriggerThreshold);
+ showAutoSaverEnabledConfirmation();
+ }
+
private final class Receiver extends BroadcastReceiver {
public void init() {
@@ -433,6 +521,9 @@
filter.addAction(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING);
filter.addAction(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING);
filter.addAction(ACTION_SHOW_START_SAVER_CONFIRMATION);
+ filter.addAction(ACTION_SHOW_AUTO_SAVER_SUGGESTION);
+ filter.addAction(ACTION_ENABLE_AUTO_SAVER);
+ filter.addAction(ACTION_AUTO_SAVER_NO_THANKS);
mContext.registerReceiverAsUser(this, UserHandle.ALL, filter,
android.Manifest.permission.DEVICE_POWER, mHandler);
}
@@ -462,10 +553,17 @@
showThermalShutdownDialog();
} else if (ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING.equals(action)) {
dismissThermalShutdownWarning();
+ } else if (ACTION_SHOW_AUTO_SAVER_SUGGESTION.equals(action)) {
+ showAutoSaverSuggestion();
+ } else if (ACTION_DISMISS_AUTO_SAVER_SUGGESTION.equals(action)) {
+ dismissAutoSaverSuggestion();
+ } else if (ACTION_ENABLE_AUTO_SAVER.equals(action)) {
+ dismissAutoSaverSuggestion();
+ scheduleAutoBatterySaver();
+ } else if (ACTION_AUTO_SAVER_NO_THANKS.equals(action)) {
+ dismissAutoSaverSuggestion();
+ BatterySaverUtils.suppressAutoBatterySaver(context);
}
}
}
-
- private final OnClickListener mStartSaverModeNoConfirmation =
- (dialog, which) -> setSaverMode(true, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index f08219a..c409f73 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -52,6 +52,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.time.Duration;
import java.util.Arrays;
public class PowerUI extends SystemUI {
@@ -61,6 +62,8 @@
private static final long TEMPERATURE_LOGGING_INTERVAL = DateUtils.HOUR_IN_MILLIS;
private static final int MAX_RECENT_TEMPS = 125; // TEMPERATURE_LOGGING_INTERVAL plus a buffer
static final long THREE_HOURS_IN_MILLIS = DateUtils.HOUR_IN_MILLIS * 3;
+ private static final int CHARGE_CYCLE_PERCENT_RESET = 45;
+ private static final long SIX_HOURS_MILLIS = Duration.ofHours(6).toMillis();
private final Handler mHandler = new Handler();
private final Receiver mReceiver = new Receiver();
@@ -69,7 +72,6 @@
private HardwarePropertiesManager mHardwarePropertiesManager;
private WarningsUI mWarnings;
private final Configuration mLastConfiguration = new Configuration();
- private int mBatteryLevel = 100;
private long mTimeRemaining = Long.MAX_VALUE;
private int mPlugType = 0;
private int mInvalidCharger = 0;
@@ -88,6 +90,7 @@
private long mNextLogTime;
private IThermalService mThermalService;
+ @VisibleForTesting int mBatteryLevel = 100;
@VisibleForTesting int mBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN;
// by using the same instance (method references are not guaranteed to be the same object
@@ -205,12 +208,6 @@
final boolean plugged = mPlugType != 0;
final boolean oldPlugged = oldPlugType != 0;
- // if we are now unplugged but we were previously plugged in we should allow the
- // time based trigger again.
- if (!plugged && plugged != oldPlugged) {
- mLowWarningShownThisChargeCycle = false;
- mSevereWarningShownThisChargeCycle = false;
- }
int oldBucket = findBatteryLevelBucket(oldBatteryLevel);
int bucket = findBatteryLevelBucket(mBatteryLevel);
@@ -261,7 +258,8 @@
boolean isPowerSaver = mPowerManager.isPowerSaveMode();
// only play SFX when the dialog comes up or the bucket changes
final boolean playSound = bucket != oldBucket || oldPlugged;
- if (mEnhancedEstimates.isHybridNotificationEnabled()) {
+ final boolean hybridEnabled = mEnhancedEstimates.isHybridNotificationEnabled();
+ if (hybridEnabled) {
final Estimate estimate = mEnhancedEstimates.getEstimate();
// Turbo is not always booted once SysUI is running so we have ot make sure we actually
// get data back
@@ -270,6 +268,14 @@
mWarnings.updateEstimate(estimate);
mWarnings.updateThresholds(mEnhancedEstimates.getLowWarningThreshold(),
mEnhancedEstimates.getSevereWarningThreshold());
+
+ // if we are now over 45% battery & 6 hours remaining we can trigger hybrid
+ // notification again
+ if (mBatteryLevel >= CHARGE_CYCLE_PERCENT_RESET
+ && mTimeRemaining > SIX_HOURS_MILLIS) {
+ mLowWarningShownThisChargeCycle = false;
+ mSevereWarningShownThisChargeCycle = false;
+ }
}
}
@@ -277,13 +283,15 @@
mTimeRemaining, isPowerSaver, mBatteryStatus)) {
mWarnings.showLowBatteryWarning(playSound);
- // mark if we've already shown a warning this cycle. This will prevent the time based
- // trigger from spamming users since the time remaining can vary based on current
- // device usage.
- if (mTimeRemaining < mEnhancedEstimates.getSevereWarningThreshold()) {
- mSevereWarningShownThisChargeCycle = true;
- } else {
- mLowWarningShownThisChargeCycle = true;
+ // mark if we've already shown a warning this cycle. This will prevent the notification
+ // trigger from spamming users by only showing low/critical warnings once per cycle
+ if (hybridEnabled) {
+ if (mTimeRemaining < mEnhancedEstimates.getSevereWarningThreshold()
+ || mBatteryLevel < mLowBatteryReminderLevels[1]) {
+ mSevereWarningShownThisChargeCycle = true;
+ } else {
+ mLowWarningShownThisChargeCycle = true;
+ }
}
} else if (shouldDismissLowBatteryWarning(plugged, oldBucket, bucket, mTimeRemaining,
isPowerSaver)) {
@@ -295,12 +303,16 @@
@VisibleForTesting
boolean shouldShowLowBatteryWarning(boolean plugged, boolean oldPlugged, int oldBucket,
- int bucket, long timeRemaining, boolean isPowerSaver, int mBatteryStatus) {
+ int bucket, long timeRemaining, boolean isPowerSaver, int batteryStatus) {
+ if (mEnhancedEstimates.isHybridNotificationEnabled()) {
+ // triggering logic when enhanced estimate is available
+ return isEnhancedTrigger(plugged, timeRemaining, isPowerSaver, batteryStatus);
+ }
+ // legacy triggering logic
return !plugged
&& !isPowerSaver
- && (((bucket < oldBucket || oldPlugged) && bucket < 0)
- || isTimeBasedTrigger(timeRemaining))
- && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN;
+ && (((bucket < oldBucket || oldPlugged) && bucket < 0))
+ && batteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN;
}
@VisibleForTesting
@@ -315,19 +327,23 @@
|| hybridWouldDismiss));
}
- private boolean isTimeBasedTrigger(long timeRemaining) {
- if (!mEnhancedEstimates.isHybridNotificationEnabled()) {
+ private boolean isEnhancedTrigger(boolean plugged, long timeRemaining, boolean isPowerSaver,
+ int batteryStatus) {
+ if (plugged || isPowerSaver || batteryStatus == BatteryManager.BATTERY_STATUS_UNKNOWN) {
return false;
}
+ int warnLevel = mLowBatteryReminderLevels[0];
+ int critLevel = mLowBatteryReminderLevels[1];
- // Only show the time based warning once per charge cycle
- final boolean canShowWarning = timeRemaining < mEnhancedEstimates.getLowWarningThreshold()
- && !mLowWarningShownThisChargeCycle;
+ // Only show the low warning once per charge cycle
+ final boolean canShowWarning = !mLowWarningShownThisChargeCycle
+ && (timeRemaining < mEnhancedEstimates.getLowWarningThreshold()
+ || mBatteryLevel <= warnLevel);
- // Only show the severe time based warning once per charge cycle
- final boolean canShowSevereWarning =
- timeRemaining < mEnhancedEstimates.getSevereWarningThreshold()
- && !mSevereWarningShownThisChargeCycle;
+ // Only show the severe warning once per charge cycle
+ final boolean canShowSevereWarning = !mSevereWarningShownThisChargeCycle
+ && (timeRemaining < mEnhancedEstimates.getSevereWarningThreshold()
+ || mBatteryLevel <= critLevel);
return canShowWarning || canShowSevereWarning;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index 8923952..c548cf6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -167,6 +167,13 @@
}
}
+ @Override
+ public void setExpansion(float expansion) {
+ for (TileRecord tr : mTiles) {
+ tr.tileView.setExpansion(expansion);
+ }
+ }
+
public void setPageListener(PageListener listener) {
mPageListener = listener;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 29f3c43..018a635 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -291,6 +291,7 @@
mHeader.setExpansion(mKeyguardShowing, expansion, panelTranslationY);
mFooter.setExpansion(mKeyguardShowing ? 1 : expansion);
mQSPanel.getQsTileRevealController().setExpansion(expansion);
+ mQSPanel.getTileLayout().setExpansion(expansion);
mQSPanel.setTranslationY(translationScaleY * heightDiff);
mQSDetail.setFullyExpanded(fullyExpanded);
@@ -359,7 +360,6 @@
// The customize state changed, so our height changed.
mContainer.updateExpansion();
mQSPanel.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
- mHeader.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
mFooter.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
// Let the panel know the position changed and it needs to update where notifications
// and whatnot are.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 61e3065..6368a6b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -616,5 +616,7 @@
boolean updateResources();
void setListening(boolean listening);
+
+ default void setExpansion(float expansion) {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 2270b60..c9c04d9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -17,6 +17,7 @@
package com.android.systemui.qs;
import android.content.Context;
+import android.content.res.Configuration;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
@@ -179,16 +180,56 @@
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
private boolean mListening;
+ /** Size of the QS tile (width & height). */
+ private int mTileDimensionSize;
public HeaderTileLayout(Context context) {
super(context);
setClipChildren(false);
setClipToPadding(false);
- setGravity(Gravity.CENTER_VERTICAL);
+
+ mTileDimensionSize = mContext.getResources().getDimensionPixelSize(
+ R.dimen.qs_quick_tile_size);
+
+ setGravity(Gravity.CENTER);
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
@Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ setGravity(Gravity.CENTER);
+ LayoutParams staticSpaceLayoutParams = generateSpaceLayoutParams(
+ mContext.getResources().getDimensionPixelSize(
+ R.dimen.qs_quick_tile_space_width));
+
+ // Update space params since they fill any open space in portrait orientation and have
+ // a static width in landscape orientation.
+ final int childViewCount = getChildCount();
+ for (int i = 0; i < childViewCount; i++) {
+ View childView = getChildAt(i);
+ if (childView instanceof Space) {
+ childView.setLayoutParams(staticSpaceLayoutParams);
+ }
+ }
+ }
+
+ /**
+ * Returns {@link LayoutParams} based on the given {@code spaceWidth}. If the width is 0,
+ * then we're going to have the space expand to take up as much space as possible. If the
+ * width is non-zero, we want the inter-tile spacers to be fixed.
+ */
+ private LayoutParams generateSpaceLayoutParams(int spaceWidth) {
+ LayoutParams lp = new LayoutParams(spaceWidth, mTileDimensionSize);
+ if (spaceWidth == 0) {
+ lp.weight = 1;
+ }
+ lp.gravity = Gravity.CENTER;
+ return lp;
+ }
+
+ @Override
public void setListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
@@ -200,25 +241,22 @@
@Override
public void addTile(TileRecord tile) {
if (getChildCount() != 0) {
- // Add a spacer.
- addView(new Space(mContext), getChildCount(), generateSpaceParams());
+ // Add a spacer between tiles. We want static-width spaces if we're in landscape to
+ // keep the tiles close. For portrait, we stick with spaces that fill up any
+ // available space.
+ LayoutParams spaceLayoutParams = generateSpaceLayoutParams(
+ mContext.getResources().getDimensionPixelSize(
+ R.dimen.qs_quick_tile_space_width));
+ addView(new Space(mContext), getChildCount(), spaceLayoutParams);
}
- addView(tile.tileView, getChildCount(), generateLayoutParams());
+
+ addView(tile.tileView, getChildCount(), generateTileLayoutParams());
mRecords.add(tile);
tile.tile.setListening(this, mListening);
}
- private LayoutParams generateSpaceParams() {
- int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
- LayoutParams lp = new LayoutParams(0, size);
- lp.weight = 1;
- lp.gravity = Gravity.CENTER;
- return lp;
- }
-
- private LayoutParams generateLayoutParams() {
- int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
- LayoutParams lp = new LayoutParams(size, size);
+ private LayoutParams generateTileLayoutParams() {
+ LayoutParams lp = new LayoutParams(mTileDimensionSize, mTileDimensionSize);
lp.gravity = Gravity.CENTER;
return lp;
}
@@ -237,8 +275,8 @@
}
private int getChildIndex(QSTileView tileView) {
- final int N = getChildCount();
- for (int i = 0; i < N; i++) {
+ final int childViewCount = getChildCount();
+ for (int i = 0; i < childViewCount; i++) {
if (getChildAt(i) == tileView) {
return i;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 9792e41..224c367 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -21,21 +21,24 @@
import android.annotation.ColorInt;
import android.app.ActivityManager;
import android.app.AlarmManager;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Rect;
+import android.media.AudioManager;
import android.os.Handler;
import android.provider.AlarmClock;
import android.support.annotation.VisibleForTesting;
-import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
import android.view.View;
import android.view.WindowInsets;
+import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -44,7 +47,6 @@
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.R.id;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.QSDetail.Callback;
@@ -91,18 +93,33 @@
private View mQuickQsStatusIcons;
private View mDate;
private View mHeaderTextContainerView;
- /** View corresponding to the next alarm info (including the icon). */
- private View mNextAlarmView;
+ /** View containing the next alarm and ringer mode info. */
+ private View mStatusContainer;
/** Tooltip for educating users that they can long press on icons to see more details. */
private View mLongPressTooltipView;
+
+ private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
+ private AlarmManager.AlarmClockInfo mNextAlarm;
+
+ private ImageView mNextAlarmIcon;
/** {@link TextView} containing the actual text indicating when the next alarm will go off. */
private TextView mNextAlarmTextView;
+ private View mStatusSeparator;
+ private ImageView mRingerModeIcon;
+ private TextView mRingerModeTextView;
private NextAlarmController mAlarmController;
- private String mNextAlarmText;
/** Counts how many times the long press tooltip has been shown to the user. */
private int mShownCount;
+ private final BroadcastReceiver mRingerReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mRingerMode = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1);
+ updateStatusText();
+ }
+ };
+
/**
* Runnable for automatically fading out the long press tooltip (as if it were animating away).
*/
@@ -110,7 +127,6 @@
public QuickStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
-
mAlarmController = Dependency.get(NextAlarmController.class);
mShownCount = getStoredShownCount();
}
@@ -128,8 +144,12 @@
// Views corresponding to the header info section (e.g. tooltip and next alarm).
mHeaderTextContainerView = findViewById(R.id.header_text_container);
mLongPressTooltipView = findViewById(R.id.long_press_tooltip);
- mNextAlarmView = findViewById(R.id.next_alarm);
+ mStatusContainer = findViewById(R.id.status_container);
+ mStatusSeparator = findViewById(R.id.status_separator);
+ mNextAlarmIcon = findViewById(R.id.next_alarm_icon);
mNextAlarmTextView = findViewById(R.id.next_alarm_text);
+ mRingerModeIcon = findViewById(R.id.ringer_mode_icon);
+ mRingerModeTextView = findViewById(R.id.ringer_mode_text);
updateResources();
@@ -140,7 +160,6 @@
// Set light text on the header icons because they will always be on a black background
applyDarkness(R.id.clock, tintArea, 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
- applyDarkness(id.signal_cluster, tintArea, intensity, colorForeground);
// Set the correct tint for the status icons so they contrast
mIconManager.setTint(fillColor);
@@ -149,6 +168,32 @@
battery.setForceShowPercent(true);
}
+ private void updateStatusText() {
+ boolean ringerVisible = false;
+ if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
+ mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate);
+ mRingerModeTextView.setText(R.string.qs_status_phone_vibrate);
+ ringerVisible = true;
+ } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) {
+ mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_silent);
+ mRingerModeTextView.setText(R.string.qs_status_phone_muted);
+ ringerVisible = true;
+ }
+ mRingerModeIcon.setVisibility(ringerVisible ? View.VISIBLE : View.GONE);
+ mRingerModeTextView.setVisibility(ringerVisible ? View.VISIBLE : View.GONE);
+
+ boolean alarmVisible = false;
+ if (mNextAlarm != null) {
+ alarmVisible = true;
+ mNextAlarmTextView.setText(formatNextAlarm(mNextAlarm));
+ }
+ mNextAlarmIcon.setVisibility(alarmVisible ? View.VISIBLE : View.GONE);
+ mNextAlarmTextView.setVisibility(alarmVisible ? View.VISIBLE : View.GONE);
+ mStatusSeparator.setVisibility(alarmVisible && ringerVisible ? View.VISIBLE : View.GONE);
+ updateTooltipShow();
+ }
+
+
private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
View v = findViewById(id);
if (v instanceof DarkReceiver) {
@@ -296,8 +341,11 @@
if (listening) {
mAlarmController.addCallback(this);
+ mContext.registerReceiver(mRingerReceiver,
+ new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
} else {
mAlarmController.removeCallback(this);
+ mContext.unregisterReceiver(mRingerReceiver);
}
}
@@ -311,23 +359,31 @@
@Override
public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
- mNextAlarmText = nextAlarm != null ? formatNextAlarm(nextAlarm) : null;
+ mNextAlarm = nextAlarm;
+ updateStatusText();
+ }
- if (mNextAlarmText != null) {
- hideLongPressTooltip(true /* shouldFadeInAlarmText */);
+ private void updateTooltipShow() {
+ if (hasStatusText()) {
+ hideLongPressTooltip(true /* shouldShowStatusText */);
} else {
- hideAlarmText();
+ hideStatusText();
}
updateHeaderTextContainerAlphaAnimator();
}
+ private boolean hasStatusText() {
+ return mNextAlarmTextView.getVisibility() == View.VISIBLE
+ || mRingerModeTextView.getVisibility() == View.VISIBLE;
+ }
+
/**
* Animates in the long press tooltip (as long as the next alarm text isn't currently occupying
* the space).
*/
public void showLongPressTooltip() {
- // If we have alarm text to show, don't bother fading in the tooltip.
- if (!TextUtils.isEmpty(mNextAlarmText)) {
+ // If we have status text to show, don't bother fading in the tooltip.
+ if (hasStatusText()) {
return;
}
@@ -357,11 +413,11 @@
/**
* Fades out the long press tooltip if it's partially visible - short circuits any running
- * animation. Additionally has the ability to fade in the alarm info text.
+ * animation. Additionally has the ability to fade in the status info text.
*
- * @param shouldShowAlarmText whether we should fade in the next alarm text
+ * @param shouldShowStatusText whether we should fade in the status text
*/
- private void hideLongPressTooltip(boolean shouldShowAlarmText) {
+ private void hideLongPressTooltip(boolean shouldShowStatusText) {
mLongPressTooltipView.animate().cancel();
if (mLongPressTooltipView.getVisibility() == View.VISIBLE
&& mLongPressTooltipView.getAlpha() != 0f) {
@@ -375,44 +431,40 @@
if (DEBUG) Log.d(TAG, "hideLongPressTooltip: Hid long press tip");
mLongPressTooltipView.setVisibility(View.INVISIBLE);
- if (shouldShowAlarmText) {
- showAlarmText();
+ if (shouldShowStatusText) {
+ showStatus();
}
}
})
.start();
} else {
mLongPressTooltipView.setVisibility(View.INVISIBLE);
- if (shouldShowAlarmText) {
- showAlarmText();
+ if (shouldShowStatusText) {
+ showStatus();
}
}
}
/**
- * Fades in the updated alarm text. Note that if there's already an alarm showing, this will
- * immediately hide it and fade in the updated time.
+ * Fades in the updated status text. Note that if there's already a status showing, this will
+ * immediately hide it and fade in the updated status.
*/
- private void showAlarmText() {
- mNextAlarmView.setAlpha(0f);
- mNextAlarmView.setVisibility(View.VISIBLE);
- mNextAlarmTextView.setText(mNextAlarmText);
+ private void showStatus() {
+ mStatusContainer.setAlpha(0f);
+ mStatusContainer.setVisibility(View.VISIBLE);
// Animate the alarm back in. Make sure to clear the animator listener for the animation!
- mNextAlarmView.animate()
+ mStatusContainer.animate()
.alpha(1f)
.setDuration(FADE_ANIMATION_DURATION_MS)
.setListener(null)
.start();
}
- /**
- * Fades out and hides the next alarm text. This also resets the text contents to null in
- * preparation for the next alarm update.
- */
- private void hideAlarmText() {
- if (mNextAlarmView.getVisibility() == View.VISIBLE) {
- mNextAlarmView.animate()
+ /** Fades out and hides the status text. */
+ private void hideStatusText() {
+ if (mStatusContainer.getVisibility() == View.VISIBLE) {
+ mStatusContainer.animate()
.alpha(0f)
.setListener(new AnimatorListenerAdapter() {
@Override
@@ -421,15 +473,11 @@
// Reset the alpha regardless of how the animation ends for the next
// time we show this view/want to animate it.
- mNextAlarmView.setVisibility(View.INVISIBLE);
- mNextAlarmView.setAlpha(1f);
- mNextAlarmTextView.setText(null);
+ mStatusContainer.setVisibility(View.INVISIBLE);
+ mStatusContainer.setAlpha(1f);
}
})
.start();
- } else {
- // Next alarm view is already hidden, only need to clear the text.
- mNextAlarmTextView.setText(null);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index 1cb89c4..64e7a63 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -23,6 +23,7 @@
protected int mCellHeight;
protected int mCellMarginHorizontal;
protected int mCellMarginVertical;
+ protected int mSidePadding;
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
private int mCellMarginTop;
@@ -80,6 +81,7 @@
mCellMarginHorizontal = res.getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal);
mCellMarginVertical= res.getDimensionPixelSize(R.dimen.qs_tile_margin_vertical);
mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top);
+ mSidePadding = res.getDimensionPixelOffset(R.dimen.qs_tile_layout_margin_side);
if (mColumns != columns) {
mColumns = columns;
requestLayout();
@@ -93,7 +95,7 @@
final int numTiles = mRecords.size();
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int numRows = (numTiles + mColumns - 1) / mColumns;
- mCellWidth = (width - (mCellMarginHorizontal * (mColumns + 1))) / mColumns;
+ mCellWidth = (width - mSidePadding * 2 - (mCellMarginHorizontal * mColumns)) / mColumns;
// Measure each QS tile.
View previousView = this;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
index 6797bb9..31c455d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
@@ -19,7 +19,7 @@
import android.support.annotation.IdRes;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
@@ -30,7 +30,7 @@
* A view that forms the header of the notification panel. This view will ensure that any
* status icons that are displayed are tinted accordingly to the current theme.
*/
-public class CarStatusBarHeader extends RelativeLayout {
+public class CarStatusBarHeader extends LinearLayout {
public CarStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -44,7 +44,6 @@
float intensity = colorForeground == Color.WHITE ? 0f : 1f;
Rect tintArea = new Rect(0, 0, 0, 0);
- applyDarkness(R.id.signal_cluster, tintArea, intensity, colorForeground);
applyDarkness(R.id.battery, tintArea, intensity, colorForeground);
applyDarkness(R.id.clock, tintArea, intensity, colorForeground);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
index eb95866..20e3cee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
@@ -44,4 +44,9 @@
public TextView getAppLabel() {
return mSecondLine;
}
+
+ @Override
+ protected boolean animationsEnabled() {
+ return false;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index a3d6c6c..4aa83d0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -20,6 +20,7 @@
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.content.res.Configuration;
+import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
@@ -37,6 +38,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QS;
@@ -81,10 +83,9 @@
public QSCustomizer(Context context, AttributeSet attrs) {
super(new ContextThemeWrapper(context, R.style.edit_theme), attrs);
- mClipper = new QSDetailClipper(this);
LayoutInflater.from(getContext()).inflate(R.layout.qs_customize_panel_content, this);
-
+ mClipper = new QSDetailClipper(findViewById(R.id.customize_container));
mToolbar = findViewById(com.android.internal.R.id.action_bar);
TypedValue value = new TypedValue();
mContext.getTheme().resolveAttribute(android.R.attr.homeAsUpIndicator, value, true);
@@ -100,7 +101,10 @@
mToolbar.getMenu().add(Menu.NONE, MENU_RESET, 0,
mContext.getString(com.android.internal.R.string.reset));
mToolbar.setTitle(R.string.qs_edit);
-
+ int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent);
+ mToolbar.setTitleTextColor(accentColor);
+ mToolbar.getNavigationIcon().setTint(accentColor);
+ mToolbar.getOverflowIcon().setTint(accentColor);
mRecyclerView = findViewById(android.R.id.list);
mTileAdapter = new TileAdapter(getContext());
mTileQueryHelper = new TileQueryHelper(context, mTileAdapter);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index 943a176..6f664d7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -102,7 +102,9 @@
mTokenMap.remove(service.getToken());
mTiles.remove(tile.getComponent());
final String slot = tile.getComponent().getClassName();
- mMainHandler.post(() -> mHost.getIconController().removeIcon(slot));
+ // TileServices doesn't know how to add more than 1 icon per slot, so remove all
+ mMainHandler.post(() -> mHost.getIconController()
+ .removeAllIconsForSlot(slot));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
index 0f83078..e7e756f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
@@ -16,6 +16,8 @@
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -127,7 +129,6 @@
}
protected void setIcon(ImageView iv, QSTile.State state) {
- updateIcon(iv, state);
if (state.disabledByPolicy) {
iv.setColorFilter(getContext().getColor(R.color.qs_tile_disabled_color));
} else {
@@ -137,7 +138,7 @@
int color = getColor(state.state);
mState = state.state;
if (iv.isShown() && mTint != 0) {
- animateGrayScale(mTint, color, iv);
+ animateGrayScale(mTint, color, iv, () -> updateIcon(iv, state));
mTint = color;
} else {
if (iv instanceof AlphaControlledSlashImageView) {
@@ -147,7 +148,10 @@
setTint(iv, color);
}
mTint = color;
+ updateIcon(iv, state);
}
+ } else {
+ updateIcon(iv, state);
}
}
@@ -155,12 +159,13 @@
return getColorForState(getContext(), state);
}
- public static void animateGrayScale(int fromColor, int toColor, ImageView iv) {
+ private void animateGrayScale(int fromColor, int toColor, ImageView iv,
+ final Runnable endRunnable) {
if (iv instanceof AlphaControlledSlashImageView) {
((AlphaControlledSlashImageView)iv)
.setFinalImageTintList(ColorStateList.valueOf(toColor));
}
- if (ValueAnimator.areAnimatorsEnabled()) {
+ if (mAnimationEnabled && ValueAnimator.areAnimatorsEnabled()) {
final float fromAlpha = Color.alpha(fromColor);
final float toAlpha = Color.alpha(toColor);
final float fromChannel = Color.red(fromColor);
@@ -175,10 +180,16 @@
setTint(iv, Color.argb(alpha, channel, channel, channel));
});
-
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ endRunnable.run();
+ }
+ });
anim.start();
} else {
setTint(iv, toColor);
+ endRunnable.run();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index c9c678c..cc60f87 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -15,7 +15,6 @@
import static com.android.systemui.qs.tileimpl.QSIconViewImpl.QS_ANIM_LENGTH;
-import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -122,14 +121,14 @@
private void setRipple(RippleDrawable tileBackground) {
mRipple = tileBackground;
if (getWidth() != 0) {
- updateRippleSize(getWidth(), getHeight());
+ updateRippleSize();
}
}
- private void updateRippleSize(int width, int height) {
+ private void updateRippleSize() {
// center the touch feedback on the center of the icon, and dial it down a bit
- final int cx = width / 2;
- final int cy = mIconFrame.getMeasuredHeight() / 2;
+ final int cx = mIconFrame.getMeasuredWidth() / 2 + mIconFrame.getLeft();
+ final int cy = mIconFrame.getMeasuredHeight() / 2 + mIconFrame.getTop();
final int rad = (int) (mIcon.getHeight() * .85f);
mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
}
@@ -151,11 +150,8 @@
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
- final int w = getMeasuredWidth();
- final int h = getMeasuredHeight();
-
if (mRipple != null) {
- updateRippleSize(w, h);
+ updateRippleSize();
}
}
@@ -183,7 +179,7 @@
protected void handleStateChanged(QSTile.State state) {
int circleColor = getCircleColor(state.state);
if (circleColor != mCircleColor) {
- if (mBg.isShown()) {
+ if (mBg.isShown() && animationsEnabled()) {
ValueAnimator animator = ValueAnimator.ofArgb(mCircleColor, circleColor)
.setDuration(QS_ANIM_LENGTH);
animator.addUpdateListener(animation -> mBg.setImageTintList(ColorStateList.valueOf(
@@ -198,6 +194,7 @@
setClickable(state.state != Tile.STATE_UNAVAILABLE);
mIcon.setIcon(state);
setContentDescription(state.contentDescription);
+
mAccessibilityClass = state.expandedAccessibilityClassName;
if (state instanceof QSTile.BooleanState) {
boolean newState = ((BooleanState) state).value;
@@ -208,6 +205,10 @@
}
}
+ protected boolean animationsEnabled() {
+ return true;
+ }
+
private int getCircleColor(int state) {
switch (state) {
case Tile.STATE_ACTIVE:
@@ -273,6 +274,10 @@
info.setText(label);
info.setChecked(b);
info.setCheckable(true);
+ info.addAction(
+ new AccessibilityNodeInfo.AccessibilityAction(
+ AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK.getId(),
+ getResources().getString(R.string.accessibility_long_click_tile)));
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index 4774785..d21b06f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -36,7 +36,6 @@
/** View that represents a standard quick settings tile. **/
public class QSTileView extends QSTileBaseView {
-
private static final boolean DUAL_TARGET_ALLOWED = false;
private View mDivider;
protected TextView mLabel;
@@ -61,7 +60,7 @@
setId(View.generateViewId());
createLabel();
setOrientation(VERTICAL);
- setGravity(Gravity.CENTER);
+ setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
}
TextView getLabel() {
@@ -72,6 +71,7 @@
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FontSizeUtils.updateFontSize(mLabel, R.dimen.qs_tile_text_size);
+ FontSizeUtils.updateFontSize(mSecondLine, R.dimen.qs_tile_text_size);
}
@Override
@@ -91,11 +91,31 @@
mExpandSpace = mLabelContainer.findViewById(R.id.expand_space);
mSecondLine = mLabelContainer.findViewById(R.id.app_label);
mSecondLine.setAlpha(.6f);
-
addView(mLabelContainer);
}
@Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ // Remeasure view if the secondary label text will be cut off.
+ if (!TextUtils.isEmpty(mSecondLine.getText())
+ && mSecondLine.getLineHeight() > mSecondLine.getHeight()) {
+ mLabel.setSingleLine();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+
+ @Override
+ public void setExpansion(float expansion) {
+ // Start the marquee when fully expanded and stop when fully collapsed. Leave as is for
+ // other expansion ratios since there is no way way to pause the marquee.
+ boolean selected = expansion == 1f ? true : expansion == 0f ? false : mLabel.isSelected();
+ mLabel.setSelected(selected);
+ mSecondLine.setSelected(selected);
+ }
+
+ @Override
protected void handleStateChanged(QSTile.State state) {
super.handleStateChanged(state);
if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 28fdc11..d8f7b71 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -41,6 +41,7 @@
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.tileimpl.QSIconViewImpl;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
@@ -60,6 +61,7 @@
protected final WifiSignalCallback mSignalCallback = new WifiSignalCallback();
private final ActivityStarter mActivityStarter;
+ private boolean mExpectDisabled;
public WifiTile(QSHost host) {
super(host);
@@ -120,6 +122,15 @@
// Immediately enter transient state when turning on wifi.
refreshState(wifiEnabled ? null : ARG_SHOW_TRANSIENT_ENABLING);
mController.setWifiEnabled(!wifiEnabled);
+ mExpectDisabled = wifiEnabled;
+ if (mExpectDisabled) {
+ mHandler.postDelayed(() -> {
+ if (mExpectDisabled) {
+ mExpectDisabled = false;
+ refreshState();
+ }
+ }, QSIconViewImpl.QS_ANIM_LENGTH);
+ }
}
@Override
@@ -143,15 +154,17 @@
@Override
protected void handleUpdateState(SignalState state, Object arg) {
if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg);
- final CallbackInfo cb;
- if (arg != null && arg instanceof CallbackInfo) {
- cb = (CallbackInfo) arg;
- } else {
- cb = mSignalCallback.mInfo;
+ final CallbackInfo cb = mSignalCallback.mInfo;
+ if (mExpectDisabled) {
+ if (cb.enabled) {
+ return; // Ignore updates until disabled event occurs.
+ } else {
+ mExpectDisabled = false;
+ }
}
boolean transientEnabling = arg == ARG_SHOW_TRANSIENT_ENABLING;
- boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null);
- boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.enabledDesc == null);
+ boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.ssid != null);
+ boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.ssid == null);
boolean enabledChanging = state.value != cb.enabled;
if (enabledChanging) {
mDetailAdapter.setItemsVisible(cb.enabled);
@@ -163,7 +176,7 @@
}
state.slash.isSlashed = false;
boolean isTransient = transientEnabling || cb.isTransient;
- state.secondaryLabel = getSecondaryLabel(isTransient);
+ state.secondaryLabel = getSecondaryLabel(isTransient, cb.statusLabel);
state.state = Tile.STATE_ACTIVE;
state.dualTarget = true;
state.value = transientEnabling || cb.enabled;
@@ -181,7 +194,7 @@
state.label = r.getString(R.string.quick_settings_wifi_label);
} else if (wifiConnected) {
state.icon = ResourceIcon.get(cb.wifiSignalIconId);
- state.label = removeDoubleQuotes(cb.enabledDesc);
+ state.label = removeDoubleQuotes(cb.ssid);
} else if (wifiNotConnected) {
state.icon = ResourceIcon.get(R.drawable.ic_qs_wifi_disconnected);
state.label = r.getString(R.string.quick_settings_wifi_label);
@@ -194,7 +207,7 @@
if (state.value) {
if (wifiConnected) {
minimalContentDescription.append(cb.wifiSignalContentDescription).append(",");
- minimalContentDescription.append(removeDoubleQuotes(cb.enabledDesc));
+ minimalContentDescription.append(removeDoubleQuotes(cb.ssid));
}
}
state.contentDescription = minimalContentDescription.toString();
@@ -203,10 +216,10 @@
state.expandedAccessibilityClassName = Switch.class.getName();
}
- private CharSequence getSecondaryLabel(boolean isTransient) {
+ private CharSequence getSecondaryLabel(boolean isTransient, String statusLabel) {
return isTransient
? mContext.getString(R.string.quick_settings_wifi_secondary_label_transient)
- : null;
+ : statusLabel;
}
@Override
@@ -246,11 +259,12 @@
boolean enabled;
boolean connected;
int wifiSignalIconId;
- String enabledDesc;
+ String ssid;
boolean activityIn;
boolean activityOut;
String wifiSignalContentDescription;
boolean isTransient;
+ public String statusLabel;
@Override
public String toString() {
@@ -258,7 +272,7 @@
.append("enabled=").append(enabled)
.append(",connected=").append(connected)
.append(",wifiSignalIconId=").append(wifiSignalIconId)
- .append(",enabledDesc=").append(enabledDesc)
+ .append(",ssid=").append(ssid)
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",wifiSignalContentDescription=").append(wifiSignalContentDescription)
@@ -272,20 +286,22 @@
@Override
public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
- boolean activityIn, boolean activityOut, String description, boolean isTransient) {
+ boolean activityIn, boolean activityOut, String description, boolean isTransient,
+ String statusLabel) {
if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled);
mInfo.enabled = enabled;
mInfo.connected = qsIcon.visible;
mInfo.wifiSignalIconId = qsIcon.icon;
- mInfo.enabledDesc = description;
+ mInfo.ssid = description;
mInfo.activityIn = activityIn;
mInfo.activityOut = activityOut;
mInfo.wifiSignalContentDescription = qsIcon.contentDescription;
mInfo.isTransient = isTransient;
+ mInfo.statusLabel = statusLabel;
if (isShowingDetail()) {
mDetailAdapter.updateItems();
}
- refreshState(mInfo);
+ refreshState();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 674ccd8..0f85c5b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -492,6 +492,13 @@
}
}
mDraggingInRecentsCurrentUser = currentUser;
+
+ if (mOverviewProxyService.getProxy() != null) {
+ // The overview service is handling split screen, so just skip the wait for the
+ // first draw and notify the divider to start animating now
+ EventBus.getDefault().post(new RecentsDrawnEvent());
+ }
+
return true;
} else {
EventBus.getDefault().send(new ShowUserToastEvent(
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 19da3db..6fcb1c1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -126,7 +126,7 @@
@Override
public void onTaskStackChangedBackground() {
// Skip background preloading recents in SystemUI if the overview services is bound
- if (Dependency.get(OverviewProxyService.class).getProxy() != null) {
+ if (Dependency.get(OverviewProxyService.class).isEnabled()) {
return;
}
@@ -300,7 +300,7 @@
public void onBootCompleted() {
// Skip preloading tasks if we are already bound to the service
- if (Dependency.get(OverviewProxyService.class).getProxy() != null) {
+ if (Dependency.get(OverviewProxyService.class).isEnabled()) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 068fd3f..227f2d2 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -189,7 +189,6 @@
mPublicNotificationBuilder =
new Notification.Builder(context, NotificationChannels.SCREENSHOTS_HEADSUP)
.setContentTitle(r.getString(R.string.screenshot_saving_title))
- .setContentText(r.getString(R.string.screenshot_saving_text))
.setSmallIcon(R.drawable.stat_notify_image)
.setCategory(Notification.CATEGORY_PROGRESS)
.setWhen(now)
@@ -203,7 +202,6 @@
.setTicker(r.getString(R.string.screenshot_saving_ticker)
+ (mTickerAddSpace ? " " : ""))
.setContentTitle(r.getString(R.string.screenshot_saving_title))
- .setContentText(r.getString(R.string.screenshot_saving_text))
.setSmallIcon(R.drawable.stat_notify_image)
.setWhen(now)
.setShowWhen(true)
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 1596d12..3d8e037 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -592,7 +592,16 @@
// Record last snap target the divider moved to
if (mHomeStackResizable && !mIsInMinimizeInteraction) {
- saveSnapTargetBeforeMinimized(snapTarget);
+ // The last snapTarget position can be negative when the last divider position was
+ // offscreen. In that case, save the middle (default) SnapTarget so calculating next
+ // position isn't negative.
+ final SnapTarget saveTarget;
+ if (snapTarget.position < 0) {
+ saveTarget = mSnapAlgorithm.getMiddleTarget();
+ } else {
+ saveTarget = snapTarget;
+ }
+ saveSnapTargetBeforeMinimized(saveTarget);
}
};
Runnable notCancelledEndAction = () -> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index fa177f2..65037f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -18,7 +18,7 @@
import android.content.ComponentName;
import android.graphics.Rect;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -160,7 +160,7 @@
default void onRotationProposal(int rotation, boolean isValid) { }
- default void showFingerprintDialog(Bundle bundle, IFingerprintDialogReceiver receiver) { }
+ default void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) { }
default void onFingerprintAuthenticated() { }
default void onFingerprintHelp(String message) { }
default void onFingerprintError(String error) { }
@@ -513,7 +513,7 @@
}
@Override
- public void showFingerprintDialog(Bundle bundle, IFingerprintDialogReceiver receiver) {
+ public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
synchronized (mLock) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = bundle;
@@ -759,7 +759,7 @@
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).showFingerprintDialog(
(Bundle)((SomeArgs)msg.obj).arg1,
- (IFingerprintDialogReceiver)((SomeArgs)msg.obj).arg2);
+ (IBiometricDialogReceiver)((SomeArgs)msg.obj).arg2);
}
break;
case MSG_FINGERPRINT_AUTHENTICATED:
@@ -810,4 +810,3 @@
}
}
}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
deleted file mode 100644
index d7c6443..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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
- */
-
-package com.android.systemui.statusbar;
-
-import android.annotation.ColorInt;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.stack.ExpandableViewState;
-import com.android.systemui.statusbar.stack.StackScrollState;
-
-public class DismissView extends StackScrollerDecorView {
- private final int mClearAllTopPadding;
- private DismissViewButton mDismissButton;
-
- public DismissView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mClearAllTopPadding = context.getResources().getDimensionPixelSize(
- R.dimen.clear_all_padding_top);
- }
-
- @Override
- protected View findContentView() {
- return findViewById(R.id.dismiss_text);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mDismissButton = (DismissViewButton) findContentView();
- }
-
- public void setTextColor(@ColorInt int color) {
- mDismissButton.setTextColor(color);
- }
-
- public void setOnButtonClickListener(OnClickListener listener) {
- mContent.setOnClickListener(listener);
- }
-
- public boolean isOnEmptySpace(float touchX, float touchY) {
- return touchX < mContent.getX()
- || touchX > mContent.getX() + mContent.getWidth()
- || touchY < mContent.getY()
- || touchY > mContent.getY() + mContent.getHeight();
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mDismissButton.setText(R.string.clear_all_notifications_text);
- mDismissButton.setContentDescription(
- mContext.getString(R.string.accessibility_clear_all));
- }
-
- public boolean isButtonVisible() {
- return mDismissButton.getAlpha() != 0.0f;
- }
-
- @Override
- public ExpandableViewState createNewViewState(StackScrollState stackScrollState) {
- return new DismissViewState();
- }
-
- public class DismissViewState extends ExpandableViewState {
- @Override
- public void applyToView(View view) {
- super.applyToView(view);
- if (view instanceof DismissView) {
- DismissView dismissView = (DismissView) view;
- boolean visible = this.clipTopAmount < mClearAllTopPadding;
- dismissView.performVisibilityAnimation(visible && !dismissView.willBeGone());
- }
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java
deleted file mode 100644
index b608d67..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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
- */
-
-package com.android.systemui.statusbar;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.ViewGroup;
-
-import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
-
-public class DismissViewButton extends AlphaOptimizedButton {
-
- public DismissViewButton(Context context) {
- this(context, null);
- }
-
- public DismissViewButton(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public DismissViewButton(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public DismissViewButton(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- /**
- * This method returns the drawing rect for the view which is different from the regular
- * drawing rect, since we layout all children in the {@link NotificationStackScrollLayout} at
- * position 0 and usually the translation is neglected. The standard implementation doesn't
- * account for translation.
- *
- * @param outRect The (scrolled) drawing bounds of the view.
- */
- @Override
- public void getDrawingRect(Rect outRect) {
- super.getDrawingRect(outRect);
- float translationX = ((ViewGroup) mParent).getTranslationX();
- float translationY = ((ViewGroup) mParent).getTranslationY();
- outRect.left += translationX;
- outRect.right += translationX;
- outRect.top += translationY;
- outRect.bottom += translationY;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
index 3698c3a0..4388b41 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java
@@ -48,6 +48,11 @@
return findViewById(R.id.no_notifications);
}
+ @Override
+ protected View findSecondaryView() {
+ return null;
+ }
+
public void setTextColor(@ColorInt int color) {
mEmptyText.setTextColor(color);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 24ebc83..3ece2f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -24,7 +24,10 @@
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.Nullable;
+import android.app.NotificationChannel;
import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Path;
@@ -34,11 +37,11 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
-import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.FloatProperty;
+import android.util.Log;
import android.util.MathUtils;
import android.util.Property;
import android.view.KeyEvent;
@@ -90,12 +93,17 @@
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
+/**
+ * View representing a notification item - this can be either the individual child notification or
+ * the group summary (which contains 1 or more child notifications).
+ */
public class ExpandableNotificationRow extends ActivatableNotificationView
implements PluginListener<NotificationMenuRowPlugin> {
private static final int DEFAULT_DIVIDER_ALPHA = 0x29;
private static final int COLORED_DIVIDER_ALPHA = 0x7B;
private static final int MENU_VIEW_INDEX = 0;
+ private static final String TAG = "ExpandableNotifRow";
public interface LayoutListener {
public void onLayout();
@@ -127,6 +135,8 @@
private boolean mHasUserChangedExpansion;
/** If {@link #mHasUserChangedExpansion}, has the user expanded this row */
private boolean mUserExpanded;
+ /** Whether the blocking helper is showing on this notification (even if dismissed) */
+ private boolean mIsBlockingHelperShowing;
/**
* Has this notification been expanded while it was pinned
@@ -164,6 +174,8 @@
private NotificationGuts mGuts;
private NotificationData.Entry mEntry;
private StatusBarNotification mStatusBarNotification;
+ private PackageManager mCachedPackageManager;
+ private PackageInfo mCachedPackageInfo;
private String mAppName;
private boolean mIsHeadsUp;
private boolean mLastChronometerRunning = true;
@@ -181,7 +193,6 @@
private AboveShelfChangedListener mAboveShelfChangedListener;
private HeadsUpManager mHeadsUpManager;
private Consumer<Boolean> mHeadsUpAnimatingAwayListener;
- private View mHelperButton;
private boolean mChildIsExpanding;
private boolean mJustClicked;
@@ -371,6 +382,53 @@
mEntry = entry;
mStatusBarNotification = entry.notification;
mNotificationInflater.inflateNotificationViews();
+
+ perhapsCachePackageInfo();
+ }
+
+ /**
+ * Caches the package manager and info objects which are expensive to obtain.
+ */
+ private void perhapsCachePackageInfo() {
+ if (mCachedPackageInfo == null) {
+ mCachedPackageManager = StatusBar.getPackageManagerForUser(
+ mContext, mStatusBarNotification.getUser().getIdentifier());
+ try {
+ mCachedPackageInfo = mCachedPackageManager.getPackageInfo(
+ mStatusBarNotification.getPackageName(), PackageManager.GET_SIGNATURES);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "perhapsCachePackageInfo: Could not find package info");
+ }
+ }
+ }
+
+ /**
+ * Returns whether this row is considered non-blockable (e.g. it's a non-blockable system notif,
+ * covers multiple channels, or is in a whitelist).
+ */
+ public boolean getIsNonblockable() {
+ boolean isNonblockable;
+
+ isNonblockable = Dependency.get(NotificationBlockingHelperManager.class)
+ .isNonblockablePackage(mStatusBarNotification.getPackageName());
+
+ // Only bother with going through the children if the row is still blockable based on the
+ // number of unique channels.
+ if (!isNonblockable) {
+ isNonblockable = getNumUniqueChannels() > 1;
+ }
+
+ // Only bother with IPC if the package is still blockable.
+ if (!isNonblockable && mCachedPackageManager != null && mCachedPackageInfo != null) {
+ if (com.android.settingslib.Utils.isSystemPackage(
+ mContext.getResources(), mCachedPackageManager, mCachedPackageInfo)) {
+ if (mEntry.channel != null
+ && !mEntry.channel.isBlockableSystem()) {
+ isNonblockable = true;
+ }
+ }
+ }
+ return isNonblockable;
}
public void onNotificationUpdated() {
@@ -399,9 +457,6 @@
updateLimits();
updateIconVisibilities();
updateShelfIconColor();
-
- showBlockingHelper(mEntry.userSentiment ==
- NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE);
updateRippleAllowed();
}
@@ -594,6 +649,13 @@
return mNotificationParent != null;
}
+ /**
+ * @return whether this notification is the only child in the group summary
+ */
+ public boolean isOnlyChildInGroup() {
+ return mGroupManager.isOnlyChildInGroup(getStatusBarNotification());
+ }
+
public ExpandableNotificationRow getNotificationParent() {
return mNotificationParent;
}
@@ -1061,6 +1123,7 @@
}
public void setDismissed(boolean fromAccessibility) {
+ setLongPressListener(null);
mDismissed = true;
mGroupParentWhenDismissed = mNotificationParent;
mRefocusOnDismiss = fromAccessibility;
@@ -1149,11 +1212,31 @@
return mGroupParentWhenDismissed;
}
+ /**
+ * Dismisses the notification with the option of showing the blocking helper in-place if we have
+ * a negative user sentiment.
+ *
+ * @param fromAccessibility whether this dismiss is coming from an accessibility action
+ * @return whether a blocking helper is shown in this row
+ */
+ public boolean performDismissWithBlockingHelper(boolean fromAccessibility) {
+ NotificationBlockingHelperManager manager =
+ Dependency.get(NotificationBlockingHelperManager.class);
+ boolean isBlockingHelperShown = manager.perhapsShowBlockingHelper(this, mMenuRow);
+
+ // Continue with dismiss since we don't want the blocking helper to be directly associated
+ // with a certain notification.
+ performDismiss(fromAccessibility);
+ return isBlockingHelperShown;
+ }
+
public void performDismiss(boolean fromAccessibility) {
- if (mGroupManager.isOnlyChildInGroup(getStatusBarNotification())) {
+ if (isOnlyChildInGroup()) {
ExpandableNotificationRow groupSummary =
mGroupManager.getLogicalGroupSummary(getStatusBarNotification());
if (groupSummary.isClearable()) {
+ // If this is the only child in the group, dismiss the group, but don't try to show
+ // the blocking helper affordance!
groupSummary.performDismiss(fromAccessibility);
}
}
@@ -1165,6 +1248,14 @@
}
}
+ public void setBlockingHelperShowing(boolean isBlockingHelperShowing) {
+ mIsBlockingHelperShowing = isBlockingHelperShowing;
+ }
+
+ public boolean isBlockingHelperShowing() {
+ return mIsBlockingHelperShowing;
+ }
+
public void setOnDismissRunnable(Runnable onDismissRunnable) {
mOnDismissRunnable = onDismissRunnable;
}
@@ -1389,10 +1480,6 @@
requestLayout();
}
- public void showBlockingHelper(boolean show) {
- mHelperButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
public void showAppOpsIcons(ArraySet<Integer> activeOps) {
if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() != null) {
mChildrenContainer.getHeaderView().showAppOpsIcons(activeOps);
@@ -1422,12 +1509,6 @@
mPrivateLayout = (NotificationContentView) findViewById(R.id.expanded);
mLayouts = new NotificationContentView[] {mPrivateLayout, mPublicLayout};
- final NotificationGutsManager gutsMan = Dependency.get(NotificationGutsManager.class);
- mHelperButton = findViewById(R.id.helper);
- mHelperButton.setOnClickListener(view -> {
- doLongClickCallback();
- });
-
for (NotificationContentView l : mLayouts) {
l.setExpandClickListener(mExpandClickListener);
l.setContainingNotification(this);
@@ -1995,6 +2076,32 @@
updateChildrenVisibility();
applyChildrenRoundness();
}
+ /**
+ * Returns the number of channels covered by the notification row (including its children if
+ * it's a summary notification).
+ */
+ public int getNumUniqueChannels() {
+ ArraySet<NotificationChannel> channels = new ArraySet<>();
+
+ channels.add(mEntry.channel);
+
+ // If this is a summary, then add in the children notification channels for the
+ // same user and pkg.
+ if (mIsSummaryWithChildren) {
+ final List<ExpandableNotificationRow> childrenRows = getNotificationChildren();
+ final int numChildren = childrenRows.size();
+ for (int i = 0; i < numChildren; i++) {
+ final ExpandableNotificationRow childRow = childrenRows.get(i);
+ final NotificationChannel childChannel = childRow.getEntry().channel;
+ final StatusBarNotification childSbn = childRow.getStatusBarNotification();
+ if (childSbn.getUser().equals(mStatusBarNotification.getUser()) &&
+ childSbn.getPackageName().equals(mStatusBarNotification.getPackageName())) {
+ channels.add(childChannel);
+ }
+ }
+ }
+ return channels.size();
+ }
public void updateChildrenHeaderAppearance() {
if (mIsSummaryWithChildren) {
@@ -2525,7 +2632,7 @@
}
switch (action) {
case AccessibilityNodeInfo.ACTION_DISMISS:
- performDismiss(true /* fromAccessibility */);
+ performDismissWithBlockingHelper(true /* fromAccessibility */);
return true;
case AccessibilityNodeInfo.ACTION_COLLAPSE:
case AccessibilityNodeInfo.ACTION_EXPAND:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/FooterView.java
new file mode 100644
index 0000000..0f4b621
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FooterView.java
@@ -0,0 +1,105 @@
+/*
+ * 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
+ */
+
+package com.android.systemui.statusbar;
+
+import android.annotation.ColorInt;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.stack.ExpandableViewState;
+import com.android.systemui.statusbar.stack.StackScrollState;
+
+public class FooterView extends StackScrollerDecorView {
+ private final int mClearAllTopPadding;
+ private FooterViewButton mDismissButton;
+ private FooterViewButton mManageButton;
+
+ public FooterView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mClearAllTopPadding = context.getResources().getDimensionPixelSize(
+ R.dimen.clear_all_padding_top);
+ }
+
+ @Override
+ protected View findContentView() {
+ return findViewById(R.id.content);
+ }
+
+ protected View findSecondaryView() {
+ return findViewById(R.id.dismiss_text);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mDismissButton = (FooterViewButton) findSecondaryView();
+ mManageButton = findViewById(R.id.manage_text);
+ }
+
+ public void setTextColor(@ColorInt int color) {
+ mManageButton.setTextColor(color);
+ mDismissButton.setTextColor(color);
+ }
+
+ public void setManageButtonClickListener(OnClickListener listener) {
+ mManageButton.setOnClickListener(listener);
+ }
+
+ public void setDismissButtonClickListener(OnClickListener listener) {
+ mDismissButton.setOnClickListener(listener);
+ }
+
+ public boolean isOnEmptySpace(float touchX, float touchY) {
+ return touchX < mContent.getX()
+ || touchX > mContent.getX() + mContent.getWidth()
+ || touchY < mContent.getY()
+ || touchY > mContent.getY() + mContent.getHeight();
+ }
+
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDismissButton.setText(R.string.clear_all_notifications_text);
+ mDismissButton.setContentDescription(
+ mContext.getString(R.string.accessibility_clear_all));
+ mManageButton.setText(R.string.manage_notifications_text);
+ }
+
+ public boolean isButtonVisible() {
+ return mManageButton.getAlpha() != 0.0f;
+ }
+
+ @Override
+ public ExpandableViewState createNewViewState(StackScrollState stackScrollState) {
+ return new FooterViewState();
+ }
+
+ public class FooterViewState extends ExpandableViewState {
+ @Override
+ public void applyToView(View view) {
+ super.applyToView(view);
+ if (view instanceof FooterView) {
+ FooterView footerView = (FooterView) view;
+ boolean visible = this.clipTopAmount < mClearAllTopPadding;
+ footerView.performVisibilityAnimation(visible && !footerView.willBeGone());
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FooterViewButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/FooterViewButton.java
new file mode 100644
index 0000000..16ca0f2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FooterViewButton.java
@@ -0,0 +1,63 @@
+/*
+ * 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
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+
+import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
+
+public class FooterViewButton extends AlphaOptimizedButton {
+
+ public FooterViewButton(Context context) {
+ this(context, null);
+ }
+
+ public FooterViewButton(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public FooterViewButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public FooterViewButton(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ /**
+ * This method returns the drawing rect for the view which is different from the regular
+ * drawing rect, since we layout all children in the {@link NotificationStackScrollLayout} at
+ * position 0 and usually the translation is neglected. The standard implementation doesn't
+ * account for translation.
+ *
+ * @param outRect The (scrolled) drawing bounds of the view.
+ */
+ @Override
+ public void getDrawingRect(Rect outRect) {
+ super.getDrawingRect(outRect);
+ float translationX = ((ViewGroup) mParent).getTranslationX();
+ float translationY = ((ViewGroup) mParent).getTranslationY();
+ outRect.left += translationX;
+ outRect.right += translationX;
+ outRect.top += translationY;
+ outRect.bottom += translationY;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NeutralGoodDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/NeutralGoodDrawable.java
new file mode 100644
index 0000000..cdb0514
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NeutralGoodDrawable.java
@@ -0,0 +1,78 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.content.res.Resources.Theme;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.view.ContextThemeWrapper;
+import android.view.Gravity;
+import com.android.settingslib.Utils;
+import com.android.systemui.R;
+
+/**
+ * NeutralGoodDrawable implements a drawable that will load 2 underlying drawable resources, one
+ * with each the DualToneDarkTheme and DualToneLightTheme, choosing which one based on what
+ * DarkIconDispatcher tells us about darkness
+ */
+public class NeutralGoodDrawable extends LayerDrawable {
+
+ public static NeutralGoodDrawable create(Context context, int resId) {
+ int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme);
+ int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme);
+ ContextThemeWrapper light = new ContextThemeWrapper(context, dualToneLightTheme);
+ ContextThemeWrapper dark = new ContextThemeWrapper(context, dualToneDarkTheme);
+
+ return create(light, dark, resId);
+ }
+
+ /**
+ * For the on-the-go young entrepreneurial who wants to cache contexts
+ * @param light - a context using the R.attr.lightIconTheme
+ * @param dark - a context using the R.attr.darkIconTheme
+ * @param resId - the resId for our drawable
+ */
+ public static NeutralGoodDrawable create(Context light, Context dark, int resId) {
+ return new NeutralGoodDrawable(
+ new Drawable[] {
+ light.getDrawable(resId).mutate(),
+ dark.getDrawable(resId).mutate() });
+ }
+
+ protected NeutralGoodDrawable(Drawable []drawables) {
+ super(drawables);
+
+ for (int i = 0; i < drawables.length; i++) {
+ setLayerGravity(i, Gravity.CENTER);
+ }
+
+ mutate();
+ setDarkIntensity(0);
+ }
+
+ public void setDarkIntensity(float intensity) {
+
+ getDrawable(0).setAlpha((int) ((1 - intensity) * 255f));
+ getDrawable(1).setAlpha((int) (intensity * 255f));
+
+ invalidateSelf();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java
new file mode 100644
index 0000000..20e5f86
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
+import com.android.systemui.statusbar.phone.StatusBar;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
+
+/**
+ * Manager for the notification blocking helper - tracks and helps create the blocking helper
+ * affordance.
+ */
+public class NotificationBlockingHelperManager {
+ /** Enables debug logging and always makes the blocking helper show up after a dismiss. */
+ private static final boolean DEBUG = false;
+ private static final String TAG = "BlockingHelper";
+
+ private final Context mContext;
+ /** Row that the blocking helper will be shown in (via {@link NotificationGuts}. */
+ private ExpandableNotificationRow mBlockingHelperRow;
+ private Set<String> mNonBlockablePkgs;
+
+ /**
+ * Whether the notification shade/stack is expanded - used to determine blocking helper
+ * eligibility.
+ */
+ private boolean mIsShadeExpanded;
+
+ public NotificationBlockingHelperManager(Context context) {
+ mContext = context;
+ mNonBlockablePkgs = new HashSet<>();
+ Collections.addAll(mNonBlockablePkgs, mContext.getResources().getStringArray(
+ com.android.internal.R.array.config_nonBlockableNotificationPackages));
+ }
+
+ /**
+ * Potentially shows the blocking helper, represented via the {@link NotificationInfo} menu
+ * item, in the current row if user sentiment is negative.
+ *
+ * @param row row to render the blocking helper in
+ * @param menuRow menu used to generate the {@link NotificationInfo} view that houses the
+ * blocking helper UI
+ * @return whether we're showing a blocking helper in the given notification row
+ */
+ boolean perhapsShowBlockingHelper(
+ ExpandableNotificationRow row, NotificationMenuRowPlugin menuRow) {
+ // We only show the blocking helper if:
+ // - User sentiment is negative (DEBUG flag can bypass)
+ // - The notification shade is fully expanded (guarantees we're not touching a HUN).
+ // - The row is blockable (i.e. not non-blockable)
+ // - The dismissed row is a valid group (>1 or 0 children) or the only child in the group
+ if ((row.getEntry().userSentiment == USER_SENTIMENT_NEGATIVE || DEBUG)
+ && mIsShadeExpanded
+ && !row.getIsNonblockable()
+ && (!row.isChildInGroup() || row.isOnlyChildInGroup())) {
+ // Dismiss any current blocking helper before continuing forward (only one can be shown
+ // at a given time).
+ dismissCurrentBlockingHelper();
+
+ if (DEBUG) {
+ Log.d(TAG, "Manager.perhapsShowBlockingHelper: Showing new blocking helper");
+ }
+ NotificationGutsManager manager = Dependency.get(NotificationGutsManager.class);
+
+ // Enable blocking helper on the row before moving forward so everything in the guts is
+ // correctly prepped.
+ mBlockingHelperRow = row;
+ mBlockingHelperRow.setBlockingHelperShowing(true);
+
+ // We don't care about the touch origin (x, y) since we're opening guts without any
+ // explicit user interaction.
+ manager.openGuts(mBlockingHelperRow, 0, 0, menuRow.getLongpressMenuItem(mContext));
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Dismiss the currently showing blocking helper, if any, through a notification update.
+ *
+ * @return whether the blocking helper was dismissed
+ */
+ boolean dismissCurrentBlockingHelper() {
+ if (!isBlockingHelperRowNull()) {
+ if (DEBUG) {
+ Log.d(TAG, "Manager.dismissCurrentBlockingHelper: Dismissing current helper");
+ }
+ if (!mBlockingHelperRow.isBlockingHelperShowing()) {
+ Log.e(TAG, "Manager.dismissCurrentBlockingHelper: "
+ + "Non-null row is not showing a blocking helper");
+ }
+
+ mBlockingHelperRow.setBlockingHelperShowing(false);
+ if (mBlockingHelperRow.isAttachedToWindow()) {
+ Dependency.get(NotificationEntryManager.class).updateNotifications();
+ }
+ mBlockingHelperRow = null;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Update the expansion status of the notification shade/stack.
+ *
+ * @param expandedHeight how much the shade is expanded ({code 0} indicating it's collapsed)
+ */
+ public void setNotificationShadeExpanded(float expandedHeight) {
+ mIsShadeExpanded = expandedHeight > 0.0f;
+ }
+
+ /**
+ * Returns whether the given package name is in the list of non-blockable packages.
+ */
+ public boolean isNonblockablePackage(String packageName) {
+ return mNonBlockablePkgs.contains(packageName);
+ }
+
+ @VisibleForTesting
+ boolean isBlockingHelperRowNull() {
+ return mBlockingHelperRow == null;
+ }
+
+ @VisibleForTesting
+ void setBlockingHelperRowForTest(ExpandableNotificationRow blockingHelperRowForTest) {
+ mBlockingHelperRow = blockingHelperRowForTest;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 775faee..4b6ab64 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -18,25 +18,21 @@
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
+import android.Manifest;
import android.app.AppGlobals;
-import android.app.AppOpsManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
+import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.content.Context;
import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
-import android.os.Bundle;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.NotificationListenerService.RankingMap;
import android.service.notification.SnoozeCriterion;
@@ -46,10 +42,8 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;
-import android.Manifest;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.messages.nano.SystemMessageProto;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.NotificationColorUtil;
import com.android.systemui.Dependency;
@@ -454,47 +448,44 @@
return Ranking.VISIBILITY_NO_OVERRIDE;
}
- public boolean shouldSuppressFullScreenIntent(String key) {
+ public boolean shouldSuppressFullScreenIntent(StatusBarNotification sbn) {
+ return shouldSuppressVisualEffect(sbn, SUPPRESSED_EFFECT_FULL_SCREEN_INTENT);
+ }
+
+ public boolean shouldSuppressPeek(StatusBarNotification sbn) {
+ return shouldSuppressVisualEffect(sbn, SUPPRESSED_EFFECT_PEEK);
+ }
+
+ public boolean shouldSuppressStatusBar(StatusBarNotification sbn) {
+ return shouldSuppressVisualEffect(sbn, SUPPRESSED_EFFECT_STATUS_BAR);
+ }
+
+ public boolean shouldSuppressAmbient(StatusBarNotification sbn) {
+ return shouldSuppressVisualEffect(sbn, SUPPRESSED_EFFECT_AMBIENT);
+ }
+
+ public boolean shouldSuppressNotificationList(StatusBarNotification sbn) {
+ return shouldSuppressVisualEffect(sbn, SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ }
+
+ private boolean shouldSuppressVisualEffect(StatusBarNotification sbn, int effect) {
+ if (isExemptFromDndVisualSuppression(sbn)) {
+ return false;
+ }
+ String key = sbn.getKey();
if (mRankingMap != null) {
getRanking(key, mTmpRanking);
- return (mTmpRanking.getSuppressedVisualEffects()
- & SUPPRESSED_EFFECT_FULL_SCREEN_INTENT) != 0;
+ return (mTmpRanking.getSuppressedVisualEffects() & effect) != 0;
}
return false;
}
- public boolean shouldSuppressPeek(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return (mTmpRanking.getSuppressedVisualEffects()
- & SUPPRESSED_EFFECT_PEEK) != 0;
+ protected boolean isExemptFromDndVisualSuppression(StatusBarNotification sbn) {
+ if ((sbn.getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
+ return true;
}
- return false;
- }
-
- public boolean shouldSuppressStatusBar(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return (mTmpRanking.getSuppressedVisualEffects()
- & SUPPRESSED_EFFECT_STATUS_BAR) != 0;
- }
- return false;
- }
-
- public boolean shouldSuppressAmbient(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return (mTmpRanking.getSuppressedVisualEffects()
- & SUPPRESSED_EFFECT_AMBIENT) != 0;
- }
- return false;
- }
-
- public boolean shouldSuppressNotificationList(String key) {
- if (mRankingMap != null) {
- getRanking(key, mTmpRanking);
- return (mTmpRanking.getSuppressedVisualEffects()
- & SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0;
+ if (sbn.getNotification().isMediaNotification()) {
+ return true;
}
return false;
}
@@ -620,11 +611,11 @@
return true;
}
- if (mEnvironment.isDozing() && shouldSuppressAmbient(sbn.getKey())) {
+ if (mEnvironment.isDozing() && shouldSuppressAmbient(sbn)) {
return true;
}
- if (!mEnvironment.isDozing() && shouldSuppressNotificationList(sbn.getKey())) {
+ if (!mEnvironment.isDozing() && shouldSuppressNotificationList(sbn)) {
return true;
}
@@ -641,9 +632,14 @@
// this is a foreground-service disclosure for a user that does not need to show one
return true;
}
- if (mFsc.isSystemAlertNotification(sbn) && !mFsc.isSystemAlertWarningNeeded(
- sbn.getUserId(), sbn.getPackageName())) {
- return true;
+ if (mFsc.isSystemAlertNotification(sbn)) {
+ final String[] apps = sbn.getNotification().extras.getStringArray(
+ Notification.EXTRA_FOREGROUND_APPS);
+ if (apps != null && apps.length >= 1) {
+ if (!mFsc.isSystemAlertWarningNeeded(sbn.getUserId(), apps[0])) {
+ return true;
+ }
+ }
}
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
index 7a7cc99..45df450 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
@@ -299,12 +299,12 @@
updateNotifications();
}
- private boolean shouldSuppressFullScreenIntent(String key) {
+ private boolean shouldSuppressFullScreenIntent(StatusBarNotification sbn) {
if (mPresenter.isDeviceInVrMode()) {
return true;
}
- return mNotificationData.shouldSuppressFullScreenIntent(key);
+ return mNotificationData.shouldSuppressFullScreenIntent(sbn);
}
private void inflateViews(NotificationData.Entry entry, ViewGroup parent) {
@@ -690,7 +690,7 @@
NotificationData.Entry shadeEntry = createNotificationViews(notification);
boolean isHeadsUped = shouldPeek(shadeEntry);
if (!isHeadsUped && notification.getNotification().fullScreenIntent != null) {
- if (shouldSuppressFullScreenIntent(key)) {
+ if (shouldSuppressFullScreenIntent(notification)) {
if (DEBUG) {
Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + key);
}
@@ -846,13 +846,13 @@
return false;
}
- if (!mPresenter.isDozing() && mNotificationData.shouldSuppressPeek(sbn.getKey())) {
+ if (!mPresenter.isDozing() && mNotificationData.shouldSuppressPeek(sbn)) {
if (DEBUG) Log.d(TAG, "No peeking: suppressed by DND: " + sbn.getKey());
return false;
}
// Peeking triggers an ambient display pulse, so disable peek is ambient is active
- if (mPresenter.isDozing() && mNotificationData.shouldSuppressAmbient(sbn.getKey())) {
+ if (mPresenter.isDozing() && mNotificationData.shouldSuppressAmbient(sbn)) {
if (DEBUG) Log.d(TAG, "No peeking: suppressed by DND: " + sbn.getKey());
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
index 52776d7..bc572a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
@@ -30,6 +30,7 @@
import android.view.accessibility.AccessibilityEvent;
import android.widget.FrameLayout;
+import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.stack.StackStateAnimator;
@@ -189,8 +190,12 @@
}
public void openControls(
- int x, int y, boolean needsFalsingProtection, @Nullable Runnable onAnimationEnd) {
- animateOpen(x, y, onAnimationEnd);
+ boolean shouldDoCircularReveal,
+ int x,
+ int y,
+ boolean needsFalsingProtection,
+ @Nullable Runnable onAnimationEnd) {
+ animateOpen(shouldDoCircularReveal, x, y, onAnimationEnd);
setExposed(true /* exposed */, needsFalsingProtection);
}
@@ -204,7 +209,20 @@
}
}
+ /**
+ * Closes any exposed guts/views.
+ *
+ * @param x x coordinate to animate the close circular reveal with
+ * @param y y coordinate to animate the close circular reveal with
+ * @param save whether the state should be saved
+ * @param force whether the guts should be force-closed regardless of state.
+ */
public void closeControls(int x, int y, boolean save, boolean force) {
+ // First try to dismiss any blocking helper.
+ boolean wasBlockingHelperDismissed =
+ Dependency.get(NotificationBlockingHelperManager.class)
+ .dismissCurrentBlockingHelper();
+
if (getWindowToken() == null) {
if (mClosedListener != null) {
mClosedListener.onGutsClosed(this);
@@ -212,8 +230,12 @@
return;
}
- if (mGutsContent == null || !mGutsContent.handleCloseControls(save, force)) {
- animateClose(x, y);
+ if (mGutsContent == null
+ || !mGutsContent.handleCloseControls(save, force)
+ || wasBlockingHelperDismissed) {
+ // We only want to do a circular reveal if we're not showing the blocking helper.
+ animateClose(x, y, !wasBlockingHelperDismissed /* shouldDoCircularReveal */);
+
setExposed(false, mNeedsFalsingProtection);
if (mClosedListener != null) {
mClosedListener.onGutsClosed(this);
@@ -221,47 +243,58 @@
}
}
- private void animateOpen(int x, int y, @Nullable Runnable onAnimationEnd) {
- final double horz = Math.max(getWidth() - x, x);
- final double vert = Math.max(getHeight() - y, y);
- final float r = (float) Math.hypot(horz, vert);
-
- final Animator a
- = ViewAnimationUtils.createCircularReveal(this, x, y, 0, r);
- a.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
- a.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
- a.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- if (onAnimationEnd != null) {
- onAnimationEnd.run();
- }
- }
- });
- a.start();
+ /** Animates in the guts view via either a fade or a circular reveal. */
+ private void animateOpen(
+ boolean shouldDoCircularReveal, int x, int y, @Nullable Runnable onAnimationEnd) {
+ if (shouldDoCircularReveal) {
+ double horz = Math.max(getWidth() - x, x);
+ double vert = Math.max(getHeight() - y, y);
+ float r = (float) Math.hypot(horz, vert);
+ // Circular reveal originating at (x, y)
+ Animator a = ViewAnimationUtils.createCircularReveal(this, x, y, 0, r);
+ a.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
+ a.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
+ a.addListener(new AnimateOpenListener(onAnimationEnd));
+ a.start();
+ } else {
+ // Fade in content
+ this.setAlpha(0f);
+ this.animate()
+ .alpha(1f)
+ .setDuration(StackStateAnimator.ANIMATION_DURATION_BLOCKING_HELPER_FADE)
+ .setInterpolator(Interpolators.ALPHA_IN)
+ .setListener(new AnimateOpenListener(onAnimationEnd))
+ .start();
+ }
}
- private void animateClose(int x, int y) {
- if (x == -1 || y == -1) {
- x = (getLeft() + getRight()) / 2;
- y = (getTop() + getHeight() / 2);
- }
- final double horz = Math.max(getWidth() - x, x);
- final double vert = Math.max(getHeight() - y, y);
- final float r = (float) Math.hypot(horz, vert);
- final Animator a = ViewAnimationUtils.createCircularReveal(this,
- x, y, r, 0);
- a.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
- a.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
- a.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- setVisibility(View.GONE);
+
+ /** Animates out the guts view via either a fade or a circular reveal. */
+ private void animateClose(int x, int y, boolean shouldDoCircularReveal) {
+ if (shouldDoCircularReveal) {
+ // Circular reveal originating at (x, y)
+ if (x == -1 || y == -1) {
+ x = (getLeft() + getRight()) / 2;
+ y = (getTop() + getHeight() / 2);
}
- });
- a.start();
+ double horz = Math.max(getWidth() - x, x);
+ double vert = Math.max(getHeight() - y, y);
+ float r = (float) Math.hypot(horz, vert);
+ Animator a = ViewAnimationUtils.createCircularReveal(this,
+ x, y, r, 0);
+ a.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
+ a.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
+ a.addListener(new AnimateCloseListener(this /* view */));
+ a.start();
+ } else {
+ // Fade in the blocking helper.
+ this.animate()
+ .alpha(0f)
+ .setDuration(StackStateAnimator.ANIMATION_DURATION_BLOCKING_HELPER_FADE)
+ .setInterpolator(Interpolators.ALPHA_OUT)
+ .setListener(new AnimateCloseListener(this /* view */))
+ .start();
+ }
}
public void setActualHeight(int actualHeight) {
@@ -336,4 +369,36 @@
public boolean isLeavebehind() {
return mGutsContent != null && mGutsContent.isLeavebehind();
}
+
+ /** Listener for animations executed in {@link #animateOpen(boolean, int, int, Runnable)}. */
+ private static class AnimateOpenListener extends AnimatorListenerAdapter {
+ final Runnable mOnAnimationEnd;
+
+ private AnimateOpenListener(Runnable onAnimationEnd) {
+ mOnAnimationEnd = onAnimationEnd;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (mOnAnimationEnd != null) {
+ mOnAnimationEnd.run();
+ }
+ }
+ }
+
+ /** Listener for animations executed in {@link #animateClose(int, int, boolean)}. */
+ private static class AnimateCloseListener extends AnimatorListenerAdapter {
+ final View mView;
+
+ private AnimateCloseListener(View view) {
+ mView = view;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ mView.setVisibility(View.GONE);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
index 9b2f939..dff5f38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
@@ -21,7 +21,6 @@
import static android.service.notification.NotificationListenerService.Ranking
.USER_SENTIMENT_NEGATIVE;
-import android.app.AppOpsManager;
import android.app.INotificationManager;
import android.app.NotificationChannel;
import android.content.Context;
@@ -34,6 +33,7 @@
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
+import android.support.annotation.VisibleForTesting;
import android.util.ArraySet;
import android.util.Log;
import android.view.HapticFeedbackConstants;
@@ -65,7 +65,6 @@
private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key";
private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
- private final Set<String> mNonBlockablePkgs;
private final Context mContext;
private final AccessibilityManager mAccessibilityManager;
@@ -87,10 +86,6 @@
mContext = context;
Resources res = context.getResources();
- mNonBlockablePkgs = new HashSet<>();
- Collections.addAll(mNonBlockablePkgs, res.getStringArray(
- com.android.internal.R.array.config_nonBlockableNotificationPackages));
-
mAccessibilityManager = (AccessibilityManager)
mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
}
@@ -119,22 +114,6 @@
bindGuts(row);
}
- private void saveAndCloseNotificationMenu(
- ExpandableNotificationRow row, NotificationGuts guts, View done) {
- guts.resetFalsingCheck();
- int[] rowLocation = new int[2];
- int[] doneLocation = new int[2];
- row.getLocationOnScreen(rowLocation);
- done.getLocationOnScreen(doneLocation);
-
- final int centerX = done.getWidth() / 2;
- final int centerY = done.getHeight() / 2;
- final int x = doneLocation[0] - rowLocation[0] + centerX;
- final int y = doneLocation[1] - rowLocation[1] + centerY;
- closeAndSaveGuts(false /* removeLeavebehind */, false /* force */,
- true /* removeControls */, x, y, true /* resetMenu */);
- }
-
/**
* Sends an intent to open the app settings for a particular package and optional
* channel.
@@ -174,12 +153,12 @@
private void bindGuts(final ExpandableNotificationRow row,
NotificationMenuRowPlugin.MenuItem item) {
+ StatusBarNotification sbn = row.getStatusBarNotification();
+
row.inflateGuts();
row.setGutsView(item);
- final StatusBarNotification sbn = row.getStatusBarNotification();
row.setTag(sbn.getPackageName());
- final NotificationGuts guts = row.getGuts();
- guts.setClosedListener((NotificationGuts g) -> {
+ row.getGuts().setClosedListener((NotificationGuts g) -> {
if (!g.willBeRemoved() && !row.isRemoved()) {
mListContainer.onHeightChanged(
row, !mPresenter.isPresenterFullyCollapsed() /* needsAnimation */);
@@ -197,86 +176,114 @@
View gutsView = item.getGutsView();
if (gutsView instanceof NotificationSnooze) {
- NotificationSnooze snoozeGuts = (NotificationSnooze) gutsView;
- snoozeGuts.setSnoozeListener(mListContainer.getSwipeActionHelper());
- snoozeGuts.setStatusBarNotification(sbn);
- snoozeGuts.setSnoozeOptions(row.getEntry().snoozeCriteria);
- guts.setHeightChangedListener((NotificationGuts g) -> {
- mListContainer.onHeightChanged(row, row.isShown() /* needsAnimation */);
- });
+ initializeSnoozeView(row, (NotificationSnooze) gutsView);
+ } else if (gutsView instanceof AppOpsInfo) {
+ initializeAppOpsInfo(row, (AppOpsInfo) gutsView);
+ } else if (gutsView instanceof NotificationInfo) {
+ initializeNotificationInfo(row, (NotificationInfo) gutsView);
}
+ }
- if (gutsView instanceof AppOpsInfo) {
- AppOpsInfo info = (AppOpsInfo) gutsView;
- final UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(mContext,
- userHandle.getIdentifier());
- final AppOpsInfo.OnSettingsClickListener onSettingsClick = (View v,
- String pkg, int uid, ArraySet<Integer> ops) -> {
- mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_OPS_GUTS_SETTINGS);
- guts.resetFalsingCheck();
- startAppOpsSettingsActivity(pkg, uid, ops, row);
- };
- if (!row.getEntry().mActiveAppOps.isEmpty()) {
- info.bindGuts(pmUser, onSettingsClick, sbn, row.getEntry().mActiveAppOps);
- }
+ /**
+ * Sets up the {@link NotificationSnooze} inside the notification row's guts.
+ *
+ * @param row view to set up the guts for
+ * @param notificationSnoozeView view to set up/bind within {@code row}
+ */
+ private void initializeSnoozeView(
+ final ExpandableNotificationRow row,
+ NotificationSnooze notificationSnoozeView) {
+ NotificationGuts guts = row.getGuts();
+ StatusBarNotification sbn = row.getStatusBarNotification();
+
+ notificationSnoozeView.setSnoozeListener(mListContainer.getSwipeActionHelper());
+ notificationSnoozeView.setStatusBarNotification(sbn);
+ notificationSnoozeView.setSnoozeOptions(row.getEntry().snoozeCriteria);
+ guts.setHeightChangedListener((NotificationGuts g) -> {
+ mListContainer.onHeightChanged(row, row.isShown() /* needsAnimation */);
+ });
+ }
+
+ /**
+ * Sets up the {@link AppOpsInfo} inside the notification row's guts.
+ *
+ * @param row view to set up the guts for
+ * @param appOpsInfoView view to set up/bind within {@code row}
+ */
+ private void initializeAppOpsInfo(
+ final ExpandableNotificationRow row,
+ AppOpsInfo appOpsInfoView) {
+ NotificationGuts guts = row.getGuts();
+ StatusBarNotification sbn = row.getStatusBarNotification();
+ UserHandle userHandle = sbn.getUser();
+ PackageManager pmUser = StatusBar.getPackageManagerForUser(mContext,
+ userHandle.getIdentifier());
+
+ AppOpsInfo.OnSettingsClickListener onSettingsClick =
+ (View v, String pkg, int uid, ArraySet<Integer> ops) -> {
+ mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_OPS_GUTS_SETTINGS);
+ guts.resetFalsingCheck();
+ startAppOpsSettingsActivity(pkg, uid, ops, row);
+ };
+ if (!row.getEntry().mActiveAppOps.isEmpty()) {
+ appOpsInfoView.bindGuts(pmUser, onSettingsClick, sbn, row.getEntry().mActiveAppOps);
}
+ }
- if (gutsView instanceof NotificationInfo) {
- final UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(mContext,
- userHandle.getIdentifier());
- final INotificationManager iNotificationManager = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- final String pkg = sbn.getPackageName();
- NotificationInfo info = (NotificationInfo) gutsView;
- // Settings link is only valid for notifications that specify a user, unless this is the
- // system user.
- NotificationInfo.OnSettingsClickListener onSettingsClick = null;
- if (!userHandle.equals(UserHandle.ALL)
- || mLockscreenUserManager.getCurrentUserId() == UserHandle.USER_SYSTEM) {
- onSettingsClick = (View v, NotificationChannel channel, int appUid) -> {
- mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_NOTE_INFO);
+ /**
+ * Sets up the {@link NotificationInfo} inside the notification row's guts.
+ *
+ * @param row view to set up the guts for
+ * @param notificationInfoView view to set up/bind within {@code row}
+ */
+ @VisibleForTesting
+ void initializeNotificationInfo(
+ final ExpandableNotificationRow row,
+ NotificationInfo notificationInfoView) {
+ NotificationGuts guts = row.getGuts();
+ StatusBarNotification sbn = row.getStatusBarNotification();
+ String packageName = sbn.getPackageName();
+ // Settings link is only valid for notifications that specify a non-system user
+ NotificationInfo.OnSettingsClickListener onSettingsClick = null;
+ UserHandle userHandle = sbn.getUser();
+ PackageManager pmUser = StatusBar.getPackageManagerForUser(
+ mContext, userHandle.getIdentifier());
+ INotificationManager iNotificationManager = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ final NotificationInfo.OnAppSettingsClickListener onAppSettingsClick =
+ (View v, Intent intent) -> {
+ mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_APP_NOTE_SETTINGS);
guts.resetFalsingCheck();
- mOnSettingsClickListener.onClick(sbn.getKey());
- startAppNotificationSettingsActivity(pkg, appUid, channel, row);
+ mPresenter.startNotificationGutsIntent(intent, sbn.getUid(), row);
};
- }
- final NotificationInfo.OnAppSettingsClickListener onAppSettingsClick = (View v,
- Intent intent) -> {
- mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_APP_NOTE_SETTINGS);
- guts.resetFalsingCheck();
- mPresenter.startNotificationGutsIntent(intent, sbn.getUid(), row);
- };
- final View.OnClickListener onDoneClick = (View v) -> {
- saveAndCloseNotificationMenu(row, guts, v);
- };
+ boolean isForBlockingHelper = row.isBlockingHelperShowing();
- ArraySet<NotificationChannel> channels = new ArraySet<>();
- channels.add(row.getEntry().channel);
- if (row.isSummaryWithChildren()) {
- // If this is a summary, then add in the children notification channels for the
- // same user and pkg.
- final List<ExpandableNotificationRow> childrenRows = row.getNotificationChildren();
- final int numChildren = childrenRows.size();
- for (int i = 0; i < numChildren; i++) {
- final ExpandableNotificationRow childRow = childrenRows.get(i);
- final NotificationChannel childChannel = childRow.getEntry().channel;
- final StatusBarNotification childSbn = childRow.getStatusBarNotification();
- if (childSbn.getUser().equals(userHandle) &&
- childSbn.getPackageName().equals(pkg)) {
- channels.add(childChannel);
- }
- }
- }
- try {
- info.bindNotification(pmUser, iNotificationManager, pkg, row.getEntry().channel,
- channels.size(), sbn, mCheckSaveListener, onSettingsClick,
- onAppSettingsClick, mNonBlockablePkgs,
- row.getEntry().userSentiment == USER_SENTIMENT_NEGATIVE);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
+ if (!userHandle.equals(UserHandle.ALL)
+ || mLockscreenUserManager.getCurrentUserId() == UserHandle.USER_SYSTEM) {
+ onSettingsClick = (View v, NotificationChannel channel, int appUid) -> {
+ mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_NOTE_INFO);
+ guts.resetFalsingCheck();
+ mOnSettingsClickListener.onClick(sbn.getKey());
+ startAppNotificationSettingsActivity(packageName, appUid, channel, row);
+ };
+ }
+
+ try {
+ notificationInfoView.bindNotification(
+ pmUser,
+ iNotificationManager,
+ packageName,
+ row.getEntry().channel,
+ row.getNumUniqueChannels(),
+ sbn,
+ mCheckSaveListener,
+ onSettingsClick,
+ onAppSettingsClick,
+ row.getIsNonblockable(),
+ isForBlockingHelper,
+ row.getEntry().userSentiment == USER_SENTIMENT_NEGATIVE);
+ } catch (RemoteException e) {
+ Log.e(TAG, e.toString());
}
}
@@ -312,37 +319,42 @@
}
/**
- * Opens guts on the given ExpandableNotificationRow |v|.
+ * Opens guts on the given ExpandableNotificationRow {@code view}. This handles opening guts for
+ * the normal half-swipe and long-press use cases via a circular reveal. When the blocking
+ * helper needs to be shown on the row, this will skip the circular reveal.
*
- * @param v ExpandableNotificationRow to open guts on
+ * @param view ExpandableNotificationRow to open guts on
* @param x x coordinate of origin of circular reveal
* @param y y coordinate of origin of circular reveal
- * @param item MenuItem the guts should display
+ * @param menuItem MenuItem the guts should display
* @return true if guts was opened
*/
- public boolean openGuts(View v, int x, int y,
- NotificationMenuRowPlugin.MenuItem item) {
- if (!(v instanceof ExpandableNotificationRow)) {
+ boolean openGuts(
+ View view,
+ int x,
+ int y,
+ NotificationMenuRowPlugin.MenuItem menuItem) {
+ if (!(view instanceof ExpandableNotificationRow)) {
return false;
}
- if (v.getWindowToken() == null) {
+ if (view.getWindowToken() == null) {
Log.e(TAG, "Trying to show notification guts, but not attached to window");
return false;
}
- final ExpandableNotificationRow row = (ExpandableNotificationRow) v;
+ final ExpandableNotificationRow row = (ExpandableNotificationRow) view;
if (row.isDark()) {
return false;
}
- v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
if (row.areGutsExposed()) {
closeAndSaveGuts(false /* removeLeavebehind */, false /* force */,
true /* removeControls */, -1 /* x */, -1 /* y */,
true /* resetMenu */);
return false;
}
- bindGuts(row, item);
+ bindGuts(row, menuItem);
NotificationGuts guts = row.getGuts();
// Assume we are a status_bar_notification_row
@@ -372,15 +384,18 @@
final boolean needsFalsingProtection =
(mPresenter.isPresenterLocked() &&
!mAccessibilityManager.isTouchExplorationEnabled());
- guts.openControls(x, y, needsFalsingProtection, () -> {
- // Move the notification view back over the menu
- row.resetTranslation();
- });
+
+ guts.openControls(
+ !row.isBlockingHelperShowing(),
+ x,
+ y,
+ needsFalsingProtection,
+ row::resetTranslation);
row.closeRemoteInput();
mListContainer.onHeightChanged(row, true /* needsAnimation */);
mNotificationGutsExposed = guts;
- mGutsMenuItem = item;
+ mGutsMenuItem = menuItem;
}
});
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index b1ad30c..a93be00 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -31,7 +31,6 @@
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
@@ -46,14 +45,14 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import java.util.List;
-import java.util.Set;
/**
* The guts of a notification revealed when performing a long press.
@@ -72,7 +71,7 @@
private int mStartingUserImportance;
private int mChosenImportance;
private boolean mIsSingleDefaultChannel;
- private boolean mNonblockable;
+ private boolean mIsNonblockable;
private StatusBarNotification mSbn;
private AnimatorSet mExpandAnimation;
private boolean mIsForeground;
@@ -81,11 +80,12 @@
private OnSettingsClickListener mOnSettingsClickListener;
private OnAppSettingsClickListener mAppSettingsClickListener;
private NotificationGuts mGutsContainer;
+
+ /** Whether this view is being shown as part of the blocking helper */
+ private boolean mIsForBlockingHelper;
private boolean mNegativeUserSentiment;
- private OnClickListener mOnKeepShowing = v -> {
- closeControls(v);
- };
+ private OnClickListener mOnKeepShowing = this::closeControls;
private OnClickListener mOnStopMinNotifications = v -> {
swapContent(false);
@@ -114,7 +114,9 @@
void onClick(View v, Intent intent);
}
- public void bindNotification(final PackageManager pm,
+ @VisibleForTesting
+ void bindNotification(
+ final PackageManager pm,
final INotificationManager iNotificationManager,
final String pkg,
final NotificationChannel notificationChannel,
@@ -123,24 +125,28 @@
final CheckSaveListener checkSaveListener,
final OnSettingsClickListener onSettingsClick,
final OnAppSettingsClickListener onAppSettingsClick,
- final Set<String> nonBlockablePkgs)
+ boolean isNonblockable)
throws RemoteException {
bindNotification(pm, iNotificationManager, pkg, notificationChannel, numChannels, sbn,
- checkSaveListener, onSettingsClick, onAppSettingsClick, nonBlockablePkgs,
- false /* negative sentiment */);
+ checkSaveListener, onSettingsClick, onAppSettingsClick, isNonblockable,
+ false /* isBlockingHelper */,
+ false /* isUserSentimentNegative */);
}
- public void bindNotification(final PackageManager pm,
- final INotificationManager iNotificationManager,
- final String pkg,
- final NotificationChannel notificationChannel,
- final int numChannels,
- final StatusBarNotification sbn,
- final CheckSaveListener checkSaveListener,
- final OnSettingsClickListener onSettingsClick,
- final OnAppSettingsClickListener onAppSettingsClick,
- final Set<String> nonBlockablePkgs,
- boolean negativeUserSentiment) throws RemoteException {
+ public void bindNotification(
+ PackageManager pm,
+ INotificationManager iNotificationManager,
+ String pkg,
+ NotificationChannel notificationChannel,
+ int numChannels,
+ StatusBarNotification sbn,
+ CheckSaveListener checkSaveListener,
+ OnSettingsClickListener onSettingsClick,
+ OnAppSettingsClickListener onAppSettingsClick,
+ boolean isNonblockable,
+ boolean isForBlockingHelper,
+ boolean isUserSentimentNegative)
+ throws RemoteException {
mINotificationManager = iNotificationManager;
mPkg = pkg;
mNumNotificationChannels = numChannels;
@@ -152,9 +158,12 @@
mOnSettingsClickListener = onSettingsClick;
mSingleNotificationChannel = notificationChannel;
mStartingUserImportance = mChosenImportance = mSingleNotificationChannel.getImportance();
- mNegativeUserSentiment = negativeUserSentiment;
+ mNegativeUserSentiment = isUserSentimentNegative;
+ mIsNonblockable = isNonblockable;
mIsForeground =
(mSbn.getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE) != 0;
+ mIsForBlockingHelper = isForBlockingHelper;
+ mAppUid = mSbn.getUid();
int numTotalChannels = mINotificationManager.getNumNotificationChannelsForPackage(
pkg, mAppUid, false /* includeDeleted */);
@@ -163,27 +172,11 @@
} else {
// Special behavior for the Default channel if no other channels have been defined.
mIsSingleDefaultChannel = mNumNotificationChannels == 1
- && mSingleNotificationChannel.getId()
- .equals(NotificationChannel.DEFAULT_CHANNEL_ID)
- && numTotalChannels <= 1;
+ && mSingleNotificationChannel.getId().equals(
+ NotificationChannel.DEFAULT_CHANNEL_ID)
+ && numTotalChannels == 1;
}
- try {
- final PackageInfo pkgInfo = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
- if (Utils.isSystemPackage(getResources(), pm, pkgInfo)) {
- if (mSingleNotificationChannel != null
- && !mSingleNotificationChannel.isBlockableSystem()) {
- mNonblockable = true;
- }
- }
- } catch (PackageManager.NameNotFoundException e) {
- // unlikely.
- }
- if (nonBlockablePkgs != null) {
- mNonblockable |= nonBlockablePkgs.contains(pkg);
- }
- mNonblockable |= (mNumNotificationChannels > 1);
-
bindHeader();
bindPrompt();
bindButtons();
@@ -200,7 +193,6 @@
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE
| PackageManager.MATCH_DIRECT_BOOT_AWARE);
if (info != null) {
- mAppUid = mSbn.getUid();
mAppName = String.valueOf(mPm.getApplicationLabel(info));
pkgicon = mPm.getApplicationIcon(info);
}
@@ -251,7 +243,7 @@
private void bindPrompt() {
final TextView blockPrompt = findViewById(R.id.block_prompt);
bindName();
- if (mNonblockable) {
+ if (mIsNonblockable) {
blockPrompt.setText(R.string.notification_unblockable_desc);
} else {
if (mNegativeUserSentiment) {
@@ -278,7 +270,7 @@
}
private void saveImportance() {
- if (mNonblockable) {
+ if (mIsNonblockable) {
return;
}
MetricsLogger.action(mContext, MetricsEvent.ACTION_SAVE_IMPORTANCE,
@@ -294,15 +286,17 @@
}
private void bindButtons() {
+ // Set up stay-in-notification actions
View block = findViewById(R.id.block);
- block.setOnClickListener(mOnStopMinNotifications);
TextView keep = findViewById(R.id.keep);
- keep.setOnClickListener(mOnKeepShowing);
- findViewById(R.id.undo).setOnClickListener(mOnUndo);
View minimize = findViewById(R.id.minimize);
+
+ findViewById(R.id.undo).setOnClickListener(mOnUndo);
+ block.setOnClickListener(mOnStopMinNotifications);
+ keep.setOnClickListener(mOnKeepShowing);
minimize.setOnClickListener(mOnStopMinNotifications);
- if (mNonblockable) {
+ if (mIsNonblockable) {
keep.setText(R.string.notification_done);
block.setVisibility(GONE);
minimize.setVisibility(GONE);
@@ -314,7 +308,7 @@
minimize.setVisibility(GONE);
}
- // app settings link
+ // Set up app settings link
TextView settingsLinkView = findViewById(R.id.app_settings);
Intent settingsIntent = getAppSettingsIntent(mPm, mPkg, mSingleNotificationChannel,
mSbn.getId(), mSbn.getTag());
@@ -421,16 +415,23 @@
return intent;
}
- private void closeControls(View v) {
- int[] parentLoc = new int[2];
- int[] targetLoc = new int[2];
- mGutsContainer.getLocationOnScreen(parentLoc);
- v.getLocationOnScreen(targetLoc);
- final int centerX = v.getWidth() / 2;
- final int centerY = v.getHeight() / 2;
- final int x = targetLoc[0] - parentLoc[0] + centerX;
- final int y = targetLoc[1] - parentLoc[1] + centerY;
- mGutsContainer.closeControls(x, y, true /* save */, false /* force */);
+ @VisibleForTesting
+ void closeControls(View v) {
+ if (mIsForBlockingHelper) {
+ NotificationBlockingHelperManager manager =
+ Dependency.get(NotificationBlockingHelperManager.class);
+ manager.dismissCurrentBlockingHelper();
+ } else {
+ int[] parentLoc = new int[2];
+ int[] targetLoc = new int[2];
+ mGutsContainer.getLocationOnScreen(parentLoc);
+ v.getLocationOnScreen(targetLoc);
+ final int centerX = v.getWidth() / 2;
+ final int centerY = v.getHeight() / 2;
+ final int x = targetLoc[0] - parentLoc[0] + centerX;
+ final int y = targetLoc[1] - parentLoc[1] + centerY;
+ mGutsContainer.closeControls(x, y, true /* save */, false /* force */);
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index a4aa598..0112661 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -227,7 +227,6 @@
expandAmount = Math.min(1.0f, expandAmount);
}
// find the first view that doesn't overlap with the shelf
- int notificationIndex = 0;
int notGoneIndex = 0;
int colorOfViewBeforeLast = NO_COLOR;
boolean backgroundForceHidden = false;
@@ -247,13 +246,15 @@
int baseZHeight = mAmbientState.getBaseZHeight();
int backgroundTop = 0;
float firstElementRoundness = 0.0f;
- while (notificationIndex < mHostLayout.getChildCount()) {
- ExpandableView child = (ExpandableView) mHostLayout.getChildAt(notificationIndex);
- notificationIndex++;
+
+ for (int i = 0; i < mHostLayout.getChildCount(); i++) {
+ ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
+
if (!(child instanceof ExpandableNotificationRow)
|| child.getVisibility() == GONE) {
continue;
}
+
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
float notificationClipEnd;
boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight
@@ -315,6 +316,9 @@
notGoneIndex++;
previousColor = ownColorUntinted;
}
+
+ clipTransientViews();
+
setBackgroundTop(backgroundTop);
setFirstElementRoundness(firstElementRoundness);
mShelfIcons.setSpeedBumpIndex(mAmbientState.getSpeedBumpIndex());
@@ -337,6 +341,25 @@
}
}
+ /**
+ * Clips transient views to the top of the shelf - Transient views are only used for
+ * disappearing views/animations and need to be clipped correctly by the shelf to ensure they
+ * don't show underneath the notification stack when something is animating and the user
+ * swipes quickly.
+ */
+ private void clipTransientViews() {
+ for (int i = 0; i < mHostLayout.getTransientViewCount(); i++) {
+ View transientView = mHostLayout.getTransientView(i);
+ if (transientView instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow transientRow = (ExpandableNotificationRow) transientView;
+ updateNotificationClipHeight(transientRow, getTranslationY());
+ } else {
+ Log.e(TAG, "NotificationShelf.clipTransientViews(): "
+ + "Trying to clip non-row transient view");
+ }
+ }
+ }
+
private void setFirstElementRoundness(float firstElementRoundness) {
if (mFirstElementRoundness != firstElementRoundness) {
mFirstElementRoundness = firstElementRoundness;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 75b8b37..fd3a9d5e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -125,24 +125,30 @@
}
- ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>();
+ ArrayList<ExpandableNotificationRow> viewsToRemove = new ArrayList<>();
for (int i=0; i< mListContainer.getContainerChildCount(); i++) {
View child = mListContainer.getContainerChildAt(i);
if (!toShow.contains(child) && child instanceof ExpandableNotificationRow) {
- toRemove.add((ExpandableNotificationRow) child);
+ ExpandableNotificationRow row = (ExpandableNotificationRow) child;
+
+ // Blocking helper is effectively a detached view. Don't bother removing it from the
+ // layout.
+ if (!row.isBlockingHelperShowing()) {
+ viewsToRemove.add((ExpandableNotificationRow) child);
+ }
}
}
- for (ExpandableNotificationRow remove : toRemove) {
- if (mGroupManager.isChildInGroupWithSummary(remove.getStatusBarNotification())) {
+ for (ExpandableNotificationRow viewToRemove : viewsToRemove) {
+ if (mGroupManager.isChildInGroupWithSummary(viewToRemove.getStatusBarNotification())) {
// we are only transferring this notification to its parent, don't generate an
// animation
mListContainer.setChildTransferInProgress(true);
}
- if (remove.isSummaryWithChildren()) {
- remove.removeAllChildren();
+ if (viewToRemove.isSummaryWithChildren()) {
+ viewToRemove.removeAllChildren();
}
- mListContainer.removeContainerView(remove);
+ mListContainer.removeContainerView(viewToRemove);
mListContainer.setChildTransferInProgress(false);
}
@@ -168,6 +174,10 @@
// We don't care about non-notification views.
continue;
}
+ if (((ExpandableNotificationRow) child).isBlockingHelperShowing()) {
+ // Don't count/reorder notifications that are showing the blocking helper!
+ continue;
+ }
ExpandableNotificationRow targetChild = toShow.get(j);
if (child != targetChild) {
@@ -340,9 +350,6 @@
}
}
- row.showBlockingHelper(entry.userSentiment ==
- NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE);
-
row.showAppOpsIcons(entry.mActiveAppOps);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 3cf7741..e7b768f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -55,7 +55,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
// Intimately tied to the design of res/layout/signal_cluster_view.xml
public class SignalClusterView extends LinearLayout implements NetworkControllerImpl.SignalCallback,
@@ -277,7 +276,8 @@
@Override
public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
- boolean activityIn, boolean activityOut, String description, boolean isTransient) {
+ boolean activityIn, boolean activityOut, String description, boolean isTransient,
+ String secondaryLabel) {
mWifiVisible = statusIcon.visible && !mBlockWifi;
mWifiStrengthId = statusIcon.icon;
mWifiDescription = statusIcon.contentDescription;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
index badc40d..14a6c42 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
@@ -31,8 +31,11 @@
public abstract class StackScrollerDecorView extends ExpandableView {
protected View mContent;
+ protected View mSecondaryView;
private boolean mIsVisible;
+ private boolean mIsSecondaryVisible;
private boolean mAnimating;
+ private int mDuration = 260;
public StackScrollerDecorView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -42,6 +45,7 @@
protected void onFinishInflate() {
super.onFinishInflate();
mContent = findContentView();
+ mSecondaryView = findSecondaryView();
setInvisible();
}
@@ -57,17 +61,37 @@
}
public void performVisibilityAnimation(boolean nowVisible) {
- animateText(nowVisible, null /* onFinishedRunnable */);
+ animateText(mContent, nowVisible, null /* onFinishedRunnable */);
+ mIsVisible = nowVisible;
}
public void performVisibilityAnimation(boolean nowVisible, Runnable onFinishedRunnable) {
- animateText(nowVisible, onFinishedRunnable);
+ animateText(mContent, nowVisible, onFinishedRunnable);
+ mIsVisible = nowVisible;
+ }
+
+ public void performSecondaryVisibilityAnimation(boolean nowVisible) {
+ performSecondaryVisibilityAnimation(nowVisible, null /* onFinishedRunnable */);
+ }
+
+ public void performSecondaryVisibilityAnimation(boolean nowVisible,
+ Runnable onFinishedRunnable) {
+ animateText(mSecondaryView, nowVisible, onFinishedRunnable);
+ mIsSecondaryVisible = nowVisible;
+ }
+
+ public boolean isSecondaryVisible() {
+ return mSecondaryView != null && (mIsSecondaryVisible || mAnimating);
}
public boolean isVisible() {
return mIsVisible || mAnimating;
}
+ void setDuration(int duration) {
+ mDuration = duration;
+ }
+
/**
* Animate the text to a new visibility.
*
@@ -75,7 +99,10 @@
* @param onFinishedRunnable A runnable which should be run when the animation is
* finished.
*/
- private void animateText(boolean nowVisible, final Runnable onFinishedRunnable) {
+ private void animateText(View view, boolean nowVisible, final Runnable onFinishedRunnable) {
+ if (view == null) {
+ return;
+ }
if (nowVisible != mIsVisible) {
// Animate text
float endValue = nowVisible ? 1.0f : 0.0f;
@@ -86,10 +113,10 @@
interpolator = Interpolators.ALPHA_OUT;
}
mAnimating = true;
- mContent.animate()
+ view.animate()
.alpha(endValue)
.setInterpolator(interpolator)
- .setDuration(260)
+ .setDuration(mDuration)
.withEndAction(new Runnable() {
@Override
public void run() {
@@ -99,7 +126,6 @@
}
}
});
- mIsVisible = nowVisible;
} else {
if (onFinishedRunnable != null) {
onFinishedRunnable.run();
@@ -109,7 +135,11 @@
public void setInvisible() {
mContent.setAlpha(0.0f);
+ if (mSecondaryView != null) {
+ mSecondaryView.setAlpha(0.0f);
+ }
mIsVisible = false;
+ mIsSecondaryVisible = false;
}
@Override
@@ -134,7 +164,15 @@
public void cancelAnimation() {
mContent.animate().cancel();
+ if (mSecondaryView != null) {
+ mSecondaryView.animate().cancel();
+ }
}
protected abstract View findContentView();
+
+ /**
+ * Returns a view that might not always appear while the main content view is still visible.
+ */
+ protected abstract View findSecondaryView();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java
new file mode 100644
index 0000000..56f78f4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconContainer.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.statusbar;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Holds an array of {@link com.android.internal.statusbar.StatusBarIcon}s and draws them
+ * in a linear layout
+ */
+public class StatusBarIconContainer {
+ private final List<StatusBarIcon> mIcons = new ArrayList<>();
+
+ public StatusBarIconContainer(List<StatusBarIcon> icons) {
+ mIcons.addAll(icons);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 603902a..bd6bd12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar;
+import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -23,6 +25,7 @@
import android.app.Notification;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -56,7 +59,7 @@
import java.text.NumberFormat;
import java.util.Arrays;
-public class StatusBarIconView extends AnimatedImageView {
+public class StatusBarIconView extends AnimatedImageView implements StatusIconDisplayable {
public static final int NO_COLOR = 0;
/**
@@ -867,6 +870,21 @@
mOnDismissListener = onDismissListener;
}
+ @Override
+ public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+ setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
+ }
+
+ @Override
+ public boolean isIconVisible() {
+ return mIcon != null && mIcon.visible;
+ }
+
+ @Override
+ public boolean isIconBlocked() {
+ return mBlocked;
+ }
+
public interface OnVisibilityChangedListener {
void onVisibilityChanged(int newVisibility);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
new file mode 100644
index 0000000..b7620f3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar;
+
+import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.AlphaOptimizedLinearLayout;
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+
+public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements DarkReceiver,
+ StatusIconDisplayable {
+ private static final String TAG = "StatusBarMobileView";
+
+ private String mSlot;
+ private MobileIconState mState;
+ private SignalDrawable mMobileDrawable;
+ private View mInoutContainer;
+ private ImageView mIn;
+ private ImageView mOut;
+ private ImageView mMobile, mMobileType, mMobileRoaming;
+ private View mMobileRoamingSpace;
+
+ public static StatusBarMobileView fromContext(Context context) {
+ LayoutInflater inflater = LayoutInflater.from(context);
+
+ return (StatusBarMobileView)
+ inflater.inflate(R.layout.status_bar_mobile_signal_group, null);
+ }
+
+ public StatusBarMobileView(Context context) {
+ super(context);
+ }
+
+ public StatusBarMobileView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ init();
+ }
+
+ private void init() {
+ mMobile = findViewById(R.id.mobile_signal);
+ mMobileType = findViewById(R.id.mobile_type);
+ mMobileRoaming = findViewById(R.id.mobile_roaming);
+ mMobileRoamingSpace = findViewById(R.id.mobile_roaming_space);
+ mIn = findViewById(R.id.mobile_in);
+ mOut = findViewById(R.id.mobile_out);
+ mInoutContainer = findViewById(R.id.inout_container);
+
+ mMobileDrawable = new SignalDrawable(getContext());
+ mMobile.setImageDrawable(mMobileDrawable);
+ }
+
+ public void applyMobileState(MobileIconState state) {
+ if (state == null) {
+ setVisibility(View.GONE);
+ mState = null;
+ return;
+ }
+
+ if (mState == null) {
+ mState = state;
+ initViewState();
+ return;
+ }
+
+ if (!mState.equals(state)) {
+ updateState(state);
+ }
+ }
+
+ private void initViewState() {
+ setContentDescription(mState.contentDescription);
+ if (!mState.visible) {
+ setVisibility(View.GONE);
+ } else {
+ setVisibility(View.VISIBLE);
+ }
+ mMobileDrawable.setLevel(mState.strengthId);
+ if (mState.typeId > 0) {
+ mMobileType.setContentDescription(mState.typeContentDescription);
+ mMobileType.setImageResource(mState.typeId);
+ mMobileType.setVisibility(View.VISIBLE);
+ } else {
+ mMobileType.setVisibility(View.GONE);
+ }
+
+ mMobileRoaming.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
+ mMobileRoamingSpace.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
+ mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
+ mInoutContainer.setVisibility((mState.activityIn || mState.activityOut)
+ ? View.VISIBLE : View.GONE);
+ }
+
+ private void updateState(MobileIconState state) {
+ setContentDescription(state.contentDescription);
+ if (mState.visible != state.visible) {
+ setVisibility(state.visible ? View.VISIBLE : View.GONE);
+ }
+ if (mState.strengthId != state.strengthId) {
+ mMobileDrawable.setLevel(state.strengthId);
+ }
+ if (mState.typeId != state.typeId && state.typeId != 0) {
+ mMobileType.setContentDescription(state.typeContentDescription);
+ mMobileType.setImageResource(state.typeId);
+ mMobileType.setVisibility(View.VISIBLE);
+ } else {
+ mMobileType.setVisibility(View.GONE);
+ }
+
+ mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
+ mMobileRoamingSpace.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
+ mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
+ mInoutContainer.setVisibility((state.activityIn || state.activityOut)
+ ? View.VISIBLE : View.GONE);
+
+ mState = state;
+ }
+
+ @Override
+ public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+ mMobileDrawable.setDarkIntensity(darkIntensity);
+ ColorStateList color = ColorStateList.valueOf(getTint(area, this, tint));
+ mIn.setImageTintList(color);
+ mOut.setImageTintList(color);
+ mMobileType.setImageTintList(color);
+ mMobileRoaming.setImageTintList(color);
+ }
+
+ @Override
+ public String getSlot() {
+ return mSlot;
+ }
+
+ public void setSlot(String slot) {
+ mSlot = slot;
+ }
+
+ @Override
+ public void setStaticDrawableColor(int color) {
+ ColorStateList list = ColorStateList.valueOf(color);
+ float intensity = color == Color.WHITE ? 0 : 1;
+ mMobileDrawable.setDarkIntensity(intensity);
+
+ mIn.setImageTintList(list);
+ mOut.setImageTintList(list);
+ mMobileType.setImageTintList(list);
+ mMobileRoaming.setImageTintList(list);
+ }
+
+ @Override
+ public boolean isIconVisible() {
+ return mState.visible;
+ }
+
+ @VisibleForTesting
+ public MobileIconState getState() {
+ return mState;
+ }
+
+ @Override
+ public String toString() {
+ return "StatusBarMobileView(slot=" + mSlot + " state=" + mState + ")";
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
new file mode 100644
index 0000000..afd373e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar;
+
+import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.android.keyguard.AlphaOptimizedLinearLayout;
+import com.android.settingslib.Utils;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+
+/**
+ * Start small: StatusBarWifiView will be able to layout from a WifiIconState
+ */
+public class StatusBarWifiView extends AlphaOptimizedLinearLayout implements DarkReceiver,
+ StatusIconDisplayable {
+ private static final String TAG = "StatusBarWifiView";
+
+ private ImageView mWifiIcon;
+ private ImageView mIn;
+ private ImageView mOut;
+ private View mInoutContainer;
+ private View mSignalSpacer;
+ private View mAirplaneSpacer;
+ private WifiIconState mState;
+ private String mSlot;
+ private float mDarkIntensity = 0;
+
+ private ContextThemeWrapper mDarkContext;
+ private ContextThemeWrapper mLightContext;
+
+ public static StatusBarWifiView fromContext(Context context) {
+ LayoutInflater inflater = LayoutInflater.from(context);
+ return (StatusBarWifiView) inflater.inflate(R.layout.status_bar_wifi_group, null);
+ }
+
+ public StatusBarWifiView(Context context) {
+ super(context);
+ }
+
+ public StatusBarWifiView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ init();
+ }
+
+ public void setSlot(String slot) {
+ mSlot = slot;
+ }
+
+ @Override
+ public void setStaticDrawableColor(int color) {
+ ColorStateList list = ColorStateList.valueOf(color);
+ mWifiIcon.setImageTintList(list);
+ mIn.setImageTintList(list);
+ mOut.setImageTintList(list);
+ }
+
+ @Override
+ public String getSlot() {
+ return mSlot;
+ }
+
+ @Override
+ public boolean isIconVisible() {
+ return mState != null && mState.visible;
+ }
+
+ private void init() {
+ int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme);
+ int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme);
+ mLightContext = new ContextThemeWrapper(mContext, dualToneLightTheme);
+ mDarkContext = new ContextThemeWrapper(mContext, dualToneDarkTheme);
+
+ mWifiIcon = findViewById(R.id.wifi_signal);
+ mIn = findViewById(R.id.wifi_in);
+ mOut = findViewById(R.id.wifi_out);
+ mSignalSpacer = findViewById(R.id.wifi_signal_spacer);
+ mAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
+ mInoutContainer = findViewById(R.id.inout_container);
+ }
+
+ public void applyWifiState(WifiIconState state) {
+ if (state == null) {
+ setVisibility(View.GONE);
+ mState = null;
+ return;
+ }
+
+ if (mState == null) {
+ mState = state;
+ initViewState();
+ }
+
+ if (!mState.equals(state)) {
+ updateState(state);
+ }
+ }
+
+ private void updateState(WifiIconState state) {
+ if (mState.resId != state.resId && state.resId >= 0) {
+ NeutralGoodDrawable drawable = NeutralGoodDrawable
+ .create(mLightContext, mDarkContext, state.resId);
+ drawable.setDarkIntensity(mDarkIntensity);
+ mWifiIcon.setImageDrawable(drawable);
+ }
+
+ mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE);
+ mInoutContainer.setVisibility(
+ (state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE);
+ mAirplaneSpacer.setVisibility(state.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
+ mSignalSpacer.setVisibility(state.signalSpacerVisible ? View.VISIBLE : View.GONE);
+ if (mState.visible != state.visible) {
+ setVisibility(state.visible ? View.VISIBLE : View.GONE);
+ }
+
+ mState = state;
+ }
+
+ private void initViewState() {
+ if (mState.resId >= 0) {
+ NeutralGoodDrawable drawable = NeutralGoodDrawable.create(
+ mLightContext, mDarkContext, mState.resId);
+ drawable.setDarkIntensity(mDarkIntensity);
+ mWifiIcon.setImageDrawable(drawable);
+ }
+
+ mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE);
+ mInoutContainer.setVisibility(
+ (mState.activityIn || mState.activityOut) ? View.VISIBLE : View.GONE);
+ mAirplaneSpacer.setVisibility(mState.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
+ mSignalSpacer.setVisibility(mState.signalSpacerVisible ? View.VISIBLE : View.GONE);
+ setVisibility(mState.visible ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+ mDarkIntensity = darkIntensity;
+ Drawable d = mWifiIcon.getDrawable();
+ if (d instanceof NeutralGoodDrawable) {
+ ((NeutralGoodDrawable)d).setDarkIntensity(darkIntensity);
+ }
+ mIn.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
+ mOut.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
+ }
+
+
+ @Override
+ public String toString() {
+ return "StatusBarWifiView(slot=" + mSlot + " state=" + mState + ")";
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java
new file mode 100644
index 0000000..ccab0d6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.statusbar;
+
+import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+
+public interface StatusIconDisplayable extends DarkReceiver {
+ String getSlot();
+ void setStaticDrawableColor(int color);
+ boolean isIconVisible();
+ default boolean isIconBlocked() {
+ return false;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
index 53101a5..5f3e2e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -10,6 +11,7 @@
import android.widget.LinearLayout;
import com.android.keyguard.AlphaOptimizedImageButton;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
/**
@@ -21,9 +23,6 @@
* other music apps installed.
*/
public class CarFacetButton extends LinearLayout {
- private static final float SELECTED_ALPHA = 1f;
- private static final float UNSELECTED_ALPHA = 0.7f;
-
private static final String FACET_FILTER_DELIMITER = ";";
/**
* Extra information to be sent to a helper to make the decision of what app to launch when
@@ -42,6 +41,10 @@
private String[] mFacetCategories;
/** App packages that are allowed to be used with this widget */
private String[] mFacetPackages;
+ private int mIconResourceId;
+ private boolean mUseMoreIcon = true;
+ private float mSelectedAlpha = 1f;
+ private float mUnselectedAlpha = 1f;
public CarFacetButton(Context context, AttributeSet attrs) {
@@ -53,6 +56,10 @@
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CarFacetButton);
setupIntents(typedArray);
setupIcons(typedArray);
+ CarFacetButtonController carFacetButtonController = Dependency.get(
+ CarFacetButtonController.class);
+ carFacetButtonController.addFacetButton(this);
+
}
/**
@@ -96,21 +103,25 @@
private void setupIcons(TypedArray styledAttributes) {
+ mSelectedAlpha = styledAttributes.getFloat(
+ R.styleable.CarFacetButton_selectedAlpha, mSelectedAlpha);
+ mUnselectedAlpha = styledAttributes.getFloat(
+ R.styleable.CarFacetButton_unselectedAlpha, mUnselectedAlpha);
mIcon = findViewById(R.id.car_nav_button_icon);
mIcon.setScaleType(ImageView.ScaleType.CENTER);
mIcon.setClickable(false);
- mIcon.setAlpha(UNSELECTED_ALPHA);
- int iconResourceId = styledAttributes.getResourceId(R.styleable.CarFacetButton_icon, 0);
- if (iconResourceId == 0) {
+ mIcon.setAlpha(mUnselectedAlpha);
+ mIconResourceId = styledAttributes.getResourceId(R.styleable.CarFacetButton_icon, 0);
+ if (mIconResourceId == 0) {
throw new RuntimeException("specified icon resource was not found and is required");
}
- mIcon.setImageResource(iconResourceId);
+ mIcon.setImageResource(mIconResourceId);
mMoreIcon = findViewById(R.id.car_nav_button_more_icon);
mMoreIcon.setClickable(false);
- mMoreIcon.setImageDrawable(getContext().getDrawable(R.drawable.car_ic_arrow));
- mMoreIcon.setAlpha(UNSELECTED_ALPHA);
+ mMoreIcon.setAlpha(mSelectedAlpha);
mMoreIcon.setVisibility(GONE);
+ mUseMoreIcon = styledAttributes.getBoolean(R.styleable.CarFacetButton_useMoreIcon, true);
}
/**
@@ -145,17 +156,27 @@
/**
* Updates the visual state to let the user know if it's been selected.
* @param selected true if should update the alpha of the icon to selected, false otherwise
- * @param showMoreIcon true if the "more icon" should be shown, false otherwise
+ * @param showMoreIcon true if the "more icon" should be shown, false otherwise. Note this
+ * is ignored if the attribute useMoreIcon is set to false
*/
public void setSelected(boolean selected, boolean showMoreIcon) {
mSelected = selected;
if (selected) {
- mMoreIcon.setVisibility(showMoreIcon ? VISIBLE : GONE);
- mMoreIcon.setAlpha(SELECTED_ALPHA);
- mIcon.setAlpha(SELECTED_ALPHA);
+ if (mUseMoreIcon) {
+ mMoreIcon.setVisibility(showMoreIcon ? VISIBLE : GONE);
+ }
+ mIcon.setAlpha(mSelectedAlpha);
} else {
mMoreIcon.setVisibility(GONE);
- mIcon.setAlpha(UNSELECTED_ALPHA);
+ mIcon.setAlpha(mUnselectedAlpha);
+ }
+ }
+
+ public void setIcon(Drawable d) {
+ if (d != null) {
+ mIcon.setImageDrawable(d);
+ } else {
+ mIcon.setImageResource(mIconResourceId);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
index e8c9a5e..b7d501e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
@@ -5,8 +5,6 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.view.View;
-import android.view.ViewGroup;
import java.util.HashMap;
import java.util.List;
@@ -29,38 +27,30 @@
}
/**
- * Goes through the supplied CarNavigationBarView and keeps track of all the CarFacetButtons
- * such that it can select and unselect them based on running task chages
- * @param bar that may contain CarFacetButtons
+ * Add facet button to this controller. The expected use is for the facet button
+ * to get a reference to this controller via {@link com.android.systemui.Dependency}
+ * and self add.
+ * @param facetButton
*/
- public void addCarNavigationBar(CarNavigationBarView bar) {
- findFacets(bar);
- }
+ public void addFacetButton(CarFacetButton facetButton) {
+ String[] categories = facetButton.getCategories();
+ for (int j = 0; j < categories.length; j++) {
+ String category = categories[j];
+ mButtonsByCategory.put(category, facetButton);
+ }
- private void findFacets(ViewGroup root) {
- final int childCount = root.getChildCount();
-
- for (int i = 0; i < childCount; ++i) {
- final View v = root.getChildAt(i);
- if (v instanceof CarFacetButton) {
- CarFacetButton facetButton = (CarFacetButton) v;
- String[] categories = facetButton.getCategories();
- for (int j = 0; j < categories.length; j++) {
- String category = categories[j];
- mButtonsByCategory.put(category, facetButton);
- }
-
- String[] facetPackages = facetButton.getFacetPackages();
- for (int j = 0; j < facetPackages.length; j++) {
- String facetPackage = facetPackages[j];
- mButtonsByPackage.put(facetPackage, facetButton);
- }
- } else if (v instanceof ViewGroup) {
- findFacets((ViewGroup) v);
- }
+ String[] facetPackages = facetButton.getFacetPackages();
+ for (int j = 0; j < facetPackages.length; j++) {
+ String facetPackage = facetPackages[j];
+ mButtonsByPackage.put(facetPackage, facetButton);
}
}
+ public void removeAll() {
+ mButtonsByCategory.clear();
+ mButtonsByPackage.clear();
+ mSelectedFacetButton = null;
+ }
/**
* This will unselect the currently selected CarFacetButton and determine which one should be
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
index 1d9ef61..e73b173 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
@@ -22,6 +22,7 @@
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
+import android.widget.TextView;
import com.android.keyguard.AlphaOptimizedImageButton;
import com.android.systemui.R;
@@ -36,9 +37,11 @@
private LinearLayout mNavButtons;
private AlphaOptimizedImageButton mNotificationsButton;
private CarStatusBar mCarStatusBar;
+ private Context mContext;
public CarNavigationBarView(Context context, AttributeSet attrs) {
super(context, attrs);
+ mContext = context;
}
@Override
@@ -46,7 +49,9 @@
mNavButtons = findViewById(R.id.nav_buttons);
mNotificationsButton = findViewById(R.id.notifications);
- mNotificationsButton.setOnClickListener(this::onNotificationsClick);
+ if (mNotificationsButton != null) {
+ mNotificationsButton.setOnClickListener(this::onNotificationsClick);
+ }
}
void setStatusBar(CarStatusBar carStatusBar) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index c15a013..3fb1137 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -17,13 +17,9 @@
package com.android.systemui.statusbar.car;
import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.content.Intent;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.UserHandle;
+import android.os.SystemProperties;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
@@ -45,10 +41,11 @@
import com.android.systemui.recents.misc.SysUiTaskStackChangeListener;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.car.hvac.HvacController;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
-import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import java.io.FileDescriptor;
@@ -60,6 +57,8 @@
public class CarStatusBar extends StatusBar implements
CarBatteryController.BatteryViewHandler {
private static final String TAG = "CarStatusBar";
+ public static final boolean ENABLE_HVAC_CONNECTION
+ = !SystemProperties.getBoolean("android.car.hvac.demo", true);
private TaskStackListenerImpl mTaskStackListener;
@@ -82,23 +81,74 @@
private boolean mShowRight;
private boolean mShowBottom;
private CarFacetButtonController mCarFacetButtonController;
+ private ActivityManagerWrapper mActivityManagerWrapper;
+ private DeviceProvisionedController mDeviceProvisionedController;
+ private boolean mDeviceIsProvisioned = true;
@Override
public void start() {
super.start();
mTaskStackListener = new TaskStackListenerImpl();
- ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
+ mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
+ mActivityManagerWrapper.registerTaskStackListener(mTaskStackListener);
mStackScroller.setScrollingEnabled(true);
createBatteryController();
mCarBatteryController.startListening();
+
+ if (ENABLE_HVAC_CONNECTION) {
+ Log.d(TAG, "Connecting to HVAC service");
+ Dependency.get(HvacController.class).connectToCarService();
+ }
+ mCarFacetButtonController = Dependency.get(CarFacetButtonController.class);
+ mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
+ mDeviceIsProvisioned = mDeviceProvisionedController.isDeviceProvisioned();
+ if (!mDeviceIsProvisioned) {
+ mDeviceProvisionedController.addCallback(
+ new DeviceProvisionedController.DeviceProvisionedListener() {
+ @Override
+ public void onDeviceProvisionedChanged() {
+ mDeviceIsProvisioned =
+ mDeviceProvisionedController.isDeviceProvisioned();
+ restartNavBars();
+ }
+ });
+ }
}
+ /**
+ * Remove all content from navbars and rebuild them. Used to allow for different nav bars
+ * before and after the device is provisioned
+ */
+ private void restartNavBars() {
+ mCarFacetButtonController.removeAll();
+ if (ENABLE_HVAC_CONNECTION) {
+ Dependency.get(HvacController.class).removeAllComponents();
+ }
+ if (mNavigationBarWindow != null) {
+ mNavigationBarWindow.removeAllViews();
+ mNavigationBarView = null;
+ }
+
+ if (mLeftNavigationBarWindow != null) {
+ mLeftNavigationBarWindow.removeAllViews();
+ mLeftNavigationBarView = null;
+ }
+
+ if (mRightNavigationBarWindow != null) {
+ mRightNavigationBarWindow.removeAllViews();
+ mRightNavigationBarView = null;
+ }
+ buildNavBarContent();
+ }
+
+
@Override
public void destroy() {
mCarBatteryController.stopListening();
mConnectedDeviceSignalController.stopListening();
+ mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackListener);
if (mNavigationBarWindow != null) {
mWindowManager.removeViewImmediate(mNavigationBarWindow);
@@ -114,10 +164,10 @@
mWindowManager.removeViewImmediate(mRightNavigationBarWindow);
mRightNavigationBarView = null;
}
-
super.destroy();
}
+
@Override
protected void makeStatusBarView() {
super.makeStatusBarView();
@@ -132,27 +182,6 @@
// By default, the BatteryMeterView should not be visible. It will be toggled
// when a device has connected by bluetooth.
mBatteryMeterView.setVisibility(View.GONE);
-
- ViewStub stub = fragment.getView().findViewById(R.id.connected_device_signals_stub);
- View signalsView = stub.inflate();
-
- // When a ViewStub if inflated, it does not respect the margins on the
- // inflated view.
- // As a result, manually add the ending margin.
- ((LinearLayout.LayoutParams) signalsView.getLayoutParams()).setMarginEnd(
- mContext.getResources().getDimensionPixelOffset(
- R.dimen.status_bar_connected_device_signal_margin_end));
-
- if (mConnectedDeviceSignalController != null) {
- mConnectedDeviceSignalController.stopListening();
- }
- mConnectedDeviceSignalController = new ConnectedDeviceSignalController(mContext,
- signalsView);
- mConnectedDeviceSignalController.startListening();
-
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "makeStatusBarView(). mBatteryMeterView: " + mBatteryMeterView);
- }
});
}
@@ -164,132 +193,132 @@
@Override
protected void createNavigationBar() {
- mCarFacetButtonController = new CarFacetButtonController(mContext);
- if (mNavigationBarView != null) {
- return;
- }
-
mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar);
- if (mShowBottom) {
- buildBottomBar();
- }
-
- int widthForSides = mContext.getResources().getDimensionPixelSize(
- R.dimen.navigation_bar_height_car_mode);
-
-
mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar);
-
- if (mShowLeft) {
- buildLeft(widthForSides);
- }
-
mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar);
+ buildNavBarWindows();
+ buildNavBarContent();
+ attachNavBarWindows();
+ }
+
+ private void buildNavBarContent() {
+ if (mShowBottom) {
+ buildBottomBar((mDeviceIsProvisioned) ? R.layout.car_navigation_bar :
+ R.layout.car_navigation_bar_unprovisioned);
+ }
+
+ if (mShowLeft) {
+ buildLeft((mDeviceIsProvisioned) ? R.layout.car_left_navigation_bar :
+ R.layout.car_left_navigation_bar_unprovisioned);
+ }
+
if (mShowRight) {
- buildRight(widthForSides);
+ buildRight((mDeviceIsProvisioned) ? R.layout.car_right_navigation_bar :
+ R.layout.car_right_navigation_bar_unprovisioned);
+ }
+ }
+
+ private void buildNavBarWindows() {
+ if (mShowBottom) {
+
+ mNavigationBarWindow = (ViewGroup) View.inflate(mContext,
+ R.layout.navigation_bar_window, null);
+ }
+ if (mShowLeft) {
+ mLeftNavigationBarWindow = (ViewGroup) View.inflate(mContext,
+ R.layout.navigation_bar_window, null);
+ }
+ if (mShowRight) {
+ mRightNavigationBarWindow = (ViewGroup) View.inflate(mContext,
+ R.layout.navigation_bar_window, null);
}
}
+ private void attachNavBarWindows() {
- private void buildBottomBar() {
+ if (mShowBottom) {
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ lp.setTitle("CarNavigationBar");
+ lp.windowAnimations = 0;
+ mWindowManager.addView(mNavigationBarWindow, lp);
+ }
+ if (mShowLeft) {
+ int width = mContext.getResources().getDimensionPixelSize(
+ R.dimen.car_left_navigation_bar_width);
+ WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams(
+ width, LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ leftlp.setTitle("LeftCarNavigationBar");
+ leftlp.windowAnimations = 0;
+ leftlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
+ leftlp.gravity = Gravity.LEFT;
+ mWindowManager.addView(mLeftNavigationBarWindow, leftlp);
+ }
+ if (mShowRight) {
+ int width = mContext.getResources().getDimensionPixelSize(
+ R.dimen.car_right_navigation_bar_width);
+ WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams(
+ width, LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ rightlp.setTitle("RightCarNavigationBar");
+ rightlp.windowAnimations = 0;
+ rightlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
+ rightlp.gravity = Gravity.RIGHT;
+ mWindowManager.addView(mRightNavigationBarWindow, rightlp);
+ }
+
+ }
+
+ private void buildBottomBar(int layout) {
// SystemUI requires that the navigation bar view have a parent. Since the regular
// StatusBar inflates navigation_bar_window as this parent view, use the same view for the
// CarNavigationBarView.
- mNavigationBarWindow = (ViewGroup) View.inflate(mContext,
- R.layout.navigation_bar_window, null);
- if (mNavigationBarWindow == null) {
- Log.e(TAG, "CarStatusBar failed inflate for R.layout.navigation_bar_window");
- }
-
-
- View.inflate(mContext, R.layout.car_navigation_bar, mNavigationBarWindow);
+ View.inflate(mContext, layout, mNavigationBarWindow);
mNavigationBarView = (CarNavigationBarView) mNavigationBarWindow.getChildAt(0);
if (mNavigationBarView == null) {
Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar");
throw new RuntimeException("Unable to build botom nav bar due to missing layout");
}
mNavigationBarView.setStatusBar(this);
-
-
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
- PixelFormat.TRANSLUCENT);
- lp.setTitle("CarNavigationBar");
- lp.windowAnimations = 0;
-
-
- mCarFacetButtonController.addCarNavigationBar(mNavigationBarView);
- mWindowManager.addView(mNavigationBarWindow, lp);
}
- private void buildLeft(int widthForSides) {
- mLeftNavigationBarWindow = (ViewGroup) View.inflate(mContext,
- R.layout.navigation_bar_window, null);
- if (mLeftNavigationBarWindow == null) {
- Log.e(TAG, "CarStatusBar failed inflate for R.layout.navigation_bar_window");
- }
-
- View.inflate(mContext, R.layout.car_left_navigation_bar, mLeftNavigationBarWindow);
+ private void buildLeft(int layout) {
+ View.inflate(mContext, layout, mLeftNavigationBarWindow);
mLeftNavigationBarView = (CarNavigationBarView) mLeftNavigationBarWindow.getChildAt(0);
if (mLeftNavigationBarView == null) {
Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar");
throw new RuntimeException("Unable to build left nav bar due to missing layout");
}
mLeftNavigationBarView.setStatusBar(this);
- mCarFacetButtonController.addCarNavigationBar(mLeftNavigationBarView);
-
- WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams(
- widthForSides, LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
- PixelFormat.TRANSLUCENT);
- leftlp.setTitle("LeftCarNavigationBar");
- leftlp.windowAnimations = 0;
- leftlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
- leftlp.gravity = Gravity.LEFT;
- mWindowManager.addView(mLeftNavigationBarWindow, leftlp);
}
- private void buildRight(int widthForSides) {
- mRightNavigationBarWindow = (ViewGroup) View.inflate(mContext,
- R.layout.navigation_bar_window, null);
- if (mRightNavigationBarWindow == null) {
- Log.e(TAG, "CarStatusBar failed inflate for R.layout.navigation_bar_window");
- }
-
- View.inflate(mContext, R.layout.car_right_navigation_bar, mRightNavigationBarWindow);
+ private void buildRight(int layout) {
+ View.inflate(mContext, layout, mRightNavigationBarWindow);
mRightNavigationBarView = (CarNavigationBarView) mRightNavigationBarWindow.getChildAt(0);
if (mRightNavigationBarView == null) {
Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar");
throw new RuntimeException("Unable to build right nav bar due to missing layout");
}
- mRightNavigationBarView.setStatusBar(this);
- mCarFacetButtonController.addCarNavigationBar(mRightNavigationBarView);
-
- WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams(
- widthForSides, LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
- PixelFormat.TRANSLUCENT);
- rightlp.setTitle("RightCarNavigationBar");
- rightlp.windowAnimations = 0;
- rightlp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
- rightlp.gravity = Gravity.RIGHT;
- mWindowManager.addView(mRightNavigationBarWindow, rightlp);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java
new file mode 100644
index 0000000..7d283d9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.car.hvac;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.hvac.CarHvacManager;
+import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Manages the connection to the Car service and delegates value changes to the registered
+ * {@link TemperatureView}s
+ */
+public class HvacController {
+
+ public static final String TAG = "HvacController";
+ public final static int BIND_TO_HVAC_RETRY_DELAY = 5000;
+
+ private Context mContext;
+ private Handler mHandler;
+ private Car mCar;
+ private CarHvacManager mHvacManager;
+ private HashMap<HvacKey, TemperatureView> mTempComponents = new HashMap<>();
+
+ public HvacController(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Create connection to the Car service. Note: call backs from the Car service
+ * ({@link CarHvacManager}) will happen on the same thread this method was called from.
+ */
+ public void connectToCarService() {
+ mHandler = new Handler();
+ mCar = Car.createCar(mContext, mServiceConnection, mHandler);
+ if (mCar != null) {
+ // note: this connect call handles the retries
+ mCar.connect();
+ }
+ }
+
+ /**
+ * Registers callbacks and initializes components upon connection.
+ */
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ try {
+ service.linkToDeath(mRestart, 0);
+ mHvacManager = (CarHvacManager) mCar.getCarManager(Car.HVAC_SERVICE);
+ mHvacManager.registerCallback(mHardwareCallback);
+ initComponents();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to correctly connect to HVAC", e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ destroyHvacManager();
+ }
+ };
+
+ private void destroyHvacManager() {
+ if (mHvacManager != null) {
+ mHvacManager.unregisterCallback(mHardwareCallback);
+ mHvacManager = null;
+ }
+ }
+
+ /**
+ * If the connection to car service goes away then restart it.
+ */
+ private final IBinder.DeathRecipient mRestart = new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ Log.d(TAG, "Death of HVAC triggering a restart");
+ if (mCar != null) {
+ mCar.disconnect();
+ }
+ destroyHvacManager();
+ mHandler.postDelayed(() -> mCar.connect(), BIND_TO_HVAC_RETRY_DELAY);
+ }
+ };
+
+ /**
+ * Add component to list and initialize it if the connection is up.
+ * @param temperatureView
+ */
+ public void addHvacTextView(TemperatureView temperatureView) {
+ mTempComponents.put(
+ new HvacKey(temperatureView.getPropertyId(), temperatureView.getAreaId()),
+ temperatureView);
+ initComponent(temperatureView);
+ }
+
+ private void initComponents() {
+ Iterator<Map.Entry<HvacKey, TemperatureView>> iterator =
+ mTempComponents.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<HvacKey, TemperatureView> next = iterator.next();
+ initComponent(next.getValue());
+ }
+ }
+
+
+ private void initComponent(TemperatureView view) {
+ int id = view.getPropertyId();
+ int zone = view.getAreaId();
+ try {
+ if (mHvacManager == null || !mHvacManager.isPropertyAvailable(id, zone)) {
+ view.setTemp(Float.NaN);
+ return;
+ }
+ view.setTemp(mHvacManager.getFloatProperty(id, zone));
+ } catch (CarNotConnectedException e) {
+ view.setTemp(Float.NaN);
+ Log.e(TAG, "Failed to get value from hvac service", e);
+ }
+ }
+
+ /**
+ * Callback for getting changes from {@link CarHvacManager} and setting the UI elements to
+ * match.
+ */
+ private final CarHvacEventCallback mHardwareCallback = new CarHvacEventCallback() {
+ @Override
+ public void onChangeEvent(final CarPropertyValue val) {
+ try {
+ int areaId = val.getAreaId();
+ int propertyId = val.getPropertyId();
+ TemperatureView temperatureView = mTempComponents.get(
+ new HvacKey(propertyId, areaId));
+ if (temperatureView != null) {
+ float value = (float) val.getValue();
+ temperatureView.setTemp(value);
+ } // else the data is not of interest
+ } catch (Exception e) {
+ // catch all so we don't take down the sysui if a new data type is
+ // introduced.
+ Log.e(TAG, "Failed handling hvac change event", e);
+ }
+ }
+
+ @Override
+ public void onErrorEvent(final int propertyId, final int zone) {
+ Log.d(TAG, "HVAC error event, propertyId: " + propertyId +
+ " zone: " + zone);
+ }
+ };
+
+ /**
+ * Removes all registered components. This is useful if you need to rebuild the UI since
+ * components self register.
+ */
+ public void removeAllComponents() {
+ mTempComponents.clear();
+ }
+
+ /**
+ * Key for storing {@link TemperatureView}s in a hash map
+ */
+ private static class HvacKey {
+
+ int mPropertyId;
+ int mAreaId;
+
+ public HvacKey(int propertyId, int areaId) {
+ mPropertyId = propertyId;
+ mAreaId = areaId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ HvacKey hvacKey = (HvacKey) o;
+ return mPropertyId == hvacKey.mPropertyId &&
+ mAreaId == hvacKey.mAreaId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mPropertyId, mAreaId);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java
new file mode 100644
index 0000000..4049ec3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.car.hvac;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+
+/**
+ * Simple text display of HVAC properties, It is designed to show temperature and is configured in
+ * the XML.
+ * XML properties:
+ * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+ * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
+ *
+ * Note: It registers itself with {@link HvacController}
+ */
+public class TemperatureView extends TextView {
+
+ private final int mAreaId;
+ private final int mPropertyId;
+ private final String mTempFormat;
+
+ public TemperatureView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView);
+ mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId,-1);
+ mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1);
+ String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat);
+ mTempFormat = (format == null) ? "%.1f\u00B0" : format;
+
+ // register with controller
+ HvacController hvacController = Dependency.get(HvacController.class);
+ hvacController.addHvacTextView(this);
+ }
+
+ /**
+ * Formats the float for display
+ * @param temp - The current temp or NaN
+ */
+ public void setTemp(float temp) {
+ if (Float.isNaN(temp)) {
+ setText("--");
+ return;
+ }
+ setText(String.format(mTempFormat, temp));
+ }
+
+ /**
+ * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+ */
+ public int getPropertyId() {
+ return mPropertyId;
+ }
+
+ /**
+ * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ */
+ public int getAreaId() {
+ return mAreaId;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index f42473d..9fcb090 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -14,11 +14,10 @@
package com.android.systemui.statusbar.phone;
+import static android.app.StatusBarManager.DISABLE_CLOCK;
import static android.app.StatusBarManager.DISABLE_NOTIFICATION_ICONS;
import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO;
-import static com.android.systemui.statusbar.phone.StatusBar.reinflateSignalCluster;
-
import android.annotation.Nullable;
import android.app.Fragment;
import android.app.StatusBarManager;
@@ -34,7 +33,6 @@
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.EncryptionHelper;
@@ -63,7 +61,6 @@
private int mDisabled1;
private StatusBar mStatusBarComponent;
private DarkIconManager mDarkIconManager;
- private SignalClusterView mSignalClusterView;
private View mOperatorNameFrame;
private SignalCallback mSignalCallback = new SignalCallback() {
@@ -99,10 +96,8 @@
Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
mClockView = mStatusBar.findViewById(R.id.clock);
- mSignalClusterView = mStatusBar.findViewById(R.id.signal_cluster);
- Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mSignalClusterView);
- // Default to showing until we know otherwise.
showSystemIconArea(false);
+ showClock(false);
initEmergencyCryptkeeperText();
initOperatorName();
}
@@ -128,7 +123,6 @@
@Override
public void onDestroyView() {
super.onDestroyView();
- Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mSignalClusterView);
Dependency.get(StatusBarIconController.class).removeIconGroup(mDarkIconManager);
if (mNetworkController.hasEmergencyCryptKeeperText()) {
mNetworkController.removeCallback(mSignalCallback);
@@ -171,6 +165,13 @@
showNotificationIconArea(animate);
}
}
+ if ((diff1 & DISABLE_CLOCK) != 0) {
+ if ((state1 & DISABLE_CLOCK) != 0) {
+ hideClock(animate);
+ } else {
+ showClock(animate);
+ }
+ }
}
protected int adjustDisableFlags(int state) {
@@ -179,6 +180,7 @@
&& shouldHideNotificationIcons()) {
state |= DISABLE_NOTIFICATION_ICONS;
state |= DISABLE_SYSTEM_INFO;
+ state |= DISABLE_CLOCK;
}
if (mNetworkController != null && EncryptionHelper.IS_DATA_ENCRYPTED) {
if (mNetworkController.hasEmergencyCryptKeeperText()) {
@@ -203,11 +205,17 @@
public void hideSystemIconArea(boolean animate) {
animateHide(mSystemIconArea, animate);
- animateHide(mClockView, animate);
}
public void showSystemIconArea(boolean animate) {
animateShow(mSystemIconArea, animate);
+ }
+
+ public void hideClock(boolean animate) {
+ animateHide(mClockView, animate);
+ }
+
+ public void showClock(boolean animate) {
animateShow(mClockView, animate);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
index 3f9ae80..80c4eb0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
@@ -69,7 +69,7 @@
mReceivers.remove(object);
}
- public void applyDark(ImageView object) {
+ public void applyDark(DarkReceiver object) {
mReceivers.get(object).onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
index edfd02b..48540b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
@@ -20,25 +20,33 @@
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
+import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.settingslib.Utils;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusBarMobileView;
+import com.android.systemui.statusbar.StatusBarWifiView;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
-import com.android.systemui.statusbar.policy.LocationControllerImpl;
-import com.android.systemui.util.leak.LeakDetector;
+import java.util.ArrayList;
public class DemoStatusIcons extends StatusIconContainer implements DemoMode, DarkReceiver {
+ private static final String TAG = "DemoStatusIcons";
+
private final LinearLayout mStatusIcons;
+ private final ArrayList<StatusBarMobileView> mMobileViews = new ArrayList<>();
private final int mIconSize;
+ private StatusBarWifiView mWifiView;
private boolean mDemoMode;
private int mColor;
@@ -56,6 +64,7 @@
}
public void remove() {
+ mMobileViews.clear();
((ViewGroup) getParent()).removeView(this);
}
@@ -66,7 +75,7 @@
private void updateColors() {
for (int i = 0; i < getChildCount(); i++) {
- StatusBarIconView child = (StatusBarIconView) getChildAt(i);
+ StatusIconDisplayable child = (StatusIconDisplayable) getChildAt(i);
child.setStaticDrawableColor(mColor);
}
}
@@ -145,6 +154,7 @@
}
}
+ /// Can only be used to update non-signal related slots
private void updateSlot(String slot, String iconPkg, int iconId) {
if (!mDemoMode) return;
if (iconPkg == null) {
@@ -152,7 +162,11 @@
}
int removeIndex = -1;
for (int i = 0; i < getChildCount(); i++) {
- StatusBarIconView v = (StatusBarIconView) getChildAt(i);
+ View child = getChildAt(i);
+ if (!(child instanceof StatusBarIconView)) {
+ continue;
+ }
+ StatusBarIconView v = (StatusBarIconView) child;
if (slot.equals(v.getTag())) {
if (iconId == 0) {
removeIndex = i;
@@ -182,8 +196,101 @@
addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize));
}
+ public void addDemoWifiView(WifiIconState state) {
+ Log.d(TAG, "addDemoWifiView: ");
+ StatusBarWifiView view = StatusBarWifiView.fromContext(mContext);
+ view.setSlot(state.slot);
+
+ int viewIndex = getChildCount();
+ // If we have mobile views, put wifi before them
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ if (child instanceof StatusBarMobileView) {
+ viewIndex = i;
+ break;
+ }
+ }
+
+ mWifiView = view;
+ mWifiView.applyWifiState(state);
+ mWifiView.setStaticDrawableColor(mColor);
+ addView(view, viewIndex);
+ }
+
+ public void updateWifiState(WifiIconState state) {
+ Log.d(TAG, "updateWifiState: ");
+ if (mWifiView == null) {
+ addDemoWifiView(state);
+ } else {
+ mWifiView.applyWifiState(state);
+ }
+ }
+
+ public void addMobileView(MobileIconState state) {
+ Log.d(TAG, "addMobileView: ");
+ StatusBarMobileView view = StatusBarMobileView.fromContext(mContext);
+
+ view.setSlot(state.slot);
+ view.applyMobileState(state);
+ view.setStaticDrawableColor(mColor);
+
+ // mobile always goes at the end
+ mMobileViews.add(view);
+ addView(view, getChildCount());
+ }
+
+ public void updateMobileState(MobileIconState state) {
+ Log.d(TAG, "updateMobileState: ");
+ // If the view for this subId exists already, use it
+ for (int i = 0; i < mMobileViews.size(); i++) {
+ StatusBarMobileView view = mMobileViews.get(i);
+ if (view.getState().subId == state.subId) {
+ view.applyMobileState(state);
+ return;
+ }
+ }
+
+ // Else we have to add it
+ addMobileView(state);
+ }
+
+ public void onRemoveIcon(StatusIconDisplayable view) {
+ if (view.getSlot().equals("wifi")) {
+ removeView(mWifiView);
+ mWifiView = null;
+ } else {
+ StatusBarMobileView mobileView = matchingMobileView(view);
+ if (mobileView != null) {
+ removeView(mobileView);
+ mMobileViews.remove(mobileView);
+ }
+ }
+ }
+
+ private StatusBarMobileView matchingMobileView(StatusIconDisplayable otherView) {
+ if (!(otherView instanceof StatusBarMobileView)) {
+ return null;
+ }
+
+ StatusBarMobileView v = (StatusBarMobileView) otherView;
+ for (StatusBarMobileView view : mMobileViews) {
+ if (view.getState().subId == v.getState().subId) {
+ return view;
+ }
+ }
+
+ return null;
+ }
+
@Override
public void onDarkChanged(Rect area, float darkIntensity, int tint) {
setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint));
+
+ if (mWifiView != null) {
+ mWifiView.onDarkChanged(area, darkIntensity, tint);
+ }
+ for (StatusBarMobileView view : mMobileViews) {
+ view.onDarkChanged(area, darkIntensity, tint);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index a2b1013..6576eb7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -399,4 +399,11 @@
pw.print(" mMode="); pw.println(mMode);
pw.print(" mWakeLock="); pw.println(mWakeLock);
}
+
+ public boolean isWakeAndUnlock() {
+ return mMode == MODE_UNLOCK
+ || mMode == MODE_WAKE_AND_UNLOCK
+ || mMode == MODE_WAKE_AND_UNLOCK_PULSING
+ || mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index d609ae7..df2b817 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -330,6 +330,24 @@
}
}
+ public boolean willDismissWithAction() {
+ return mKeyguardView != null && mKeyguardView.hasDismissActions();
+ }
+
+ public int getTop() {
+ if (mKeyguardView == null) {
+ return 0;
+ }
+
+ int top = mKeyguardView.getTop();
+ // The password view has an extra top padding that should be ignored.
+ if (mKeyguardView.getCurrentSecurityMode() == SecurityMode.Password) {
+ View messageArea = mKeyguardView.findViewById(R.id.keyguard_message_area);
+ top += messageArea.getTop();
+ }
+ return top;
+ }
+
protected void ensureView() {
// Removal of the view might be deferred to reduce unlock latency,
// in this case we need to force the removal, otherwise we'll
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 19e8295..3d7067d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -114,6 +114,11 @@
private boolean mTracking;
/**
+ * Distance in pixels between the top of the screen and the first view of the bouncer.
+ */
+ private int mBouncerTop;
+
+ /**
* Refreshes the dimension values.
*/
public void loadDimens(Resources res) {
@@ -129,7 +134,7 @@
public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
float expandedHeight, float maxPanelHeight, int parentHeight, int keyguardStatusHeight,
- float dark, boolean secure, boolean tracking) {
+ float dark, boolean secure, boolean tracking, int bouncerTop) {
mMinTopMargin = minTopMargin + mContainerTopPadding;
mMaxShadeBottom = maxShadeBottom;
mNotificationStackHeight = notificationStackHeight;
@@ -140,6 +145,7 @@
mDarkAmount = dark;
mCurrentlySecure = secure;
mTracking = tracking;
+ mBouncerTop = bouncerTop;
}
public void run(Result result) {
@@ -189,8 +195,10 @@
private int getClockY() {
// Dark: Align the bottom edge of the clock at about half of the screen:
final float clockYDark = getMaxClockY() + burnInPreventionOffsetY();
- float clockYRegular = getExpandedClockPosition();
- float clockYTarget = mCurrentlySecure ? mMinTopMargin : -mKeyguardStatusHeight;
+ final float clockYRegular = getExpandedClockPosition();
+ final boolean hasEnoughSpace = mMinTopMargin + mKeyguardStatusHeight < mBouncerTop;
+ float clockYTarget = mCurrentlySecure && hasEnoughSpace ?
+ mMinTopMargin : -mKeyguardStatusHeight;
// Move clock up while collapsing the shade
float shadeExpansion = mExpandedHeight / mMaxPanelHeight;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 994c0ab..b817809 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -207,7 +207,6 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
updateLayoutConsideringCutout();
- setSignalClusterLayoutWidth();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@@ -296,17 +295,6 @@
return true;
}
- //TODO: Something is setting signal_cluster to MATCH_PARENT. Why?
- private void setSignalClusterLayoutWidth() {
- View signalCluster = findViewById(R.id.signal_cluster);
- if (signalCluster == null) {
- return;
- }
-
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) signalCluster.getLayoutParams();
- lp.width = LinearLayout.LayoutParams.WRAP_CONTENT;
- }
-
public void setListening(boolean listening) {
if (listening == mBatteryListening) {
return;
@@ -459,7 +447,6 @@
mIconManager.setTint(iconColor);
Rect tintArea = new Rect(0, 0, 0, 0);
- applyDarkness(R.id.signal_cluster, tintArea, intensity, iconColor);
applyDarkness(R.id.battery, tintArea, intensity, iconColor);
applyDarkness(R.id.clock, tintArea, intensity, iconColor);
// Reload user avatar
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index a39800d..58f8baa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -171,7 +171,7 @@
private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() {
@Override
public void onConnectionChanged(boolean isConnected) {
- mNavigationBarView.onOverviewProxyConnectionChanged(isConnected);
+ mNavigationBarView.updateStates();
updateScreenPinningGestures();
WindowManagerWrapper.getInstance()
.setNavBarVirtualKeyHapticFeedbackEnabled(!isConnected);
@@ -188,6 +188,7 @@
@Override
public void onInteractionFlagsChanged(@InteractionType int flags) {
mNavigationBarView.updateStates();
+ updateScreenPinningGestures();
}
};
@@ -925,7 +926,9 @@
private boolean onLongPressRecents() {
if (mRecents == null || !ActivityManager.supportsMultiWindow(getContext())
|| !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()
- || Recents.getConfiguration().isLowRamDevice) {
+ || Recents.getConfiguration().isLowRamDevice
+ // If we are connected to the overview service, then disable the recents button
+ || mOverviewProxyService.getProxy() != null) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 8fb0620..4c4eb60 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -79,7 +79,6 @@
import java.util.function.Consumer;
import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_QUICK_SCRUB;
-import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP;
import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON;
import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_OVERVIEW;
@@ -125,7 +124,7 @@
private TintedKeyButtonDrawable mRotateSuggestionIcon;
private GestureHelper mGestureHelper;
- private DeadZone mDeadZone;
+ private final DeadZone mDeadZone;
private final NavigationBarTransitions mBarTransitions;
private final OverviewProxyService mOverviewProxyService;
@@ -264,6 +263,7 @@
new ButtonDispatcher(R.id.accessibility_button));
mButtonDispatchers.put(R.id.rotate_suggestion,
new ButtonDispatcher(R.id.rotate_suggestion));
+ mDeadZone = new DeadZone(this);
}
public BarTransitions getBarTransitions() {
@@ -298,6 +298,10 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (mDeadZone.onTouchEvent(event)) {
+ // Consumed the touch event
+ return true;
+ }
switch (event.getActionMasked()) {
case ACTION_DOWN:
int x = (int) event.getX();
@@ -320,6 +324,10 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
+ if (mDeadZone.onTouchEvent(event)) {
+ // Consumed the touch event
+ return true;
+ }
if (mGestureHelper.onTouchEvent(event)) {
return true;
}
@@ -385,17 +393,13 @@
}
public boolean isQuickStepSwipeUpEnabled() {
- return mOverviewProxyService.getProxy() != null
- && isOverviewEnabled()
- && ((mOverviewProxyService.getInteractionFlags()
- & FLAG_DISABLE_SWIPE_UP) == 0);
+ return mOverviewProxyService.shouldShowSwipeUpUI() && isOverviewEnabled();
}
public boolean isQuickScrubEnabled() {
return SystemProperties.getBoolean("persist.quickstep.scrub.enabled", true)
- && mOverviewProxyService.getProxy() != null && isOverviewEnabled()
- && ((mOverviewProxyService.getInteractionFlags()
- & FLAG_DISABLE_QUICK_SCRUB) == 0);
+ && mOverviewProxyService.isEnabled() && isOverviewEnabled()
+ && ((mOverviewProxyService.getInteractionFlags() & FLAG_DISABLE_QUICK_SCRUB) == 0);
}
private void updateCarModeIcons(Context ctx) {
@@ -429,13 +433,16 @@
mRecentIcon = getDrawable(ctx,
R.drawable.ic_sysbar_recent, R.drawable.ic_sysbar_recent_dark);
mMenuIcon = getDrawable(ctx, R.drawable.ic_sysbar_menu, R.drawable.ic_sysbar_menu_dark);
- mAccessibilityIcon = getDrawable(ctx, R.drawable.ic_sysbar_accessibility_button,
- R.drawable.ic_sysbar_accessibility_button_dark);
int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme);
int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme);
Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
+
+ mAccessibilityIcon = getDrawable(darkContext, lightContext,
+ R.drawable.ic_sysbar_accessibility_button,
+ R.drawable.ic_sysbar_accessibility_button);
+
mImeIcon = getDrawable(darkContext, lightContext,
R.drawable.ic_ime_switcher_default, R.drawable.ic_ime_switcher_default);
@@ -468,7 +475,7 @@
private KeyButtonDrawable chooseNavigationIconDrawable(Context ctx, @DrawableRes int iconLight,
@DrawableRes int iconDark, @DrawableRes int quickStepIconLight,
@DrawableRes int quickStepIconDark) {
- final boolean quickStepEnabled = isQuickStepSwipeUpEnabled() || isQuickScrubEnabled();
+ final boolean quickStepEnabled = mOverviewProxyService.shouldShowSwipeUpUI();
return quickStepEnabled
? getDrawable(ctx, quickStepIconLight, quickStepIconDark)
: getDrawable(ctx, iconLight, iconDark);
@@ -589,7 +596,7 @@
// recents buttons when disconnected from launcher service in screen pinning mode,
// as they are used for exiting.
final boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
- if (mOverviewProxyService.getProxy() != null) {
+ if (mOverviewProxyService.isEnabled()) {
// Use interaction flags to show/hide navigation buttons but will be shown if required
// to exit screen pinning.
final int flags = mOverviewProxyService.getInteractionFlags();
@@ -681,6 +688,7 @@
updateSlippery();
reloadNavIcons();
updateNavButtonIcons();
+ setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
}
private void updateSlippery() {
@@ -816,14 +824,10 @@
}
}
- public void onOverviewProxyConnectionChanged(boolean isConnected) {
- updateStates();
- setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
- }
-
@Override
protected void onDraw(Canvas canvas) {
mGestureHelper.onDraw(canvas);
+ mDeadZone.onDraw(canvas);
super.onDraw(canvas);
}
@@ -842,10 +846,17 @@
buttonBounds.setEmpty();
return;
}
+ // Temporarily reset the translation back to origin to get the position in window
+ final float posX = view.getTranslationX();
+ final float posY = view.getTranslationY();
+ view.setTranslationX(0);
+ view.setTranslationY(0);
view.getLocationInWindow(mTmpPosition);
buttonBounds.set(mTmpPosition[0], mTmpPosition[1],
mTmpPosition[0] + view.getMeasuredWidth(),
mTmpPosition[1] + view.getMeasuredHeight());
+ view.setTranslationX(posX);
+ view.setTranslationY(posY);
}
private void updateRotatedViews() {
@@ -888,10 +899,8 @@
public void reorient() {
updateCurrentView();
- mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);
-
((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone);
- mDeadZone.setDisplayRotation(mCurrentRotation);
+ mDeadZone.onConfigurationChanged(mCurrentRotation);
// force the low profile & disabled states into compliance
mBarTransitions.init();
@@ -1038,7 +1047,7 @@
onPluginDisconnected(null); // Create default gesture helper
Dependency.get(PluginManager.class).addPluginListener(this,
NavGesture.class, false /* Only one */);
- setUpSwipeUpOnboarding(mOverviewProxyService.getProxy() != null);
+ setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
index b75c7e0..ca65965 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
@@ -169,7 +169,7 @@
if (group.suppressed) {
handleSuppressedSummaryHeadsUpped(group.summary);
}
- if (!mIsUpdatingUnchangedGroup) {
+ if (!mIsUpdatingUnchangedGroup && mListener != null) {
mListener.onGroupsChanged();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 9063dea..b6a11f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -150,7 +150,7 @@
// showAmbient == show in shade but not shelf
if (!showAmbient && mEntryManager.getNotificationData().shouldSuppressStatusBar(
- entry.key)) {
+ entry.notification)) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 64e205d..27ca0d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -160,6 +160,7 @@
protected int mQsMinExpansionHeight;
protected int mQsMaxExpansionHeight;
private int mQsPeekHeight;
+ private int mBouncerTop;
private boolean mStackScrollerOverscrolling;
private boolean mQsExpansionFromOverscroll;
private float mLastOverscroll;
@@ -476,7 +477,8 @@
mKeyguardStatusView.getHeight(),
mDarkAmount,
mStatusBar.isKeyguardCurrentlySecure(),
- mTracking);
+ mTracking,
+ mBouncerTop);
mClockPositionAlgorithm.run(mClockPositionResult);
if (animate || mClockAnimator != null) {
startClockAnimation(mClockPositionResult.clockX, mClockPositionResult.clockY);
@@ -550,6 +552,11 @@
return count;
}
+ public void setBouncerTop(int bouncerTop) {
+ mBouncerTop = bouncerTop;
+ positionClockAndNotifications();
+ }
+
private void startClockAnimation(int x, int y) {
if (mClockAnimationTargetX == x && mClockAnimationTargetY == y) {
return;
@@ -2165,18 +2172,18 @@
@Override
protected boolean fullyExpandedClearAllVisible() {
- return mNotificationStackScroller.isDismissViewNotGone()
+ return mNotificationStackScroller.isFooterViewNotGone()
&& mNotificationStackScroller.isScrolledToBottom() && !mQsExpandImmediate;
}
@Override
protected boolean isClearAllVisible() {
- return mNotificationStackScroller.isDismissViewVisible();
+ return mNotificationStackScroller.isFooterViewVisible();
}
@Override
protected int getClearAllHeight() {
- return mNotificationStackScroller.getDismissViewHeight();
+ return mNotificationStackScroller.getFooterViewHeight();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 04cb620..304a499 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -488,7 +488,7 @@
mUpdateFlingVelocity = vel;
}
} else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking
- && !mStatusBar.isBouncerShowing()) {
+ && !mStatusBar.isBouncerShowing() && !mStatusBar.isKeyguardFadingAway()) {
long timePassed = SystemClock.uptimeMillis() - mDownTime;
if (timePassed < ViewConfiguration.getLongPressTimeout()) {
// Lets show the user that he can actually expand the panel
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index c326fee..3e7b0d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -297,7 +297,7 @@
mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID,
mContext.getString(R.string.accessibility_location_active));
} else {
- mIconController.removeIcon(mSlotLocation);
+ mIconController.removeAllIconsForSlot(mSlotLocation);
}
}
@@ -363,16 +363,16 @@
zenDescription = mContext.getString(R.string.interruption_level_priority);
}
- if (DndTile.isVisible(mContext) && !DndTile.isCombinedIcon(mContext)
- && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
- volumeVisible = true;
- volumeIconId = R.drawable.stat_sys_ringer_silent;
- volumeDescription = mContext.getString(R.string.accessibility_ringer_silent);
- } else if (zen != Global.ZEN_MODE_NO_INTERRUPTIONS && zen != Global.ZEN_MODE_ALARMS &&
+ if (zen != Global.ZEN_MODE_NO_INTERRUPTIONS && zen != Global.ZEN_MODE_ALARMS &&
audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
volumeVisible = true;
volumeIconId = R.drawable.stat_sys_ringer_vibrate;
volumeDescription = mContext.getString(R.string.accessibility_ringer_vibrate);
+ } else if (zen != Global.ZEN_MODE_NO_INTERRUPTIONS && zen != Global.ZEN_MODE_ALARMS &&
+ audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
+ volumeVisible = true;
+ volumeIconId = R.drawable.stat_sys_ringer_silent;
+ volumeDescription = mContext.getString(R.string.accessibility_ringer_silent);
}
if (zenVisible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
index fb1addf..a7d5aca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -32,7 +32,7 @@
private final PhoneStatusBarView mView;
private final float mIconAlphaWhenOpaque;
- private View mLeftSide, mStatusIcons, mSignalCluster, mBattery, mClock;
+ private View mLeftSide, mStatusIcons, mBattery, mClock;
private Animator mCurrentAnimation;
public PhoneStatusBarTransitions(PhoneStatusBarView view) {
@@ -43,11 +43,9 @@
}
public void init() {
- mLeftSide = mView.findViewById(R.id.notification_icon_area);
+ mLeftSide = mView.findViewById(R.id.status_bar_left_side);
mStatusIcons = mView.findViewById(R.id.statusIcons);
- mSignalCluster = mView.findViewById(R.id.signal_cluster);
mBattery = mView.findViewById(R.id.battery);
- mClock = mView.findViewById(R.id.clock);
applyModeBackground(-1, getMode(), false /*animate*/);
applyMode(getMode(), false /*animate*/);
}
@@ -90,9 +88,7 @@
anims.playTogether(
animateTransitionTo(mLeftSide, newAlpha),
animateTransitionTo(mStatusIcons, newAlpha),
- animateTransitionTo(mSignalCluster, newAlpha),
- animateTransitionTo(mBattery, newAlphaBC),
- animateTransitionTo(mClock, newAlphaBC)
+ animateTransitionTo(mBattery, newAlphaBC)
);
if (isLightsOut(mode)) {
anims.setDuration(LIGHTS_OUT_DURATION);
@@ -102,9 +98,7 @@
} else {
mLeftSide.setAlpha(newAlpha);
mStatusIcons.setAlpha(newAlpha);
- mSignalCluster.setAlpha(newAlpha);
mBattery.setAlpha(newAlphaBC);
- mClock.setAlpha(newAlphaBC);
}
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index a51cd93..af77804 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -168,8 +168,8 @@
}
private boolean handleTouchEvent(MotionEvent event) {
- if (!mNavigationBarView.isQuickScrubEnabled()
- && !mNavigationBarView.isQuickStepSwipeUpEnabled()) {
+ if (mOverviewEventSender.getProxy() == null || (!mNavigationBarView.isQuickScrubEnabled()
+ && !mNavigationBarView.isQuickStepSwipeUpEnabled())) {
mNavigationBarView.getHomeButton().setDelayTouchFeedback(false /* delay */);
return false;
}
@@ -199,7 +199,7 @@
break;
}
case MotionEvent.ACTION_MOVE: {
- if (mQuickStepStarted || !mAllowGestureDetection){
+ if (mQuickStepStarted || !mAllowGestureDetection || mHomeButtonView == null){
break;
}
int x = (int) event.getX();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index cfc0cc6..2c025b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -148,7 +148,7 @@
private float mNotificationDensity;
// Scrim blanking callbacks
- private Choreographer.FrameCallback mPendingFrameCallback;
+ private Runnable mPendingFrameCallback;
private Runnable mBlankingTransitionRunnable;
private final WakeLock mWakeLock;
@@ -240,7 +240,7 @@
// Cancel blanking transitions that were pending before we requested a new state
if (mPendingFrameCallback != null) {
- Choreographer.getInstance().removeFrameCallback(mPendingFrameCallback);
+ mScrimBehind.removeCallbacks(mPendingFrameCallback);
mPendingFrameCallback = null;
}
if (getHandler().hasCallbacks(mBlankingTransitionRunnable)) {
@@ -278,7 +278,7 @@
// with too many things at this case, in order to not skip the initial frames.
mScrimInFront.postOnAnimationDelayed(this::scheduleUpdate, 16);
mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY;
- } else if (!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD
+ } else if ((!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD)
|| (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) {
// Scheduling a frame isn't enough when:
// • Leaving doze and we need to modify scrim color immediately
@@ -347,7 +347,9 @@
if (mExpansionFraction != fraction) {
mExpansionFraction = fraction;
- if (!(mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD)) {
+ final boolean keyguardOrUnlocked = mState == ScrimState.UNLOCKED
+ || mState == ScrimState.KEYGUARD;
+ if (!keyguardOrUnlocked || !mExpansionAffectsAlpha) {
return;
}
@@ -727,7 +729,7 @@
// Notify callback that the screen is completely black and we're
// ready to change the display power mode
- mPendingFrameCallback = frameTimeNanos -> {
+ mPendingFrameCallback = () -> {
if (mCallback != null) {
mCallback.onDisplayBlanked();
mScreenBlankingCallbackCalled = true;
@@ -743,7 +745,7 @@
// Setting power states can happen after we push out the frame. Make sure we
// stay fully opaque until the power state request reaches the lower levels.
- final int delay = mScreenOn ? 16 : 500;
+ final int delay = mScreenOn ? 32 : 500;
if (DEBUG) {
Log.d(TAG, "Fading out scrims with delay: " + delay);
}
@@ -752,9 +754,15 @@
doOnTheNextFrame(mPendingFrameCallback);
}
+ /**
+ * Executes a callback after the frame has hit the display.
+ * @param callback What to run.
+ */
@VisibleForTesting
- protected void doOnTheNextFrame(Choreographer.FrameCallback callback) {
- Choreographer.getInstance().postFrameCallback(callback);
+ protected void doOnTheNextFrame(Runnable callback) {
+ // Just calling View#postOnAnimation isn't enough because the frame might not have reached
+ // the display yet. A timeout is the safest solution.
+ mScrimBehind.postOnAnimationDelayed(callback, 32 /* delayMillis */);
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 5b734eb..f4b6c38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -156,7 +156,6 @@
mCurrentBehindTint = Color.BLACK;
mBlankScreen = true;
} else {
- // Scrims should still be black at the end of the transition.
mCurrentInFrontTint = Color.TRANSPARENT;
mCurrentBehindTint = Color.TRANSPARENT;
mBlankScreen = false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 8cd6295..f7a97be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -130,7 +130,6 @@
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.widget.LockPatternUtils;
@@ -185,12 +184,11 @@
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CrossFadeHelper;
-import com.android.systemui.statusbar.DismissView;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.FooterView;
import com.android.systemui.statusbar.GestureRecorder;
-import com.android.systemui.statusbar.HeadsUpStatusBarView;
import com.android.systemui.statusbar.KeyboardShortcuts;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
@@ -237,7 +235,6 @@
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
-import com.android.systemui.util.NotificationChannels;
import com.android.systemui.volume.VolumeComponent;
import java.io.FileDescriptor;
@@ -351,6 +348,7 @@
protected boolean mBouncerShowing;
private PhoneStatusBarPolicy mIconPolicy;
+ private StatusBarSignalPolicy mSignalPolicy;
private VolumeComponent mVolumeComponent;
private BrightnessMirrorController mBrightnessMirrorController;
@@ -411,6 +409,7 @@
protected NotificationEntryManager mEntryManager;
protected NotificationViewHierarchyManager mViewHierarchyManager;
protected AppOpsListener mAppOpsListener;
+ protected KeyguardViewMediator mKeyguardViewMediator;
private ZenModeController mZenController;
/**
@@ -564,7 +563,7 @@
};
private KeyguardUserSwitcher mKeyguardUserSwitcher;
- private UserSwitcherController mUserSwitcherController;
+ protected UserSwitcherController mUserSwitcherController;
private NetworkController mNetworkController;
private KeyguardMonitorImpl mKeyguardMonitor
= (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class);
@@ -577,7 +576,7 @@
private final LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
protected NotificationIconAreaController mNotificationIconAreaController;
private boolean mReinflateNotificationsOnUserSwitched;
- private boolean mClearAllEnabled;
+ protected boolean mClearAllEnabled;
@Nullable private View mAmbientIndicationContainer;
private SysuiColorExtractor mColorExtractor;
private ScreenLifecycle mScreenLifecycle;
@@ -590,7 +589,7 @@
}
};
private boolean mNoAnimationOnNextBarModeChange;
- private FalsingManager mFalsingManager;
+ protected FalsingManager mFalsingManager;
private final KeyguardUpdateMonitorCallback mUpdateCallback =
new KeyguardUpdateMonitorCallback() {
@@ -635,6 +634,7 @@
mAppOpsListener = Dependency.get(AppOpsListener.class);
mAppOpsListener.setUpWithPresenter(this, mEntryManager);
mZenController = Dependency.get(ZenModeController.class);
+ mKeyguardViewMediator = getComponent(KeyguardViewMediator.class);
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mColorExtractor.addOnColorsChangedListener(this);
@@ -748,6 +748,7 @@
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController);
+ mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController);
mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
mUnlockMethodCache.addListener(this);
@@ -868,7 +869,7 @@
mVisualStabilityManager.setVisibilityLocationProvider(mStackScroller);
inflateEmptyShadeView();
- inflateDismissView();
+ inflateFooterView();
mBackdrop = mStatusBarWindow.findViewById(R.id.backdrop);
mBackdropFront = mBackdrop.findViewById(R.id.backdrop_front);
@@ -1132,9 +1133,8 @@
}
protected void reevaluateStyles() {
- inflateSignalClusters();
- inflateDismissView();
- updateClearAll();
+ inflateFooterView();
+ updateFooter();
inflateEmptyShadeView();
updateEmptyShadeView();
}
@@ -1146,36 +1146,6 @@
}
}
- private void inflateSignalClusters() {
- if (mKeyguardStatusBar != null) reinflateSignalCluster(mKeyguardStatusBar);
- }
-
- public static SignalClusterView reinflateSignalCluster(View view) {
- Context context = view.getContext();
- SignalClusterView signalCluster = view.findViewById(R.id.signal_cluster);
- if (signalCluster != null) {
- ViewParent parent = signalCluster.getParent();
- if (parent instanceof ViewGroup) {
- ViewGroup viewParent = (ViewGroup) parent;
- int index = viewParent.indexOfChild(signalCluster);
- viewParent.removeView(signalCluster);
- SignalClusterView newCluster = (SignalClusterView) LayoutInflater.from(context)
- .inflate(R.layout.signal_cluster_view, viewParent, false);
- ViewGroup.MarginLayoutParams layoutParams =
- (ViewGroup.MarginLayoutParams) viewParent.getLayoutParams();
- layoutParams.setMarginsRelative(
- context.getResources().getDimensionPixelSize(
- R.dimen.signal_cluster_margin_start),
- 0, 0, 0);
- newCluster.setLayoutParams(layoutParams);
- viewParent.addView(newCluster, index);
- return newCluster;
- }
- return signalCluster;
- }
- return null;
- }
-
private void inflateEmptyShadeView() {
if (mStackScroller == null) {
return;
@@ -1186,18 +1156,21 @@
mStackScroller.setEmptyShadeView(mEmptyShadeView);
}
- private void inflateDismissView() {
- if (!mClearAllEnabled || mStackScroller == null) {
+ private void inflateFooterView() {
+ if (mStackScroller == null) {
return;
}
- mDismissView = (DismissView) LayoutInflater.from(mContext).inflate(
- R.layout.status_bar_notification_dismiss_all, mStackScroller, false);
- mDismissView.setOnButtonClickListener(v -> {
+ mFooterView = (FooterView) LayoutInflater.from(mContext).inflate(
+ R.layout.status_bar_notification_footer, mStackScroller, false);
+ mFooterView.setDismissButtonClickListener(v -> {
mMetricsLogger.action(MetricsEvent.ACTION_DISMISS_ALL_NOTES);
clearAllNotifications();
});
- mStackScroller.setDismissView(mDismissView);
+ mFooterView.setManageButtonClickListener(v -> {
+ manageNotifications();
+ });
+ mStackScroller.setFooterView(mFooterView);
}
protected void createUserSwitcher() {
@@ -1211,6 +1184,12 @@
R.layout.super_status_bar, null);
}
+ public void manageNotifications() {
+ Intent intent = new Intent(Settings.ACTION_ALL_APPS_NOTIFICATION_SETTINGS);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent, true, true);
+ }
+
public void clearAllNotifications() {
// animate-swipe all dismissable notifications, then animate the shade closed
@@ -1393,7 +1372,7 @@
mViewHierarchyManager.updateNotificationViews();
updateSpeedBumpIndex();
- updateClearAll();
+ updateFooter();
updateEmptyShadeView();
updateQsExpansionEnabled();
@@ -1446,24 +1425,29 @@
}
public void addQsTile(ComponentName tile) {
- mQSPanel.getHost().addTile(tile);
+ if (mQSPanel.getHost() != null) {
+ mQSPanel.getHost().addTile(tile);
+ }
}
public void remQsTile(ComponentName tile) {
- mQSPanel.getHost().removeTile(tile);
+ if (mQSPanel.getHost() != null) {
+ mQSPanel.getHost().removeTile(tile);
+ }
}
public void clickTile(ComponentName tile) {
mQSPanel.clickTile(tile);
}
- private void updateClearAll() {
- if (!mClearAllEnabled) {
- return;
- }
- boolean showDismissView = mState != StatusBarState.KEYGUARD
+ @VisibleForTesting
+ protected void updateFooter() {
+ boolean showFooterView = mState != StatusBarState.KEYGUARD
+ && mEntryManager.getNotificationData().getActiveNotifications().size() != 0;
+ boolean showDismissView = mClearAllEnabled && mState != StatusBarState.KEYGUARD
&& hasActiveClearableNotifications();
- mStackScroller.updateDismissView(showDismissView);
+
+ mStackScroller.updateFooterView(showFooterView, showDismissView);
}
/**
@@ -3439,6 +3423,13 @@
return updateIsKeyguard();
}
+ /**
+ * @return True if StatusBar state is FULLSCREEN_USER_SWITCHER.
+ */
+ public boolean isFullScreenUserSwitcherState() {
+ return mState == StatusBarState.FULLSCREEN_USER_SWITCHER;
+ }
+
private boolean updateIsKeyguard() {
boolean wakeAndUnlocking = mFingerprintUnlockController.getMode()
== FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
@@ -4621,6 +4612,7 @@
boolean dozing = mDozingRequested && mState == StatusBarState.KEYGUARD
|| mFingerprintUnlockController.getMode()
== FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
+ final boolean alwaysOn = DozeParameters.getInstance(mContext).getAlwaysOn();
// When in wake-and-unlock we may not have received a change to mState
// but we still should not be dozing, manually set to false.
if (mFingerprintUnlockController.getMode() ==
@@ -4628,6 +4620,7 @@
dozing = false;
}
mDozing = dozing;
+ mKeyguardViewMediator.setAodShowing(mDozing && alwaysOn);
mStatusBarWindowManager.setDozing(mDozing);
mStatusBarKeyguardViewManager.setDozing(mDozing);
if (mAmbientIndicationContainer instanceof DozeReceiver) {
@@ -4648,15 +4641,17 @@
final boolean wakeAndUnlocking = mFingerprintUnlockController.getMode()
== FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
- // Do not animate the scrim expansion when it's triggered by the fingerprint sensor.
- mScrimController.setExpansionAffectsAlpha(mFingerprintUnlockController.getMode()
- != FingerprintUnlockController.MODE_UNLOCK);
+ // Do not animate the scrim expansion when triggered by the fingerprint sensor.
+ mScrimController.setExpansionAffectsAlpha(!mFingerprintUnlockController.isWakeAndUnlock());
if (mBouncerShowing) {
// Bouncer needs the front scrim when it's on top of an activity,
- // tapping on a notification or editing QS.
- mScrimController.transitionTo(mIsOccluded || mNotificationPanel.needsScrimming() ?
- ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER);
+ // tapping on a notification, editing QS or being dismissed by
+ // FLAG_DISMISS_KEYGUARD_ACTIVITY.
+ ScrimState state = mIsOccluded || mNotificationPanel.needsScrimming()
+ || mStatusBarKeyguardViewManager.willDismissWithAction() ?
+ ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER;
+ mScrimController.transitionTo(state);
} else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
} else if (mBrightnessMirrorVisible) {
@@ -4935,7 +4930,7 @@
protected RecentsComponent mRecents;
protected NotificationShelf mNotificationShelf;
- protected DismissView mDismissView;
+ protected FooterView mFooterView;
protected EmptyShadeView mEmptyShadeView;
protected AssistManager mAssistManager;
@@ -5408,8 +5403,8 @@
// incremented in the following "changeViewPosition" calls so that its value is correct for
// subsequent calls.
int offsetFromEnd = 1;
- if (mDismissView != null) {
- mStackScroller.changeViewPosition(mDismissView,
+ if (mFooterView != null) {
+ mStackScroller.changeViewPosition(mFooterView,
mStackScroller.getChildCount() - offsetFromEnd++);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 956bebb..94e004b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -16,12 +16,16 @@
import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS;
import static android.app.StatusBarManager.DISABLE_NONE;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.ArraySet;
+import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
@@ -33,19 +37,39 @@
import com.android.systemui.DemoMode;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusBarMobileView;
+import com.android.systemui.statusbar.StatusBarWifiView;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.util.Utils.DisableStateTracker;
+import java.util.List;
public interface StatusBarIconController {
+ /**
+ * When an icon is added with TAG_PRIMARY, it will be treated as the primary icon
+ * in that slot and not added as a sub slot.
+ */
+ public static final int TAG_PRIMARY = 0;
+
public void addIconGroup(IconManager iconManager);
public void removeIconGroup(IconManager iconManager);
public void setExternalIcon(String slot);
public void setIcon(String slot, int resourceId, CharSequence contentDescription);
public void setIcon(String slot, StatusBarIcon icon);
- public void setIconVisibility(String slotTty, boolean b);
- public void removeIcon(String slot);
+ public void setSignalIcon(String slot, WifiIconState state);
+ public void setMobileIcons(String slot, List<MobileIconState> states);
+ public void setIconVisibility(String slot, boolean b);
+ /**
+ * If you don't know what to pass for `tag`, either remove all icons for slot, or use
+ * TAG_PRIMARY to refer to the first icon at a given slot.
+ */
+ public void removeIcon(String slot, int tag);
+ public void removeAllIconsForSlot(String slot);
public static final String ICON_BLACKLIST = "icon_blacklist";
@@ -79,9 +103,9 @@
@Override
protected void onIconAdded(int index, String slot, boolean blocked,
- StatusBarIcon icon) {
- StatusBarIconView v = addIcon(index, slot, blocked, icon);
- mDarkIconDispatcher.addDarkReceiver(v);
+ StatusBarIconHolder holder) {
+ StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
+ mDarkIconDispatcher.addDarkReceiver((DarkReceiver) view);
}
@Override
@@ -95,21 +119,21 @@
@Override
protected void destroy() {
for (int i = 0; i < mGroup.getChildCount(); i++) {
- mDarkIconDispatcher.removeDarkReceiver((ImageView) mGroup.getChildAt(i));
+ mDarkIconDispatcher.removeDarkReceiver((DarkReceiver) mGroup.getChildAt(i));
}
mGroup.removeAllViews();
}
@Override
protected void onRemoveIcon(int viewIndex) {
- mDarkIconDispatcher.removeDarkReceiver((ImageView) mGroup.getChildAt(viewIndex));
+ mDarkIconDispatcher.removeDarkReceiver((DarkReceiver) mGroup.getChildAt(viewIndex));
super.onRemoveIcon(viewIndex);
}
@Override
public void onSetIcon(int viewIndex, StatusBarIcon icon) {
super.onSetIcon(viewIndex, icon);
- mDarkIconDispatcher.applyDark((ImageView) mGroup.getChildAt(viewIndex));
+ mDarkIconDispatcher.applyDark((DarkReceiver) mGroup.getChildAt(viewIndex));
}
@Override
@@ -135,17 +159,18 @@
}
@Override
- protected void onIconAdded(int index, String slot, boolean blocked, StatusBarIcon icon) {
- StatusBarIconView v = addIcon(index, slot, blocked, icon);
- v.setStaticDrawableColor(mColor);
+ protected void onIconAdded(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
+ view.setStaticDrawableColor(mColor);
}
public void setTint(int color) {
mColor = color;
for (int i = 0; i < mGroup.getChildCount(); i++) {
View child = mGroup.getChildAt(i);
- if (child instanceof StatusBarIconView) {
- StatusBarIconView icon = (StatusBarIconView) child;
+ if (child instanceof StatusIconDisplayable) {
+ StatusIconDisplayable icon = (StatusIconDisplayable) child;
icon.setStaticDrawableColor(mColor);
}
}
@@ -171,6 +196,7 @@
// Enables SystemUI demo mode to take effect in this group
protected boolean mDemoable = true;
+ private boolean mIsInDemoMode;
protected DemoStatusIcons mDemoStatusIcons;
public IconManager(ViewGroup group) {
@@ -205,10 +231,27 @@
}
protected void onIconAdded(int index, String slot, boolean blocked,
- StatusBarIcon icon) {
- addIcon(index, slot, blocked, icon);
+ StatusBarIconHolder holder) {
+ addHolder(index, slot, blocked, holder);
}
+ protected StatusIconDisplayable addHolder(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ switch (holder.getType()) {
+ case TYPE_ICON:
+ return addIcon(index, slot, blocked, holder.getIcon());
+
+ case TYPE_WIFI:
+ return addSignalIcon(index, slot, holder.getWifiState());
+
+ case TYPE_MOBILE:
+ return addMobileIcon(index, slot, holder.getMobileState());
+ }
+
+ return null;
+ }
+
+ @VisibleForTesting
protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
StatusBarIcon icon) {
StatusBarIconView view = onCreateStatusBarIconView(slot, blocked);
@@ -218,10 +261,45 @@
}
@VisibleForTesting
- protected StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
+ protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) {
+ StatusBarWifiView view = onCreateStatusBarWifiView(slot);
+ view.applyWifiState(state);
+ mGroup.addView(view, index, onCreateLayoutParams());
+
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.addDemoWifiView(state);
+ }
+ return view;
+ }
+
+ @VisibleForTesting
+ protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) {
+ StatusBarMobileView view = onCreateStatusBarMobileView(slot);
+ view.applyMobileState(state);
+ mGroup.addView(view, index, onCreateLayoutParams());
+
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.addMobileView(state);
+ }
+ return view;
+ }
+
+ private StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
return new StatusBarIconView(mContext, slot, null, blocked);
}
+ private StatusBarWifiView onCreateStatusBarWifiView(String slot) {
+ StatusBarWifiView view = StatusBarWifiView.fromContext(mContext);
+ view.setSlot(slot);
+ return view;
+ }
+
+ private StatusBarMobileView onCreateStatusBarMobileView(String slot) {
+ StatusBarMobileView view = StatusBarMobileView.fromContext(mContext);
+ view.setSlot(slot);
+ return view;
+ }
+
protected LinearLayout.LayoutParams onCreateLayoutParams() {
return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
}
@@ -256,6 +334,9 @@
}
protected void onRemoveIcon(int viewIndex) {
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.onRemoveIcon((StatusIconDisplayable) mGroup.getChildAt(viewIndex));
+ }
mGroup.removeViewAt(viewIndex);
}
@@ -264,17 +345,59 @@
view.set(icon);
}
+ public void onSetIconHolder(int viewIndex, StatusBarIconHolder holder) {
+ switch (holder.getType()) {
+ case TYPE_ICON:
+ onSetIcon(viewIndex, holder.getIcon());
+ return;
+ case TYPE_WIFI:
+ onSetSignalIcon(viewIndex, holder.getWifiState());
+ return;
+
+ case TYPE_MOBILE:
+ onSetMobileIcon(viewIndex, holder.getMobileState());
+ default:
+ break;
+ }
+ }
+
+ public void onSetSignalIcon(int viewIndex, WifiIconState state) {
+ StatusBarWifiView wifiView = (StatusBarWifiView) mGroup.getChildAt(viewIndex);
+ if (wifiView != null) {
+ wifiView.applyWifiState(state);
+ }
+
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.updateWifiState(state);
+ }
+ }
+
+ public void onSetMobileIcon(int viewIndex, MobileIconState state) {
+ StatusBarMobileView view = (StatusBarMobileView) mGroup.getChildAt(viewIndex);
+ if (view != null) {
+ view.applyMobileState(state);
+ }
+
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.updateMobileState(state);
+ }
+ }
+
@Override
public void dispatchDemoCommand(String command, Bundle args) {
if (!mDemoable) {
return;
}
- if (mDemoStatusIcons != null && command.equals(COMMAND_EXIT)) {
- mDemoStatusIcons.dispatchDemoCommand(command, args);
- exitDemoMode();
+ if (command.equals(COMMAND_EXIT)) {
+ if (mDemoStatusIcons != null) {
+ mDemoStatusIcons.dispatchDemoCommand(command, args);
+ exitDemoMode();
+ }
+ mIsInDemoMode = false;
} else {
if (mDemoStatusIcons == null) {
+ mIsInDemoMode = true;
mDemoStatusIcons = createDemoStatusIcons();
}
mDemoStatusIcons.dispatchDemoCommand(command, args);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 8f5e705..510af03 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -16,13 +16,14 @@
package com.android.systemui.statusbar.phone;
+import android.annotation.NonNull;
import android.content.Context;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Dependency;
@@ -30,7 +31,9 @@
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusIconDisplayable;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.IconLogger;
@@ -40,8 +43,9 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
-import static com.android.systemui.statusbar.phone.CollapsedStatusBarFragment.STATUS_BAR_ICON_MANAGER_TAG;
+import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
/**
* Receives the callbacks from CommandQueue related to icons and tracks the state of
@@ -50,20 +54,25 @@
*/
public class StatusBarIconControllerImpl extends StatusBarIconList implements Tunable,
ConfigurationListener, Dumpable, CommandQueue.Callbacks, StatusBarIconController {
+
private static final String TAG = "StatusBarIconController";
private final ArrayList<IconManager> mIconGroups = new ArrayList<>();
private final ArraySet<String> mIconBlacklist = new ArraySet<>();
private final IconLogger mIconLogger = Dependency.get(IconLogger.class);
+ // Points to light or dark context depending on the... context?
private Context mContext;
- private DemoStatusIcons mDemoStatusIcons;
- private IconManager mStatusBarIconManager;
+ private Context mLightContext;
+ private Context mDarkContext;
+
+ private boolean mIsDark = false;
public StatusBarIconControllerImpl(Context context) {
super(context.getResources().getStringArray(
com.android.internal.R.array.config_statusBarIcons));
Dependency.get(ConfigurationController.class).addCallback(this);
+
mContext = context;
loadDimens();
@@ -76,12 +85,16 @@
@Override
public void addIconGroup(IconManager group) {
mIconGroups.add(group);
- for (int i = 0; i < mIcons.size(); i++) {
- StatusBarIcon icon = mIcons.get(i);
- if (icon != null) {
- String slot = mSlots.get(i);
- boolean blocked = mIconBlacklist.contains(slot);
- group.onIconAdded(getViewIndex(getSlotIndex(slot)), slot, blocked, icon);
+ List<Slot> allSlots = getSlots();
+ for (int i = 0; i < allSlots.size(); i++) {
+ Slot slot = allSlots.get(i);
+ List<StatusBarIconHolder> holders = slot.getHolderList();
+ boolean blocked = mIconBlacklist.contains(slot.getName());
+
+ for (StatusBarIconHolder holder : holders) {
+ int tag = holder.getTag();
+ int viewIndex = getViewIndex(getSlotIndex(slot.getName()), holder.getTag());
+ group.onIconAdded(viewIndex, slot.getName(), blocked, holder);
}
}
}
@@ -99,104 +112,209 @@
}
mIconBlacklist.clear();
mIconBlacklist.addAll(StatusBarIconController.getIconBlacklist(newValue));
- ArrayList<StatusBarIcon> current = new ArrayList<>(mIcons);
- ArrayList<String> currentSlots = new ArrayList<>(mSlots);
+ ArrayList<Slot> currentSlots = getSlots();
+ ArrayMap<Slot, List<StatusBarIconHolder>> slotsToReAdd = new ArrayMap<>();
+
+ // This is a little hacky... Peel off all of the holders on all of the slots
+ // but keep them around so they can be re-added
+
// Remove all the icons.
- for (int i = current.size() - 1; i >= 0; i--) {
- removeIcon(currentSlots.get(i));
+ for (int i = currentSlots.size() - 1; i >= 0; i--) {
+ Slot s = currentSlots.get(i);
+ slotsToReAdd.put(s, s.getHolderList());
+ removeAllIconsForSlot(s.getName());
}
+
// Add them all back
- for (int i = 0; i < current.size(); i++) {
- setIcon(currentSlots.get(i), current.get(i));
+ for (int i = 0; i < currentSlots.size(); i++) {
+ Slot item = currentSlots.get(i);
+ List<StatusBarIconHolder> iconsForSlot = slotsToReAdd.get(item);
+ if (iconsForSlot == null) continue;
+ for (StatusBarIconHolder holder : iconsForSlot) {
+ setIcon(getSlotIndex(item.getName()), holder);
+ }
}
}
private void loadDimens() {
}
- private void addSystemIcon(int index, StatusBarIcon icon) {
- String slot = getSlot(index);
- int viewIndex = getViewIndex(index);
+ private void addSystemIcon(int index, StatusBarIconHolder holder) {
+ String slot = getSlotName(index);
+ int viewIndex = getViewIndex(index, holder.getTag());
boolean blocked = mIconBlacklist.contains(slot);
- mIconLogger.onIconVisibility(getSlot(index), icon.visible);
- mIconGroups.forEach(l -> l.onIconAdded(viewIndex, slot, blocked, icon));
+ mIconLogger.onIconVisibility(getSlotName(index), holder.isVisible());
+ mIconGroups.forEach(l -> l.onIconAdded(viewIndex, slot, blocked, holder));
}
@Override
public void setIcon(String slot, int resourceId, CharSequence contentDescription) {
int index = getSlotIndex(slot);
- StatusBarIcon icon = getIcon(index);
- if (icon == null) {
- icon = new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(),
- Icon.createWithResource(mContext, resourceId), 0, 0, contentDescription);
- setIcon(slot, icon);
+ StatusBarIconHolder holder = getIcon(index, 0);
+ if (holder == null) {
+ StatusBarIcon icon = new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(),
+ Icon.createWithResource(
+ mContext, resourceId), 0, 0, contentDescription);
+ holder = StatusBarIconHolder.fromIcon(icon);
+ setIcon(index, holder);
} else {
- icon.icon = Icon.createWithResource(mContext, resourceId);
- icon.contentDescription = contentDescription;
- handleSet(index, icon);
+ holder.getIcon().icon = Icon.createWithResource(mContext, resourceId);
+ holder.getIcon().contentDescription = contentDescription;
+ handleSet(index, holder);
+ }
+ }
+
+ /**
+ * Signal icons need to be handled differently, because they can be
+ * composite views
+ */
+ @Override
+ public void setSignalIcon(String slot, WifiIconState state) {
+
+ int index = getSlotIndex(slot);
+
+ if (state == null) {
+ removeIcon(index, 0);
+ return;
+ }
+
+ StatusBarIconHolder holder = getIcon(index, 0);
+ if (holder == null) {
+ holder = StatusBarIconHolder.fromWifiIconState(state);
+ setIcon(index, holder);
+ } else {
+ holder.setWifiState(state);
+ handleSet(index, holder);
+ }
+ }
+
+ /**
+ * Accept a list of MobileIconStates, which all live in the same slot(?!), and then are sorted
+ * by subId. Don't worry this definitely makes sense and works.
+ * @param slot da slot
+ * @param iconStates All of the mobile icon states
+ */
+ @Override
+ public void setMobileIcons(String slot, List<MobileIconState> iconStates) {
+ Slot mobileSlot = getSlot(slot);
+ int slotIndex = getSlotIndex(slot);
+
+ for (MobileIconState state : iconStates) {
+ StatusBarIconHolder holder = mobileSlot.getHolderForTag(state.subId);
+ if (holder == null) {
+ holder = StatusBarIconHolder.fromMobileIconState(state);
+ setIcon(slotIndex, holder);
+ } else {
+ holder.setMobileState(state);
+ handleSet(slotIndex, holder);
+ }
}
}
@Override
public void setExternalIcon(String slot) {
- int viewIndex = getViewIndex(getSlotIndex(slot));
+ int viewIndex = getViewIndex(getSlotIndex(slot), 0);
int height = mContext.getResources().getDimensionPixelSize(
R.dimen.status_bar_icon_drawing_size);
mIconGroups.forEach(l -> l.onIconExternal(viewIndex, height));
}
+ //TODO: remove this (used in command queue and for 3rd party tiles?)
@Override
public void setIcon(String slot, StatusBarIcon icon) {
setIcon(getSlotIndex(slot), icon);
}
+ /**
+ * For backwards compatibility, in the event that someone gives us a slot and a status bar icon
+ */
+ private void setIcon(int index, StatusBarIcon icon) {
+ if (icon == null) {
+ removeAllIconsForSlot(getSlotName(index));
+ return;
+ }
+
+ StatusBarIconHolder holder = StatusBarIconHolder.fromIcon(icon);
+ setIcon(index, holder);
+ }
+
@Override
- public void removeIcon(String slot) {
- int index = getSlotIndex(slot);
- removeIcon(index);
+ public void setIcon(int index, @NonNull StatusBarIconHolder holder) {
+ boolean isNew = getIcon(index, holder.getTag()) == null;
+ super.setIcon(index, holder);
+
+ if (isNew) {
+ addSystemIcon(index, holder);
+ } else {
+ handleSet(index, holder);
+ }
}
public void setIconVisibility(String slot, boolean visibility) {
int index = getSlotIndex(slot);
- StatusBarIcon icon = getIcon(index);
- if (icon == null || icon.visible == visibility) {
+ StatusBarIconHolder holder = getIcon(index, 0);
+ if (holder == null || holder.isVisible() == visibility) {
return;
}
- icon.visible = visibility;
- handleSet(index, icon);
+
+ holder.setVisible(visibility);
+ handleSet(index, holder);
+ }
+
+ public void removeIcon(String slot) {
+ removeAllIconsForSlot(slot);
}
@Override
- public void removeIcon(int index) {
- if (getIcon(index) == null) {
+ public void removeIcon(String slot, int tag) {
+ removeIcon(getSlotIndex(slot), tag);
+ }
+
+ @Override
+ public void removeAllIconsForSlot(String slotName) {
+ Slot slot = getSlot(slotName);
+ if (!slot.hasIconsInSlot()) {
return;
}
- mIconLogger.onIconHidden(getSlot(index));
- super.removeIcon(index);
- int viewIndex = getViewIndex(index);
+
+ mIconLogger.onIconHidden(slotName);
+
+ int slotIndex = getSlotIndex(slotName);
+ List<StatusBarIconHolder> iconsToRemove = slot.getHolderList();
+ for (StatusBarIconHolder holder : iconsToRemove) {
+ int viewIndex = getViewIndex(slotIndex, holder.getTag());
+ slot.removeForTag(holder.getTag());
+ mIconGroups.forEach(l -> l.onRemoveIcon(viewIndex));
+ }
+ }
+
+ @Override
+ public void removeIcon(int index, int tag) {
+ if (getIcon(index, tag) == null) {
+ return;
+ }
+ mIconLogger.onIconHidden(getSlotName(index));
+ super.removeIcon(index, tag);
+ int viewIndex = getViewIndex(index, 0);
mIconGroups.forEach(l -> l.onRemoveIcon(viewIndex));
}
- @Override
- public void setIcon(int index, StatusBarIcon icon) {
- if (icon == null) {
- removeIcon(index);
- return;
- }
- boolean isNew = getIcon(index) == null;
- super.setIcon(index, icon);
- if (isNew) {
- addSystemIcon(index, icon);
- } else {
- handleSet(index, icon);
- }
+ private void handleSet(int index, StatusBarIconHolder holder) {
+ int viewIndex = getViewIndex(index, holder.getTag());
+ mIconLogger.onIconVisibility(getSlotName(index), holder.isVisible());
+ mIconGroups.forEach(l -> l.onSetIconHolder(viewIndex, holder));
}
- private void handleSet(int index, StatusBarIcon icon) {
- int viewIndex = getViewIndex(index);
- mIconLogger.onIconVisibility(getSlot(index), icon.visible);
- mIconGroups.forEach(l -> l.onSetIcon(viewIndex, icon));
+ /**
+ * For mobile essentially (an array of holders in one slot)
+ */
+ private void handleSet(int slotIndex, List<StatusBarIconHolder> holders) {
+ for (StatusBarIconHolder holder : holders) {
+ int viewIndex = getViewIndex(slotIndex, holder.getTag());
+ mIconLogger.onIconVisibility(getSlotName(slotIndex), holder.isVisible());
+ mIconGroups.forEach(l -> l.onSetIconHolder(viewIndex, holder));
+ }
}
@Override
@@ -208,7 +326,7 @@
int N = group.getChildCount();
pw.println(" icon views: " + N);
for (int i = 0; i < N; i++) {
- StatusBarIconView ic = (StatusBarIconView) group.getChildAt(i);
+ StatusIconDisplayable ic = (StatusIconDisplayable) group.getChildAt(i);
pw.println(" [" + i + "] icon=" + ic);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
new file mode 100644
index 0000000..e854dd0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.os.UserHandle;
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
+
+/**
+ * Wraps {@link com.android.internal.statusbar.StatusBarIcon} so we can still have a uniform list
+ */
+public class StatusBarIconHolder {
+ public static final int TYPE_ICON = 0;
+ public static final int TYPE_WIFI = 1;
+ public static final int TYPE_MOBILE = 2;
+
+ private StatusBarIcon mIcon;
+ private WifiIconState mWifiState;
+ private MobileIconState mMobileState;
+ private int mType = TYPE_ICON;
+ private int mTag = 0;
+ private boolean mVisible = true;
+
+ public static StatusBarIconHolder fromIcon(StatusBarIcon icon) {
+ StatusBarIconHolder wrapper = new StatusBarIconHolder();
+ wrapper.mIcon = icon;
+
+ return wrapper;
+ }
+
+ public static StatusBarIconHolder fromResId(Context context, int resId,
+ CharSequence contentDescription) {
+ StatusBarIconHolder holder = new StatusBarIconHolder();
+ holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(),
+ Icon.createWithResource( context, resId), 0, 0, contentDescription);
+ return holder;
+ }
+
+ public static StatusBarIconHolder fromWifiIconState(WifiIconState state) {
+ StatusBarIconHolder holder = new StatusBarIconHolder();
+ holder.mWifiState = state;
+ holder.mType = TYPE_WIFI;
+ return holder;
+ }
+
+ public static StatusBarIconHolder fromMobileIconState(MobileIconState state) {
+ StatusBarIconHolder holder = new StatusBarIconHolder();
+ holder.mMobileState = state;
+ holder.mType = TYPE_MOBILE;
+ holder.mTag = state.subId;
+ return holder;
+ }
+
+ public int getType() {
+ return mType;
+ }
+
+ @Nullable
+ public StatusBarIcon getIcon() {
+ return mIcon;
+ }
+
+ @Nullable
+ public WifiIconState getWifiState() {
+ return mWifiState;
+ }
+
+ public void setWifiState(WifiIconState state) {
+ mWifiState = state;
+ }
+
+ @Nullable
+ public MobileIconState getMobileState() {
+ return mMobileState;
+ }
+
+ public void setMobileState(MobileIconState state) {
+ mMobileState = state;
+ }
+
+ public boolean isVisible() {
+ switch (mType) {
+ case TYPE_ICON:
+ return mIcon.visible;
+ case TYPE_WIFI:
+ return mWifiState.visible;
+ case TYPE_MOBILE:
+ return mMobileState.visible;
+
+ default: return true;
+ }
+ }
+
+ public void setVisible(boolean visible) {
+ switch (mType) {
+ case TYPE_ICON:
+ mIcon.visible = visible;
+ break;
+
+ case TYPE_WIFI:
+ mWifiState.visible = visible;
+ break;
+
+ case TYPE_MOBILE:
+ mMobileState.visible = visible;
+ break;
+ }
+ }
+
+ public int getTag() {
+ return mTag;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
index 1aa3a43..c773170 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
@@ -16,64 +16,78 @@
package com.android.systemui.statusbar.phone;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.StatusBarIcon;
-
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
+
+import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
public class StatusBarIconList {
- protected ArrayList<String> mSlots = new ArrayList<>();
- protected ArrayList<StatusBarIcon> mIcons = new ArrayList<>();
+ private ArrayList<Slot> mSlots = new ArrayList<>();
public StatusBarIconList(String[] slots) {
final int N = slots.length;
for (int i=0; i < N; i++) {
- mSlots.add(slots[i]);
- mIcons.add(null);
+ mSlots.add(new Slot(slots[i], null));
}
}
public int getSlotIndex(String slot) {
final int N = mSlots.size();
for (int i=0; i<N; i++) {
- if (slot.equals(mSlots.get(i))) {
+ Slot item = mSlots.get(i);
+ if (item.getName().equals(slot)) {
return i;
}
}
// Auto insert new items at the beginning.
- mSlots.add(0, slot);
- mIcons.add(0, null);
+ mSlots.add(0, new Slot(slot, null));
return 0;
}
+ protected ArrayList<Slot> getSlots() {
+ return new ArrayList<>(mSlots);
+ }
+
+ protected Slot getSlot(String name) {
+ return mSlots.get(getSlotIndex(name));
+ }
+
public int size() {
return mSlots.size();
}
- public void setIcon(int index, StatusBarIcon icon) {
- mIcons.set(index, icon);
+ public void setIcon(int index, @NonNull StatusBarIconHolder holder) {
+ mSlots.get(index).addHolder(holder);
}
- public void removeIcon(int index) {
- mIcons.set(index, null);
+ public void removeIcon(int index, int tag) {
+ mSlots.get(index).removeForTag(tag);
}
- public String getSlot(int index) {
- return mSlots.get(index);
+ public String getSlotName(int index) {
+ return mSlots.get(index).getName();
}
- public StatusBarIcon getIcon(int index) {
- return mIcons.get(index);
+ public StatusBarIconHolder getIcon(int index, int tag) {
+ return mSlots.get(index).getHolderForTag(tag);
}
- public int getViewIndex(int index) {
+ public int getViewIndex(int slotIndex, int tag) {
int count = 0;
- for (int i = 0; i < index; i++) {
- if (mIcons.get(i) != null) {
- count++;
+ for (int i = 0; i < slotIndex; i++) {
+ Slot item = mSlots.get(i);
+ if (item.hasIconsInSlot()) {
+ count += item.numberOfIcons();
}
}
- return count;
+
+ Slot viewItem = mSlots.get(slotIndex);
+ return count + viewItem.viewIndexOffsetForTag(tag);
}
public void dump(PrintWriter pw) {
@@ -81,7 +95,163 @@
final int N = mSlots.size();
pw.println(" icon slots: " + N);
for (int i=0; i<N; i++) {
- pw.printf(" %2d: (%s) %s\n", i, mSlots.get(i), mIcons.get(i));
+ pw.printf(" %2d:%s\n", i, mSlots.get(i).toString());
+ }
+ }
+
+ public static class Slot {
+ private final String mName;
+ private StatusBarIconHolder mHolder;
+ /**
+ * Only used if multiple icons are added to the same slot.
+ *
+ * If there are mSubSlots, then these are structured like:
+ * [ First item | (the rest) ]
+ *
+ * The tricky thing to keep in mind here is that the list [mHolder, mSubSlots] is ordered
+ * ascending, but for view logic we should go backwards through the list. I.e., the first
+ * element (mHolder) should be the highest index, because higher priority items go to the
+ * right of lower priority items
+ */
+ private ArrayList<StatusBarIconHolder> mSubSlots;
+
+ public Slot(String name, StatusBarIconHolder iconHolder) {
+ mName = name;
+ mHolder = iconHolder;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ @Nullable
+ public StatusBarIconHolder getHolderForTag(int tag) {
+ if (tag == TAG_PRIMARY) {
+ return mHolder;
+ }
+
+ if (mSubSlots != null) {
+ for (StatusBarIconHolder holder : mSubSlots) {
+ if (holder.getTag() == tag) {
+ return holder;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public void addHolder(StatusBarIconHolder holder) {
+ int tag = holder.getTag();
+ if (tag == TAG_PRIMARY) {
+ mHolder = holder;
+ } else {
+ setSubSlot(holder, tag);
+ }
+ }
+
+ public void removeForTag(int tag) {
+ if (tag == TAG_PRIMARY) {
+ mHolder = null;
+ } else {
+ int index = getIndexForTag(tag);
+ if (index != -1) {
+ mSubSlots.remove(index);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ public void clear() {
+ mHolder = null;
+ if (mSubSlots != null) {
+ mSubSlots = null;
+ }
+ }
+
+ private void setSubSlot(StatusBarIconHolder holder, int tag) {
+ if (mSubSlots == null) {
+ mSubSlots = new ArrayList<>();
+ mSubSlots.add(holder);
+ return;
+ }
+
+ if (getIndexForTag(tag) != -1) {
+ // Holder exists for tag; no-op
+ return;
+ }
+
+ // These holders get added to the end. Confused yet?
+ mSubSlots.add(holder);
+ }
+
+ private int getIndexForTag(int tag) {
+ for (int i = 0; i < mSubSlots.size(); i++) {
+ StatusBarIconHolder h = mSubSlots.get(i);
+ if (h.getTag() == tag) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ public boolean hasIconsInSlot() {
+ if (mHolder != null) return true;
+ if (mSubSlots == null) return false;
+
+ return mSubSlots.size() > 0;
+ }
+
+ public int numberOfIcons() {
+ int num = mHolder == null ? 0 : 1;
+ if (mSubSlots == null) return num;
+
+ return num + mSubSlots.size();
+ }
+
+ /**
+ * View index is backwards from regular index
+ * @param tag the tag of the holder being viewed
+ * @return (1 + mSubSlots.size() - indexOfTag)
+ */
+ public int viewIndexOffsetForTag(int tag) {
+ if (mSubSlots == null) {
+ return 0;
+ }
+
+ int subSlots = mSubSlots.size();
+ if (tag == TAG_PRIMARY) {
+ return subSlots;
+ }
+
+ return subSlots - getIndexForTag(tag) - 1;
+ }
+
+ public List<StatusBarIconHolder> getHolderList() {
+ ArrayList<StatusBarIconHolder> holders = new ArrayList<>();
+ if (mHolder != null) {
+ holders.add(mHolder);
+ }
+
+ if (mSubSlots != null) {
+ holders.addAll(mSubSlots);
+ }
+
+ return holders;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("(%s) %s", mName, subSlotsString());
+ }
+
+ private String subSlotsString() {
+ if (mSubSlots == null) {
+ return "";
+ }
+
+ return "" + mSubSlots.size() + " subSlots";
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 56a7b1b..6b6ea10 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -135,23 +135,34 @@
mFingerprintUnlockController = fingerprintUnlockController;
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry);
+ mContainer.addOnLayoutChangeListener(this::onContainerLayout);
mNotificationPanelView = notificationPanelView;
notificationPanelView.setExpansionListener(this::onPanelExpansionChanged);
}
+ private void onContainerLayout(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ mNotificationPanelView.setBouncerTop(mBouncer.getTop());
+ }
+
private void onPanelExpansionChanged(float expansion, boolean tracking) {
- // We don't want to translate the bounce when the keyguard is occluded, because we're in
- // a FLAG_SHOW_WHEN_LOCKED activity and need to conserve the original animation.
- // We also don't want to show the bouncer when the user quickly taps on the display.
+ // We don't want to translate the bounce when:
+ // • Keyguard is occluded, because we're in a FLAG_SHOW_WHEN_LOCKED activity and need to
+ // conserve the original animation.
+ // • The user quickly taps on the display and we show "swipe up to unlock."
+ // • Keyguard will be dismissed by an action. a.k.a: FLAG_DISMISS_KEYGUARD_ACTIVITY
+ // • Full-screen user switcher is displayed.
final boolean noLongerTracking = mLastTracking != tracking && !tracking;
- if (mOccluded || mNotificationPanelView.isUnlockHintRunning()) {
+ if (mOccluded || mNotificationPanelView.isUnlockHintRunning()
+ || mBouncer.willDismissWithAction()
+ || mStatusBar.isFullScreenUserSwitcherState()) {
mBouncer.setExpansion(0);
} else if (mShowing && mStatusBar.isKeyguardCurrentlySecure() && !mDozing) {
mBouncer.setExpansion(expansion);
if (expansion == 1) {
mBouncer.onFullyHidden();
} else if (!mBouncer.isShowing() && !mBouncer.isAnimatingAway()) {
- mBouncer.show(true /* resetSecuritySelection */, false /* notifyFalsing */);
+ mBouncer.show(false /* resetSecuritySelection */, false /* animated */);
} else if (noLongerTracking) {
// Notify that falsing manager should stop its session when user stops touching,
// even before the animation ends, to guarantee that we're not recording sensitive
@@ -696,6 +707,10 @@
}
}
+ public boolean willDismissWithAction() {
+ return mBouncer.willDismissWithAction();
+ }
+
private static class DismissWithActionRequest {
final OnDismissAction dismissAction;
final Runnable cancelAction;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
new file mode 100644
index 0000000..c5a3a0d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.Looper;
+import android.telephony.SubscriptionInfo;
+import android.util.ArraySet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.ImageView;
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.NetworkController.IconState;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl;
+import com.android.systemui.statusbar.policy.SecurityController;
+import com.android.systemui.tuner.TunerService.Tunable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+
+public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback,
+ SecurityController.SecurityControllerCallback, Tunable {
+ private static final String TAG = "StatusBarSignalPolicy";
+
+ private final String mSlotAirplane;
+ private final String mSlotMobile;
+ private final String mSlotWifi;
+ private final String mSlotEthernet;
+ private final String mSlotVpn;
+
+ private final Context mContext;
+ private final StatusBarIconController mIconController;
+ private final NetworkController mNetworkController;
+ private final SecurityController mSecurityController;
+ private final Handler mHandler = Handler.getMain();
+
+ private boolean mBlockAirplane;
+ private boolean mBlockMobile;
+ private boolean mBlockWifi;
+ private boolean mBlockEthernet;
+ private boolean mActivityEnabled;
+ private boolean mForceBlockWifi;
+
+ // Track as little state as possible, and only for padding purposes
+ private boolean mIsAirplaneMode = false;
+ private boolean mWifiVisible = false;
+
+ private ArrayList<MobileIconState> mMobileStates = new ArrayList<MobileIconState>();
+ private WifiIconState mWifiIconState = new WifiIconState();
+
+ public StatusBarSignalPolicy(Context context, StatusBarIconController iconController) {
+ mContext = context;
+
+ mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane);
+ mSlotMobile = mContext.getString(com.android.internal.R.string.status_bar_mobile);
+ mSlotWifi = mContext.getString(com.android.internal.R.string.status_bar_wifi);
+ mSlotEthernet = mContext.getString(com.android.internal.R.string.status_bar_ethernet);
+ mSlotVpn = mContext.getString(com.android.internal.R.string.status_bar_vpn);
+
+ mIconController = iconController;
+ mNetworkController = Dependency.get(NetworkController.class);
+ mSecurityController = Dependency.get(SecurityController.class);
+
+ mNetworkController.addCallback(this);
+ mSecurityController.addCallback(this);
+ }
+
+ public void destroy() {
+ mNetworkController.removeCallback(this);
+ mSecurityController.removeCallback(this);
+ }
+
+ private void updateVpn() {
+ boolean vpnVisible = mSecurityController.isVpnEnabled();
+ int vpnIconId = currentVpnIconId(mSecurityController.isVpnBranded());
+
+ mIconController.setIcon(mSlotVpn, vpnIconId, null);
+ mIconController.setIconVisibility(mSlotVpn, vpnVisible);
+ }
+
+ private int currentVpnIconId(boolean isBranded) {
+ return isBranded ? R.drawable.stat_sys_branded_vpn : R.drawable.stat_sys_vpn_ic;
+ }
+
+ private void updateActivityEnabled() {
+ mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity);
+ }
+
+ /**
+ * From SecurityController
+ */
+ @Override
+ public void onStateChanged() {
+ mHandler.post(this::updateVpn);
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
+ return;
+ }
+ ArraySet<String> blockList = StatusBarIconController.getIconBlacklist(newValue);
+ boolean blockAirplane = blockList.contains(mSlotAirplane);
+ boolean blockMobile = blockList.contains(mSlotMobile);
+ boolean blockWifi = blockList.contains(mSlotWifi);
+ boolean blockEthernet = blockList.contains(mSlotEthernet);
+
+ if (blockAirplane != mBlockAirplane || blockMobile != mBlockMobile
+ || blockEthernet != mBlockEthernet || blockWifi != mBlockWifi) {
+ mBlockAirplane = blockAirplane;
+ mBlockMobile = blockMobile;
+ mBlockEthernet = blockEthernet;
+ mBlockWifi = blockWifi || mForceBlockWifi;
+ // Re-register to get new callbacks.
+ mNetworkController.removeCallback(this);
+ }
+ }
+
+ @Override
+ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
+ boolean activityIn, boolean activityOut, String description, boolean isTransient,
+ String statusLabel) {
+
+ boolean visible = statusIcon.visible && !mBlockWifi;
+ boolean in = activityIn && mActivityEnabled && visible;
+ boolean out = activityOut && mActivityEnabled && visible;
+
+ mWifiIconState.visible = visible;
+ mWifiIconState.resId = statusIcon.icon;
+ mWifiIconState.activityIn = in;
+ mWifiIconState.activityOut = out;
+ mWifiIconState.slot = mSlotWifi;
+ mWifiIconState.airplaneSpacerVisible = mIsAirplaneMode;
+ mWifiIconState.contentDescription = statusIcon.contentDescription;
+
+ if (mWifiIconState.visible && mWifiIconState.resId > 0) {
+ mIconController.setSignalIcon(mSlotWifi, mWifiIconState.copy());
+ mIconController.setIconVisibility(mSlotWifi, true);
+ } else {
+ mIconController.setIconVisibility(mSlotWifi, false);
+ }
+ }
+
+ @Override
+ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {
+ MobileIconState state = getState(subId);
+ if (state == null) {
+ return;
+ }
+
+ state.visible = statusIcon.visible && !mBlockMobile;
+ state.strengthId = statusIcon.icon;
+ state.typeId = statusType;
+ state.contentDescription = statusIcon.contentDescription;
+ state.typeContentDescription = typeContentDescription;
+ state.roaming = roaming;
+ state.activityIn = activityIn && mActivityEnabled;
+ state.activityOut = activityOut && mActivityEnabled;
+
+ // Always send a copy to maintain value type semantics
+ mIconController.setMobileIcons(mSlotMobile, MobileIconState.copyStates(mMobileStates));
+ }
+
+ private MobileIconState getState(int subId) {
+ for (MobileIconState state : mMobileStates) {
+ if (state.subId == subId) {
+ return state;
+ }
+ }
+ Log.e(TAG, "Unexpected subscription " + subId);
+ return null;
+ }
+
+
+ /**
+ * It is expected that a call to setSubs will be immediately followed by setMobileDataIndicators
+ * so we don't have to update the icon manager at this point, just remove the old ones
+ * @param subs list of mobile subscriptions, displayed as mobile data indicators (max 8)
+ */
+ @Override
+ public void setSubs(List<SubscriptionInfo> subs) {
+ if (hasCorrectSubs(subs)) {
+ return;
+ }
+
+ mIconController.removeAllIconsForSlot(mSlotMobile);
+ mMobileStates.clear();
+ final int n = subs.size();
+ for (int i = 0; i < n; i++) {
+ mMobileStates.add(new MobileIconState(subs.get(i).getSubscriptionId()));
+ }
+ }
+
+ private boolean hasCorrectSubs(List<SubscriptionInfo> subs) {
+ final int N = subs.size();
+ if (N != mMobileStates.size()) {
+ return false;
+ }
+ for (int i = 0; i < N; i++) {
+ if (mMobileStates.get(i).subId != subs.get(i).getSubscriptionId()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void setNoSims(boolean show, boolean simDetected) {
+ // Noop yay!
+ }
+
+
+ @Override
+ public void setEthernetIndicators(IconState state) {
+ boolean visible = state.visible && !mBlockEthernet;
+ int resId = state.icon;
+ String description = state.contentDescription;
+
+ if (resId > 0) {
+ mIconController.setIcon(mSlotEthernet, resId, description);
+ mIconController.setIconVisibility(mSlotEthernet, true);
+ } else {
+ mIconController.setIconVisibility(mSlotEthernet, false);
+ }
+ }
+
+ @Override
+ public void setIsAirplaneMode(IconState icon) {
+ mIsAirplaneMode = icon.visible && !mBlockAirplane;
+ int resId = icon.icon;
+ String description = icon.contentDescription;
+
+ if (mIsAirplaneMode && resId > 0) {
+ mIconController.setIcon(mSlotAirplane, resId, description);
+ mIconController.setIconVisibility(mSlotAirplane, true);
+ } else {
+ mIconController.setIconVisibility(mSlotAirplane, false);
+ }
+ }
+
+ @Override
+ public void setMobileDataEnabled(boolean enabled) {
+ // Don't care.
+ }
+
+ private static abstract class SignalIconState {
+ public boolean visible;
+ public boolean activityOut;
+ public boolean activityIn;
+ public String slot;
+ public String contentDescription;
+
+ @Override
+ public boolean equals(Object o) {
+ // Skipping reference equality bc this should be more of a value type
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ SignalIconState that = (SignalIconState) o;
+ return visible == that.visible &&
+ activityOut == that.activityOut &&
+ activityIn == that.activityIn &&
+ Objects.equals(contentDescription, that.contentDescription) &&
+ Objects.equals(slot, that.slot);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(visible, activityOut, slot);
+ }
+
+ protected void copyTo(SignalIconState other) {
+ other.visible = visible;
+ other.activityIn = activityIn;
+ other.activityOut = activityOut;
+ other.slot = slot;
+ other.contentDescription = contentDescription;
+ }
+ }
+
+ public static class WifiIconState extends SignalIconState{
+ public int resId;
+ public boolean airplaneSpacerVisible;
+ public boolean signalSpacerVisible;
+
+ @Override
+ public boolean equals(Object o) {
+ // Skipping reference equality bc this should be more of a value type
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ WifiIconState that = (WifiIconState) o;
+ return resId == that.resId &&
+ airplaneSpacerVisible == that.airplaneSpacerVisible &&
+ signalSpacerVisible == that.signalSpacerVisible;
+ }
+
+ public void copyTo(WifiIconState other) {
+ super.copyTo(other);
+ other.resId = resId;
+ other.airplaneSpacerVisible = airplaneSpacerVisible;
+ other.signalSpacerVisible = signalSpacerVisible;
+ }
+
+ public WifiIconState copy() {
+ WifiIconState newState = new WifiIconState();
+ copyTo(newState);
+ return newState;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(),
+ resId, airplaneSpacerVisible, signalSpacerVisible);
+ }
+
+ @Override public String toString() {
+ return "WifiIconState(resId=" + resId + ", visible=" + visible + ")";
+ }
+ }
+
+ /**
+ * A little different. This one delegates to SignalDrawable instead of a specific resId
+ */
+ public static class MobileIconState extends SignalIconState {
+ public int subId;
+ public int strengthId;
+ public int typeId;
+ public boolean roaming;
+ public boolean needsLeadingPadding;
+ public String typeContentDescription;
+
+ private MobileIconState(int subId) {
+ super();
+ this.subId = subId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ MobileIconState that = (MobileIconState) o;
+ return subId == that.subId &&
+ strengthId == that.strengthId &&
+ typeId == that.typeId &&
+ roaming == that.roaming &&
+ needsLeadingPadding == that.needsLeadingPadding &&
+ Objects.equals(typeContentDescription, that.typeContentDescription);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects
+ .hash(super.hashCode(), subId, strengthId, typeId, roaming, needsLeadingPadding,
+ typeContentDescription);
+ }
+
+ public void copyTo(MobileIconState other) {
+ super.copyTo(other);
+ other.subId = subId;
+ other.strengthId = strengthId;
+ other.typeId = typeId;
+ other.roaming = roaming;
+ other.needsLeadingPadding = needsLeadingPadding;
+ other.typeContentDescription = typeContentDescription;
+ }
+
+ private static List<MobileIconState> copyStates(List<MobileIconState> inStates) {
+ ArrayList<MobileIconState> outStates = new ArrayList<>();
+ for (MobileIconState state : inStates) {
+ MobileIconState copy = new MobileIconState(state.subId);
+ state.copyTo(copy);
+ outStates.add(copy);
+ }
+
+ return outStates;
+ }
+
+ @Override public String toString() {
+ return "MobileIconState(subId=" + subId + ", strengthId=" + strengthId + ", roaming="
+ + roaming + ", visible=" + visible + ")";
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index 309a1a7..2437c51 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -143,7 +143,9 @@
final boolean scrimsOccludingWallpaper =
state.scrimsVisibility == ScrimController.VISIBILITY_FULLY_OPAQUE;
- if (state.keyguardShowing && !state.backdropShowing && !scrimsOccludingWallpaper) {
+ final boolean keyguardOrAod = state.keyguardShowing
+ || (state.dozing && mDozeParameters.getAlwaysOn());
+ if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) {
mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
} else {
mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
index dab28d6..255e10e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
@@ -18,13 +18,13 @@
import android.annotation.Nullable;
import android.content.Context;
-import android.util.ArrayMap;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import com.android.keyguard.AlphaOptimizedLinearLayout;
import com.android.systemui.R;
-import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.stack.ViewState;
/**
@@ -97,7 +97,7 @@
* Layout is happening from end -> start
*/
private void calculateIconTranslations() {
- float width = getWidth();
+ float width = getWidth() - getPaddingEnd();
float translationX = width;
float contentStart = getPaddingStart();
int childCount = getChildCount();
@@ -109,18 +109,22 @@
//TODO: Dots
for (int i = childCount - 1; i >= 0; i--) {
View child = getChildAt(i);
- if (!(child instanceof StatusBarIconView)) {
+ if (!(child instanceof StatusIconDisplayable)) {
+ if (DEBUG) Log.d(TAG, "skipping child (wrong type)");
continue;
}
+ StatusIconDisplayable iconView = (StatusIconDisplayable) child;
+
ViewState childState = getViewStateFromChild(child);
if (childState == null ) {
+ if (DEBUG) Log.d(TAG, "skipping child (" + iconView.getSlot() + ") no ViewState");
continue;
}
- // Rely on StatusBarIcon for truth about visibility
- if (!((StatusBarIconView) child).getStatusBarIcon().visible) {
+ if (!iconView.isIconVisible() || iconView.isIconBlocked()) {
childState.hidden = true;
+ if (DEBUG) Log.d(TAG, "skipping child (" + iconView.getSlot() + ") not visible");
continue;
}
@@ -175,8 +179,8 @@
vs.initFrom(child);
vs.alpha = 1.0f;
- if (child instanceof StatusBarIconView) {
- vs.hidden = !((StatusBarIconView)child).getStatusBarIcon().visible;
+ if (child instanceof StatusIconDisplayable) {
+ vs.hidden = !((StatusIconDisplayable)child).isIconVisible();
} else {
vs.hidden = false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index fcf084b..94db95a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -279,6 +279,9 @@
@Override
public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {}
+ @Override
+ public void onProfileAudioStateChanged(int bluetoothProfile, int state) {}
+
private ActuallyCachedState getCachedState(CachedBluetoothDevice device) {
ActuallyCachedState state = mCachedState.get(device);
if (state == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
index 5159e8d..b76d536 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
@@ -109,13 +109,13 @@
@Override
public void setWifiIndicators(final boolean enabled, final IconState statusIcon,
final IconState qsIcon, final boolean activityIn, final boolean activityOut,
- final String description, boolean isTransient) {
+ final String description, boolean isTransient, String secondaryLabel) {
post(new Runnable() {
@Override
public void run() {
for (SignalCallback callback : mSignalCallbacks) {
callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut,
- description, isTransient);
+ description, isTransient, secondaryLabel);
}
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DarkIconDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DarkIconDispatcher.java
index 58944c6..945ed76 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DarkIconDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DarkIconDispatcher.java
@@ -35,7 +35,7 @@
// Used to reapply darkness on an object, must have previously been added through
// addDarkReceiver.
- void applyDark(ImageView object);
+ void applyDark(DarkReceiver object);
int DEFAULT_ICON_TINT = Color.WHITE;
Rect sTmpRect = new Rect();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
index 06040e2..4a11754 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
@@ -17,18 +17,16 @@
package com.android.systemui.statusbar.policy;
import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
+import android.content.res.Resources;
import android.graphics.Canvas;
import android.os.SystemClock;
-import android.util.AttributeSet;
import android.util.Slog;
import android.view.MotionEvent;
import android.view.Surface;
-import android.view.View;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.statusbar.phone.StatusBar;
/**
@@ -38,7 +36,7 @@
* outside the navigation bar (since this is when accidental taps are more likely), then contracts
* back over time (since a later tap might be intended for the top of the bar).
*/
-public class DeadZone extends View {
+public class DeadZone {
public static final String TAG = "DeadZone";
public static final boolean DEBUG = false;
@@ -47,6 +45,7 @@
private static final boolean CHATTY = true; // print to logcat when we eat a click
private final StatusBar mStatusBar;
+ private final NavigationBarView mNavigationBarView;
private boolean mShouldFlash;
private float mFlashFrac = 0f;
@@ -67,31 +66,11 @@
}
};
- public DeadZone(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public DeadZone(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeadZone,
- defStyle, 0);
-
- mHold = a.getInteger(R.styleable.DeadZone_holdTime, 0);
- mDecay = a.getInteger(R.styleable.DeadZone_decayTime, 0);
-
- mSizeMin = a.getDimensionPixelSize(R.styleable.DeadZone_minSize, 0);
- mSizeMax = a.getDimensionPixelSize(R.styleable.DeadZone_maxSize, 0);
-
- int index = a.getInt(R.styleable.DeadZone_orientation, -1);
- mVertical = (index == VERTICAL);
-
- if (DEBUG)
- Slog.v(TAG, this + " size=[" + mSizeMin + "-" + mSizeMax + "] hold=" + mHold
- + (mVertical ? " vertical" : " horizontal"));
-
- setFlashOnTouchCapture(context.getResources().getBoolean(R.bool.config_dead_zone_flash));
- mStatusBar = SysUiServiceProvider.getComponent(context, StatusBar.class);
+ public DeadZone(NavigationBarView view) {
+ mNavigationBarView = view;
+ mStatusBar = SysUiServiceProvider.getComponent(mNavigationBarView.getContext(),
+ StatusBar.class);
+ onConfigurationChanged(HORIZONTAL);
}
static float lerp(float a, float b, float f) {
@@ -112,11 +91,29 @@
public void setFlashOnTouchCapture(boolean dbg) {
mShouldFlash = dbg;
mFlashFrac = 0f;
- postInvalidate();
+ mNavigationBarView.postInvalidate();
+ }
+
+ public void onConfigurationChanged(int rotation) {
+ mDisplayRotation = rotation;
+
+ final Resources res = mNavigationBarView.getResources();
+ mHold = res.getInteger(R.integer.navigation_bar_deadzone_hold);
+ mDecay = res.getInteger(R.integer.navigation_bar_deadzone_decay);
+
+ mSizeMin = res.getDimensionPixelSize(R.dimen.navigation_bar_deadzone_size);
+ mSizeMax = res.getDimensionPixelSize(R.dimen.navigation_bar_deadzone_size_max);
+ int index = res.getInteger(R.integer.navigation_bar_deadzone_orientation);
+ mVertical = (index == VERTICAL);
+
+ if (DEBUG) {
+ Slog.v(TAG, this + " size=[" + mSizeMin + "-" + mSizeMax + "] hold=" + mHold
+ + (mVertical ? " vertical" : " horizontal"));
+ }
+ setFlashOnTouchCapture(res.getBoolean(R.bool.config_dead_zone_flash));
}
// I made you a touch event...
- @Override
public boolean onTouchEvent(MotionEvent event) {
if (DEBUG) {
Slog.v(TAG, this + " onTouch: " + MotionEvent.actionToString(event.getAction()));
@@ -143,7 +140,7 @@
final boolean consumeEvent;
if (mVertical) {
if (mDisplayRotation == Surface.ROTATION_270) {
- consumeEvent = event.getX() > getWidth() - size;
+ consumeEvent = event.getX() > mNavigationBarView.getWidth() - size;
} else {
consumeEvent = event.getX() < size;
}
@@ -155,8 +152,8 @@
Slog.v(TAG, "consuming errant click: (" + event.getX() + "," + event.getY() + ")");
}
if (mShouldFlash) {
- post(mDebugFlash);
- postInvalidate();
+ mNavigationBarView.post(mDebugFlash);
+ mNavigationBarView.postInvalidate();
}
return true; // ...but I eated it
}
@@ -168,19 +165,18 @@
mLastPokeTime = event.getEventTime();
if (DEBUG)
Slog.v(TAG, "poked! size=" + getSize(mLastPokeTime));
- if (mShouldFlash) postInvalidate();
+ if (mShouldFlash) mNavigationBarView.postInvalidate();
}
public void setFlash(float f) {
mFlashFrac = f;
- postInvalidate();
+ mNavigationBarView.postInvalidate();
}
public float getFlash() {
return mFlashFrac;
}
- @Override
public void onDraw(Canvas can) {
if (!mShouldFlash || mFlashFrac <= 0f) {
return;
@@ -202,10 +198,6 @@
if (DEBUG && size > mSizeMin)
// crazy aggressive redrawing here, for debugging only
- postInvalidateDelayed(100);
- }
-
- public void setDisplayRotation(int rotation) {
- mDisplayRotation = rotation;
+ mNavigationBarView.postInvalidateDelayed(100);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
index cc7943b..8e32a0b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
@@ -26,9 +26,12 @@
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.SystemProperties;
import android.view.DisplayListCanvas;
import android.view.RenderNodeAnimator;
import android.view.View;
+import android.view.ViewConfiguration;
import android.view.animation.Interpolator;
import com.android.systemui.Interpolators;
@@ -56,14 +59,17 @@
private float mGlowAlpha = 0f;
private float mGlowScale = 1f;
private boolean mPressed;
+ private boolean mVisible;
private boolean mDrawingHardwareGlow;
private int mMaxWidth;
private boolean mLastDark;
private boolean mDark;
+ private boolean mDelayTouchFeedback;
private final Interpolator mInterpolator = new LogInterpolator();
private boolean mSupportHardware;
private final View mTargetView;
+ private final Handler mHandler = new Handler();
private final HashSet<Animator> mRunningAnimations = new HashSet<>();
private final ArrayList<Animator> mTmpArray = new ArrayList<>();
@@ -77,6 +83,10 @@
mDark = darkIntensity >= 0.5f;
}
+ public void setDelayTouchFeedback(boolean delay) {
+ mDelayTouchFeedback = delay;
+ }
+
private Paint getRipplePaint() {
if (mRipplePaint == null) {
mRipplePaint = new Paint();
@@ -211,7 +221,16 @@
}
}
+ /**
+ * Abort the ripple while it is delayed and before shown used only when setShouldDelayStartTouch
+ * is enabled.
+ */
+ public void abortDelayedRipple() {
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
private void cancelAnimations() {
+ mVisible = false;
mTmpArray.addAll(mRunningAnimations);
int size = mTmpArray.size();
for (int i = 0; i < size; i++) {
@@ -220,11 +239,21 @@
}
mTmpArray.clear();
mRunningAnimations.clear();
+ mHandler.removeCallbacksAndMessages(null);
}
private void setPressedSoftware(boolean pressed) {
if (pressed) {
- enterSoftware();
+ if (mDelayTouchFeedback) {
+ if (mRunningAnimations.isEmpty()) {
+ mHandler.removeCallbacksAndMessages(null);
+ mHandler.postDelayed(this::enterSoftware, ViewConfiguration.getTapTimeout());
+ } else if (mVisible) {
+ enterSoftware();
+ }
+ } else {
+ enterSoftware();
+ }
} else {
exitSoftware();
}
@@ -232,6 +261,7 @@
private void enterSoftware() {
cancelAnimations();
+ mVisible = true;
mGlowAlpha = getMaxGlowAlpha();
ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(this, "glowScale",
0f, GLOW_MAX_SCALE_FACTOR);
@@ -240,6 +270,12 @@
scaleAnimator.addListener(mAnimatorListener);
scaleAnimator.start();
mRunningAnimations.add(scaleAnimator);
+
+ // With the delay, it could eventually animate the enter animation with no pressed state,
+ // then immediately show the exit animation. If this is skipped there will be no ripple.
+ if (mDelayTouchFeedback && !mPressed) {
+ exitSoftware();
+ }
}
private void exitSoftware() {
@@ -253,7 +289,16 @@
private void setPressedHardware(boolean pressed) {
if (pressed) {
- enterHardware();
+ if (mDelayTouchFeedback) {
+ if (mRunningAnimations.isEmpty()) {
+ mHandler.removeCallbacksAndMessages(null);
+ mHandler.postDelayed(this::enterHardware, ViewConfiguration.getTapTimeout());
+ } else if (mVisible) {
+ enterHardware();
+ }
+ } else {
+ enterHardware();
+ }
} else {
exitHardware();
}
@@ -302,6 +347,7 @@
private void enterHardware() {
cancelAnimations();
+ mVisible = true;
mDrawingHardwareGlow = true;
setExtendStart(CanvasProperty.createFloat(getExtendSize() / 2));
final RenderNodeAnimator startAnim = new RenderNodeAnimator(getExtendStart(),
@@ -343,6 +389,12 @@
mRunningAnimations.add(endAnim);
invalidateSelf();
+
+ // With the delay, it could eventually animate the enter animation with no pressed state,
+ // then immediately show the exit animation. If this is skipped there will be no ripple.
+ if (mDelayTouchFeedback && !mPressed) {
+ exitHardware();
+ }
}
private void exitHardware() {
@@ -366,6 +418,7 @@
public void onAnimationEnd(Animator animation) {
mRunningAnimations.remove(animation);
if (mRunningAnimations.isEmpty() && !mPressed) {
+ mVisible = false;
mDrawingHardwareGlow = false;
invalidateSelf();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index e5fefd3..44c2757 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -65,7 +65,6 @@
private int mTouchSlop;
private int mTouchDownX;
private int mTouchDownY;
- private boolean mIsPressed;
private boolean mSupportsLongpress = true;
private AudioManager mAudioManager;
private boolean mGestureAborted;
@@ -78,7 +77,7 @@
private final Runnable mCheckLongPress = new Runnable() {
public void run() {
- if (mIsPressed) {
+ if (isPressed()) {
// Log.d("KeyButtonView", "longpressed: " + this);
if (isLongClickable()) {
// Just an old-fashioned ImageView
@@ -89,12 +88,6 @@
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
mLongClicked = true;
}
-
- // Only when quick step is enabled, ripple will not be shown on touch down, then
- // show the ripple on touch up or on long press
- if (mLongClicked && mOverviewProxyService.getProxy() != null) {
- setPressed(true);
- }
}
}
};
@@ -207,16 +200,14 @@
}
public boolean onTouchEvent(MotionEvent ev) {
- final boolean isProxyConnected = mOverviewProxyService.getProxy() != null;
+ final boolean showSwipeUI = mOverviewProxyService.shouldShowSwipeUpUI();
final int action = ev.getAction();
int x, y;
if (action == MotionEvent.ACTION_DOWN) {
mGestureAborted = false;
}
if (mGestureAborted) {
- if (mIsPressed) {
- setPressed(false);
- }
+ setPressed(false);
return false;
}
@@ -224,6 +215,7 @@
case MotionEvent.ACTION_DOWN:
mDownTime = SystemClock.uptimeMillis();
mLongClicked = false;
+ setPressed(true);
// Use raw X and Y to detect gestures in case a parent changes the x and y values
mTouchDownX = (int) ev.getRawX();
@@ -234,10 +226,8 @@
// Provide the same haptic feedback that the system offers for virtual keys.
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
- mIsPressed = true;
- if (!isProxyConnected) {
+ if (!showSwipeUI) {
playSoundEffect(SoundEffectConstants.CLICK);
- setPressed(mIsPressed);
}
removeCallbacks(mCheckLongPress);
postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout());
@@ -250,10 +240,7 @@
if (exceededTouchSlopX || exceededTouchSlopY) {
// When quick step is enabled, prevent animating the ripple triggered by
// setPressed and decide to run it on touch up
- mIsPressed = false;
- if (!isProxyConnected) {
- setPressed(mIsPressed);
- }
+ setPressed(false);
removeCallbacks(mCheckLongPress);
}
break;
@@ -265,12 +252,11 @@
removeCallbacks(mCheckLongPress);
break;
case MotionEvent.ACTION_UP:
- final boolean doIt = mIsPressed && !mLongClicked;
+ final boolean doIt = isPressed() && !mLongClicked;
+ setPressed(false);
final boolean doHapticFeedback = (SystemClock.uptimeMillis() - mDownTime) > 150;
- if (isProxyConnected) {
+ if (showSwipeUI) {
if (doIt) {
- // Animate the ripple in on touch up with setPressed and then out later
- setPressed(true);
if (doHapticFeedback) {
mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
}
@@ -281,7 +267,6 @@
// and it feels weird to sometimes get a release haptic and other times not.
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
}
- setPressed(false);
if (mCode != 0) {
if (doIt) {
// If there was a pending remote recents animation, then we need to
@@ -311,12 +296,6 @@
mAudioManager.playSoundEffect(soundConstant, ActivityManager.getCurrentUser());
}
- @Override
- public void setPressed(boolean pressed) {
- mIsPressed = pressed;
- super.setPressed(pressed);
- }
-
public void sendEvent(int action, int flags) {
sendEvent(action, flags, SystemClock.uptimeMillis());
}
@@ -339,6 +318,7 @@
@Override
public void abortCurrentGesture() {
setPressed(false);
+ mRipple.abortDelayedRipple();
mGestureAborted = true;
}
@@ -357,6 +337,7 @@
@Override
public void setDelayTouchFeedback(boolean shouldDelay) {
+ mRipple.setDelayTouchFeedback(shouldDelay);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 76e3ad7..51fef7d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -47,7 +47,8 @@
public interface SignalCallback {
default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
- boolean activityIn, boolean activityOut, String description, boolean isTransient) {}
+ boolean activityIn, boolean activityOut, String description, boolean isTransient,
+ String statusLabel) {}
default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 4533aa5..4c100cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -54,6 +54,7 @@
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
+import com.android.systemui.statusbar.policy.MobileSignalController.MobileState;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -848,6 +849,11 @@
subs.add(addSignalController(i, i));
}
mCallbackHandler.setSubs(subs);
+ for (int i = 0; i < mMobileSignalControllers.size(); i++) {
+ int key = mMobileSignalControllers.keyAt(i);
+ MobileSignalController controller = mMobileSignalControllers.get(key);
+ controller.notifyListeners();
+ }
}
}
String nosim = args.getString("nosim");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
index 0616ffc..4d33dec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.policy;
import android.annotation.ColorInt;
+import android.graphics.Color;
import android.graphics.drawable.Drawable;
import com.android.internal.graphics.ColorUtils;
@@ -49,16 +50,21 @@
public void setDarkIntensity(float intensity) {
// Duplicate intensity scaling from KeyButtonDrawable
mDarkIntensity = intensity;
- int intermediateColor = ColorUtils.compositeColors(
- setAlphaFloat(mDarkColor, intensity),
- setAlphaFloat(mLightColor,1f - intensity));
+
+ // Dark and light colors may have an alpha component
+ final int intermediateColor = ColorUtils.compositeColors(
+ blendAlpha(mDarkColor, intensity),
+ blendAlpha(mLightColor, (1f - intensity)));
+
getDrawable(0).setTint(intermediateColor);
invalidateSelf();
}
- private int setAlphaFloat(int color, float alpha) {
+ private int blendAlpha(int color, float alpha) {
+ final float newAlpha = alpha < 0f ? 0f : (alpha > 1f ? 1f : alpha);
+ final float colorAlpha = Color.alpha(color) / 255f;
+ final int alphaInt = (int) (255 * newAlpha * colorAlpha); // Blend by multiplying
// Ensure alpha is clamped [0-255] or ColorUtils will crash
- final int alphaInt = alpha > 1f ? 255 : (alpha < 0f ? 0 : ((int) alpha*255));
return ColorUtils.setAlphaComponent(color, alphaInt);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index 0f65421..e5e576d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -17,12 +17,15 @@
import android.content.Context;
import android.content.Intent;
+import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
+import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -37,7 +40,6 @@
public class WifiSignalController extends
SignalController<WifiSignalController.WifiState, SignalController.IconGroup> {
- private final WifiManager mWifiManager;
private final AsyncChannel mWifiChannel;
private final boolean mHasMobileData;
private final WifiStatusTracker mWifiTracker;
@@ -47,12 +49,17 @@
WifiManager wifiManager) {
super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
callbackHandler, networkController);
- mWifiManager = wifiManager;
- mWifiTracker = new WifiStatusTracker(mWifiManager);
+ NetworkScoreManager networkScoreManager =
+ context.getSystemService(NetworkScoreManager.class);
+ ConnectivityManager connectivityManager =
+ context.getSystemService(ConnectivityManager.class);
+ mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
+ connectivityManager, this::handleStatusUpdated);
+ mWifiTracker.setListening(true);
mHasMobileData = hasMobileData;
Handler handler = new WifiHandler(Looper.getMainLooper());
mWifiChannel = new AsyncChannel();
- Messenger wifiMessenger = mWifiManager.getWifiServiceMessenger();
+ Messenger wifiMessenger = wifiManager.getWifiServiceMessenger();
if (wifiMessenger != null) {
mWifiChannel.connect(context, handler, wifiMessenger);
}
@@ -68,7 +75,6 @@
WifiIcons.QS_WIFI_NO_NETWORK,
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
-
}
@Override
@@ -87,13 +93,12 @@
if (mCurrentState.inetCondition == 0) {
contentDescription += ("," + mContext.getString(R.string.data_connection_no_internet));
}
-
IconState statusIcon = new IconState(wifiVisible, getCurrentIconId(), contentDescription);
IconState qsIcon = new IconState(mCurrentState.connected, getQsCurrentIconId(),
contentDescription);
callback.setWifiIndicators(mCurrentState.enabled, statusIcon, qsIcon,
ssidPresent && mCurrentState.activityIn, ssidPresent && mCurrentState.activityOut,
- wifiDesc, mCurrentState.isTransient);
+ wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel);
}
/**
@@ -106,6 +111,12 @@
mCurrentState.ssid = mWifiTracker.ssid;
mCurrentState.rssi = mWifiTracker.rssi;
mCurrentState.level = mWifiTracker.level;
+ mCurrentState.statusLabel = mWifiTracker.statusLabel;
+ notifyListenersIfNecessary();
+ }
+
+ private void handleStatusUpdated() {
+ mCurrentState.statusLabel = mWifiTracker.statusLabel;
notifyListenersIfNecessary();
}
@@ -150,6 +161,7 @@
static class WifiState extends SignalController.State {
String ssid;
boolean isTransient;
+ String statusLabel;
@Override
public void copyFrom(State s) {
@@ -157,20 +169,26 @@
WifiState state = (WifiState) s;
ssid = state.ssid;
isTransient = state.isTransient;
+ statusLabel = state.statusLabel;
}
@Override
protected void toString(StringBuilder builder) {
super.toString(builder);
- builder.append(',').append("ssid=").append(ssid);
- builder.append(',').append("isTransient=").append(isTransient);
+ builder.append(",ssid=").append(ssid)
+ .append(",isTransient=").append(isTransient)
+ .append(",statusLabel=").append(statusLabel);
}
@Override
public boolean equals(Object o) {
- return super.equals(o)
- && Objects.equals(((WifiState) o).ssid, ssid)
- && (((WifiState) o).isTransient == isTransient);
+ if (!super.equals(o)) {
+ return false;
+ }
+ WifiState other = (WifiState) o;
+ return Objects.equals(other.ssid, ssid)
+ && other.isTransient == isTransient
+ && TextUtils.equals(other.statusLabel, statusLabel);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index dc94203..375e860 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -16,7 +16,8 @@
package com.android.systemui.statusbar.stack;
-import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
+import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator
+ .ExpandAnimationParameters;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -43,6 +44,7 @@
import android.service.notification.StatusBarNotification;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
+import android.support.v4.graphics.ColorUtils;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Log;
@@ -68,6 +70,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
import com.android.systemui.ExpandHelper;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -77,10 +80,11 @@
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.statusbar.ActivatableNotificationView;
-import com.android.systemui.statusbar.DismissView;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
+import com.android.systemui.statusbar.FooterView;
+import com.android.systemui.statusbar.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationGuts;
import com.android.systemui.statusbar.NotificationListContainer;
@@ -99,8 +103,6 @@
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.ScrollAdapter;
-import android.support.v4.graphics.ColorUtils;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -109,7 +111,6 @@
import java.util.HashSet;
import java.util.List;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
/**
* A layout which handles a dynamic amount of notifications and presents them in a scrollable stack.
@@ -226,7 +227,7 @@
private boolean mExpandingNotification;
private boolean mExpandedInThisMotion;
protected boolean mScrollingEnabled;
- protected DismissView mDismissView;
+ protected FooterView mFooterView;
protected EmptyShadeView mEmptyShadeView;
private boolean mDismissAllInProgress;
private boolean mFadeNotificationsOnDismiss;
@@ -449,6 +450,13 @@
mRoundnessManager.setOnRoundingChangedCallback(this::invalidate);
addOnExpandedHeightListener(mRoundnessManager::setExpanded);
+ // Blocking helper manager wants to know the expanded state, update as well.
+ NotificationBlockingHelperManager blockingHelperManager =
+ Dependency.get(NotificationBlockingHelperManager.class);
+ addOnExpandedHeightListener((height, unused) -> {
+ blockingHelperManager.setNotificationShadeExpanded(height);
+ });
+
updateWillNotDraw();
mBackgroundPaint.setAntiAlias(true);
if (DEBUG) {
@@ -1039,45 +1047,63 @@
mQsContainer = qsContainer;
}
+ /**
+ * Handles cleanup after the given {@code view} has been fully swiped out (including
+ * re-invoking dismiss logic in case the notification has not made its way out yet).
+ */
@Override
- public void onChildDismissed(View v) {
- ExpandableNotificationRow row = (ExpandableNotificationRow) v;
+ public void onChildDismissed(View view) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) view;
if (!row.isDismissed()) {
- handleChildDismissed(v);
+ handleChildViewDismissed(view);
}
ViewGroup transientContainer = row.getTransientContainer();
if (transientContainer != null) {
- transientContainer.removeTransientView(v);
+ transientContainer.removeTransientView(view);
}
}
- private void handleChildDismissed(View v) {
+ /**
+ * Starts up notification dismiss and tells the notification, if any, to remove itself from
+ * layout.
+ *
+ * @param view view (e.g. notification) to dismiss from the layout
+ */
+ private void handleChildViewDismissed(View view) {
if (mDismissAllInProgress) {
return;
}
+
+ boolean isBlockingHelperShown = false;
+
setSwipingInProgress(false);
- if (mDragAnimPendingChildren.contains(v)) {
- // We start the swipe and finish it in the same frame, we don't want any animation
- // for the drag
- mDragAnimPendingChildren.remove(v);
+ if (mDragAnimPendingChildren.contains(view)) {
+ // We start the swipe and finish it in the same frame; we don't want a drag animation.
+ mDragAnimPendingChildren.remove(view);
}
- mSwipedOutViews.add(v);
- mAmbientState.onDragFinished(v);
+ mAmbientState.onDragFinished(view);
updateContinuousShadowDrawing();
- if (v instanceof ExpandableNotificationRow) {
- ExpandableNotificationRow row = (ExpandableNotificationRow) v;
+
+ if (view instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) view;
if (row.isHeadsUp()) {
mHeadsUpManager.addSwipedOutNotification(row.getStatusBarNotification().getKey());
}
- }
- if (v instanceof ExpandableNotificationRow) {
- ((ExpandableNotificationRow) v).performDismiss(false /* fromAccessibility */);
+ isBlockingHelperShown =
+ row.performDismissWithBlockingHelper(false /* fromAccessibility */);
}
+ if (!isBlockingHelperShown) {
+ mSwipedOutViews.add(view);
+ }
mFalsingManager.onNotificationDismissed();
if (mFalsingManager.shouldEnforceBouncer()) {
- mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
- false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */);
+ mStatusBar.executeRunnableDismissingKeyguard(
+ null,
+ null /* cancelAction */,
+ false /* dismissShade */,
+ true /* afterKeyguardGone */,
+ false /* deferred */);
}
}
@@ -2730,9 +2756,8 @@
updateScrollStateForRemovedChild(expandableView);
boolean animationGenerated = generateRemoveAnimation(child);
if (animationGenerated) {
- if (!mSwipedOutViews.contains(child)) {
- container.getOverlay().add(child);
- } else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) {
+ if (!mSwipedOutViews.contains(child)
+ || Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) {
container.addTransientView(child, 0);
expandableView.setTransientContainer(container);
}
@@ -3838,13 +3863,13 @@
Context context = new ContextThemeWrapper(mContext,
lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI);
final int textColor = Utils.getColorAttr(context, R.attr.wallpaperTextColor);
- mDismissView.setTextColor(textColor);
+ mFooterView.setTextColor(textColor);
mEmptyShadeView.setTextColor(textColor);
}
public void goToFullShade(long delay) {
- if (mDismissView != null) {
- mDismissView.setInvisible();
+ if (mFooterView != null) {
+ mFooterView.setInvisible();
}
mEmptyShadeView.setInvisible();
mGoToFullShadeNeedsAnimation = true;
@@ -3967,14 +3992,14 @@
return -1;
}
- public void setDismissView(@NonNull DismissView dismissView) {
+ public void setFooterView(@NonNull FooterView footerView) {
int index = -1;
- if (mDismissView != null) {
- index = indexOfChild(mDismissView);
- removeView(mDismissView);
+ if (mFooterView != null) {
+ index = indexOfChild(mFooterView);
+ removeView(mFooterView);
}
- mDismissView = dismissView;
- addView(mDismissView, index);
+ mFooterView = footerView;
+ addView(mFooterView, index);
}
public void setEmptyShadeView(EmptyShadeView emptyShadeView) {
@@ -3992,77 +4017,64 @@
int newVisibility = visible ? VISIBLE : GONE;
if (oldVisibility != newVisibility) {
if (newVisibility != GONE) {
- if (mEmptyShadeView.willBeGone()) {
- mEmptyShadeView.cancelAnimation();
- } else {
- mEmptyShadeView.setInvisible();
- }
if (mStatusBar.areNotificationsHidden()) {
mEmptyShadeView.setText(R.string.dnd_suppressing_shade_text);
} else {
mEmptyShadeView.setText(R.string.empty_shade_text);
}
- mEmptyShadeView.setVisibility(newVisibility);
- mEmptyShadeView.setWillBeGone(false);
- updateContentHeight();
- notifyHeightChangeListener(mEmptyShadeView);
+ showFooterView(mEmptyShadeView);
} else {
- Runnable onFinishedRunnable = new Runnable() {
- @Override
- public void run() {
- mEmptyShadeView.setVisibility(GONE);
- mEmptyShadeView.setWillBeGone(false);
- updateContentHeight();
- notifyHeightChangeListener(mEmptyShadeView);
- }
- };
- if (mAnimationsEnabled && mIsExpanded) {
- mEmptyShadeView.setWillBeGone(true);
- mEmptyShadeView.performVisibilityAnimation(false, onFinishedRunnable);
- } else {
- mEmptyShadeView.setInvisible();
- onFinishedRunnable.run();
- }
+ hideFooterView(mEmptyShadeView, true);
}
}
}
- public void updateDismissView(boolean visible) {
- if (mDismissView == null) {
+ public void updateFooterView(boolean visible, boolean showDismissView) {
+ if (mFooterView == null) {
return;
}
-
- int oldVisibility = mDismissView.willBeGone() ? GONE : mDismissView.getVisibility();
+ int oldVisibility = mFooterView.willBeGone() ? GONE : mFooterView.getVisibility();
int newVisibility = visible ? VISIBLE : GONE;
if (oldVisibility != newVisibility) {
if (newVisibility != GONE) {
- if (mDismissView.willBeGone()) {
- mDismissView.cancelAnimation();
- } else {
- mDismissView.setInvisible();
- }
- mDismissView.setVisibility(newVisibility);
- mDismissView.setWillBeGone(false);
- updateContentHeight();
- notifyHeightChangeListener(mDismissView);
+ showFooterView(mFooterView);
} else {
- Runnable dimissHideFinishRunnable = new Runnable() {
- @Override
- public void run() {
- mDismissView.setVisibility(GONE);
- mDismissView.setWillBeGone(false);
- updateContentHeight();
- notifyHeightChangeListener(mDismissView);
- }
- };
- if (mDismissView.isButtonVisible() && mIsExpanded && mAnimationsEnabled) {
- mDismissView.setWillBeGone(true);
- mDismissView.performVisibilityAnimation(false, dimissHideFinishRunnable);
- } else {
- dimissHideFinishRunnable.run();
- }
+ hideFooterView(mFooterView, mFooterView.isButtonVisible());
}
}
+ if (mFooterView.isSecondaryVisible() != showDismissView) {
+ mFooterView.performSecondaryVisibilityAnimation(showDismissView);
+ }
+ }
+
+ private void showFooterView(StackScrollerDecorView footerView) {
+ if (footerView.willBeGone()) {
+ footerView.cancelAnimation();
+ } else {
+ footerView.setInvisible();
+ }
+ footerView.setVisibility(VISIBLE);
+ footerView.setWillBeGone(false);
+ updateContentHeight();
+ notifyHeightChangeListener(footerView);
+ }
+
+ private void hideFooterView(StackScrollerDecorView footerView, boolean isButtonVisible) {
+ Runnable onHideFinishRunnable = new Runnable() {
+ @Override
+ public void run() {
+ footerView.setVisibility(GONE);
+ footerView.setWillBeGone(false);
+ updateContentHeight();
+ notifyHeightChangeListener(footerView);
+ }
+ };
+ if (isButtonVisible && mIsExpanded && mAnimationsEnabled) {
+ footerView.setWillBeGone(true);
+ footerView.performVisibilityAnimation(false, onHideFinishRunnable);
+ } else {
+ onHideFinishRunnable.run();
+ }
}
public void setDismissAllInProgress(boolean dismissAllInProgress) {
@@ -4088,18 +4100,18 @@
}
}
- public boolean isDismissViewNotGone() {
- return mDismissView != null
- && mDismissView.getVisibility() != View.GONE
- && !mDismissView.willBeGone();
+ public boolean isFooterViewNotGone() {
+ return mFooterView != null
+ && mFooterView.getVisibility() != View.GONE
+ && !mFooterView.willBeGone();
}
- public boolean isDismissViewVisible() {
- return mDismissView != null && mDismissView.isVisible();
+ public boolean isFooterViewVisible() {
+ return mFooterView != null && mFooterView.isVisible();
}
- public int getDismissViewHeight() {
- return mDismissView == null ? 0 : mDismissView.getHeight() + mPaddingBetweenElements;
+ public int getFooterViewHeight() {
+ return mFooterView == null ? 0 : mFooterView.getHeight() + mPaddingBetweenElements;
}
public int getEmptyShadeViewHeight() {
@@ -4155,8 +4167,8 @@
}
boolean belowChild = touchY > childTop + child.getActualHeight()
- child.getClipBottomAmount();
- if (child == mDismissView) {
- if(!belowChild && !mDismissView.isOnEmptySpace(touchX - mDismissView.getX(),
+ if (child == mFooterView) {
+ if(!belowChild && !mFooterView.isOnEmptySpace(touchX - mFooterView.getX(),
touchY - childTop)) {
// We clicked on the dismiss button
return false;
@@ -4632,7 +4644,7 @@
if (mIsExpanded) {
// We don't want to quick-dismiss when it's a heads up as this might lead to closing
// of the panel early.
- handleChildDismissed(view);
+ handleChildViewDismissed(view);
}
mStatusBar.getGutsManager().closeAndSaveGuts(true /* removeLeavebehind */,
false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index 7c8e0fc..a8d2d98 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -22,10 +22,10 @@
import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.R;
-import com.android.systemui.statusbar.DismissView;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
+import com.android.systemui.statusbar.FooterView;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.NotificationUtils;
@@ -390,7 +390,7 @@
int paddingAfterChild = getPaddingAfterChild(algorithmState, child);
int childHeight = getMaxAllowedChildHeight(child);
childViewState.yTranslation = currentYPosition;
- boolean isDismissView = child instanceof DismissView;
+ boolean isFooterView = child instanceof FooterView;
boolean isEmptyShadeView = child instanceof EmptyShadeView;
childViewState.location = ExpandableViewState.LOCATION_MAIN_AREA;
@@ -404,7 +404,7 @@
float end = childViewState.yTranslation + childViewState.height + inset;
childViewState.headsUpIsVisible = end < ambientState.getMaxHeadsUpTranslation();
}
- if (isDismissView) {
+ if (isFooterView) {
childViewState.yTranslation = Math.min(childViewState.yTranslation,
ambientState.getInnerHeight() - childHeight);
} else if (isEmptyShadeView) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index d48ae76..c80bdc6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -51,6 +51,7 @@
= (int) (ANIMATION_DURATION_HEADS_UP_APPEAR
* HeadsUpAppearInterpolator.getFractionUntilOvershoot());
public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 300;
+ public static final int ANIMATION_DURATION_BLOCKING_HELPER_FADE = 240;
public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80;
public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32;
public static final int ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE = 48;
@@ -79,6 +80,7 @@
private ValueAnimator mBottomOverScrollAnimator;
private int mHeadsUpAppearHeightBottom;
private boolean mShadeExpanded;
+ private ArrayList<ExpandableView> mTransientViewsToRemove = new ArrayList<>();
private NotificationShelf mShelf;
private float mStatusBarIconLocation;
private int[] mTmpLocation = new int[2];
@@ -333,6 +335,12 @@
private void onAnimationFinished() {
mHostLayout.onChildAnimationFinished();
+
+ for (ExpandableView transientViewsToRemove : mTransientViewsToRemove) {
+ transientViewsToRemove.getTransientContainer()
+ .removeTransientView(transientViewsToRemove);
+ }
+ mTransientViewsToRemove.clear();
}
/**
@@ -362,7 +370,7 @@
} else if (event.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE) {
if (changingView.getVisibility() != View.VISIBLE) {
- removeFromOverlay(changingView);
+ removeTransientView(changingView);
continue;
}
@@ -402,8 +410,7 @@
0, new Runnable() {
@Override
public void run() {
- // remove the temporary overlay
- removeFromOverlay(changingView);
+ removeTransientView(changingView);
}
}, null);
} else if (event.animationType ==
@@ -494,6 +501,12 @@
}
}
+ private static void removeTransientView(ExpandableView viewToRemove) {
+ if (viewToRemove.getTransientContainer() != null) {
+ viewToRemove.getTransientContainer().removeTransientView(viewToRemove);
+ }
+ }
+
public static void removeFromOverlay(View changingView) {
ViewGroup parent = (ViewGroup) changingView.getParent();
if (parent != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index 7ffca173..d527465 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -323,10 +323,10 @@
if (notif != null) {
mNotificationManager.notifyAsUser(vol.getId(), SystemMessage.NOTE_STORAGE_PUBLIC,
- notif, UserHandle.ALL);
+ notif, UserHandle.of(vol.getMountUserId()));
} else {
mNotificationManager.cancelAsUser(vol.getId(), SystemMessage.NOTE_STORAGE_PUBLIC,
- UserHandle.ALL);
+ UserHandle.of(vol.getMountUserId()));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index fc932c3..7a9cdfd 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -37,9 +37,9 @@
public static String STORAGE = "DSK";
public static String TVPIP = "TPP";
public static String BATTERY = "BAT";
+ public static String HINTS = "HNT";
- @VisibleForTesting
- static void createAll(Context context) {
+ public static void createAll(Context context) {
final NotificationManager nm = context.getSystemService(NotificationManager.class);
final NotificationChannel batteryChannel = new NotificationChannel(BATTERY,
context.getString(R.string.notification_channel_battery),
@@ -73,6 +73,12 @@
: NotificationManager.IMPORTANCE_LOW);
storage.setBypassDnd(true);
+ final NotificationChannel hint = new NotificationChannel(
+ HINTS,
+ context.getString(R.string.notification_channel_hints),
+ NotificationManager.IMPORTANCE_DEFAULT);
+ // No need to bypass DND.
+
nm.createNotificationChannels(Arrays.asList(
alerts,
general,
@@ -80,7 +86,8 @@
createScreenshotChannel(
context.getString(R.string.notification_channel_screenshot),
nm.getNotificationChannel(SCREENSHOTS_LEGACY)),
- batteryChannel
+ batteryChannel,
+ hint
));
// Delete older SS channel if present.
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
index ee6748e..a97effd 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
@@ -16,6 +16,8 @@
package com.android.systemui.volume;
+import static android.media.AudioManager.RINGER_MODE_NORMAL;
+
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -29,6 +31,7 @@
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioSystem;
+import android.media.IAudioService;
import android.media.IVolumeController;
import android.media.VolumePolicy;
import android.media.session.MediaController.PlaybackInfo;
@@ -39,6 +42,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
@@ -73,9 +77,11 @@
public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpable {
private static final String TAG = Util.logTag(VolumeDialogControllerImpl.class);
+
+ private static final int TOUCH_FEEDBACK_TIMEOUT_MS = 1000;
private static final int DYNAMIC_STREAM_START_INDEX = 100;
private static final int VIBRATE_HINT_DURATION = 50;
- private static final AudioAttributes SONFICIATION_VIBRATION_ATTRIBUTES =
+ private static final AudioAttributes SONIFICIATION_VIBRATION_ATTRIBUTES =
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
@@ -100,6 +106,7 @@
private final W mWorker;
private final Context mContext;
private AudioManager mAudio;
+ private IAudioService mAudioService;
protected StatusBar mStatusBar;
private final NotificationManager mNoMan;
private final SettingObserver mObserver;
@@ -113,6 +120,7 @@
private boolean mShowA11yStream;
private boolean mShowVolumeDialog;
private boolean mShowSafetyWarning;
+ private long mLastToggledRingerOn;
private final NotificationManager mNotificationManager;
private boolean mDestroyed;
@@ -140,6 +148,8 @@
mReceiver.init();
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
mHasVibrator = mVibrator != null && mVibrator.hasVibrator();
+ mAudioService = IAudioService.Stub.asInterface(
+ ServiceManager.getService(Context.AUDIO_SERVICE));
updateStatusBar();
boolean accessibilityVolumeStreamActive = context.getSystemService(
@@ -300,10 +310,24 @@
mShowSafetyWarning = safetyWarning;
}
- public void vibrate() {
+ @Override
+ public void scheduleTouchFeedback() {
+ mLastToggledRingerOn = System.currentTimeMillis();
+ }
+
+ private void playTouchFeedback() {
+ if (System.currentTimeMillis() - mLastToggledRingerOn < TOUCH_FEEDBACK_TIMEOUT_MS) {
+ try {
+ mAudioService.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
+ } catch (RemoteException e) {
+ // ignore
+ }
+ }
+ }
+
+ public void vibrate(VibrationEffect effect) {
if (mHasVibrator) {
- mVibrator.vibrate(VibrationEffect.createOneShot(VIBRATE_HINT_DURATION,
- VibrationEffect.DEFAULT_AMPLITUDE), SONFICIATION_VIBRATION_ATTRIBUTES);
+ mVibrator.vibrate(effect, SONIFICIATION_VIBRATION_ATTRIBUTES);
}
}
@@ -425,7 +449,7 @@
for (int stream : STREAMS.keySet()) {
updateStreamLevelW(stream, getAudioManagerStreamVolume(stream));
streamStateW(stream).levelMin = getAudioManagerStreamMinVolume(stream);
- streamStateW(stream).levelMax = getAudioManagerStreamMaxVolume(stream);
+ streamStateW(stream).levelMax = Math.max(1, getAudioManagerStreamMaxVolume(stream));
updateStreamMuteW(stream, mAudio.isStreamMute(stream));
final StreamState ss = streamStateW(stream);
ss.muteSupported = mAudio.isStreamAffectedByMute(stream);
@@ -556,6 +580,11 @@
if (rm == mState.ringerModeInternal) return false;
mState.ringerModeInternal = rm;
Events.writeEvent(mContext, Events.EVENT_INTERNAL_RINGER_MODE_CHANGED, rm);
+
+ if (mState.ringerModeInternal == RINGER_MODE_NORMAL) {
+ playTouchFeedback();
+ }
+
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 1c8a26c..6f71e55 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -18,11 +18,14 @@
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC;
-import static android.media.AudioManager.RINGER_MODE_MAX;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
import static android.media.AudioManager.STREAM_ACCESSIBILITY;
+import static android.media.AudioManager.STREAM_ALARM;
+import static android.media.AudioManager.STREAM_MUSIC;
+import static android.media.AudioManager.STREAM_RING;
+import static android.media.AudioManager.STREAM_VOICE_CALL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
@@ -37,17 +40,22 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioSystem;
+import android.media.MediaPlayer;
import android.os.Debug;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.text.InputFilter;
@@ -61,6 +69,7 @@
import android.view.View.AccessibilityDelegate;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
import android.view.Window;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
@@ -125,6 +134,7 @@
private final Accessibility mAccessibility = new Accessibility();
private final ColorStateList mActiveSliderTint;
private final ColorStateList mInactiveSliderTint;
+ private final Vibrator mVibrator;
private boolean mShowing;
private boolean mShowA11yStream;
@@ -145,6 +155,7 @@
mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext));
mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
+ mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
}
public void init(int windowType, Callback callback) {
@@ -193,7 +204,7 @@
mDialog.setCanceledOnTouchOutside(true);
mDialog.setContentView(R.layout.volume_dialog);
mDialog.setOnShowListener(dialog -> {
- mDialogView.setTranslationX(mDialogView.getWidth() / 2);
+ if (!isLandscape()) mDialogView.setTranslationX(mDialogView.getWidth() / 2);
mDialogView.setAlpha(0);
mDialogView.animate()
.alpha(1)
@@ -202,6 +213,9 @@
.setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
.withEndAction(() -> {
mWindow.getDecorView().requestAccessibilityFocus();
+ if (!Prefs.getBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true)) {
+ mRingerIcon.postOnAnimationDelayed(mSinglePress, 1500);
+ }
})
.start();
});
@@ -222,12 +236,16 @@
mSettingsIcon = mDialog.findViewById(R.id.settings);
if (mRows.isEmpty()) {
+ if (!AudioSystem.isSingleVolume(mContext)) {
+ addRow(STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility,
+ R.drawable.ic_volume_accessibility, true, false);
+ }
addRow(AudioManager.STREAM_MUSIC,
R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
if (!AudioSystem.isSingleVolume(mContext)) {
addRow(AudioManager.STREAM_RING,
R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);
- addRow(AudioManager.STREAM_ALARM,
+ addRow(STREAM_ALARM,
R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, true, false);
addRow(AudioManager.STREAM_VOICE_CALL,
R.drawable.ic_volume_voice, R.drawable.ic_volume_voice, false, false);
@@ -235,8 +253,6 @@
R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false, false);
addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system,
R.drawable.ic_volume_system_mute, false, false);
- addRow(STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility,
- R.drawable.ic_volume_accessibility, true, false);
}
} else {
addExistingRows();
@@ -255,6 +271,11 @@
return ColorStateList.valueOf(mContext.getColor(colorResId));
}
+ private boolean isLandscape() {
+ return mContext.getResources().getConfiguration().orientation ==
+ Configuration.ORIENTATION_LANDSCAPE;
+ }
+
public void setStreamImportant(int stream, boolean important) {
mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget();
}
@@ -281,11 +302,11 @@
if (D.BUG) Slog.d(TAG, "Adding row for stream " + stream);
VolumeRow row = new VolumeRow();
initRow(row, stream, iconRes, iconMuteRes, important, defaultStream);
- int rowSize;
- if (mShowA11yStream && dynamic && (rowSize = mRows.size()) > 1) {
- // A11y Stream should be the first in the list, so it's shown to start of other rows
- mDialogRowsView.addView(row.view, 0);
- mRows.add(rowSize - 2, row);
+ if (dynamic && mRows.size() > 2) {
+ // Dynamic Streams should be the first in the list, so they're shown to start of
+ // everything except a11y
+ mDialogRowsView.addView(row.view, 1);
+ mRows.add(1, row);
} else {
mDialogRowsView.addView(row.view);
mRows.add(row);
@@ -309,6 +330,11 @@
return row;
}
}
+ for (VolumeRow row : mRows) {
+ if (row.stream == STREAM_MUSIC) {
+ return row;
+ }
+ }
return mRows.get(0);
}
@@ -408,6 +434,7 @@
mRingerIcon.setOnClickListener(v -> {
Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, AudioManager.STREAM_RING,
mRingerIcon.getTag());
+ Prefs.putBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true);
final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
if (ss == null) {
return;
@@ -418,7 +445,6 @@
final boolean hasVibrator = mController.hasVibrator();
if (mState.ringerModeInternal == AudioManager.RINGER_MODE_NORMAL) {
if (hasVibrator) {
- mController.vibrate();
newRingerMode = AudioManager.RINGER_MODE_VIBRATE;
} else {
newRingerMode = AudioManager.RINGER_MODE_SILENT;
@@ -432,30 +458,56 @@
}
}
updateRingerH();
-
+ provideTouchFeedbackH(newRingerMode);
mController.setRingerMode(newRingerMode, false);
maybeShowToastH(newRingerMode);
});
updateRingerH();
}
+
+ private void provideTouchFeedbackH(int newRingerMode) {
+ VibrationEffect effect = null;
+ switch (newRingerMode) {
+ case RINGER_MODE_NORMAL:
+ mController.scheduleTouchFeedback();
+ break;
+ case RINGER_MODE_SILENT:
+ effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ break;
+ case RINGER_MODE_VIBRATE:
+ default:
+ effect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+ }
+ if (effect != null) {
+ mController.vibrate(effect);
+ }
+ }
+
private void maybeShowToastH(int newRingerMode) {
int seenToastCount = Prefs.getInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, 0);
if (seenToastCount > VolumePrefs.SHOW_RINGER_TOAST_COUNT) {
return;
}
- int toastText;
+ CharSequence toastText = null;
switch (newRingerMode) {
case RINGER_MODE_NORMAL:
- toastText = R.string.volume_dialog_ringer_guidance_ring;
+ final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
+ if (ss != null) {
+ toastText = mContext.getString(
+ R.string.volume_dialog_ringer_guidance_ring,
+ Utils.formatPercentage(ss.level, ss.levelMax));
+ }
break;
case RINGER_MODE_SILENT:
- toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_silent;
+ toastText = mContext.getString(
+ com.android.internal.R.string.volume_dialog_ringer_guidance_silent);
break;
case RINGER_MODE_VIBRATE:
default:
- toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_vibrate;
+ toastText = mContext.getString(
+ com.android.internal.R.string.volume_dialog_ringer_guidance_vibrate);
}
Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show();
@@ -510,16 +562,16 @@
mDialogView.setTranslationX(0);
mDialogView.setAlpha(1);
- mDialogView.animate()
+ ViewPropertyAnimator animator = mDialogView.animate()
.alpha(0)
- .translationX(mDialogView.getWidth() / 2)
.setDuration(250)
.setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
.withEndAction(() -> mHandler.postDelayed(() -> {
if (D.BUG) Log.d(TAG, "mDialog.dismiss()");
mDialog.dismiss();
- }, 50))
- .start();
+ }, 50));
+ if (!isLandscape()) animator.translationX(mDialogView.getWidth() / 2);
+ animator.start();
Events.writeEvent(mContext, Events.EVENT_DISMISS_DIALOG, reason);
mController.notifyVisible(false);
@@ -532,7 +584,7 @@
}
private boolean shouldBeVisibleH(VolumeRow row, VolumeRow activeRow) {
- boolean isActive = row == activeRow;
+ boolean isActive = row.stream == activeRow.stream;
if (row.stream == AudioSystem.STREAM_ACCESSIBILITY) {
return mShowA11yStream;
}
@@ -544,7 +596,18 @@
return true;
}
- return row.defaultStream || isActive;
+ if (isActive) {
+ return true;
+ }
+
+ if (row.defaultStream) {
+ return activeRow.stream == STREAM_RING
+ || activeRow.stream == STREAM_ALARM
+ || activeRow.stream == STREAM_VOICE_CALL
+ || activeRow.stream == STREAM_ACCESSIBILITY;
+ }
+
+ return false;
}
private void updateRowsH(final VolumeRow activeRow) {
@@ -570,7 +633,11 @@
return;
}
- enableRingerViewsH(mState.zenMode == Global.ZEN_MODE_OFF || !mState.disallowRinger);
+ boolean isZenMuted = mState.zenMode == Global.ZEN_MODE_ALARMS
+ || mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS
+ || (mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+ && mState.disallowRinger);
+ enableRingerViewsH(!isZenMuted);
switch (mState.ringerModeInternal) {
case AudioManager.RINGER_MODE_VIBRATE:
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate);
@@ -586,7 +653,7 @@
case AudioManager.RINGER_MODE_NORMAL:
default:
boolean muted = (mAutomute && ss.level == 0) || ss.muted;
- if (muted) {
+ if (!isZenMuted && muted) {
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
mRingerIcon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
@@ -660,7 +727,8 @@
if (mActiveStream != state.activeStream) {
mPrevActiveStream = mActiveStream;
mActiveStream = state.activeStream;
- updateRowsH(getActiveRow());
+ VolumeRow activeRow = getActiveRow();
+ updateRowsH(activeRow);
rescheduleTimeoutH();
}
for (VolumeRow row : mRows) {
@@ -686,7 +754,7 @@
final boolean isA11yStream = row.stream == STREAM_ACCESSIBILITY;
final boolean isRingStream = row.stream == AudioManager.STREAM_RING;
final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM;
- final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM;
+ final boolean isAlarmStream = row.stream == STREAM_ALARM;
final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC;
final boolean isRingVibrate = isRingStream
&& mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE;
@@ -911,6 +979,21 @@
}
}
+ private Runnable mSinglePress = new Runnable() {
+ @Override
+ public void run() {
+ mRingerIcon.setPressed(true);
+ mRingerIcon.postOnAnimationDelayed(mSingleUnpress, 200);
+ }
+ };
+
+ private Runnable mSingleUnpress = new Runnable() {
+ @Override
+ public void run() {
+ mRingerIcon.setPressed(false);
+ }
+ };
+
private final VolumeDialogController.Callbacks mControllerCallbackH
= new VolumeDialogController.Callbacks() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
index 173400f..434327c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
@@ -43,7 +43,7 @@
public static final String PREF_ADJUST_ALARMS = "pref_adjust_alarms";
public static final String PREF_ADJUST_NOTIFICATION = "pref_adjust_notification";
- public static final int SHOW_RINGER_TOAST_COUNT = 9;
+ public static final int SHOW_RINGER_TOAST_COUNT = 12;
public static final boolean DEFAULT_SHOW_HEADERS = true;
public static final boolean DEFAULT_ENABLE_AUTOMUTE = true;
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 107ce1e..a6b09ce 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -75,7 +75,7 @@
android.test.runner \
telephony-common \
android.test.base \
-
+ android.car
LOCAL_AAPT_FLAGS := --extra-packages com.android.systemui:com.android.keyguard
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
new file mode 100644
index 0000000..3f85c9d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.keyguard;
+
+import static org.mockito.Mockito.mock;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class KeyguardHostViewTest extends SysuiTestCase {
+
+ private KeyguardHostView mKeyguardHostView;
+
+ @Before
+ public void setup() {
+ mKeyguardHostView = new KeyguardHostView(getContext());
+ }
+
+ @Test
+ public void testHasDismissActions() {
+ Assert.assertFalse("Action not set yet", mKeyguardHostView.hasDismissActions());
+ mKeyguardHostView.setOnDismissAction(mock(KeyguardHostView.OnDismissAction.class),
+ null /* cancelAction */);
+ Assert.assertTrue("Action should exist", mKeyguardHostView.hasDismissActions());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
index 4b455ba..149f2de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
@@ -58,6 +58,7 @@
public static final int BELOW_WARNING_BUCKET = -1;
public static final long BELOW_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(2);
public static final long ABOVE_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(4);
+ private static final long ABOVE_CHARGE_CYCLE_THRESHOLD = Duration.ofHours(8).toMillis();
private HardwarePropertiesManager mHardProps;
private WarningsUI mMockWarnings;
private PowerUI mPowerUI;
@@ -198,6 +199,7 @@
when(mEnhancedEstimates.isHybridNotificationEnabled()).thenReturn(true);
when(mEnhancedEstimates.getLowWarningThreshold()).thenReturn(PowerUI.THREE_HOURS_IN_MILLIS);
when(mEnhancedEstimates.getSevereWarningThreshold()).thenReturn(ONE_HOUR_MILLIS);
+ mPowerUI.mBatteryLevel = 10;
mPowerUI.start();
// unplugged device that would show the non-hybrid notification and the hybrid
@@ -213,6 +215,7 @@
when(mEnhancedEstimates.isHybridNotificationEnabled()).thenReturn(true);
when(mEnhancedEstimates.getLowWarningThreshold()).thenReturn(PowerUI.THREE_HOURS_IN_MILLIS);
when(mEnhancedEstimates.getSevereWarningThreshold()).thenReturn(ONE_HOUR_MILLIS);
+ mPowerUI.mBatteryLevel = 10;
mPowerUI.start();
// unplugged device that would show the non-hybrid but not the hybrid
@@ -254,13 +257,14 @@
}
@Test
- public void testShouldShowLowBatteryWarning_deviceBatteryStatusUnkown_returnsNoShow() {
+ public void testShouldShowLowBatteryWarning_deviceBatteryStatusUnknown_returnsNoShow() {
when(mEnhancedEstimates.isHybridNotificationEnabled()).thenReturn(true);
when(mEnhancedEstimates.getLowWarningThreshold()).thenReturn(PowerUI.THREE_HOURS_IN_MILLIS);
when(mEnhancedEstimates.getSevereWarningThreshold()).thenReturn(ONE_HOUR_MILLIS);
mPowerUI.start();
- // Unknown battery status device that would show the neither due
+ // Unknown battery status device that would show the neither due to the battery status being
+ // unknown
boolean shouldShow =
mPowerUI.shouldShowLowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
BELOW_WARNING_BUCKET, BELOW_HYBRID_THRESHOLD,
@@ -295,6 +299,9 @@
mPowerUI.maybeShowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
ABOVE_WARNING_BUCKET);
+
+ // reduce battery level to handle time based trigger -> level trigger interactions
+ mPowerUI.mBatteryLevel = 10;
boolean shouldShow =
mPowerUI.shouldShowLowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
ABOVE_WARNING_BUCKET, BELOW_HYBRID_THRESHOLD,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 231a1866..ab042d4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -16,15 +16,22 @@
package com.android.systemui.statusbar;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
+import android.app.NotificationChannel;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
@@ -32,66 +39,80 @@
import android.view.View;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import java.util.List;
import java.util.function.Consumer;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ExpandableNotificationRowTest extends SysuiTestCase {
- private ExpandableNotificationRow mGroup;
+ private ExpandableNotificationRow mGroupRow;
+
private NotificationTestHelper mNotificationTestHelper;
boolean mHeadsUpAnimatingAway = false;
+ @Rule public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
+
@Before
public void setUp() throws Exception {
mNotificationTestHelper = new NotificationTestHelper(mContext);
- mGroup = mNotificationTestHelper.createGroup();
- mGroup.setHeadsUpAnimatingAwayListener(
+ mGroupRow = mNotificationTestHelper.createGroup();
+ mGroupRow.setHeadsUpAnimatingAwayListener(
animatingAway -> mHeadsUpAnimatingAway = animatingAway);
+ mDependency.injectTestDependency(
+ NotificationBlockingHelperManager.class,
+ mBlockingHelperManager);
}
@Test
public void testGroupSummaryNotShowingIconWhenPublic() {
- mGroup.setSensitive(true, true);
- mGroup.setHideSensitiveForIntrinsicHeight(true);
- Assert.assertTrue(mGroup.isSummaryWithChildren());
- Assert.assertFalse(mGroup.isShowingIcon());
+ mGroupRow.setSensitive(true, true);
+ mGroupRow.setHideSensitiveForIntrinsicHeight(true);
+ assertTrue(mGroupRow.isSummaryWithChildren());
+ assertFalse(mGroupRow.isShowingIcon());
}
@Test
public void testNotificationHeaderVisibleWhenAnimating() {
- mGroup.setSensitive(true, true);
- mGroup.setHideSensitive(true, false, 0, 0);
- mGroup.setHideSensitive(false, true, 0, 0);
- Assert.assertTrue(mGroup.getChildrenContainer().getVisibleHeader().getVisibility()
+ mGroupRow.setSensitive(true, true);
+ mGroupRow.setHideSensitive(true, false, 0, 0);
+ mGroupRow.setHideSensitive(false, true, 0, 0);
+ assertTrue(mGroupRow.getChildrenContainer().getVisibleHeader().getVisibility()
== View.VISIBLE);
}
@Test
public void testUserLockedResetEvenWhenNoChildren() {
- mGroup.setUserLocked(true);
- mGroup.removeAllChildren();
- mGroup.setUserLocked(false);
- Assert.assertFalse("The childrencontainer should not be userlocked but is, the state "
- + "seems out of sync.", mGroup.getChildrenContainer().isUserLocked());
+ mGroupRow.setUserLocked(true);
+ mGroupRow.removeAllChildren();
+ mGroupRow.setUserLocked(false);
+ assertFalse("The childrencontainer should not be userlocked but is, the state "
+ + "seems out of sync.", mGroupRow.getChildrenContainer().isUserLocked());
}
@Test
public void testReinflatedOnDensityChange() {
- mGroup.setUserLocked(true);
- mGroup.removeAllChildren();
- mGroup.setUserLocked(false);
+ mGroupRow.setUserLocked(true);
+ mGroupRow.removeAllChildren();
+ mGroupRow.setUserLocked(false);
NotificationChildrenContainer mockContainer = mock(NotificationChildrenContainer.class);
- mGroup.setChildrenContainer(mockContainer);
- mGroup.onDensityOrFontScaleChanged();
+ mGroupRow.setChildrenContainer(mockContainer);
+ mGroupRow.onDensityOrFontScaleChanged();
verify(mockContainer).reInflateViews(any(), any());
}
@@ -148,22 +169,38 @@
@Test
public void testClickSound() throws Exception {
- Assert.assertTrue("Should play sounds by default.", mGroup.isSoundEffectsEnabled());
- mGroup.setDark(true /* dark */, false /* fade */, 0 /* delay */);
- mGroup.setSecureStateProvider(()-> false);
- Assert.assertFalse("Shouldn't play sounds when dark and trusted.",
- mGroup.isSoundEffectsEnabled());
- mGroup.setSecureStateProvider(()-> true);
- Assert.assertTrue("Should always play sounds when not trusted.",
- mGroup.isSoundEffectsEnabled());
+ assertTrue("Should play sounds by default.", mGroupRow.isSoundEffectsEnabled());
+ mGroupRow.setDark(true /* dark */, false /* fade */, 0 /* delay */);
+ mGroupRow.setSecureStateProvider(()-> false);
+ assertFalse("Shouldn't play sounds when dark and trusted.",
+ mGroupRow.isSoundEffectsEnabled());
+ mGroupRow.setSecureStateProvider(()-> true);
+ assertTrue("Should always play sounds when not trusted.",
+ mGroupRow.isSoundEffectsEnabled());
+ }
+
+ @Test
+ public void testSetDismissed_longPressListenerRemoved() {
+ ExpandableNotificationRow.LongPressListener listener =
+ mock(ExpandableNotificationRow.LongPressListener.class);
+ mGroupRow.setLongPressListener(listener);
+ mGroupRow.doLongClickCallback(0,0);
+ verify(listener, times(1)).onLongPress(eq(mGroupRow), eq(0), eq(0),
+ any(NotificationMenuRowPlugin.MenuItem.class));
+ reset(listener);
+
+ mGroupRow.setDismissed(true);
+ mGroupRow.doLongClickCallback(0,0);
+ verify(listener, times(0)).onLongPress(eq(mGroupRow), eq(0), eq(0),
+ any(NotificationMenuRowPlugin.MenuItem.class));
}
@Test
public void testShowAppOps_noHeader() {
// public notification is custom layout - no header
- mGroup.setSensitive(true, true);
- mGroup.setAppOpsOnClickListener(null);
- mGroup.showAppOpsIcons(null);
+ mGroupRow.setSensitive(true, true);
+ mGroupRow.setAppOpsOnClickListener(null);
+ mGroupRow.showAppOpsIcons(null);
}
@Test
@@ -171,17 +208,17 @@
NotificationHeaderView mockHeader = mock(NotificationHeaderView.class);
NotificationContentView publicLayout = mock(NotificationContentView.class);
- mGroup.setPublicLayout(publicLayout);
+ mGroupRow.setPublicLayout(publicLayout);
NotificationContentView privateLayout = mock(NotificationContentView.class);
- mGroup.setPrivateLayout(privateLayout);
+ mGroupRow.setPrivateLayout(privateLayout);
NotificationChildrenContainer mockContainer = mock(NotificationChildrenContainer.class);
when(mockContainer.getNotificationChildCount()).thenReturn(1);
when(mockContainer.getHeaderView()).thenReturn(mockHeader);
- mGroup.setChildrenContainer(mockContainer);
+ mGroupRow.setChildrenContainer(mockContainer);
ArraySet<Integer> ops = new ArraySet<>();
ops.add(AppOpsManager.OP_ANSWER_PHONE_CALLS);
- mGroup.showAppOpsIcons(ops);
+ mGroupRow.showAppOpsIcons(ops);
verify(mockHeader, times(1)).showAppOpsIcons(ops);
verify(privateLayout, times(1)).showAppOpsIcons(ops);
@@ -195,17 +232,70 @@
ExpandableNotificationRow.OnAppOpsClickListener.class);
View view = mock(View.class);
- mGroup.setAppOpsOnClickListener(l);
+ mGroupRow.setAppOpsOnClickListener(l);
- mGroup.getAppOpsOnClickListener().onClick(view);
+ mGroupRow.getAppOpsOnClickListener().onClick(view);
verify(l, times(1)).onClick(any(), anyInt(), anyInt(), any());
}
@Test
public void testHeadsUpAnimatingAwayListener() {
- mGroup.setHeadsUpAnimatingAway(true);
+ mGroupRow.setHeadsUpAnimatingAway(true);
Assert.assertEquals(true, mHeadsUpAnimatingAway);
- mGroup.setHeadsUpAnimatingAway(false);
+ mGroupRow.setHeadsUpAnimatingAway(false);
Assert.assertEquals(false, mHeadsUpAnimatingAway);
}
+
+ @Test
+ public void testPerformDismissWithBlockingHelper_falseWhenBlockingHelperIsntShown() {
+ when(mBlockingHelperManager.perhapsShowBlockingHelper(
+ eq(mGroupRow), any(NotificationMenuRowPlugin.class))).thenReturn(false);
+
+ assertFalse(
+ mGroupRow.performDismissWithBlockingHelper(false /* fromAccessibility */));
+ }
+
+ @Test
+ public void testPerformDismissWithBlockingHelper_doesntPerformOnGroupSummary() {
+ ExpandableNotificationRow childRow = mGroupRow.getChildrenContainer().getViewAtPosition(0);
+ when(mBlockingHelperManager.perhapsShowBlockingHelper(eq(childRow), any(NotificationMenuRowPlugin.class)))
+ .thenReturn(true);
+
+ assertTrue(
+ childRow.performDismissWithBlockingHelper(false /* fromAccessibility */));
+
+ verify(mBlockingHelperManager, times(1))
+ .perhapsShowBlockingHelper(eq(childRow), any(NotificationMenuRowPlugin.class));
+ verify(mBlockingHelperManager, times(0))
+ .perhapsShowBlockingHelper(eq(mGroupRow), any(NotificationMenuRowPlugin.class));
+ }
+
+ @Test
+ public void testIsBlockingHelperShowing_isCorrectlyUpdated() {
+ mGroupRow.setBlockingHelperShowing(true);
+ assertTrue(mGroupRow.isBlockingHelperShowing());
+
+ mGroupRow.setBlockingHelperShowing(false);
+ assertFalse(mGroupRow.isBlockingHelperShowing());
+ }
+
+ @Test
+ public void testGetNumUniqueChildren_defaultChannel() {
+ assertEquals(1, mGroupRow.getNumUniqueChannels());
+ }
+
+ @Test
+ public void testGetNumUniqueChildren_multiChannel() {
+ List<ExpandableNotificationRow> childRows =
+ mGroupRow.getChildrenContainer().getNotificationChildren();
+ // Give each child a unique channel id/name.
+ int i = 0;
+ for (ExpandableNotificationRow childRow : childRows) {
+ childRow.getEntry().channel =
+ new NotificationChannel("id" + i, "dinnertime" + i, IMPORTANCE_DEFAULT);
+ i++;
+ }
+
+ assertEquals(3, mGroupRow.getNumUniqueChannels());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/FooterViewTest.java
new file mode 100644
index 0000000..96b0255
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/FooterViewTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.drawable.Icon;
+import android.os.UserHandle;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.util.NotificationColorUtil;
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class FooterViewTest extends SysuiTestCase {
+
+ FooterView mView;
+
+ @Before
+ public void setUp() {
+ mView = (FooterView) LayoutInflater.from(mContext).inflate(
+ R.layout.status_bar_notification_footer, null, false);
+ mView.setDuration(0);
+ }
+
+ @Test
+ public void testViewsNotNull() {
+ assertNotNull(mView.findContentView());
+ assertNotNull(mView.findSecondaryView());
+ }
+
+ @Test
+ public void setDismissOnClick() {
+ mView.setDismissButtonClickListener(mock(View.OnClickListener.class));
+ assertTrue(mView.findSecondaryView().hasOnClickListeners());
+ }
+
+ @Test
+ public void setManageOnClick() {
+ mView.setManageButtonClickListener(mock(View.OnClickListener.class));
+ assertTrue(mView.findViewById(R.id.manage_text).hasOnClickListeners());
+ }
+
+ @Test
+ public void testPerformVisibilityAnimation() {
+ mView.setInvisible();
+ assertFalse(mView.isVisible());
+
+ Runnable test = new Runnable() {
+ @Override
+ public void run() {
+ assertEquals(1.0f, mView.findContentView().getAlpha());
+ assertEquals(0.0f, mView.findSecondaryView().getAlpha());
+ assertTrue(mView.isVisible());
+ }
+ };
+ mView.performVisibilityAnimation(true, test);
+ }
+
+ @Test
+ public void testPerformSecondaryVisibilityAnimation() {
+ mView.setInvisible();
+ assertFalse(mView.isSecondaryVisible());
+
+ Runnable test = new Runnable() {
+ @Override
+ public void run() {
+ assertEquals(0.0f, mView.findContentView().getAlpha());
+ assertEquals(1.0f, mView.findSecondaryView().getAlpha());
+ assertTrue(mView.isSecondaryVisible());
+ }
+ };
+ mView.performSecondaryVisibilityAnimation(true, test);
+ }
+}
+
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
new file mode 100644
index 0000000..78cceeb
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
+
+import android.content.Context;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.View;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
+import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
+import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_POSITIVE;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * Tests for {@link NotificationBlockingHelperManager}.
+ */
+@SmallTest
+@org.junit.runner.RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class NotificationBlockingHelperManagerTest extends SysuiTestCase {
+
+ private NotificationBlockingHelperManager mBlockingHelperManager;
+
+ private NotificationTestHelper mHelper;
+
+ @Rule public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock private NotificationGutsManager mGutsManager;
+ @Mock private NotificationEntryManager mEntryManager;
+ @Mock private NotificationMenuRow mMenuRow;
+ @Mock private NotificationMenuRowPlugin.MenuItem mMenuItem;
+
+ @Before
+ public void setUp() {
+ mBlockingHelperManager = new NotificationBlockingHelperManager(mContext);
+
+ mHelper = new NotificationTestHelper(mContext);
+ when(mGutsManager.openGuts(
+ any(View.class),
+ anyInt(),
+ anyInt(),
+ any(NotificationMenuRowPlugin.MenuItem.class)))
+ .thenReturn(true);
+ mDependency.injectTestDependency(NotificationGutsManager.class, mGutsManager);
+ mDependency.injectTestDependency(NotificationEntryManager.class, mEntryManager);
+ when(mMenuRow.getLongpressMenuItem(any(Context.class))).thenReturn(mMenuItem);
+ }
+
+ @Test
+ public void testDismissCurrentBlockingHelper_nullBlockingHelperRow() {
+ // By default, this shouldn't dismiss (no pointers/vars set up!)
+ assertFalse(mBlockingHelperManager.dismissCurrentBlockingHelper());
+ assertTrue(mBlockingHelperManager.isBlockingHelperRowNull());
+ }
+
+ @Test
+ public void testDismissCurrentBlockingHelper_withDetachedBlockingHelperRow() throws Exception {
+ ExpandableNotificationRow row = spy(createBlockableRowSpy());
+ row.setBlockingHelperShowing(true);
+ when(row.isAttachedToWindow()).thenReturn(false);
+ mBlockingHelperManager.setBlockingHelperRowForTest(row);
+
+ assertTrue(mBlockingHelperManager.dismissCurrentBlockingHelper());
+ assertTrue(mBlockingHelperManager.isBlockingHelperRowNull());
+
+ verify(mEntryManager, times(0)).updateNotifications();
+ }
+
+ @Test
+ public void testDismissCurrentBlockingHelper_withAttachedBlockingHelperRow() throws Exception {
+ ExpandableNotificationRow row = spy(createBlockableRowSpy());
+ row.setBlockingHelperShowing(true);
+ when(row.isAttachedToWindow()).thenReturn(true);
+ mBlockingHelperManager.setBlockingHelperRowForTest(row);
+
+ assertTrue(mBlockingHelperManager.dismissCurrentBlockingHelper());
+ assertTrue(mBlockingHelperManager.isBlockingHelperRowNull());
+
+ verify(mEntryManager).updateNotifications();
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_shown() throws Exception {
+ ExpandableNotificationRow row = createBlockableRowSpy();
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+
+ verify(mGutsManager).openGuts(row, 0, 0, mMenuItem);
+ }
+
+
+ @Test
+ public void testPerhapsShowBlockingHelper_shownForLargeGroup() throws Exception {
+ ExpandableNotificationRow groupRow = createBlockableGroupRowSpy(10);
+ groupRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(groupRow, mMenuRow));
+
+ verify(mGutsManager).openGuts(groupRow, 0, 0, mMenuItem);
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_shownForOnlyChildNotification()
+ throws Exception {
+ ExpandableNotificationRow groupRow = createBlockableGroupRowSpy(1);
+ // Explicitly get the children container & call getViewAtPosition on it instead of the row
+ // as other factors such as view expansion may cause us to get the parent row back instead
+ // of the child row.
+ ExpandableNotificationRow childRow = groupRow.getChildrenContainer().getViewAtPosition(0);
+ childRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(childRow, mMenuRow));
+
+ verify(mGutsManager).openGuts(childRow, 0, 0, mMenuItem);
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_notShownDueToNeutralUserSentiment() throws Exception {
+ ExpandableNotificationRow row = createBlockableRowSpy();
+ row.getEntry().userSentiment = USER_SENTIMENT_NEUTRAL;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_notShownDueToPositiveUserSentiment()
+ throws Exception {
+ ExpandableNotificationRow row = createBlockableRowSpy();
+ row.getEntry().userSentiment = USER_SENTIMENT_POSITIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_notShownDueToShadeVisibility() throws Exception {
+ ExpandableNotificationRow row = createBlockableRowSpy();
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ // Hide the shade
+ mBlockingHelperManager.setNotificationShadeExpanded(0f);
+
+ assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_notShownDueToNonblockability() throws Exception {
+ ExpandableNotificationRow row = createBlockableRowSpy();
+ when(row.getIsNonblockable()).thenReturn(true);
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+ }
+
+ @Test
+ public void testPerhapsShowBlockingHelper_notShownAsNotificationIsInMultipleChildGroup()
+ throws Exception {
+ ExpandableNotificationRow groupRow = createBlockableGroupRowSpy(2);
+ // Explicitly get the children container & call getViewAtPosition on it instead of the row
+ // as other factors such as view expansion may cause us to get the parent row back instead
+ // of the child row.
+ ExpandableNotificationRow childRow = groupRow.getChildrenContainer().getViewAtPosition(0);
+ childRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(childRow, mMenuRow));
+ }
+
+ @Test
+ public void testBlockingHelperShowAndDismiss() throws Exception{
+ ExpandableNotificationRow row = spy(createBlockableRowSpy());
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ when(row.isAttachedToWindow()).thenReturn(true);
+ mBlockingHelperManager.setNotificationShadeExpanded(1f);
+
+ // Show check
+ assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
+
+ verify(mGutsManager).openGuts(row, 0, 0, mMenuItem);
+
+ // Dismiss check
+ assertTrue(mBlockingHelperManager.dismissCurrentBlockingHelper());
+ assertTrue(mBlockingHelperManager.isBlockingHelperRowNull());
+
+ verify(mEntryManager).updateNotifications();
+ }
+
+ private ExpandableNotificationRow createBlockableRowSpy() throws Exception {
+ ExpandableNotificationRow row = spy(mHelper.createRow());
+ when(row.getIsNonblockable()).thenReturn(false);
+ return row;
+ }
+
+ private ExpandableNotificationRow createBlockableGroupRowSpy(int numChildren) throws Exception {
+ ExpandableNotificationRow row = spy(mHelper.createGroup(numChildren));
+ when(row.getIsNonblockable()).thenReturn(false);
+ return row;
+ }
+
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
index 2000bff..5e27fde 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -35,6 +35,7 @@
import android.app.NotificationChannel;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.media.session.MediaSession;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
@@ -61,6 +62,7 @@
private static final int UID_NORMAL = 123;
private static final int UID_ALLOW_DURING_SETUP = 456;
private static final String TEST_HIDDEN_NOTIFICATION_KEY = "testHiddenNotificationKey";
+ private static final String TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY = "exempt";
private final StatusBarNotification mMockStatusBarNotification =
mock(StatusBarNotification.class);
@@ -226,12 +228,21 @@
public void testSuppressSystemAlertNotification() {
when(mFsc.isSystemAlertWarningNeeded(anyInt(), anyString())).thenReturn(false);
when(mFsc.isSystemAlertNotification(any())).thenReturn(true);
+ StatusBarNotification sbn = mRow.getEntry().notification;
+ Bundle bundle = new Bundle();
+ bundle.putStringArray(Notification.EXTRA_FOREGROUND_APPS, new String[] {"something"});
+ sbn.getNotification().extras = bundle;
assertTrue(mNotificationData.shouldFilterOut(mRow.getEntry().notification));
}
@Test
public void testDoNotSuppressSystemAlertNotification() {
+ StatusBarNotification sbn = mRow.getEntry().notification;
+ Bundle bundle = new Bundle();
+ bundle.putStringArray(Notification.EXTRA_FOREGROUND_APPS, new String[] {"something"});
+ sbn.getNotification().extras = bundle;
+
when(mFsc.isSystemAlertWarningNeeded(anyInt(), anyString())).thenReturn(true);
when(mFsc.isSystemAlertNotification(any())).thenReturn(true);
@@ -249,7 +260,24 @@
}
@Test
+ public void testDoNotSuppressMalformedSystemAlertNotification() {
+ when(mFsc.isSystemAlertWarningNeeded(anyInt(), anyString())).thenReturn(true);
+
+ // missing extra
+ assertFalse(mNotificationData.shouldFilterOut(mRow.getEntry().notification));
+
+ StatusBarNotification sbn = mRow.getEntry().notification;
+ Bundle bundle = new Bundle();
+ bundle.putStringArray(Notification.EXTRA_FOREGROUND_APPS, new String[] {});
+ sbn.getNotification().extras = bundle;
+
+ // extra missing values
+ assertFalse(mNotificationData.shouldFilterOut(mRow.getEntry().notification));
+ }
+
+ @Test
public void testShouldFilterHiddenNotifications() {
+ initStatusBarNotification(false);
// setup
when(mFsc.isSystemAlertWarningNeeded(anyInt(), anyString())).thenReturn(false);
when(mFsc.isSystemAlertNotification(any())).thenReturn(false);
@@ -264,6 +292,33 @@
assertFalse(mNotificationData.shouldFilterOut(mMockStatusBarNotification));
}
+ @Test
+ public void testIsExemptFromDndVisualSuppression_foreground() {
+ initStatusBarNotification(false);
+ when(mMockStatusBarNotification.getKey()).thenReturn(
+ TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY);
+ Notification n = mMockStatusBarNotification.getNotification();
+ n.flags = Notification.FLAG_FOREGROUND_SERVICE;
+
+ assertTrue(mNotificationData.isExemptFromDndVisualSuppression(mMockStatusBarNotification));
+ assertFalse(mNotificationData.shouldSuppressAmbient(mMockStatusBarNotification));
+ }
+
+ @Test
+ public void testIsExemptFromDndVisualSuppression_media() {
+ initStatusBarNotification(false);
+ when(mMockStatusBarNotification.getKey()).thenReturn(
+ TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY);
+ Notification n = mMockStatusBarNotification.getNotification();
+ Notification.Builder nb = Notification.Builder.recoverBuilder(mContext, n);
+ nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
+ n = nb.build();
+ when(mMockStatusBarNotification.getNotification()).thenReturn(n);
+
+ assertTrue(mNotificationData.isExemptFromDndVisualSuppression(mMockStatusBarNotification));
+ assertFalse(mNotificationData.shouldSuppressAmbient(mMockStatusBarNotification));
+ }
+
private void initStatusBarNotification(boolean allowDuringSetup) {
Bundle bundle = new Bundle();
bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup);
@@ -293,6 +348,13 @@
outRanking.getImportance(), outRanking.getImportanceExplanation(),
outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
outRanking.canShowBadge(), outRanking.getUserSentiment(), true);
+ } else if (key.equals(TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY)) {
+ outRanking.populate(key, outRanking.getRank(),
+ outRanking.matchesInterruptionFilter(),
+ outRanking.getVisibilityOverride(), 255,
+ outRanking.getImportance(), outRanking.getImportanceExplanation(),
+ outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), true);
} else {
outRanking.populate(key, outRanking.getRank(),
outRanking.matchesInterruptionFilter(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
index 6209d59..0ef2d051 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
@@ -20,6 +20,7 @@
import static android.app.AppOpsManager.OP_RECORD_AUDIO;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
+import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
@@ -27,6 +28,8 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -34,31 +37,24 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
+import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
-import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Handler;
-import android.os.Looper;
-import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
-import android.view.LayoutInflater;
import android.view.View;
-import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
-import com.android.systemui.statusbar.NotificationData;
-import com.android.systemui.statusbar.NotificationGuts;
-import com.android.systemui.statusbar.NotificationTestHelper;
-import com.android.systemui.statusbar.notification.NotificationInflater;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before;
@@ -70,15 +66,18 @@
import org.mockito.junit.MockitoRule;
import org.mockito.junit.MockitoJUnit;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Tests for {@link NotificationGutsManager}.
+ */
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class NotificationGutsManagerTest extends SysuiTestCase {
private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId";
- private final String mPackageName = mContext.getPackageName();
- private final int mUid = Binder.getCallingUid();
-
private NotificationChannel mTestNotificationChannel = new NotificationChannel(
TEST_CHANNEL_ID, TEST_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT);
private TestableLooper mTestableLooper;
@@ -87,7 +86,6 @@
private NotificationGutsManager mGutsManager;
@Rule public MockitoRule mockito = MockitoJUnit.rule();
- @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
@Mock private NotificationPresenter mPresenter;
@Mock private NotificationEntryManager mEntryManager;
@Mock private NotificationStackScrollLayout mStackScroller;
@@ -118,7 +116,12 @@
});
// Test doesn't support animation since the guts view is not attached.
- doNothing().when(guts).openControls(anyInt(), anyInt(), anyBoolean(), any(Runnable.class));
+ doNothing().when(guts).openControls(
+ eq(true) /* shouldDoCircularReveal */,
+ anyInt(),
+ anyInt(),
+ anyBoolean(),
+ any(Runnable.class));
ExpandableNotificationRow realRow = createTestNotificationRow();
NotificationMenuRowPlugin.MenuItem menuItem = createTestMenuItem(realRow);
@@ -130,7 +133,12 @@
mGutsManager.openGuts(row, 0, 0, menuItem);
assertEquals(View.INVISIBLE, guts.getVisibility());
mTestableLooper.processAllMessages();
- verify(guts).openControls(anyInt(), anyInt(), anyBoolean(), any(Runnable.class));
+ verify(guts).openControls(
+ eq(true),
+ anyInt(),
+ anyInt(),
+ anyBoolean(),
+ any(Runnable.class));
assertEquals(View.VISIBLE, guts.getVisibility());
mGutsManager.closeAndSaveGuts(false, false, false, 0, 0, false);
@@ -148,7 +156,12 @@
});
// Test doesn't support animation since the guts view is not attached.
- doNothing().when(guts).openControls(anyInt(), anyInt(), anyBoolean(), any(Runnable.class));
+ doNothing().when(guts).openControls(
+ eq(true) /* shouldDoCircularReveal */,
+ anyInt(),
+ anyInt(),
+ anyBoolean(),
+ any(Runnable.class));
ExpandableNotificationRow realRow = createTestNotificationRow();
NotificationMenuRowPlugin.MenuItem menuItem = createTestMenuItem(realRow);
@@ -160,7 +173,12 @@
mGutsManager.openGuts(row, 0, 0, menuItem);
mTestableLooper.processAllMessages();
- verify(guts).openControls(anyInt(), anyInt(), anyBoolean(), any(Runnable.class));
+ verify(guts).openControls(
+ eq(true),
+ anyInt(),
+ anyInt(),
+ anyBoolean(),
+ any(Runnable.class));
row.onDensityOrFontScaleChanged();
mGutsManager.onDensityOrFontScaleChanged(row);
@@ -247,6 +265,58 @@
assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.getValue().getAction());
}
+ @Test
+ public void testInitializeNotificationInfoView_showBlockingHelper() throws Exception {
+ NotificationInfo notificationInfoView = mock(NotificationInfo.class);
+ ExpandableNotificationRow row = spy(mHelper.createRow());
+ row.setBlockingHelperShowing(true);
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ when(row.getIsNonblockable()).thenReturn(false);
+ StatusBarNotification statusBarNotification = row.getStatusBarNotification();
+
+ mGutsManager.initializeNotificationInfo(row, notificationInfoView);
+
+ verify(notificationInfoView).bindNotification(
+ any(PackageManager.class),
+ any(INotificationManager.class),
+ eq(statusBarNotification.getPackageName()),
+ isNull(),
+ anyInt(),
+ eq(statusBarNotification),
+ any(NotificationInfo.CheckSaveListener.class),
+ any(NotificationInfo.OnSettingsClickListener.class),
+ any(NotificationInfo.OnAppSettingsClickListener.class),
+ eq(false),
+ eq(true) /* isForBlockingHelper */,
+ eq(true) /* isUserSentimentNegative */);
+ }
+
+ @Test
+ public void testInitializeNotificationInfoView_dontShowBlockingHelper() throws Exception {
+ NotificationInfo notificationInfoView = mock(NotificationInfo.class);
+ ExpandableNotificationRow row = spy(mHelper.createRow());
+ row.setBlockingHelperShowing(false);
+ row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ when(row.getIsNonblockable()).thenReturn(false);
+ StatusBarNotification statusBarNotification = row.getStatusBarNotification();
+
+ mGutsManager.initializeNotificationInfo(row, notificationInfoView);
+
+ verify(notificationInfoView).bindNotification(
+ any(PackageManager.class),
+ any(INotificationManager.class),
+ eq(statusBarNotification.getPackageName()),
+ isNull(),
+ anyInt(),
+ eq(statusBarNotification),
+ any(NotificationInfo.CheckSaveListener.class),
+ any(NotificationInfo.OnSettingsClickListener.class),
+ any(NotificationInfo.OnAppSettingsClickListener.class),
+ eq(false),
+ eq(false) /* isForBlockingHelper */,
+ eq(true) /* isUserSentimentNegative */);
+ }
+
////////////////////////////////////////////////////////////////////////////////////////////////
// Utility methods:
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index 01664b2..d86e947 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -67,12 +67,15 @@
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -83,18 +86,26 @@
private static final String TEST_PACKAGE_NAME = "test_package";
private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME;
private static final int TEST_UID = 1;
+ private static final int MULTIPLE_CHANNEL_COUNT = 2;
private static final String TEST_CHANNEL = "test_channel";
private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME";
private NotificationInfo mNotificationInfo;
- private final INotificationManager mMockINotificationManager = mock(INotificationManager.class);
- private final PackageManager mMockPackageManager = mock(PackageManager.class);
private NotificationChannel mNotificationChannel;
private NotificationChannel mDefaultNotificationChannel;
private StatusBarNotification mSbn;
+ @Rule public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock private INotificationManager mMockINotificationManager;
+ @Mock private PackageManager mMockPackageManager;
+ @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
+
@Before
public void setUp() throws Exception {
+ mDependency.injectTestDependency(
+ NotificationBlockingHelperManager.class,
+ mBlockingHelperManager);
+
// Inflate the layout
final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
mNotificationInfo = (NotificationInfo) layoutInflater.inflate(R.layout.notification_info,
@@ -146,7 +157,7 @@
public void testBindNotification_SetsTextApplicationName() throws Exception {
when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final TextView textView = mNotificationInfo.findViewById(R.id.pkgname);
assertTrue(textView.getText().toString().contains("App Name"));
assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility());
@@ -158,7 +169,7 @@
when(mMockPackageManager.getApplicationIcon(any(ApplicationInfo.class)))
.thenReturn(iconDrawable);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final ImageView iconView = mNotificationInfo.findViewById(R.id.pkgicon);
assertEquals(iconDrawable, iconView.getDrawable());
}
@@ -166,7 +177,7 @@
@Test
public void testBindNotification_GroupNameHiddenIfNoGroup() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name);
assertEquals(GONE, groupNameView.getVisibility());
final TextView groupDividerView = mNotificationInfo.findViewById(R.id.pkg_group_divider);
@@ -182,7 +193,7 @@
eq("test_group_id"), eq(TEST_PACKAGE_NAME), eq(TEST_UID)))
.thenReturn(notificationChannelGroup);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name);
assertEquals(View.VISIBLE, groupNameView.getVisibility());
assertEquals("Test Group Name", groupNameView.getText());
@@ -193,7 +204,7 @@
@Test
public void testBindNotification_SetsTextChannelName() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(TEST_CHANNEL_NAME, textView.getText());
}
@@ -201,16 +212,27 @@
@Test
public void testBindNotification_DefaultChannelDoesNotUseChannelName() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mDefaultNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mDefaultNotificationChannel, 1, mSbn, null, null, null, false);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(GONE, textView.getVisibility());
}
@Test
+ public void testBindNotification_DefaultChannelUsesChannelNameIfMoreChannelsExist()
+ throws Exception {
+ // Package has one channel by default.
+ when(mMockINotificationManager.getNumNotificationChannelsForPackage(
+ eq(TEST_PACKAGE_NAME), eq(TEST_UID), anyBoolean())).thenReturn(10);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mDefaultNotificationChannel, 1, mSbn, null, null, null, false);
+ final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
+ assertEquals(VISIBLE, textView.getVisibility());
+ }
+
+ @Test
public void testBindNotification_UnblockablePackageUsesChannelName() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(VISIBLE, textView.getVisibility());
}
@@ -218,7 +240,7 @@
@Test
public void testBindNotification_BlockButton() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final View block = mNotificationInfo.findViewById(R.id.block);
final View minimize = mNotificationInfo.findViewById(R.id.minimize);
assertEquals(VISIBLE, block.getVisibility());
@@ -229,7 +251,7 @@
public void testBindNotification_MinButton() throws Exception {
mSbn.getNotification().flags = Notification.FLAG_FOREGROUND_SERVICE;
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final View block = mNotificationInfo.findViewById(R.id.block);
final View minimize = mNotificationInfo.findViewById(R.id.minimize);
assertEquals(GONE, block.getVisibility());
@@ -244,7 +266,7 @@
(View v, NotificationChannel c, int appUid) -> {
assertEquals(mNotificationChannel, c);
latch.countDown();
- }, null, null);
+ }, null, false);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
settingsButton.performClick();
@@ -255,7 +277,7 @@
@Test
public void testBindNotification_SettingsButtonInvisibleWhenNoClickListener() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
assertTrue(settingsButton.getVisibility() != View.VISIBLE);
}
@@ -263,11 +285,11 @@
@Test
public void testBindNotification_SettingsButtonReappearsAfterSecondBind() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null,
(View v, NotificationChannel c, int appUid) -> {
- }, null, null);
+ }, null, false);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
assertEquals(View.VISIBLE, settingsButton.getVisibility());
}
@@ -276,11 +298,11 @@
public void testOnClickListenerPassesNullChannelForBundle() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 2, mSbn, null,
+ TEST_PACKAGE_NAME, mNotificationChannel, MULTIPLE_CHANNEL_COUNT, mSbn, null,
(View v, NotificationChannel c, int appUid) -> {
assertEquals(null, c);
latch.countDown();
- }, null, null);
+ }, null, true);
mNotificationInfo.findViewById(R.id.info).performClick();
// Verify that listener was triggered.
@@ -292,7 +314,8 @@
public void testBindNotification_ChannelNameInvisibleWhenBundleFromDifferentChannels()
throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 2, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, MULTIPLE_CHANNEL_COUNT, mSbn, null, null,
+ null, true);
final TextView channelNameView =
mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(GONE, channelNameView.getVisibility());
@@ -302,7 +325,8 @@
@UiThreadTest
public void testStopInvisibleIfBundleFromDifferentChannels() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 2, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, MULTIPLE_CHANNEL_COUNT, mSbn, null, null,
+ null, true);
final TextView blockView = mNotificationInfo.findViewById(R.id.block);
assertEquals(GONE, blockView.getVisibility());
}
@@ -310,8 +334,8 @@
@Test
public void testbindNotification_BlockingHelper() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null,
- null, null, true);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false, false,
+ true);
final TextView view = mNotificationInfo.findViewById(R.id.block_prompt);
assertEquals(View.VISIBLE, view.getVisibility());
assertEquals(mContext.getString(R.string.inline_blocking_helper), view.getText());
@@ -320,8 +344,7 @@
@Test
public void testbindNotification_UnblockableTextVisibleWhenAppUnblockable() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null,
- null, Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
final TextView view = mNotificationInfo.findViewById(R.id.block_prompt);
assertEquals(View.VISIBLE, view.getVisibility());
assertEquals(mContext.getString(R.string.notification_unblockable_desc),
@@ -331,7 +354,7 @@
@Test
public void testBindNotification_DoesNotUpdateNotificationChannel() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
anyString(), eq(TEST_UID), any());
}
@@ -340,7 +363,7 @@
public void testDoesNotUpdateNotificationChannelAfterImportanceChanged() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.block).performClick();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -352,7 +375,7 @@
throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.minimize).performClick();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -364,7 +387,7 @@
throws Exception {
int originalImportance = mNotificationChannel.getImportance();
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.handleCloseControls(true, false);
verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -377,7 +400,7 @@
throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_UNSPECIFIED);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.handleCloseControls(true, false);
verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -386,11 +409,31 @@
}
@Test
+ public void testCloseControls_blockingHelperDismissedIfShown() throws Exception {
+ mNotificationInfo.bindNotification(
+ mMockPackageManager,
+ mMockINotificationManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ 1 /* numChannels */,
+ mSbn,
+ null /* checkSaveListener */,
+ null /* onSettingsClick */,
+ null /* onAppSettingsClick */,
+ false /* isNonblockable */,
+ true /* isForBlockingHelper */,
+ false /* isUserSentimentNegative */);
+
+ mNotificationInfo.closeControls(mNotificationInfo);
+
+ verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
+ }
+
+ @Test
public void testNonBlockableAppDoesNotBecomeBlocked() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null,
- null, Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -401,7 +444,7 @@
public void testBlockChangedCallsUpdateNotificationChannel() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -420,8 +463,7 @@
public void testNonBlockableAppDoesNotBecomeMin() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null,
- null, Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -433,7 +475,7 @@
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mSbn.getNotification().flags = Notification.FLAG_FOREGROUND_SERVICE;
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
@@ -452,7 +494,7 @@
public void testKeepUpdatesNotificationChannel() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.handleCloseControls(true, false);
@@ -468,7 +510,7 @@
public void testBlockUndoDoesNotBlockNotificationChannel() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -488,7 +530,7 @@
public void testMinUndoDoesNotMinNotificationChannel() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
@@ -508,8 +550,7 @@
public void testCloseControlsDoesNotUpdateiMinIfSaveIsFalse() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
@@ -522,8 +563,7 @@
public void testCloseControlsDoesNotUpdateIfSaveIsFalse() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -538,7 +578,7 @@
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
(Runnable saveImportance, StatusBarNotification sbn) -> {
- }, null, null, Collections.singleton(TEST_PACKAGE_NAME));
+ }, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -554,7 +594,7 @@
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
(Runnable saveImportance, StatusBarNotification sbn) -> {
saveImportance.run();
- }, null, null, null);
+ }, null, null, false);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -584,7 +624,7 @@
TEST_PACKAGE_NAME, mNotificationChannel, 1, sbn, null, null,
(View v, Intent intent) -> {
latch.countDown();
- }, null);
+ }, false);
final TextView settingsLink = mNotificationInfo.findViewById(R.id.app_settings);
assertEquals(View.VISIBLE, settingsLink.getVisibility());
settingsLink.performClick();
@@ -609,10 +649,10 @@
0, null, 0, 0, n, UserHandle.CURRENT, null, 0);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 2, sbn, null, null,
+ TEST_PACKAGE_NAME, mNotificationChannel, MULTIPLE_CHANNEL_COUNT, sbn, null, null,
(View v, Intent intent) -> {
latch.countDown();
- }, null);
+ }, false);
final TextView settingsLink = mNotificationInfo.findViewById(R.id.app_settings);
assertEquals(View.VISIBLE, settingsLink.getVisibility());
settingsLink.performClick();
@@ -630,7 +670,8 @@
0, null, 0, 0, n, UserHandle.CURRENT, null, 0);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 2, sbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, MULTIPLE_CHANNEL_COUNT, sbn, null, null,
+ null, false);
final TextView settingsLink = mNotificationInfo.findViewById(R.id.app_settings);
assertEquals(GONE, settingsLink.getVisibility());
}
@@ -650,7 +691,7 @@
0, null, 0, 0, n, UserHandle.CURRENT, null, 0);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, sbn, null, null, null, null);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, sbn, null, null, null, false);
final TextView settingsLink = mNotificationInfo.findViewById(R.id.app_settings);
assertEquals(GONE, settingsLink.getVisibility());
}
@@ -666,8 +707,7 @@
mSbn.getNotification().flags = Notification.FLAG_FOREGROUND_SERVICE;
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
@@ -679,8 +719,7 @@
public void testUndoText_block() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -692,8 +731,7 @@
public void testNoHeaderOnConfirmation() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
@@ -704,8 +742,7 @@
public void testHeaderOnUndo() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null,
- Collections.singleton(TEST_PACKAGE_NAME));
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
mNotificationInfo.findViewById(R.id.block).performClick();
waitForUndoButton();
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 2764254..de2e6bf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Instrumentation;
import android.app.Notification;
@@ -23,33 +24,32 @@
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
+import android.text.TextUtils;
import android.view.LayoutInflater;
-import android.widget.FrameLayout;
import android.widget.RemoteViews;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
-import com.android.systemui.statusbar.notification.AboveShelfObserver;
-import com.android.systemui.statusbar.notification.InflationException;
import com.android.systemui.statusbar.notification.NotificationInflaterTest;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.policy.HeadsUpManager;
/**
- * A helper class to create {@link ExpandableNotificationRow}
+ * A helper class to create {@link ExpandableNotificationRow} (for both individual and group
+ * notifications).
*/
public class NotificationTestHelper {
+ static final String PKG = "com.android.systemui";
+ static final int UID = 1000;
+ private static final String GROUP_KEY = "gruKey";
+
private final Context mContext;
private final Instrumentation mInstrumentation;
private int mId;
private final NotificationGroupManager mGroupManager = new NotificationGroupManager();
private ExpandableNotificationRow mRow;
- private InflationException mException;
private HeadsUpManager mHeadsUpManager;
- protected static final String PKG = "com.android.systemui";
- protected static final int UID = 1000;
public NotificationTestHelper(Context context) {
mContext = context;
@@ -57,57 +57,125 @@
mHeadsUpManager = new HeadsUpManagerPhone(mContext, null, mGroupManager, null, null);
}
+ public ExpandableNotificationRow createRow() throws Exception {
+ return createRow(PKG, UID);
+ }
+
public ExpandableNotificationRow createRow(String pkg, int uid) throws Exception {
+ return createRow(pkg, uid, false /* isGroupSummary */, null /* groupKey */);
+ }
+
+ public ExpandableNotificationRow createRow(Notification notification) throws Exception {
+ return generateRow(notification, PKG, UID, false /* isGroupRow */);
+ }
+
+ /**
+ * Returns an {@link ExpandableNotificationRow} group with the given number of child
+ * notifications.
+ */
+ public ExpandableNotificationRow createGroup(int numChildren) throws Exception {
+ ExpandableNotificationRow row = createGroupSummary(GROUP_KEY);
+ for (int i = 0; i < numChildren; i++) {
+ ExpandableNotificationRow childRow = createGroupChild(GROUP_KEY);
+ row.addChildNotification(childRow);
+ }
+ return row;
+ }
+
+ /** Returns a group notification with 2 child notifications. */
+ public ExpandableNotificationRow createGroup() throws Exception {
+ return createGroup(2);
+ }
+
+ private ExpandableNotificationRow createGroupSummary(String groupkey) throws Exception {
+ return createRow(PKG, UID, true /* isGroupSummary */, groupkey);
+ }
+
+ private ExpandableNotificationRow createGroupChild(String groupkey) throws Exception {
+ return createRow(PKG, UID, false /* isGroupSummary */, groupkey);
+ }
+
+ /**
+ * Creates a notification row with the given details.
+ *
+ * @param pkg package used for creating a {@link StatusBarNotification}
+ * @param uid uid used for creating a {@link StatusBarNotification}
+ * @param isGroupSummary whether the notification row is a group summary
+ * @param groupKey the group key for the notification group used across notifications
+ * @return a row with that's either a standalone notification or a group notification if the
+ * groupKey is non-null
+ * @throws Exception
+ */
+ private ExpandableNotificationRow createRow(
+ String pkg,
+ int uid,
+ boolean isGroupSummary,
+ @Nullable String groupKey)
+ throws Exception {
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
R.layout.custom_view_dark))
.build();
- Notification notification = new Notification.Builder(mContext).setSmallIcon(
- R.drawable.ic_person)
- .setContentTitle("Title")
- .setContentText("Text")
- .setPublicVersion(publicVersion)
- .build();
- return createRow(notification, pkg, uid);
+ Notification.Builder notificationBuilder =
+ new Notification.Builder(mContext)
+ .setSmallIcon(R.drawable.ic_person)
+ .setContentTitle("Title")
+ .setContentText("Text")
+ .setPublicVersion(publicVersion);
+
+ // Group notification setup
+ if (isGroupSummary) {
+ notificationBuilder.setGroupSummary(true);
+ }
+ if (!TextUtils.isEmpty(groupKey)) {
+ notificationBuilder.setGroup(groupKey);
+ }
+
+ return generateRow(notificationBuilder.build(), pkg, uid, !TextUtils.isEmpty(groupKey));
}
- public ExpandableNotificationRow createRow() throws Exception {
- return createRow(PKG, UID);
- }
-
- public ExpandableNotificationRow createRow(Notification notification) throws Exception {
- return createRow(notification, PKG, UID);
- }
-
- public ExpandableNotificationRow createRow(Notification notification, String pkg, int uid)
+ private ExpandableNotificationRow generateRow(
+ Notification notification,
+ String pkg,
+ int uid,
+ boolean isGroupRow)
throws Exception {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
mContext.LAYOUT_INFLATER_SERVICE);
- mInstrumentation.runOnMainSync(() -> {
- mRow = (ExpandableNotificationRow) inflater.inflate(
- R.layout.status_bar_notification_row,
- null, false);
- });
+ mInstrumentation.runOnMainSync(() ->
+ mRow = (ExpandableNotificationRow) inflater.inflate(
+ R.layout.status_bar_notification_row,
+ null /* root */,
+ false /* attachToRoot */)
+ );
ExpandableNotificationRow row = mRow;
row.setGroupManager(mGroupManager);
row.setHeadsUpManager(mHeadsUpManager);
row.setAboveShelfChangedListener(aboveShelf -> {});
UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
- StatusBarNotification sbn = new StatusBarNotification(pkg, pkg, mId++, null, uid,
- 2000, notification, mUser, null, System.currentTimeMillis());
+ StatusBarNotification sbn = new StatusBarNotification(
+ pkg,
+ pkg,
+ mId++,
+ null /* tag */,
+ uid,
+ 2000 /* initialPid */,
+ notification,
+ mUser,
+ null /* overrideGroupKey */,
+ System.currentTimeMillis());
NotificationData.Entry entry = new NotificationData.Entry(sbn);
entry.row = row;
entry.createIcons(mContext, sbn);
- NotificationInflaterTest.runThenWaitForInflation(() -> row.updateNotification(entry),
+ NotificationInflaterTest.runThenWaitForInflation(
+ () -> row.updateNotification(entry),
row.getNotificationInflater());
- return row;
- }
- public ExpandableNotificationRow createGroup() throws Exception {
- ExpandableNotificationRow row = createRow();
- row.addChildNotification(createRow());
- row.addChildNotification(createRow());
+ // This would be done as part of onAsyncInflationFinished, but we skip large amounts of
+ // the callback chain, so we need to make up for not adding it to the group manager
+ // here.
+ mGroupManager.onEntryAdded(entry);
return row;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
index 2792d8c..07ac11b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
@@ -1,17 +1,23 @@
package com.android.systemui.statusbar;
+import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
import com.android.systemui.statusbar.phone.StatusBarIconList;
+import com.android.systemui.statusbar.phone.StatusBarIconList.Slot;
+import java.util.ArrayList;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -41,45 +47,125 @@
@Test
public void testAddSlotSlidesIcons() {
StatusBarIconList statusBarIconList = new StatusBarIconList(STATUS_BAR_SLOTS);
- StatusBarIcon sbIcon = mock(StatusBarIcon.class);
- statusBarIconList.setIcon(0, sbIcon);
+ StatusBarIconHolder sbHolder = mock(StatusBarIconHolder.class);
+ statusBarIconList.setIcon(0, sbHolder);
statusBarIconList.getSlotIndex("zzz"); // new content added in front
- assertNull(statusBarIconList.getIcon(0));
- assertEquals(sbIcon, statusBarIconList.getIcon(1));
+ assertNull(statusBarIconList.getIcon(0, TAG_PRIMARY));
+ assertEquals(sbHolder, statusBarIconList.getIcon(1, TAG_PRIMARY));
}
@Test
public void testGetAndSetIcon() {
StatusBarIconList statusBarIconList = new StatusBarIconList(STATUS_BAR_SLOTS);
- StatusBarIcon sbIconA = mock(StatusBarIcon.class);
- StatusBarIcon sbIconB = mock(StatusBarIcon.class);
- statusBarIconList.setIcon(0, sbIconA);
- statusBarIconList.setIcon(1, sbIconB);
- assertEquals(sbIconA, statusBarIconList.getIcon(0));
- assertEquals(sbIconB, statusBarIconList.getIcon(1));
- assertNull(statusBarIconList.getIcon(2)); // icon not set
+ StatusBarIconHolder sbHolderA = mock(StatusBarIconHolder.class);
+ StatusBarIconHolder sbHolderB = mock(StatusBarIconHolder.class);
+ statusBarIconList.setIcon(0, sbHolderA);
+ statusBarIconList.setIcon(1, sbHolderB);
+ assertEquals(sbHolderA, statusBarIconList.getIcon(0, TAG_PRIMARY));
+ assertEquals(sbHolderB, statusBarIconList.getIcon(1, TAG_PRIMARY));
+ assertNull(statusBarIconList.getIcon(2, TAG_PRIMARY)); // icon not set
}
@Test
public void testRemoveIcon() {
StatusBarIconList statusBarIconList = new StatusBarIconList(STATUS_BAR_SLOTS);
- StatusBarIcon sbIconA = mock(StatusBarIcon.class);
- StatusBarIcon sbIconB = mock(StatusBarIcon.class);
- statusBarIconList.setIcon(0, sbIconA);
- statusBarIconList.setIcon(1, sbIconB);
- statusBarIconList.removeIcon(0);
- assertNull(statusBarIconList.getIcon(0)); // icon not set
+ StatusBarIconHolder sbHolderA = mock(StatusBarIconHolder.class);
+ StatusBarIconHolder sbHolderB = mock(StatusBarIconHolder.class);
+ statusBarIconList.setIcon(0, sbHolderA);
+ statusBarIconList.setIcon(1, sbHolderB);
+ statusBarIconList.removeIcon(0, TAG_PRIMARY);
+ assertNull(statusBarIconList.getIcon(0, TAG_PRIMARY)); // icon not set
}
@Test
- public void testGetViewIndex() {
+ public void testGetViewIndex_NoMultiples() {
StatusBarIconList statusBarIconList = new StatusBarIconList(STATUS_BAR_SLOTS);
- StatusBarIcon sbIcon = mock(StatusBarIcon.class);
- statusBarIconList.setIcon(2, sbIcon);
- assertEquals(0, statusBarIconList.getViewIndex(2)); // Icon for item 2 is 0th child view.
- statusBarIconList.setIcon(0, sbIcon);
- assertEquals(0, statusBarIconList.getViewIndex(0)); // Icon for item 0 is 0th child view,
- assertEquals(1, statusBarIconList.getViewIndex(2)); // and item 2 is now 1st child view.
+ StatusBarIconHolder sbHolder = mock(StatusBarIconHolder.class);
+ statusBarIconList.setIcon(2, sbHolder);
+ // Icon for item 2 is 0th child view.
+ assertEquals(0, statusBarIconList.getViewIndex(2, TAG_PRIMARY));
+ statusBarIconList.setIcon(0, sbHolder);
+ // Icon for item 0 is 0th child view,
+ assertEquals(0, statusBarIconList.getViewIndex(0, TAG_PRIMARY));
+ // and item 2 is now 1st child view.
+ assertEquals(1, statusBarIconList.getViewIndex(2, TAG_PRIMARY));
}
+ @Test
+ public void testGetViewIndex_MultipleIconsPerSlot() {
+ StatusBarIconList statusBarIconList = new StatusBarIconList(STATUS_BAR_SLOTS);
+ StatusBarIconHolder sbHolder = mock(StatusBarIconHolder.class);
+
+ statusBarIconList.setIcon(2, sbHolder); // item 2, one icon 0th child
+
+ // All of these can be added to the same slot
+ // no tag bc it defaults to 0
+ StatusBarIconHolder sbHolder2 = mock(StatusBarIconHolder.class);
+ StatusBarIconHolder sbHolder3 = mock(StatusBarIconHolder.class);
+ int sb3Tag = 1;
+ when(sbHolder3.getTag()).thenReturn(sb3Tag);
+ StatusBarIconHolder sbHolder4 = mock(StatusBarIconHolder.class);
+ int sb4Tag = 2;
+ when(sbHolder4.getTag()).thenReturn(sb4Tag);
+
+ // Put a holder at slot 1, verify that it is first
+ statusBarIconList.setIcon(1, sbHolder2);
+ assertEquals(0, statusBarIconList.getViewIndex(1, TAG_PRIMARY));
+
+ // Put another holder at slot 1, verify it's index 0 and the rest come after
+ statusBarIconList.setIcon(1, sbHolder3);
+ assertEquals(0, statusBarIconList.getViewIndex(1, sb3Tag));
+ assertEquals(1, statusBarIconList.getViewIndex(1, TAG_PRIMARY));
+ // First icon should be at the end
+ assertEquals(2, statusBarIconList.getViewIndex(2, TAG_PRIMARY));
+
+ // Put another one in there just for good measure
+ statusBarIconList.setIcon(1, sbHolder4);
+ assertEquals(0, statusBarIconList.getViewIndex(1, sb4Tag));
+ assertEquals(1, statusBarIconList.getViewIndex(1, sb3Tag));
+ assertEquals(2, statusBarIconList.getViewIndex(1, TAG_PRIMARY));
+ assertEquals(3, statusBarIconList.getViewIndex(2, TAG_PRIMARY));
+ }
+
+ /**
+ * StatusBarIconList.Slot tests
+ */
+
+ @Test
+ public void testSlot_OrderIsPreserved() {
+ Slot testSlot = new Slot("test_name", null);
+
+ // no tag bc it defaults to 0
+ StatusBarIconHolder sbHolder1 = mock(StatusBarIconHolder.class);
+ StatusBarIconHolder sbHolder2 = mock(StatusBarIconHolder.class);
+ int sb2Tag = 1;
+ when(sbHolder2.getTag()).thenReturn(sb2Tag);
+ StatusBarIconHolder sbHolder3 = mock(StatusBarIconHolder.class);
+ int sb3Tag = 2;
+ when(sbHolder3.getTag()).thenReturn(sb3Tag);
+
+ ArrayList<StatusBarIconHolder> expected = new ArrayList<>();
+ expected.add(sbHolder1);
+ expected.add(sbHolder2);
+ expected.add(sbHolder3);
+
+
+ // Add 3 icons in the same slot, and verify that the list we get is equal to what we gave
+ for (StatusBarIconHolder holder : expected) {
+ testSlot.addHolder(holder);
+ }
+ assertTrue(listsEqual(expected, testSlot.getHolderList()));
+ }
+
+ private boolean listsEqual(List<StatusBarIconHolder> list1, List<StatusBarIconHolder> list2) {
+ if (list1.size() != list2.size()) return false;
+
+ for (int i = 0; i < list1.size(); i++) {
+ if (!list1.get(i).equals(list2.get(i))) {
+ return false;
+ }
+ }
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 2edcd01..9e8fa22 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -89,15 +89,11 @@
assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
.getVisibility());
- assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.clock)
- .getVisibility());
fragment.disable(0, 0, false);
assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
.getVisibility());
- assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.clock)
- .getVisibility());
}
@Test
@@ -115,4 +111,20 @@
Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
}
+
+ @Test
+ public void testDisableClock() throws Exception {
+ mFragments.dispatchResume();
+ processAllMessages();
+
+ CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+ fragment.initNotificationIconArea(mMockNotificiationAreaController);
+ fragment.disable(StatusBarManager.DISABLE_CLOCK, 0, false);
+
+ assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.clock).getVisibility());
+
+ fragment.disable(0, 0, false);
+
+ assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.clock).getVisibility());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index a37947d..67453d5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -22,6 +22,7 @@
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
@@ -307,4 +308,12 @@
mBouncer.isSecure(), mode != KeyguardSecurityModel.SecurityMode.None);
}
}
+
+ @Test
+ public void testWillDismissWithAction() {
+ mBouncer.ensureView();
+ Assert.assertFalse("Action not set yet", mBouncer.willDismissWithAction());
+ when(mKeyguardHostView.hasDismissActions()).thenReturn(true);
+ Assert.assertTrue("Action should exist", mBouncer.willDismissWithAction());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 45845fc..a88f31a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@@ -39,10 +40,8 @@
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import android.view.Choreographer;
import android.view.View;
-import com.android.internal.util.Preconditions;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ScrimView;
@@ -75,7 +74,7 @@
@Before
public void setup() {
mLightBarController = mock(LightBarController.class);
- mScrimBehind = new ScrimView(getContext());
+ mScrimBehind = spy(new ScrimView(getContext()));
mScrimInFront = new ScrimView(getContext());
mWakeLock = mock(WakeLock.class);
mAlarmManager = mock(AlarmManager.class);
@@ -212,8 +211,10 @@
mScrimController.finishAnimationsImmediately();
final float scrimAlpha = mScrimBehind.getViewAlpha();
+ reset(mScrimBehind);
mScrimController.setExpansionAffectsAlpha(false);
mScrimController.setPanelExpansion(0.8f);
+ verifyZeroInteractions(mScrimBehind);
Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha "
+ "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
@@ -557,8 +558,8 @@
* @param callback What to execute.
*/
@Override
- protected void doOnTheNextFrame(Choreographer.FrameCallback callback) {
- callback.doFrame(0);
+ protected void doOnTheNextFrame(Runnable callback) {
+ callback.run();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index 5db7792..72b0156 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -14,10 +14,17 @@
package com.android.systemui.statusbar.phone;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.graphics.Rect;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -25,9 +32,14 @@
import android.widget.LinearLayout;
import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusBarMobileView;
+import com.android.systemui.statusbar.StatusBarWifiView;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -50,50 +62,119 @@
public void testSetCalledOnAdd_IconManager() {
LinearLayout layout = new LinearLayout(mContext);
TestIconManager manager = new TestIconManager(layout);
- StatusBarIcon icon = mock(StatusBarIcon.class);
-
- manager.onIconAdded(0, "test_slot", false, icon);
- verify(manager.mMock).set(eq(icon));
+ testCallOnAdd_forManager(manager);
}
@Test
public void testSetCalledOnAdd_DarkIconManager() {
LinearLayout layout = new LinearLayout(mContext);
TestDarkIconManager manager = new TestDarkIconManager(layout);
- StatusBarIcon icon = mock(StatusBarIcon.class);
-
- manager.onIconAdded(0, "test_slot", false, icon);
- verify(manager.mMock).set(eq(icon));
+ testCallOnAdd_forManager(manager);
}
- private static class TestDarkIconManager extends DarkIconManager {
- private final StatusBarIconView mMock;
+ private <T extends IconManager & TestableIconManager> void testCallOnAdd_forManager(T manager) {
+ StatusBarIconHolder holder = holderForType(TYPE_ICON);
+ manager.onIconAdded(0, "test_slot", false, holder);
+ assertTrue("Expected StatusBarIconView",
+ (manager.getViewAt(0) instanceof StatusBarIconView));
+
+ holder = holderForType(TYPE_WIFI);
+ manager.onIconAdded(1, "test_wifi", false, holder);
+ assertTrue(manager.getViewAt(1) instanceof StatusBarWifiView);
+
+ holder = holderForType(TYPE_MOBILE);
+ manager.onIconAdded(2, "test_mobile", false, holder);
+ assertTrue(manager.getViewAt(2) instanceof StatusBarMobileView);
+ }
+
+ private StatusBarIconHolder holderForType(int type) {
+ switch (type) {
+ case TYPE_MOBILE:
+ return StatusBarIconHolder.fromMobileIconState(mock(MobileIconState.class));
+
+ case TYPE_WIFI:
+ return StatusBarIconHolder.fromWifiIconState(mock(WifiIconState.class));
+
+ case TYPE_ICON:
+ default:
+ return StatusBarIconHolder.fromIcon(mock(StatusBarIcon.class));
+ }
+ }
+
+ private static class TestDarkIconManager extends DarkIconManager
+ implements TestableIconManager {
public TestDarkIconManager(LinearLayout group) {
super(group);
- mMock = mock(StatusBarIconView.class);
}
@Override
- protected StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
- return mMock;
+ public StatusIconDisplayable getViewAt(int index) {
+ return (StatusIconDisplayable) mGroup.getChildAt(index);
+ }
+
+ @Override
+ protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
+ StatusBarIcon icon) {
+ StatusBarIconView mock = mock(StatusBarIconView.class);
+ mGroup.addView(mock, index);
+
+ return mock;
+ }
+
+ @Override
+ protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) {
+ StatusBarWifiView mock = mock(StatusBarWifiView.class);
+ mGroup.addView(mock, index);
+ return mock;
+ }
+
+ @Override
+ protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) {
+ StatusBarMobileView mock = mock(StatusBarMobileView.class);
+ mGroup.addView(mock, index);
+
+ return mock;
}
}
- private static class TestIconManager extends IconManager {
-
- private final StatusBarIconView mMock;
-
+ private static class TestIconManager extends IconManager implements TestableIconManager {
public TestIconManager(ViewGroup group) {
super(group);
- mMock = mock(StatusBarIconView.class);
}
@Override
- protected StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
- return mMock;
+ public StatusIconDisplayable getViewAt(int index) {
+ return (StatusIconDisplayable) mGroup.getChildAt(index);
+ }
+
+ @Override
+ protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
+ StatusBarIcon icon) {
+ StatusBarIconView mock = mock(StatusBarIconView.class);
+ mGroup.addView(mock, index);
+
+ return mock;
+ }
+
+ @Override
+ protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) {
+ StatusBarWifiView mock = mock(StatusBarWifiView.class);
+ mGroup.addView(mock, index);
+ return mock;
+ }
+
+ @Override
+ protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) {
+ StatusBarMobileView mock = mock(StatusBarMobileView.class);
+ mGroup.addView(mock, index);
+
+ return mock;
}
}
+ private interface TestableIconManager {
+ StatusIconDisplayable getViewAt(int index);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index f13fa4e..b31a2dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -18,7 +18,9 @@
import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.fail;
@@ -39,6 +41,7 @@
import android.app.StatusBarManager;
import android.app.trust.TrustManager;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.hardware.fingerprint.FingerprintManager;
import android.metrics.LogMaker;
import android.os.Binder;
@@ -55,6 +58,8 @@
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.SparseArray;
+import android.view.Gravity;
+import android.view.View;
import android.view.ViewGroup.LayoutParams;
import com.android.internal.logging.MetricsLogger;
@@ -65,13 +70,17 @@
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.UiOffloadThread;
import com.android.systemui.assist.AssistManager;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.classifier.FalsingManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.AppOpsListener;
import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.FooterView;
+import com.android.systemui.statusbar.FooterViewButton;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationData.Entry;
@@ -84,25 +93,28 @@
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
-import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.function.Predicate;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -125,6 +137,8 @@
@Mock private NotificationViewHierarchyManager mViewHierarchyManager;
@Mock private VisualStabilityManager mVisualStabilityManager;
@Mock private NotificationListener mNotificationListener;
+ @Mock private KeyguardViewMediator mKeyguardViewMediator;
+ @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
private TestableStatusBar mStatusBar;
private FakeMetricsLogger mMetricsLogger;
@@ -137,9 +151,7 @@
MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(AssistManager.class);
mDependency.injectMockDependency(DeviceProvisionedController.class);
- mDependency.injectMockDependency(NotificationGroupManager.class);
mDependency.injectMockDependency(NotificationGutsManager.class);
- mDependency.injectMockDependency(NotificationRemoteInputManager.class);
mDependency.injectMockDependency(NotificationMediaManager.class);
mDependency.injectMockDependency(ForegroundServiceController.class);
mDependency.injectTestDependency(NotificationViewHierarchyManager.class,
@@ -193,7 +205,12 @@
mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
mEntryManager, mScrimController, mFingerprintUnlockController,
- mock(ActivityLaunchAnimator.class));
+ mock(ActivityLaunchAnimator.class), mKeyguardViewMediator,
+ mock(NotificationRemoteInputManager.class), mock(NotificationGroupManager.class),
+ mock(FalsingManager.class), mock(StatusBarWindowManager.class),
+ mock(NotificationIconAreaController.class), mock(DozeScrimController.class),
+ mock(NotificationShelf.class), mLockscreenUserManager,
+ mock(CommandQueue.class));
mStatusBar.mContext = mContext;
mStatusBar.mComponents = mContext.getComponents();
mEntryManager.setUpForTest(mStatusBar, mStackScroller, mStatusBar, mHeadsUpManager,
@@ -520,11 +537,7 @@
@Test
@RunWithLooper(setAsMainLooper = true)
public void testUpdateKeyguardState_DoesNotCrash() {
- mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class);
mStatusBar.mState = StatusBarState.KEYGUARD;
- mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
- mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
- mStatusBar.mLockscreenUserManager = mock(NotificationLockscreenUserManager.class);
when(mStatusBar.mLockscreenUserManager.getCurrentProfiles()).thenReturn(
new SparseArray<>());
mStatusBar.updateKeyguardState(false, false);
@@ -532,9 +545,6 @@
@Test
public void testFingerprintNotification_UpdatesScrims() {
- mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
- mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
- mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class);
mStatusBar.notifyFpAuthModeChanged();
verify(mScrimController).transitionTo(any(), any());
}
@@ -558,6 +568,94 @@
verify(mScrimController).setKeyguardOccluded(eq(false));
}
+ @Test
+ public void testInflateFooterView() {
+ mStatusBar.reevaluateStyles();
+ ArgumentCaptor<FooterView> captor = ArgumentCaptor.forClass(FooterView.class);
+ verify(mStackScroller).setFooterView(captor.capture());
+
+ assertNotNull(captor.getValue().findViewById(R.id.manage_text).hasOnClickListeners());
+ assertNotNull(captor.getValue().findViewById(R.id.dismiss_text).hasOnClickListeners());
+ }
+
+ @Test
+ public void testUpdateFooter_noNotifications() {
+ mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ assertEquals(0, mEntryManager.getNotificationData().getActiveNotifications().size());
+
+ mStatusBar.updateFooter();
+ verify(mStackScroller).updateFooterView(false, false);
+ }
+
+ @Test
+ public void testUpdateFooter_oneClearableNotification() {
+ mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ ArrayList<Entry> entries = new ArrayList<>();
+ entries.add(mock(Entry.class));
+ when(mNotificationData.getActiveNotifications()).thenReturn(entries);
+
+ ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
+ when(row.canViewBeDismissed()).thenReturn(true);
+ when(mStackScroller.getChildCount()).thenReturn(1);
+ when(mStackScroller.getChildAt(anyInt())).thenReturn(row);
+
+ mStatusBar.updateFooter();
+ verify(mStackScroller).updateFooterView(true, true);
+ }
+
+ @Test
+ public void testUpdateFooter_oneNonClearableNotification() {
+ mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ ArrayList<Entry> entries = new ArrayList<>();
+ entries.add(mock(Entry.class));
+ when(mNotificationData.getActiveNotifications()).thenReturn(entries);
+
+ mStatusBar.updateFooter();
+ verify(mStackScroller).updateFooterView(true, false);
+ }
+
+ @Test
+ public void testUpdateFooter_atEnd() {
+ // add footer
+ mStatusBar.reevaluateStyles();
+
+ // add notification
+ ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
+ when(row.isClearable()).thenReturn(true);
+ mStackScroller.addContainerView(row);
+
+ mStatusBar.onUpdateRowStates();
+
+ // move footer to end
+ verify(mStackScroller).changeViewPosition(any(FooterView.class), eq(-1 /* end */));
+ }
+
+ @Test
+ public void testSetState_changesIsFullScreenUserSwitcherState() {
+ mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
+ assertFalse(mStatusBar.isFullScreenUserSwitcherState());
+
+ mStatusBar.setBarStateForTest(StatusBarState.FULLSCREEN_USER_SWITCHER);
+ assertTrue(mStatusBar.isFullScreenUserSwitcherState());
+ }
+
+ @Test
+ public void testShowKeyguardImplementation_setsState() {
+ when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
+
+ mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+
+ // By default, showKeyguardImpl sets state to KEYGUARD.
+ mStatusBar.showKeyguardImpl();
+ assertTrue(mStatusBar.mState == StatusBarState.KEYGUARD);
+
+ // If useFullscreenUserSwitcher is true, state is set to FULLSCREEN_USER_SWITCHER.
+ mStatusBar.mUserSwitcherController = mock(UserSwitcherController.class);
+ when(mStatusBar.mUserSwitcherController.useFullscreenUserSwitcher()).thenReturn(true);
+ mStatusBar.showKeyguardImpl();
+ assertTrue(mStatusBar.mState == StatusBarState.FULLSCREEN_USER_SWITCHER);
+ }
+
static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man,
UnlockMethodCache unlock, KeyguardIndicationController key,
@@ -569,7 +667,16 @@
NotificationViewHierarchyManager viewHierarchyManager,
TestableNotificationEntryManager entryManager, ScrimController scrimController,
FingerprintUnlockController fingerprintUnlockController,
- ActivityLaunchAnimator launchAnimator) {
+ ActivityLaunchAnimator launchAnimator, KeyguardViewMediator keyguardViewMediator,
+ NotificationRemoteInputManager notificationRemoteInputManager,
+ NotificationGroupManager notificationGroupManager,
+ FalsingManager falsingManager,
+ StatusBarWindowManager statusBarWindowManager,
+ NotificationIconAreaController notificationIconAreaController,
+ DozeScrimController dozeScrimController,
+ NotificationShelf notificationShelf,
+ NotificationLockscreenUserManager notificationLockscreenUserManager,
+ CommandQueue commandQueue) {
mStatusBarKeyguardViewManager = man;
mUnlockMethodCache = unlock;
mKeyguardIndicationController = key;
@@ -587,6 +694,17 @@
mScrimController = scrimController;
mFingerprintUnlockController = fingerprintUnlockController;
mActivityLaunchAnimator = launchAnimator;
+ mKeyguardViewMediator = keyguardViewMediator;
+ mClearAllEnabled = true;
+ mRemoteInputManager = notificationRemoteInputManager;
+ mGroupManager = notificationGroupManager;
+ mFalsingManager = falsingManager;
+ mStatusBarWindowManager = statusBarWindowManager;
+ mNotificationIconAreaController = notificationIconAreaController;
+ mDozeScrimController = dozeScrimController;
+ mNotificationShelf = notificationShelf;
+ mLockscreenUserManager = notificationLockscreenUserManager;
+ mCommandQueue = commandQueue;
}
private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index 2afb48c..ed0f9ab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -18,7 +18,6 @@
import android.os.HandlerThread;
import android.support.test.runner.AndroidJUnit4;
import android.telephony.SubscriptionInfo;
-import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -81,7 +80,8 @@
boolean in = true;
boolean out = true;
String description = "Test";
- mHandler.setWifiIndicators(enabled, status, qs, in, out, description, true);
+ String secondaryLabel = "Secondary label";
+ mHandler.setWifiIndicators(enabled, status, qs, in, out, description, true, secondaryLabel);
waitForCallbacks();
ArgumentCaptor<Boolean> enableArg = ArgumentCaptor.forClass(Boolean.class);
@@ -91,9 +91,10 @@
ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<Boolean> isTransient = ArgumentCaptor.forClass(Boolean.class);
+ ArgumentCaptor<String> secondary = ArgumentCaptor.forClass(String.class);
Mockito.verify(mSignalCallback).setWifiIndicators(enableArg.capture(),
statusArg.capture(), qsArg.capture(), inArg.capture(), outArg.capture(),
- descArg.capture(), isTransient.capture());
+ descArg.capture(), isTransient.capture(), secondary.capture());
assertEquals(enabled, (boolean) enableArg.getValue());
assertEquals(status, statusArg.getValue());
assertEquals(qs, qsArg.getValue());
@@ -101,6 +102,7 @@
assertEquals(out, (boolean) outArg.getValue());
assertEquals(description, descArg.getValue());
assertTrue(isTransient.getValue());
+ assertEquals(secondaryLabel, secondary.getValue());
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index fc3de84..d30e777 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -5,8 +5,6 @@
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.net.wifi.WifiSsid;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -20,6 +18,7 @@
import static junit.framework.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.when;
@@ -39,6 +38,7 @@
verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
setWifiState(true, testSsid);
+ setWifiLevel(0);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]);
for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
@@ -160,7 +160,8 @@
ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
- anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean());
+ anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean(),
+ any());
assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue());
assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue());
}
@@ -173,7 +174,7 @@
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
enabledArg.capture(), any(), iconArg.capture(), anyBoolean(),
- anyBoolean(), descArg.capture(), anyBoolean());
+ anyBoolean(), descArg.capture(), anyBoolean(), any());
IconState iconState = iconArg.getValue();
assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue());
assertEquals("WiFi connected, in quick settings", connected, iconState.visible);
@@ -186,7 +187,7 @@
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(),
- any(), anyBoolean());
+ any(), anyBoolean(), any());
IconState iconState = iconArg.getValue();
assertEquals("WiFi visible, in status bar", visible, iconState.visible);
assertEquals("WiFi signal, in status bar", icon, iconState.icon);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayoutTest.java
index 6fa91ff..cd3031b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayoutTest.java
@@ -16,40 +16,87 @@
package com.android.systemui.statusbar.stack;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
+import com.android.systemui.ExpandHelper;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.TestableDependency;
import com.android.systemui.statusbar.EmptyShadeView;
+import com.android.systemui.statusbar.FooterView;
+import com.android.systemui.statusbar.NotificationBlockingHelperManager;
+import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBar;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+/**
+ * Tests for {@link NotificationStackScrollLayout}.
+ */
@SmallTest
@RunWith(AndroidJUnit4.class)
public class NotificationStackScrollLayoutTest extends SysuiTestCase {
private NotificationStackScrollLayout mStackScroller;
- private StatusBar mBar;
+
+ @Rule public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock private StatusBar mBar;
+ @Mock private HeadsUpManagerPhone mHeadsUpManager;
+ @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
+ @Mock private NotificationGroupManager mGroupManager;
+ @Mock private ExpandHelper mExpandHelper;
+ @Mock private EmptyShadeView mEmptyShadeView;
@Before
@UiThreadTest
public void setUp() throws Exception {
+ // Inject dependencies before initializing the layout
+ mDependency.injectTestDependency(
+ NotificationBlockingHelperManager.class,
+ mBlockingHelperManager);
+
+ NotificationShelf notificationShelf = spy(new NotificationShelf(getContext(), null));
mStackScroller = new NotificationStackScrollLayout(getContext());
- mBar = mock(StatusBar.class);
+ mStackScroller.setShelf(notificationShelf);
mStackScroller.setStatusBar(mBar);
mStackScroller.setScrimController(mock(ScrimController.class));
+ mStackScroller.setHeadsUpManager(mHeadsUpManager);
+ mStackScroller.setGroupManager(mGroupManager);
+ mStackScroller.setEmptyShadeView(mEmptyShadeView);
+
+ // Stub out functionality that isn't necessary to test.
+ doNothing().when(mBar)
+ .executeRunnableDismissingKeyguard(any(Runnable.class),
+ any(Runnable.class),
+ anyBoolean(),
+ anyBoolean(),
+ anyBoolean());
+ doNothing().when(mGroupManager).collapseAllGroups();
+ doNothing().when(mExpandHelper).cancelImmediately();
+ doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean());
}
@Test
@@ -73,25 +120,59 @@
@Test
public void updateEmptyView_dndSuppressing() {
- EmptyShadeView view = mock(EmptyShadeView.class);
- mStackScroller.setEmptyShadeView(view);
- when(view.willBeGone()).thenReturn(true);
+ when(mEmptyShadeView.willBeGone()).thenReturn(true);
when(mBar.areNotificationsHidden()).thenReturn(true);
mStackScroller.updateEmptyShadeView(true);
- verify(view).setText(R.string.dnd_suppressing_shade_text);
+ verify(mEmptyShadeView).setText(R.string.dnd_suppressing_shade_text);
}
@Test
public void updateEmptyView_dndNotSuppressing() {
- EmptyShadeView view = mock(EmptyShadeView.class);
- mStackScroller.setEmptyShadeView(view);
- when(view.willBeGone()).thenReturn(true);
+ mStackScroller.setEmptyShadeView(mEmptyShadeView);
+ when(mEmptyShadeView.willBeGone()).thenReturn(true);
when(mBar.areNotificationsHidden()).thenReturn(false);
mStackScroller.updateEmptyShadeView(true);
- verify(view).setText(R.string.empty_shade_text);
+ verify(mEmptyShadeView).setText(R.string.empty_shade_text);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testSetExpandedHeight_blockingHelperManagerReceivedCallbacks() {
+ mStackScroller.setExpandedHeight(0f);
+ verify(mBlockingHelperManager).setNotificationShadeExpanded(0f);
+ reset(mBlockingHelperManager);
+
+ mStackScroller.setExpandedHeight(100f);
+ verify(mBlockingHelperManager).setNotificationShadeExpanded(100f);
+ }
+
+ @Test
+ public void manageNotifications_visible() {
+ FooterView view = mock(FooterView.class);
+ mStackScroller.setFooterView(view);
+ when(view.willBeGone()).thenReturn(true);
+ when(view.isSecondaryVisible()).thenReturn(true);
+
+ mStackScroller.updateFooterView(true, false);
+
+ verify(view).setVisibility(View.VISIBLE);
+ verify(view).performSecondaryVisibilityAnimation(false);
+ }
+
+ @Test
+ public void clearAll_visible() {
+ FooterView view = mock(FooterView.class);
+ mStackScroller.setFooterView(view);
+ when(view.willBeGone()).thenReturn(true);
+ when(view.isSecondaryVisible()).thenReturn(false);
+
+ mStackScroller.updateFooterView(true, true);
+
+ verify(view).setVisibility(View.VISIBLE);
+ verify(view).performSecondaryVisibilityAnimation(true);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
index 80dc2c9..50b4f3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
@@ -60,7 +60,8 @@
NotificationChannels.SCREENSHOTS_HEADSUP,
NotificationChannels.STORAGE,
NotificationChannels.GENERAL,
- NotificationChannels.BATTERY
+ NotificationChannels.BATTERY,
+ NotificationChannels.HINTS
));
NotificationChannels.createAll(mContext);
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
index 6b501af..8e34685 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
@@ -19,6 +19,9 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
+import java.util.List;
public class FakeStatusBarIconController extends BaseLeakChecker<IconManager>
implements StatusBarIconController {
@@ -53,12 +56,23 @@
}
@Override
- public void setIconVisibility(String slotTty, boolean b) {
-
+ public void setSignalIcon(String slot, WifiIconState state) {
}
@Override
- public void removeIcon(String slot) {
-
+ public void setMobileIcons(String slot, List<MobileIconState> states) {
}
+
+ @Override
+ public void setIconVisibility(String slotTty, boolean b) {
+ }
+
+ @Override
+ public void removeIcon(String slot, int tag) {
+ }
+
+ @Override
+ public void removeAllIconsForSlot(String slot) {
+ }
+
}
diff --git a/packages/VpnDialogs/res/values-de/strings.xml b/packages/VpnDialogs/res/values-de/strings.xml
index b1cebf8..d901104 100644
--- a/packages/VpnDialogs/res/values-de/strings.xml
+++ b/packages/VpnDialogs/res/values-de/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Verbindungsanfrage"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lasse die Verbindung nur zu, wenn die App vertrauenswürdig ist. <br /> <br /> <img src=vpn_icon /> wird oben am Display angezeigt, wenn VPN aktiv ist."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. <br /> <br /> <img src=vpn_icon /> wird oben am Display angezeigt, wenn VPN aktiv ist."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN ist verbunden"</string>
<string name="session" msgid="6470628549473641030">"Sitzung:"</string>
<string name="duration" msgid="3584782459928719435">"Dauer:"</string>
diff --git a/packages/VpnDialogs/res/values-in/strings.xml b/packages/VpnDialogs/res/values-in/strings.xml
index 386c24a..18ef372a 100644
--- a/packages/VpnDialogs/res/values-in/strings.xml
+++ b/packages/VpnDialogs/res/values-in/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Permintaan sambungan"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> ingin menyiapkan sambungan VPN yang memungkinkannya memantau lalu-lintas jaringan. Terima hanya jika Anda memercayai sumber. <br /> <br /> <img src=vpn_icon /> muncul di bagian atas layar Anda saat VPN aktif."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> ingin menyiapkan sambungan VPN yang memungkinkannya memantau traffic jaringan. Terima hanya jika Anda memercayai sumber. <br /> <br /> <img src=vpn_icon /> muncul di bagian atas layar Anda saat VPN aktif."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN tersambung"</string>
<string name="session" msgid="6470628549473641030">"Sesi:"</string>
<string name="duration" msgid="3584782459928719435">"Durasi:"</string>
diff --git a/packages/VpnDialogs/res/values-ja/strings.xml b/packages/VpnDialogs/res/values-ja/strings.xml
index 9dbf38b..8480692 100644
--- a/packages/VpnDialogs/res/values-ja/strings.xml
+++ b/packages/VpnDialogs/res/values-ja/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"接続リクエスト"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g>がネットワークトラフィックを監視するためVPN接続をセットアップしようとしています。ソースを信頼できる場合にのみ許可してください。<br /> <br /> VPNがアクティブになると画面の上部に<img src=vpn_icon />が表示されます。"</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> がネットワーク トラフィックを監視するため VPN 接続をセットアップしようとしています。信頼できるソースである場合にのみ許可してください。<br /> <br /> VPN がアクティブになると画面の上部に <img src=vpn_icon /> が表示されます。"</string>
<string name="legacy_title" msgid="192936250066580964">"VPN接続済み"</string>
<string name="session" msgid="6470628549473641030">"セッション:"</string>
<string name="duration" msgid="3584782459928719435">"期間:"</string>
diff --git a/packages/VpnDialogs/res/values-or/strings.xml b/packages/VpnDialogs/res/values-or/strings.xml
index 93f56ba..f1122eb 100644
--- a/packages/VpnDialogs/res/values-or/strings.xml
+++ b/packages/VpnDialogs/res/values-or/strings.xml
@@ -24,20 +24,13 @@
<string name="data_transmitted" msgid="7988167672982199061">"ପଠାଯାଇଛି:"</string>
<string name="data_received" msgid="4062776929376067820">"ପ୍ରାପ୍ତ ହୋଇଛି:"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ବାଇଟ୍ସ <xliff:g id="NUMBER_1">%2$s</xliff:g> ପ୍ୟାକେଟ୍ସ"</string>
- <!-- no translation found for always_on_disconnected_title (1906740176262776166) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message (555634519845992917) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) -->
- <skip />
- <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) -->
- <skip />
+ <string name="always_on_disconnected_title" msgid="1906740176262776166">"ସର୍ବଦା-ଅନ୍ ଥିବା VPN ସହ କନେକ୍ଟ କରିପାରିବ ନାହିଁ"</string>
+ <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> ସବୁ ସମୟରେ କନେକ୍ଟ ହୋଇ ରହିବା ପାଇଁ ସେଟଅପ୍ କରାଯାଇଛି। ଆପଣଙ୍କ ଫୋନ୍, <xliff:g id="VPN_APP_1">%1$s</xliff:g> ସହ କନେକ୍ଟ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଏକ ପବ୍ଲିକ୍ ନେଟ୍ୱର୍କ ବ୍ୟବହାର କରିବ।"</string>
+ <string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"<xliff:g id="VPN_APP">%1$s</xliff:g> ସବୁ ସମୟରେ କନେକ୍ଟ ହୋଇରହିବାକୁ ସେଟଅପ୍ କରାଯାଇଛି, କିନ୍ତୁ ଏହା ବର୍ତ୍ତମାନ କନେକ୍ଟ କରିପାରୁ ନାହିଁ। VPN ପୁଣି କନେକ୍ଟ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣଙ୍କର କୌଣସି କନେକ୍ସନ୍ ରହିବନାହିଁ।"</string>
+ <string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string>
+ <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"VPN ସେଟିଙ୍ଗ ବଦଳାନ୍ତୁ"</string>
<string name="configure" msgid="4905518375574791375">"କନଫିଗର୍ କରନ୍ତୁ"</string>
<string name="disconnect" msgid="971412338304200056">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string>
- <!-- no translation found for open_app (3717639178595958667) -->
- <skip />
- <!-- no translation found for dismiss (6192859333764711227) -->
- <skip />
+ <string name="open_app" msgid="3717639178595958667">"ଆପ୍ ଖୋଲନ୍ତୁ"</string>
+ <string name="dismiss" msgid="6192859333764711227">"ଖାରଜ କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-zh-rCN/strings.xml b/packages/VpnDialogs/res/values-zh-rCN/strings.xml
index 0bd62ce..734fa80 100644
--- a/packages/VpnDialogs/res/values-zh-rCN/strings.xml
+++ b/packages/VpnDialogs/res/values-zh-rCN/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"网络连接请求"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g>想要设置一个 VPN 连接,以允许其监控网络流量。除非您信任该来源,否则请勿接受此请求。启用 VPN 时,您的屏幕顶部会显示 <img src=vpn_icon /> 图标。"</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> 想要设置一个 VPN 连接,以允许其监控网络流量。除非您信任该来源,否则请勿接受此请求。启用 VPN 时,您的屏幕顶部会显示 <img src=vpn_icon /> 图标。"</string>
<string name="legacy_title" msgid="192936250066580964">"已连接VPN"</string>
<string name="session" msgid="6470628549473641030">"会话:"</string>
<string name="duration" msgid="3584782459928719435">"时长:"</string>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-am/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-am/strings.xml
new file mode 100644
index 0000000..b6c4de1
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"የማዕዘን ማሳያ ቅርጽ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ar/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ar/strings.xml
new file mode 100644
index 0000000..9517eb2
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"صورة مقطوعة لشاشة جانبية"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-as/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..1ba9d7a0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"কৌণিক ডিছপ্লে কাটআউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..41dfd3a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Izrezana slika u uglu ekrana"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-cs/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-cs/strings.xml
new file mode 100644
index 0000000..fd43995
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Rohový výřez displeje"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fa/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fa/strings.xml
new file mode 100644
index 0000000..bfbaa5c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"نمایشگر با گوشههای بریده"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..4110d51
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Découpe d\'écran en coin"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-hy/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-hy/strings.xml
new file mode 100644
index 0000000..656ae24
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Էկրանի անկյունի կտրվածք"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-is/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-is/strings.xml
new file mode 100644
index 0000000..755360f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Hornskjáskurður"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-iw/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-iw/strings.xml
new file mode 100644
index 0000000..bfb4797
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"חיתוך פינות התצוגה"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lt/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lt/strings.xml
new file mode 100644
index 0000000..e4b01ba
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Kampinė ekrano išpjova"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lv/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lv/strings.xml
new file mode 100644
index 0000000..3087b63
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Stūra ekrāna izgriezums"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-or/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..620d36f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"କର୍ନର୍ ଡିସ୍ପ୍ଲେ କଟଆଉଟ୍"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml
new file mode 100644
index 0000000..fa8fefb
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Сделать вырез в углу экрана"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-sr/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-sr/strings.xml
new file mode 100644
index 0000000..4c5701a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Изрезана слика у углу екрана"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-tl/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-tl/strings.xml
new file mode 100644
index 0000000..3d4552e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"Display cutout sa sulok"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..4cb357b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4967302169856689448">"边角显示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-as/strings.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..0b93c40
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="5659433562878674546">"দ্বৈত ডিছপ্লে কাটআউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-or/strings.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..1a5d801
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="5659433562878674546">"ଡବଲ୍ ଡିସ୍ପ୍ଲେ କଟଆଉଟ୍"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-af/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-af/strings.xml
new file mode 100644
index 0000000..98b4303
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-af/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Uitsnede vir smal vertoonskerm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-am/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-am/strings.xml
new file mode 100644
index 0000000..2fc0dbe
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"የጠባብ ማሳያ ቅርጽ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ar/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ar/strings.xml
new file mode 100644
index 0000000..aae2ada
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"صورة مقطوعة لشاشة ضيقة"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-as/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..181bcbf
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ঠেক ডিছপ্লে কাটআউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-az/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-az/strings.xml
new file mode 100644
index 0000000..f5b856b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Dar ekran profili"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..0a9aaaf
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Izrezana slika za uske ekrane"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-be/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-be/strings.xml
new file mode 100644
index 0000000..189f1ccd
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Зрабіць выраз на экране больш вузкім"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bg/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bg/strings.xml
new file mode 100644
index 0000000..d236710
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Тесен прорез на екрана"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bn/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bn/strings.xml
new file mode 100644
index 0000000..301d686
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ন্যারো ডিসপ্লে কাট-আউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bs/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bs/strings.xml
new file mode 100644
index 0000000..8ceaac5
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-bs/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Uski urez ekrana"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ca/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ca/strings.xml
new file mode 100644
index 0000000..ab9061e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Retall de pantalla estret"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-cs/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-cs/strings.xml
new file mode 100644
index 0000000..440a2f0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Úzký výřez displeje"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-da/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-da/strings.xml
new file mode 100644
index 0000000..4372d56
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Smal udskæring på skærmen"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-de/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-de/strings.xml
new file mode 100644
index 0000000..a92a24a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Schmaler Display-Ausschnitt"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-el/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-el/strings.xml
new file mode 100644
index 0000000..69adde3
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Διακοπή στενής οθόνης"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rAU/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..bf2624f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Narrow display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..bf2624f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Narrow display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rGB/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..bf2624f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Narrow display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rIN/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..bf2624f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Narrow display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rXC/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..7ba124fb
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Narrow display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es-rUS/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..f1d3348
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Recorte de pantalla estrecho"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es/strings.xml
new file mode 100644
index 0000000..a17a32c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Recorte estrecho de la pantalla"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-et/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-et/strings.xml
new file mode 100644
index 0000000..367b221
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Kitsas ekraani väljalõige"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-eu/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-eu/strings.xml
new file mode 100644
index 0000000..0fd9d9b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Pantailaren mozketa estua"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fa/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fa/strings.xml
new file mode 100644
index 0000000..43bfb2e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"نمایشگری با لبه باریک"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fi/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fi/strings.xml
new file mode 100644
index 0000000..540fbae
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Kapea aukko näytössä"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..d78f8b8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Découpe d\'affichage étroit"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr/strings.xml
new file mode 100644
index 0000000..4ee1b4f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Encoche pour écran étroit"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gl/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gl/strings.xml
new file mode 100644
index 0000000..9d01afd
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Recorte de pantalla estreito"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gu/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gu/strings.xml
new file mode 100644
index 0000000..7d9987e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-gu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"સાંકડું ડિસ્પ્લે કટઆઉટ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hi/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hi/strings.xml
new file mode 100644
index 0000000..32d6139
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"कम जगह वाला डिसप्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hr/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hr/strings.xml
new file mode 100644
index 0000000..00eca5b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Obrezana slika za uske zaslone"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hu/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hu/strings.xml
new file mode 100644
index 0000000..bfd2944
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Keskeny képernyőkivágás"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hy/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hy/strings.xml
new file mode 100644
index 0000000..2afecc8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Էկրանի նեղ կտրվածք"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-in/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-in/strings.xml
new file mode 100644
index 0000000..7728ab6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Potongan tampilan sempit"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-is/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-is/strings.xml
new file mode 100644
index 0000000..3d86080
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Mjór skjáskurður"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-it/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-it/strings.xml
new file mode 100644
index 0000000..419c12b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ritaglio display stretto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-iw/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-iw/strings.xml
new file mode 100644
index 0000000..ffde493
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-iw/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"חיתוך תצוגה צר"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ja/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ja/strings.xml
new file mode 100644
index 0000000..2b6a897
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"幅狭のディスプレイ カットアウト"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ka/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ka/strings.xml
new file mode 100644
index 0000000..e52a32f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ka/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ეკრანის ვიწრო ამოჭრა"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kk/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kk/strings.xml
new file mode 100644
index 0000000..ee0d72d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Жіңішке экран ойығы"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-km/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-km/strings.xml
new file mode 100644
index 0000000..c1faaa3c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-km/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ស្នាមចោះផ្ទាំងអេក្រង់តូច"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kn/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kn/strings.xml
new file mode 100644
index 0000000..b356b31
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-kn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ಕಿರಿದಾದ ಪ್ರದರ್ಶನ ಕಟೌಟ್"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ko/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ko/strings.xml
new file mode 100644
index 0000000..7175d52
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"좁은 디스플레이 컷아웃"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ky/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ky/strings.xml
new file mode 100644
index 0000000..97308ca
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ичке дисплей кесиндиси"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lo/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lo/strings.xml
new file mode 100644
index 0000000..6a0251b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lo/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ກ່ອງຂໍ້ຄວາມສະແດງຜົນແບບແຄບ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lt/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lt/strings.xml
new file mode 100644
index 0000000..cb8a54b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Siaura ekrano išpjova"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lv/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lv/strings.xml
new file mode 100644
index 0000000..c87bc3f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Šaurs ekrāna izgriezums"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mk/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mk/strings.xml
new file mode 100644
index 0000000..dd93e83
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Тесен исечок на екранот"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ml/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ml/strings.xml
new file mode 100644
index 0000000..3e12f05
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ml/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ഇടുങ്ങിയ ഡിസ്പ്ലേ കട്ടൗട്ട്"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mn/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mn/strings.xml
new file mode 100644
index 0000000..087ed4a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Дэлгэцийг нарийн болгож таслах"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mr/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mr/strings.xml
new file mode 100644
index 0000000..14a35da
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"अरुंद डिस्प्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ms/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ms/strings.xml
new file mode 100644
index 0000000..20edbd7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ms/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Potongan paparan sempit"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-my/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-my/strings.xml
new file mode 100644
index 0000000..4f84f2c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ကျဉ်းမြောင်းသည့် မျက်နှာပြင် ဖြတ်ညှပ်ပြသမှု"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nb/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nb/strings.xml
new file mode 100644
index 0000000..300e988
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Smalt skjermutklipp"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ne/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ne/strings.xml
new file mode 100644
index 0000000..9027414
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ne/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"साँघुरो प्रदर्शनसम्बन्धी कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nl/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nl/strings.xml
new file mode 100644
index 0000000..b6f7f02
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Smalle display-cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-or/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..031edf0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-or/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ସଙ୍କୀର୍ଣ୍ଣ ଡିସ୍ପ୍ଲେ କଟଆଉଟ୍"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pa/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pa/strings.xml
new file mode 100644
index 0000000..ddc0b11
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pa/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"ਤੰਗ ਡਿਸਪਲੇ ਕੱਟਆਊਟ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pl/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pl/strings.xml
new file mode 100644
index 0000000..f3261de
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Wąskie wycięcie wyświetlacza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..3af25e8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Corte da tela estreito"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..257c974
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ecrã estreito com recorte"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt/strings.xml
new file mode 100644
index 0000000..3af25e8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Corte da tela estreito"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ro/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ro/strings.xml
new file mode 100644
index 0000000..26d5448
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Decupare ecran îngustă"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ru/strings.xml
new file mode 100644
index 0000000..0b8693c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Сделать вырез на экране уже"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-si/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-si/strings.xml
new file mode 100644
index 0000000..0f4a8ff
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-si/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"පටු සංදර්ශක කටවුට්"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sk/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sk/strings.xml
new file mode 100644
index 0000000..4cda8d5
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Úzky výrez obrazovky"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sl/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sl/strings.xml
new file mode 100644
index 0000000..290df41
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ozek izrez prikaza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sq/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sq/strings.xml
new file mode 100644
index 0000000..be0a1e4
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Prerje e ngushtë ekrani"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sr/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sr/strings.xml
new file mode 100644
index 0000000..d0710ac
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Изрезана слика за уске екране"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sv/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sv/strings.xml
new file mode 100644
index 0000000..f8c4bc3
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Smalt urklipp av skärm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sw/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sw/strings.xml
new file mode 100644
index 0000000..1aa3014
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Mwonekeno wenye pengo jembamba"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ta/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ta/strings.xml
new file mode 100644
index 0000000..8481f29
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ta/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"குறுகிய கட்அவுட் காட்சி"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-te/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-te/strings.xml
new file mode 100644
index 0000000..4e71bac
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-te/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"సన్నని డిస్ప్లే కట్అవుట్"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-th/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-th/strings.xml
new file mode 100644
index 0000000..4989e86
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"คัตเอาท์ดิสเพลย์แบบแคบ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tl/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tl/strings.xml
new file mode 100644
index 0000000..3c88b3f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Manipis na display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tr/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tr/strings.xml
new file mode 100644
index 0000000..d84b758
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-tr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Dar ekran kesimi"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uk/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uk/strings.xml
new file mode 100644
index 0000000..b5109de
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Відключення вузького дисплея"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ur/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ur/strings.xml
new file mode 100644
index 0000000..5dba372
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"تنگ ڈسپلے کٹ آؤٹ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uz/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uz/strings.xml
new file mode 100644
index 0000000..64bf629
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-uz/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ekrandagi kesimni qisqartirish"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-vi/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-vi/strings.xml
new file mode 100644
index 0000000..0cf0602
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Cắt hiển thị hẹp"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..211ea2f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"窄型显示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..c187813
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"幼身顯示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..5799fed
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"窄型螢幕凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zu/strings.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zu/strings.xml
new file mode 100644
index 0000000..785ec6f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="6129374114103110395">"Ukusikwa kwesiboniso esimcingo"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-af/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-af/strings.xml
new file mode 100644
index 0000000..e561329
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Uitsnede vir lang vertoonskerm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-am/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-am/strings.xml
new file mode 100644
index 0000000..16a82a1
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"የረጅም ማሳያ ቅርጽ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ar/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ar/strings.xml
new file mode 100644
index 0000000..06cab99
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"صورة مقطوعة لشاشة طويلة"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-as/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..6adad3d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ওখ ডিছপ্লে কাটআউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-az/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-az/strings.xml
new file mode 100644
index 0000000..a14afc4
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Uzun ekran profili"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..2212e82
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Izrezana slika za visoke ekrane"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-be/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-be/strings.xml
new file mode 100644
index 0000000..53bb487
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Зрабіць выраз на экране больш высокім"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bg/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bg/strings.xml
new file mode 100644
index 0000000..a33cc39
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Голям прорез на екрана"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bn/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bn/strings.xml
new file mode 100644
index 0000000..8513761
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"টল ডিসপ্লে কাট-আউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bs/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bs/strings.xml
new file mode 100644
index 0000000..4f0ed61
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Dugačak urez ekrana"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ca/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ca/strings.xml
new file mode 100644
index 0000000..d264e34
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Retall de pantalla alt"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-cs/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-cs/strings.xml
new file mode 100644
index 0000000..fa5ceee
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Vysoký výřez displeje"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-da/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-da/strings.xml
new file mode 100644
index 0000000..75e2d5d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Stor udskæring på skærmen"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-de/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-de/strings.xml
new file mode 100644
index 0000000..6c65b16
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Hoher Display-Ausschnitt"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-el/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-el/strings.xml
new file mode 100644
index 0000000..1167237
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Διακοπή ψηλής οθόνης"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rAU/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..3a41cbe
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Tall display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..3a41cbe
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Tall display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rGB/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..3a41cbe
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Tall display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rIN/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..3a41cbe
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Tall display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rXC/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..db56bac
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Tall display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es-rUS/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..3223601
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Recorte de pantalla alto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es/strings.xml
new file mode 100644
index 0000000..1a73f18
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Recorte alto de la pantalla"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-et/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-et/strings.xml
new file mode 100644
index 0000000..ec84069
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Pikk ekraani väljalõige"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-eu/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-eu/strings.xml
new file mode 100644
index 0000000..7445925
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Pantailaren mozketa altua"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fa/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fa/strings.xml
new file mode 100644
index 0000000..57990e8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"نمایشگر با لبه بلند"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fi/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fi/strings.xml
new file mode 100644
index 0000000..4add280
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Korkea aukko näytössä"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..cf15b14
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Découpe d\'affichage haut"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr/strings.xml
new file mode 100644
index 0000000..f5db328
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Encoche pour écran haut"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gl/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gl/strings.xml
new file mode 100644
index 0000000..3223601
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Recorte de pantalla alto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gu/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gu/strings.xml
new file mode 100644
index 0000000..a9a1f4a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ઊંચું ડિસ્પ્લે કટઆઉટ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hi/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hi/strings.xml
new file mode 100644
index 0000000..dbd3e84
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"लंबा डिसप्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hr/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hr/strings.xml
new file mode 100644
index 0000000..34082f8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Obrezana slika za visoke zaslone"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hu/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hu/strings.xml
new file mode 100644
index 0000000..7b871c5
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Magas képernyőkivágás"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hy/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hy/strings.xml
new file mode 100644
index 0000000..ebff54c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Էկրանի բարձր կտրվածք"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-in/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-in/strings.xml
new file mode 100644
index 0000000..9740135
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Potongan tampilan tinggi"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-is/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-is/strings.xml
new file mode 100644
index 0000000..f039cb9
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Hár skjáskurður"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-it/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-it/strings.xml
new file mode 100644
index 0000000..af09afd
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ritaglio display alto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-iw/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-iw/strings.xml
new file mode 100644
index 0000000..faf3630
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"חיתוך תצוגה גבוה"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ja/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ja/strings.xml
new file mode 100644
index 0000000..86974bc
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"縦長のディスプレイ カットアウト"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ka/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ka/strings.xml
new file mode 100644
index 0000000..f84faba
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ეკრანის მაღალი ამოჭრა"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kk/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kk/strings.xml
new file mode 100644
index 0000000..8747ff0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ұзын экран ойығы"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-km/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-km/strings.xml
new file mode 100644
index 0000000..1741d58
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ស្នាមចោះផ្ទាំងអេក្រង់ជ្រៅ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kn/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kn/strings.xml
new file mode 100644
index 0000000..ce1beb4
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ಎತ್ತರದ ಪ್ರದರ್ಶನ ಕಟೌಟ್"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ko/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ko/strings.xml
new file mode 100644
index 0000000..c91015c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"세로로 긴 디스플레이 컷아웃"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ky/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ky/strings.xml
new file mode 100644
index 0000000..0fbf920
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Узун дисплей кесиндиси"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lo/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lo/strings.xml
new file mode 100644
index 0000000..f5ed0a8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ກ່ອງຂໍ້ຄວາມສະແດງຜົນແບບສູງ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lt/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lt/strings.xml
new file mode 100644
index 0000000..9afa5bd
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ilga ekrano išpjova"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lv/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lv/strings.xml
new file mode 100644
index 0000000..ec80989
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Augsts ekrāna izgriezums"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mk/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mk/strings.xml
new file mode 100644
index 0000000..b58b8ff
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Висок исечок на екранот"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ml/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ml/strings.xml
new file mode 100644
index 0000000..561ac16
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ഉയരമുളള ഡിസ്പ്ലേ കട്ടൗട്ട്"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mn/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mn/strings.xml
new file mode 100644
index 0000000..f45a11c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Дэлгэцийг өндөр болгож таслах"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mr/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mr/strings.xml
new file mode 100644
index 0000000..6f19f27
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"उंच डिस्प्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ms/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ms/strings.xml
new file mode 100644
index 0000000..1847595
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Potongan paparan tinggi"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-my/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-my/strings.xml
new file mode 100644
index 0000000..353d766
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ရှည်လျားသည့် မျက်နှာပြင် ဖြတ်ညှပ်ပြသမှု"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nb/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nb/strings.xml
new file mode 100644
index 0000000..ab1c4c6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Høyt skjermutklipp"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ne/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ne/strings.xml
new file mode 100644
index 0000000..c969172
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"अग्लो प्रदर्शनसम्बन्धी कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nl/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nl/strings.xml
new file mode 100644
index 0000000..d7db4a9
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Grote display-cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-or/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..2aba08b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ଉଚ୍ଚ ଡିସ୍ପ୍ଲେ କଟଆଉଟ୍"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pa/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pa/strings.xml
new file mode 100644
index 0000000..b10a5d0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"ਲੰਮਾ ਡਿਸਪਲੇ ਕੱਟਆਊਟ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pl/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pl/strings.xml
new file mode 100644
index 0000000..561947e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Wysokie wycięcie wyświetlacza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..893dd76
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Corte da tela alto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..817dfec
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ecrã grande com recorte"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt/strings.xml
new file mode 100644
index 0000000..893dd76
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Corte da tela alto"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ro/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ro/strings.xml
new file mode 100644
index 0000000..32d771c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Decupare ecran înaltă"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml
new file mode 100644
index 0000000..ef1a690
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Сделать вырез на экране выше"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-si/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-si/strings.xml
new file mode 100644
index 0000000..6d34b5bd
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"උස සංදර්ශක කටවුට්"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sk/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sk/strings.xml
new file mode 100644
index 0000000..553e08d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Vysoký výrez obrazovky"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sl/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sl/strings.xml
new file mode 100644
index 0000000..9ad38ca
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Visok izrez prikaza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sq/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sq/strings.xml
new file mode 100644
index 0000000..ab6fd63
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Prerje e lartë ekrani"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sr/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sr/strings.xml
new file mode 100644
index 0000000..4f457f6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Изрезана слика за високе екране"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sv/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sv/strings.xml
new file mode 100644
index 0000000..d0be3c3
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Avlångt urklipp av skärm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sw/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sw/strings.xml
new file mode 100644
index 0000000..463a703
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Mwonekeno wenye pengo ndefu"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ta/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ta/strings.xml
new file mode 100644
index 0000000..d7ccc78
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"உயரமான கட்அவுட் காட்சி"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-te/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-te/strings.xml
new file mode 100644
index 0000000..7de7e93
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"పొడవైన డిస్ప్లే కట్అవుట్"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-th/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-th/strings.xml
new file mode 100644
index 0000000..ad6256e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"คัตเอาท์ดิสเพลย์แบบสูง"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tl/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tl/strings.xml
new file mode 100644
index 0000000..e9568be
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Mataas na display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tr/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tr/strings.xml
new file mode 100644
index 0000000..1e75a40
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Uzun ekran kesimi"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uk/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uk/strings.xml
new file mode 100644
index 0000000..94a9369
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Відключення високого дисплея"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ur/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ur/strings.xml
new file mode 100644
index 0000000..f45451c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"لمبا ڈسپلے کٹ آؤٹ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uz/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uz/strings.xml
new file mode 100644
index 0000000..6d09785
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ekrandagi kesimni balandroq qilish"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-vi/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-vi/strings.xml
new file mode 100644
index 0000000..650a30b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Cắt hiển thị cao"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..4e4ff89
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"长型显示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..3aa87e0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"長身顯示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..cde32db
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"長型螢幕凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zu/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zu/strings.xml
new file mode 100644
index 0000000..ff1b633
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="4955013674374634273">"Ukusikwa kwesiboniso esinde"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-af/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-af/strings.xml
new file mode 100644
index 0000000..eda1e76
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Uitsnede vir wye vertoonskerm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-am/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-am/strings.xml
new file mode 100644
index 0000000..c1345dc
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"የሰፊ ማሳያ ቅርጽ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ar/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ar/strings.xml
new file mode 100644
index 0000000..0a7bfac
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"صورة مقطوعة لشاشة عريضة"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-as/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..49373e4
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"বহল ডিছপ্লে কাটআউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-az/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-az/strings.xml
new file mode 100644
index 0000000..3a78dfe6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Geniş ekran profili"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..b67afb9
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Izrezana slika za široke ekrane"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-be/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-be/strings.xml
new file mode 100644
index 0000000..a3a76f5
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Зрабіць выраз на экране больш шырокім"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bg/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bg/strings.xml
new file mode 100644
index 0000000..d0cf01d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Широк прорез на екрана"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bn/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bn/strings.xml
new file mode 100644
index 0000000..9ef4739
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ওয়াইড ডিসপ্লে কাট-আউট"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bs/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bs/strings.xml
new file mode 100644
index 0000000..0aaf27f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Široki urez ekrana"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ca/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ca/strings.xml
new file mode 100644
index 0000000..c9aa251
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Retall de pantalla ample"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-cs/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-cs/strings.xml
new file mode 100644
index 0000000..dcbb256
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Široký výřez displeje"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-da/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-da/strings.xml
new file mode 100644
index 0000000..b73b6ae
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Bred udskæring på skærmen"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-de/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-de/strings.xml
new file mode 100644
index 0000000..20537dc
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Breiter Display-Ausschnitt"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-el/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-el/strings.xml
new file mode 100644
index 0000000..04c5e387
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Διακοπή πλατιάς οθόνης"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rAU/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..cc0e6c7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Wide display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..cc0e6c7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Wide display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rGB/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..cc0e6c7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Wide display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rIN/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..cc0e6c7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Wide display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rXC/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..9310af8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Wide display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es-rUS/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..c88e12d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Recorte de pantalla ancho"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es/strings.xml
new file mode 100644
index 0000000..f63e427
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Recorte ancho de la pantalla"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-et/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-et/strings.xml
new file mode 100644
index 0000000..f3643a9
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Lai ekraani väljalõige"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-eu/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-eu/strings.xml
new file mode 100644
index 0000000..f13d7f6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Pantailaren mozketa zabala"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fa/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fa/strings.xml
new file mode 100644
index 0000000..13cbe2f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"نمایشگر با لبه پهن"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fi/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fi/strings.xml
new file mode 100644
index 0000000..2568605
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Leveä aukko näytössä"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..92faa6c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Découpe d\'affichage large"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr/strings.xml
new file mode 100644
index 0000000..3e104be
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Encoche pour écran large"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gl/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gl/strings.xml
new file mode 100644
index 0000000..deafd40
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Recorte de pantalla amplo"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gu/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gu/strings.xml
new file mode 100644
index 0000000..fc08278
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"પહોળું ડિસ્પ્લે કટઆઉટ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hi/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hi/strings.xml
new file mode 100644
index 0000000..cdea4bb
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"चौड़ा डिसप्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hr/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hr/strings.xml
new file mode 100644
index 0000000..fbb0858
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Obrezana slika za široke zaslone"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hu/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hu/strings.xml
new file mode 100644
index 0000000..b9a4729
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Széles képernyőkivágás"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hy/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hy/strings.xml
new file mode 100644
index 0000000..cfe4dbf
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Էկրանի լայն կտրվածք"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-in/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-in/strings.xml
new file mode 100644
index 0000000..91440fc
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Potongan tampilan lebar"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-is/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-is/strings.xml
new file mode 100644
index 0000000..367219b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Breiður skjáskurður"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-it/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-it/strings.xml
new file mode 100644
index 0000000..5349c40
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Ritaglio display largo"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-iw/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-iw/strings.xml
new file mode 100644
index 0000000..1a2fdd7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"חיתוך תצוגה רחב"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ja/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ja/strings.xml
new file mode 100644
index 0000000..f0fc0a2
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"幅広のディスプレイ カットアウト"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ka/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ka/strings.xml
new file mode 100644
index 0000000..8a6b89f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ეკრანის ფართო ამოჭრა"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kk/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kk/strings.xml
new file mode 100644
index 0000000..f3124de
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Жалпақ экран ойығы"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-km/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-km/strings.xml
new file mode 100644
index 0000000..6fc8643
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ស្នាមចោះផ្ទាំងអេក្រង់ធំ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kn/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kn/strings.xml
new file mode 100644
index 0000000..f95180d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ವಿಶಾಲ ಪ್ರದರ್ಶನ ಕಟೌಟ್"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ko/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ko/strings.xml
new file mode 100644
index 0000000..ea4f638
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"넓은 디스플레이 컷아웃"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ky/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ky/strings.xml
new file mode 100644
index 0000000..735034d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Жазы дисплей кесиндиси"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lo/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lo/strings.xml
new file mode 100644
index 0000000..8282319
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ກ່ອງຂໍ້ຄວາມສະແດງຜົນແບບກວ້າງ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lt/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lt/strings.xml
new file mode 100644
index 0000000..a46ae3d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Plati ekrano išpjova"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lv/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lv/strings.xml
new file mode 100644
index 0000000..9789d8c
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Plats ekrāna izgriezums"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mk/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mk/strings.xml
new file mode 100644
index 0000000..025c46e
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Широк исечок на екранот"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ml/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ml/strings.xml
new file mode 100644
index 0000000..9a47565
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"വിസ്തൃതമായ ഡിസ്പ്ലേ കട്ടൗട്ട്"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mn/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mn/strings.xml
new file mode 100644
index 0000000..a7d8b5a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Дэлгэцийг өргөн болгож таслах"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mr/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mr/strings.xml
new file mode 100644
index 0000000..50542af
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"रुंद डिस्प्ले कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ms/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ms/strings.xml
new file mode 100644
index 0000000..ad702b7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Potongan paparan lebar"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-my/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-my/strings.xml
new file mode 100644
index 0000000..94566da
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"မြင်ကွင်းကျယ် မျက်နှာပြင် ဖြတ်ညှပ်ပြသမှု"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nb/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nb/strings.xml
new file mode 100644
index 0000000..c84fc8b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Bredt skjermutklipp"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ne/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ne/strings.xml
new file mode 100644
index 0000000..718ca43
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"फराकिलो प्रदर्शनसम्बन्धी कटआउट"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nl/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nl/strings.xml
new file mode 100644
index 0000000..b57cac7
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Brede display-cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-or/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..b146134
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ଓସାରିଆ ଡିସ୍ପ୍ଲେ କଟଆଉଟ୍"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pa/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pa/strings.xml
new file mode 100644
index 0000000..c86889f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"ਚੌੜਾ ਡਿਸਪਲੇ ਕੱਟਆਊਟ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pl/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pl/strings.xml
new file mode 100644
index 0000000..082946f
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Szerokie wycięcie wyświetlacza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..16491f8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Corte da tela largo"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..03d3631
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Ecrã largo com recorte"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt/strings.xml
new file mode 100644
index 0000000..16491f8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Corte da tela largo"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ro/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ro/strings.xml
new file mode 100644
index 0000000..a1140a8
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Decupare ecran lată"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ru/strings.xml
new file mode 100644
index 0000000..f7d5ec6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Сделать вырез на экране шире"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-si/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-si/strings.xml
new file mode 100644
index 0000000..1be117b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"පුළුල් සංදර්ශක කටවුට්"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sk/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sk/strings.xml
new file mode 100644
index 0000000..059e584
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Široký výrez obrazovky"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sl/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sl/strings.xml
new file mode 100644
index 0000000..5c5b5a25
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Širok izrez prikaza"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sq/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sq/strings.xml
new file mode 100644
index 0000000..76271ac
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Prerje e gjerë ekrani"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sr/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sr/strings.xml
new file mode 100644
index 0000000..6670512
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Изрезана слика за широке екране"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sv/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sv/strings.xml
new file mode 100644
index 0000000..c624c05
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Brett urklipp av skärm"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sw/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sw/strings.xml
new file mode 100644
index 0000000..0414e8a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Mwonekeno wenye pengo pana"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ta/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ta/strings.xml
new file mode 100644
index 0000000..122a8b2
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"அகலமான கட்அவுட் காட்சி"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-te/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-te/strings.xml
new file mode 100644
index 0000000..1a0a3bf
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"వెడల్పైన డిస్ప్లే కట్అవుట్"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-th/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-th/strings.xml
new file mode 100644
index 0000000..f91a7b6
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"คัตเอาท์ดิสเพลย์แบบกว้าง"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tl/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tl/strings.xml
new file mode 100644
index 0000000..2f82c4b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Malapad na display cutout"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tr/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tr/strings.xml
new file mode 100644
index 0000000..01d77d58
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Geniş ekran kesimi"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uk/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uk/strings.xml
new file mode 100644
index 0000000..40b5c9d
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Відключення широкого дисплея"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ur/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ur/strings.xml
new file mode 100644
index 0000000..3bed22a
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"چوڑا ڈسپلے کٹ آؤٹ"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uz/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uz/strings.xml
new file mode 100644
index 0000000..c67c8ca
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Ekrandagi kesimni uzaytirish"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-vi/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-vi/strings.xml
new file mode 100644
index 0000000..c811af0
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Cắt hiển thị rộng"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..8aea673
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"宽型显示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..8a23136
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"闊身顯示屏凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..9d2921b
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"寬型螢幕凹口"</string>
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zu/strings.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zu/strings.xml
new file mode 100644
index 0000000..4a96281
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="display_cutout_emulation_overlay" msgid="3249818092477753587">"Ukusikwa kwesiboniso esibanzi"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml
new file mode 100644
index 0000000..33c6982
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Donker"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml
new file mode 100644
index 0000000..5979569
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ጨለማ"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml
new file mode 100644
index 0000000..7b20c01
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"داكن"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml
new file mode 100644
index 0000000..0910e7e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"গাঢ়"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml
new file mode 100644
index 0000000..a9db75c
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Qaranlıq"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..b63dcbc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml
new file mode 100644
index 0000000..eb875b3
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Цёмная"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml
new file mode 100644
index 0000000..7b39462
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Тъмно"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml
new file mode 100644
index 0000000..0910e7e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"গাঢ়"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml
new file mode 100644
index 0000000..b63dcbc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml
new file mode 100644
index 0000000..02ee226
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Fosc"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml
new file mode 100644
index 0000000..5d11f07
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tmavé"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml
new file mode 100644
index 0000000..460ebe7
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Mørk"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml
new file mode 100644
index 0000000..4b54b8e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dunkel"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml
new file mode 100644
index 0000000..c58061d
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Σκοτεινό"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..7c94a51
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..7c94a51
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..7c94a51
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..7c94a51
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..cbdd3d2
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..2717f0f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Oscuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml
new file mode 100644
index 0000000..2717f0f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Oscuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml
new file mode 100644
index 0000000..e0cce05
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tume"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml
new file mode 100644
index 0000000..44cee4c
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Iluna"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml
new file mode 100644
index 0000000..fdd1df5
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"تیره"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml
new file mode 100644
index 0000000..237fe70
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tumma"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..f92c2ef
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Sombre"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml
new file mode 100644
index 0000000..eac51d3
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Foncé"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml
new file mode 100644
index 0000000..300868f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml
new file mode 100644
index 0000000..6a4cd62
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ઘેરી"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml
new file mode 100644
index 0000000..c5bc0e2
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"गहरे रंग की थीम"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml
new file mode 100644
index 0000000..b63dcbc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml
new file mode 100644
index 0000000..84a3ab8
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Sötét"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml
new file mode 100644
index 0000000..555cb64
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Մուգ"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml
new file mode 100644
index 0000000..391451b
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Gelap"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml
new file mode 100644
index 0000000..f4d1531
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Dökkt"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml
new file mode 100644
index 0000000..b59155b
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Scuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml
new file mode 100644
index 0000000..3ecf444
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"כהה"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml
new file mode 100644
index 0000000..3a2dba0
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ダーク"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml
new file mode 100644
index 0000000..36bf77e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"მუქი"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml
new file mode 100644
index 0000000..913c0b1
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Қараңғы"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml
new file mode 100644
index 0000000..b56c490
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ងងឹត"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml
new file mode 100644
index 0000000..e757116
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ಕತ್ತಲೆ"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml
new file mode 100644
index 0000000..ca4ab1e
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"어두움"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml
new file mode 100644
index 0000000..e8e8279
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Караңгы"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml
new file mode 100644
index 0000000..0434a41
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ມືດ"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml
new file mode 100644
index 0000000..147779b
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamsi"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml
new file mode 100644
index 0000000..7a296ec
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tumšs"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml
new file mode 100644
index 0000000..6be693a
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Темна"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml
new file mode 100644
index 0000000..f8a24fa
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ഡാർക്ക്"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml
new file mode 100644
index 0000000..e65d9c7
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Бараан"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml
new file mode 100644
index 0000000..854af00
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"गडद"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml
new file mode 100644
index 0000000..391451b
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Gelap"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml
new file mode 100644
index 0000000..008e9c6
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"မှောင်သော"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml
new file mode 100644
index 0000000..460ebe7
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Mørk"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml
new file mode 100644
index 0000000..8f2c5ba
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"अँध्यारो"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml
new file mode 100644
index 0000000..33c6982
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Donker"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml
new file mode 100644
index 0000000..d8045bd
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ଗାଢ଼"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml
new file mode 100644
index 0000000..7110303
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ਗੂੜ੍ਹਾ"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml
new file mode 100644
index 0000000..25ca20f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Ciemna"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..300868f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..300868f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml
new file mode 100644
index 0000000..300868f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml
new file mode 100644
index 0000000..de73f36
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Întunecată"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml
new file mode 100644
index 0000000..b05e844
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Темный"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml
new file mode 100644
index 0000000..f0f5725
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"අඳුරු"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml
new file mode 100644
index 0000000..5df6895
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tmavý"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml
new file mode 100644
index 0000000..ad58250
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Temno"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml
new file mode 100644
index 0000000..0e1eae7
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"E errët"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml
new file mode 100644
index 0000000..1561ee2
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Тамно"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml
new file mode 100644
index 0000000..676de42
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Mörk"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml
new file mode 100644
index 0000000..cc1f120
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Nyeusi"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml
new file mode 100644
index 0000000..af98172
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"டார்க்"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml
new file mode 100644
index 0000000..446455f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"ముదురు రంగు"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml
new file mode 100644
index 0000000..9e3462b
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"เข้ม"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml
new file mode 100644
index 0000000..5502d90
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Madilim"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml
new file mode 100644
index 0000000..368b398
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Koyu"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml
new file mode 100644
index 0000000..6e67e45
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Темна тема"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml
new file mode 100644
index 0000000..1d5d6de
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"گہرا"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml
new file mode 100644
index 0000000..957c28f
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tungi"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml
new file mode 100644
index 0000000..a458889
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Tối"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..c9b43dc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..c9b43dc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..c9b43dc
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
+</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml
new file mode 100644
index 0000000..6d328da
--- /dev/null
+++ b/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sysui_overlay_dark" msgid="557336259295713662">"Emnyama"</string>
+</resources>
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 9417f04..c66c7b0 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5547,6 +5547,31 @@
// OS: P
ACTION_ANOMALY_TRIGGERED = 1367;
+ // ACTION: Settings > Condition > Device muted
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_CONDITION_DEVICE_MUTED = 1368;
+
+ // ACTION: Settings > Condition > Device vibrate
+ // CATEGORY: SETTINGS
+ // OS: P
+ SETTINGS_CONDITION_DEVICE_VIBRATE = 1369;
+
+ // OPEN: Settings > Connected devices > previously connected devices
+ // CATEGORY: SETTINGS
+ // OS: P
+ PREVIOUSLY_CONNECTED_DEVICES = 1370;
+
+ // ACTION: A Settings Slice is requested
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_SETTINGS_SLICE_REQUESTED = 1371;
+
+ // ACTION: A Settings Slice is updated with new value
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_SETTINGS_SLICE_CHANGED = 1372;
+
// ---- End P Constants, all P constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 608970f..f9af31c 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -208,6 +208,10 @@
// Package: android
NOTE_ZEN_UPGRADE = 48;
+ // Notification to suggest automatic battery saver.
+ // Package: android
+ NOTE_AUTO_SAVER_SUGGESTION = 49;
+
// ADD_NEW_IDS_ABOVE_THIS_LINE
// Legacy IDs with arbitrary values appear below
// Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index 39d0070..934ad88 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -249,12 +249,12 @@
optional int32 num_wificond_crashes = 54;
// Indicates the number of times an error was encountered in
- // Wifi HAL when wifi was turned on.
- optional int32 num_wifi_on_failure_due_to_hal = 55;
+ // Wifi HAL on |WifiNative.setupInterfaceForClientMode|.
+ optional int32 num_setup_client_interface_failure_due_to_hal = 55;
// Indicates the number of times an error was encountered in
- // Wificond when wifi was turned on.
- optional int32 num_wifi_on_failure_due_to_wificond = 56;
+ // Wificond on |WifiNative.setupInterfaceForClientMode|.
+ optional int32 num_setup_client_interface_failure_due_to_wificond = 56;
// Wi-Fi Aware metrics
optional WifiAwareLog wifi_aware_log = 57;
@@ -382,6 +382,46 @@
// WifiWake statistics
optional WifiWakeStats wifi_wake_stats = 94;
+
+ // Histogram counting instances of scans with N many 802.11mc (RTT) supporting APs
+ repeated NumConnectableNetworksBucket observed_80211mc_supporting_aps_in_scan_histogram = 95;
+
+ // Total number of times supplicant crashed.
+ optional int32 num_supplicant_crashes = 96;
+
+ // Total number of times hostapd crashed.
+ optional int32 num_hostapd_crashes = 97;
+
+ // Indicates the number of times an error was encountered in
+ // supplicant on |WifiNative.setupInterfaceForClientMode|.
+ optional int32 num_setup_client_interface_failure_due_to_supplicant = 98;
+
+ // Indicates the number of times an error was encountered in
+ // Wifi HAL on |WifiNative.setupInterfaceForSoftApMode|.
+ optional int32 num_setup_soft_ap_interface_failure_due_to_hal = 99;
+
+ // Indicates the number of times an error was encountered in
+ // Wifi HAL on |WifiNative.setupInterfaceForSoftApMode|.
+ optional int32 num_setup_soft_ap_interface_failure_due_to_wificond = 100;
+
+ // Indicates the number of times an error was encountered in
+ // Wifi HAL on |WifiNative.setupInterfaceForSoftApMode|.
+ optional int32 num_setup_soft_ap_interface_failure_due_to_hostapd = 101;
+
+ // Indicates the number of times we got an interface down in client mode.
+ optional int32 num_client_interface_down = 102;
+
+ // Indicates the number of times we got an interface down in softap mode.
+ optional int32 num_soft_ap_interface_down = 103;
+
+ // Indicates the number of scan requests from external apps.
+ optional int32 num_external_app_oneshot_scan_requests = 104;
+
+ // Indicates the number of times a scan request from an external foreground app was throttled.
+ optional int32 num_external_foreground_app_oneshot_scan_requests_throttled = 105;
+
+ // Indicates the number of times a scan request from an external background app was throttled.
+ optional int32 num_external_background_app_oneshot_scan_requests_throttled = 106;
}
// Information that gets logged for every WiFi connection.
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 8941b49..de112f9 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -853,11 +853,7 @@
if (mSecurityPolicy.findA11yWindowInfoById(windowId) == null) {
return null;
}
- IBinder token = mGlobalWindowTokens.get(windowId);
- if (token != null) {
- return token;
- }
- return getCurrentUserStateLocked().mWindowTokens.get(windowId);
+ return findWindowTokenLocked(windowId);
}
}
@@ -2527,6 +2523,14 @@
getInteractionBridge().clearAccessibilityFocusNotLocked(windowId);
}
+ private IBinder findWindowTokenLocked(int windowId) {
+ IBinder token = mGlobalWindowTokens.get(windowId);
+ if (token != null) {
+ return token;
+ }
+ return getCurrentUserStateLocked().mWindowTokens.get(windowId);
+ }
+
private int findWindowIdLocked(IBinder token) {
final int globalIndex = mGlobalWindowTokens.indexOfValue(token);
if (globalIndex >= 0) {
@@ -2986,7 +2990,7 @@
// the accessibility layer reports which are windows
// that a sighted user can touch.
default: {
- return isRetrievalAllowingWindow(event.getWindowId());
+ return isRetrievalAllowingWindowLocked(event.getWindowId());
}
}
}
@@ -3438,7 +3442,8 @@
public boolean canGetAccessibilityNodeInfoLocked(
AbstractAccessibilityServiceConnection service, int windowId) {
- return canRetrieveWindowContentLocked(service) && isRetrievalAllowingWindow(windowId);
+ return canRetrieveWindowContentLocked(service)
+ && isRetrievalAllowingWindowLocked(windowId);
}
public boolean canRetrieveWindowsLocked(AbstractAccessibilityServiceConnection service) {
@@ -3523,17 +3528,40 @@
|| userId == UserHandle.USER_CURRENT_OR_SELF);
}
- private boolean isRetrievalAllowingWindow(int windowId) {
+ private boolean isRetrievalAllowingWindowLocked(int windowId) {
// The system gets to interact with any window it wants.
if (Binder.getCallingUid() == Process.SYSTEM_UID) {
return true;
}
+ if (Binder.getCallingUid() == Process.SHELL_UID) {
+ if (!isShellAllowedToRetrieveWindowLocked(windowId)) {
+ return false;
+ }
+ }
if (windowId == mActiveWindowId) {
return true;
}
return findA11yWindowInfoById(windowId) != null;
}
+ private boolean isShellAllowedToRetrieveWindowLocked(int windowId) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ IBinder windowToken = findWindowTokenLocked(windowId);
+ if (windowToken == null) {
+ return false;
+ }
+ int userId = mWindowManagerService.getWindowOwnerUserId(windowToken);
+ if (userId == UserHandle.USER_NULL) {
+ return false;
+ }
+ return !mUserManager.hasUserRestriction(
+ UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.of(userId));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
public AccessibilityWindowInfo findA11yWindowInfoById(int windowId) {
return mA11yWindowInfoById.get(windowId);
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 009e723..3253f2e 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -19,8 +19,8 @@
import static android.Manifest.permission.MANAGE_AUTO_FILL;
import static android.content.Context.AUTOFILL_MANAGER_SERVICE;
-import static com.android.server.autofill.Helper.bundleToString;
import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sFullScreenMode;
import static com.android.server.autofill.Helper.sPartitionMaxCount;
import static com.android.server.autofill.Helper.sVisibleDatasetsMaxCount;
import static com.android.server.autofill.Helper.sVerbose;
@@ -80,7 +80,6 @@
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
-import com.android.server.autofill.AutofillManagerService.PackageCompatState;
import com.android.server.autofill.ui.AutoFillUI;
import java.io.FileDescriptor;
@@ -193,8 +192,7 @@
if (disabledBefore == disabledNow) {
// Nothing changed, do nothing.
if (sDebug) {
- Slog.d(TAG, "Autofill restriction did not change for user " + userId + ": "
- + bundleToString(newRestrictions));
+ Slog.d(TAG, "Autofill restriction did not change for user " + userId);
return;
}
}
@@ -449,7 +447,7 @@
}
// Called by Shell command.
- public int getMaxPartitions() {
+ int getMaxPartitions() {
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
synchronized (mLock) {
@@ -458,7 +456,7 @@
}
// Called by Shell command.
- public void setMaxPartitions(int max) {
+ void setMaxPartitions(int max) {
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
Slog.i(TAG, "setMaxPartitions(): " + max);
synchronized (mLock) {
@@ -467,7 +465,7 @@
}
// Called by Shell command.
- public int getMaxVisibleDatasets() {
+ int getMaxVisibleDatasets() {
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
synchronized (mLock) {
@@ -476,7 +474,7 @@
}
// Called by Shell command.
- public void setMaxVisibleDatasets(int max) {
+ void setMaxVisibleDatasets(int max) {
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
Slog.i(TAG, "setMaxVisibleDatasets(): " + max);
synchronized (mLock) {
@@ -485,7 +483,7 @@
}
// Called by Shell command.
- public void getScore(@Nullable String algorithmName, @NonNull String value1,
+ void getScore(@Nullable String algorithmName, @NonNull String value1,
@NonNull String value2, @NonNull RemoteCallback callback) {
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
@@ -496,6 +494,18 @@
Arrays.asList(AutofillValue.forText(value1)), new String[] { value2 });
}
+ // Called by Shell command.
+ Boolean getFullScreenMode() {
+ mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
+ return sFullScreenMode;
+ }
+
+ // Called by Shell command.
+ void setFullScreenMode(@Nullable Boolean mode) {
+ mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
+ sFullScreenMode = mode;
+ }
+
private void setDebugLocked(boolean debug) {
com.android.server.autofill.Helper.sDebug = debug;
android.view.autofill.Helper.sDebug = debug;
@@ -1036,6 +1046,18 @@
}
@Override
+ public void setAutofillFailure(int sessionId, @NonNull List<AutofillId> ids, int userId) {
+ synchronized (mLock) {
+ final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ service.setAutofillFailureLocked(sessionId, getCallingUid(), ids);
+ } else if (sVerbose) {
+ Slog.v(TAG, "setAutofillFailure(): no service for " + userId);
+ }
+ }
+ }
+
+ @Override
public void finishSession(int sessionId, int userId) {
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
@@ -1147,6 +1169,9 @@
pw.print("Disabled users: "); pw.println(mDisabledUsers);
pw.print("Max partitions per session: "); pw.println(sPartitionMaxCount);
pw.print("Max visible datasets: "); pw.println(sVisibleDatasetsMaxCount);
+ if (sFullScreenMode != null) {
+ pw.print("Overridden full-screen mode: "); pw.println(sFullScreenMode);
+ }
pw.println("User data constraints: "); UserData.dumpConstraints(prefix, pw);
final int size = mServicesCache.size();
pw.print("Cached services: ");
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index ef0d7e6..0bb29a7 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -404,6 +404,19 @@
}
@GuardedBy("mLock")
+ void setAutofillFailureLocked(int sessionId, int uid, @NonNull List<AutofillId> ids) {
+ if (!isEnabledLocked()) {
+ return;
+ }
+ final Session session = mSessions.get(sessionId);
+ if (session == null || uid != session.uid) {
+ Slog.v(TAG, "setAutofillFailure(): no session for " + sessionId + "(" + uid + ")");
+ return;
+ }
+ session.setAutofillFailureLocked(ids);
+ }
+
+ @GuardedBy("mLock")
void finishSessionLocked(int sessionId, int uid) {
if (!isEnabledLocked()) {
return;
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
index 1904061..c76c8ac 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
@@ -80,6 +80,12 @@
pw.println(" get max_visible_datasets");
pw.println(" Gets the maximum number of visible datasets in the UI.");
pw.println("");
+ pw.println(" get full_screen_mode");
+ pw.println(" Gets the Fill UI full screen mode");
+ pw.println("");
+ pw.println(" get fc_score [--algorithm ALGORITHM] value1 value2");
+ pw.println(" Gets the field classification score for 2 fields.");
+ pw.println("");
pw.println(" set log_level [off | debug | verbose]");
pw.println(" Sets the Autofill log level.");
pw.println("");
@@ -89,6 +95,9 @@
pw.println(" set max_visible_datasets number");
pw.println(" Sets the maximum number of visible datasets in the UI.");
pw.println("");
+ pw.println(" set full_screen_mode [true | false | default]");
+ pw.println(" Sets the Fill UI full screen mode");
+ pw.println("");
pw.println(" list sessions [--user USER_ID]");
pw.println(" Lists all pending sessions.");
pw.println("");
@@ -98,9 +107,6 @@
pw.println(" reset");
pw.println(" Resets all pending sessions and cached service connections.");
pw.println("");
- pw.println(" get fc_score [--algorithm ALGORITHM] value1 value2");
- pw.println(" Gets the field classification score for 2 fields.");
- pw.println("");
}
}
@@ -115,6 +121,8 @@
return getMaxVisibileDatasets(pw);
case "fc_score":
return getFieldClassificationScore(pw);
+ case "full_screen_mode":
+ return getFullScreenMode(pw);
default:
pw.println("Invalid set: " + what);
return -1;
@@ -131,6 +139,8 @@
return setMaxPartitions();
case "max_visible_datasets":
return setMaxVisibileDatasets();
+ case "full_screen_mode":
+ return setFullScreenMode(pw);
default:
pw.println("Invalid set: " + what);
return -1;
@@ -219,6 +229,36 @@
return waitForLatch(pw, latch);
}
+ private int getFullScreenMode(PrintWriter pw) {
+ final Boolean mode = mService.getFullScreenMode();
+ if (mode == null) {
+ pw.println("default");
+ } else if (mode) {
+ pw.println("true");
+ } else {
+ pw.println("false");
+ }
+ return 0;
+ }
+
+ private int setFullScreenMode(PrintWriter pw) {
+ final String mode = getNextArgRequired();
+ switch (mode.toLowerCase()) {
+ case "true":
+ mService.setFullScreenMode(Boolean.TRUE);
+ return 0;
+ case "false":
+ mService.setFullScreenMode(Boolean.FALSE);
+ return 0;
+ case "default":
+ mService.setFullScreenMode(null);
+ return 0;
+ default:
+ pw.println("Invalid mode: " + mode);
+ return -1;
+ }
+ }
+
private int requestDestroy(PrintWriter pw) {
if (!isNextArgSessions(pw)) {
return -1;
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 7bb532e..78526f5 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -70,32 +70,15 @@
*/
public static int sVisibleDatasetsMaxCount = 3;
+ /**
+ * When non-null, overrides whether the UI should be shown on full-screen mode.
+ */
+ public static Boolean sFullScreenMode = null;
+
private Helper() {
throw new UnsupportedOperationException("contains static members only");
}
- static void append(StringBuilder builder, Bundle bundle) {
- if (bundle == null || !sVerbose) {
- builder.append("null");
- return;
- }
- final Set<String> keySet = bundle.keySet();
- builder.append("[Bundle with ").append(keySet.size()).append(" extras:");
- for (String key : keySet) {
- final Object value = bundle.get(key);
- builder.append(' ').append(key).append('=');
- builder.append((value instanceof Object[])
- ? Arrays.toString((Objects[]) value) : value);
- }
- builder.append(']');
- }
-
- static String bundleToString(Bundle bundle) {
- final StringBuilder builder = new StringBuilder();
- append(builder, bundle);
- return builder.toString();
- }
-
@Nullable
static AutofillId[] toArray(@Nullable ArraySet<AutofillId> set) {
if (set == null) return null;
@@ -180,9 +163,11 @@
*
* @param structure Assist structure
* @param urlBarIds list of ids; only the first id found will be sanitized.
+ *
+ * @return the node containing the URL bar
*/
@Nullable
- public static void sanitizeUrlBar(@NonNull AssistStructure structure,
+ public static ViewNode sanitizeUrlBar(@NonNull AssistStructure structure,
@NonNull String[] urlBarIds) {
final ViewNode urlBarNode = findViewNode(structure, (node) -> {
return ArrayUtils.contains(urlBarIds, node.getIdEntry());
@@ -191,7 +176,7 @@
final String domain = urlBarNode.getText().toString();
if (domain.isEmpty()) {
if (sDebug) Slog.d(TAG, "sanitizeUrlBar(): empty on " + urlBarNode.getIdEntry());
- return;
+ return null;
}
urlBarNode.setWebDomain(domain);
if (sDebug) {
@@ -199,6 +184,7 @@
+ urlBarNode.getWebDomain());
}
}
+ return urlBarNode;
}
private interface ViewNodeFilter {
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 1e1de35..e14584f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -146,6 +146,13 @@
/** Whether the app being autofilled is running in compat mode. */
private final boolean mCompatMode;
+ /** Node representing the URL bar on compat mode. */
+ @GuardedBy("mLock")
+ private ViewNode mUrlBar;
+
+ @GuardedBy("mLock")
+ private boolean mSaveOnAllViewsInvisible;
+
@GuardedBy("mLock")
private final ArrayMap<AutofillId, ViewState> mViewStates = new ArrayMap<>();
@@ -280,7 +287,17 @@
Slog.d(TAG, "url_bars in compat mode: " + Arrays.toString(urlBarIds));
}
if (urlBarIds != null) {
- Helper.sanitizeUrlBar(structure, urlBarIds);
+ mUrlBar = Helper.sanitizeUrlBar(structure, urlBarIds);
+ if (mUrlBar != null) {
+ final AutofillId urlBarId = mUrlBar.getAutofillId();
+ if (sDebug) {
+ Slog.d(TAG, "Setting urlBar as id=" + urlBarId + " and domain "
+ + mUrlBar.getWebDomain());
+ }
+ final ViewState viewState = new ViewState(Session.this, urlBarId,
+ Session.this, ViewState.STATE_URL_BAR);
+ mViewStates.put(urlBarId, viewState);
+ }
}
}
structure.sanitizeForParceling(true);
@@ -1810,6 +1827,11 @@
}
viewState.setState(ViewState.STATE_STARTED_PARTITION);
requestNewFillResponseLocked(flags);
+ } else {
+ if (sVerbose) {
+ Slog.v(TAG, "Not starting new partition for view " + id + ": "
+ + viewState.getStateAsString());
+ }
}
}
@@ -1878,14 +1900,15 @@
return;
}
if (sVerbose) {
- Slog.v(TAG, "updateLocked(): id=" + id + ", action=" + action + ", flags=" + flags);
+ Slog.v(TAG, "updateLocked(): id=" + id + ", action=" + actionAsString(action)
+ + ", flags=" + flags);
}
ViewState viewState = mViewStates.get(id);
if (viewState == null) {
if (action == ACTION_START_SESSION || action == ACTION_VALUE_CHANGED
|| action == ACTION_VIEW_ENTERED) {
- if (sVerbose) Slog.v(TAG, "Creating viewState for " + id + " on " + action);
+ if (sVerbose) Slog.v(TAG, "Creating viewState for " + id);
boolean isIgnored = isIgnoredLocked(id);
viewState = new ViewState(this, id, this,
isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL);
@@ -1895,11 +1918,11 @@
// detectable, and batch-send them when the session is finished (but that will
// require tracking detectable fields on AutofillManager)
if (isIgnored) {
- if (sDebug) Slog.d(TAG, "updateLocked(): ignoring view " + id);
+ if (sDebug) Slog.d(TAG, "updateLocked(): ignoring view " + viewState);
return;
}
} else {
- if (sVerbose) Slog.v(TAG, "Ignored action " + action + " for " + id);
+ if (sVerbose) Slog.v(TAG, "Ignoring specific action when viewState=null");
return;
}
}
@@ -1913,6 +1936,40 @@
requestNewFillResponseLocked(flags);
break;
case ACTION_VALUE_CHANGED:
+ if (mCompatMode && (viewState.getState() & ViewState.STATE_URL_BAR) != 0) {
+ // Must cancel the session if the value of the URL bar changed
+ final String currentUrl = mUrlBar == null ? null
+ : mUrlBar.getText().toString().trim();
+ if (currentUrl == null) {
+ // Sanity check - shouldn't happen.
+ wtf(null, "URL bar value changed, but current value is null");
+ return;
+ }
+ if (value == null || ! value.isText()) {
+ // Sanity check - shouldn't happen.
+ wtf(null, "URL bar value changed to null or non-text: %s", value);
+ return;
+ }
+ final String newUrl = value.getTextValue().toString();
+ if (newUrl.equals(currentUrl)) {
+ if (sDebug) Slog.d(TAG, "Ignoring change on URL bar as it's the same");
+ return;
+ }
+ if (mSaveOnAllViewsInvisible) {
+ // We cannot cancel the session because it could hinder Save when all views
+ // are finished, as the URL bar changed callback is usually called before
+ // the virtual views become invisible.
+ if (sDebug) {
+ Slog.d(TAG, "Ignoring change on URL because session will finish when "
+ + "views are gone");
+ }
+ return;
+ }
+ if (sDebug) Slog.d(TAG, "Finishing session because URL bar changed");
+ forceRemoveSelfLocked(AutofillManager.STATE_UNKNOWN_COMPAT_MODE);
+ return;
+ }
+
if (value != null && !value.equals(viewState.getCurrentValue())) {
if (value.isEmpty()
&& viewState.getCurrentValue() != null
@@ -1953,6 +2010,12 @@
if (sVerbose && virtualBounds != null) {
Slog.v(TAG, "entered on virtual child " + id + ": " + virtualBounds);
}
+
+ if (mCompatMode && (viewState.getState() & ViewState.STATE_URL_BAR) != 0) {
+ if (sDebug) Slog.d(TAG, "Ignoring VIEW_ENTERED on URL BAR (id=" + id + ")");
+ return;
+ }
+
requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags);
// Remove the UI if the ViewState has changed.
@@ -2068,7 +2131,7 @@
if (response == null) return;
ArraySet<AutofillId> trackedViews = null;
- boolean saveOnAllViewsInvisible = false;
+ mSaveOnAllViewsInvisible = false;
boolean saveOnFinish = true;
final SaveInfo saveInfo = response.getSaveInfo();
final AutofillId saveTriggerId;
@@ -2081,10 +2144,10 @@
if (mCompatMode) {
flags |= SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE;
}
- saveOnAllViewsInvisible = (flags & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
+ mSaveOnAllViewsInvisible = (flags & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
// We only need to track views if we want to save once they become invisible.
- if (saveOnAllViewsInvisible) {
+ if (mSaveOnAllViewsInvisible) {
if (trackedViews == null) {
trackedViews = new ArraySet<>();
}
@@ -2129,13 +2192,34 @@
Slog.v(TAG, "updateTrackedIdsLocked(): " + trackedViews + " => " + fillableIds
+ " triggerId: " + saveTriggerId + " saveOnFinish:" + saveOnFinish);
}
- mClient.setTrackedViews(id, toArray(trackedViews), saveOnAllViewsInvisible,
+ mClient.setTrackedViews(id, toArray(trackedViews), mSaveOnAllViewsInvisible,
saveOnFinish, toArray(fillableIds), saveTriggerId);
} catch (RemoteException e) {
Slog.w(TAG, "Cannot set tracked ids", e);
}
}
+ /**
+ * Sets the state of views that failed to autofill.
+ */
+ @GuardedBy("mLock")
+ void setAutofillFailureLocked(@NonNull List<AutofillId> ids) {
+ for (int i = 0; i < ids.size(); i++) {
+ final AutofillId id = ids.get(i);
+ final ViewState viewState = mViewStates.get(id);
+ if (viewState == null) {
+ Slog.w(TAG, "setAutofillFailure(): no view for id " + id);
+ continue;
+ }
+ viewState.resetState(ViewState.STATE_AUTOFILLED);
+ final int state = viewState.getState();
+ viewState.setState(state | ViewState.STATE_AUTOFILL_FAILED);
+ if (sVerbose) {
+ Slog.v(TAG, "Changed state of " + id + " to " + viewState.getStateAsString());
+ }
+ }
+ }
+
@GuardedBy("mLock")
private void replaceResponseLocked(@NonNull FillResponse oldResponse,
@NonNull FillResponse newResponse, @Nullable Bundle newClientState) {
@@ -2418,9 +2502,21 @@
}
pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback);
- pw.print(prefix); pw.print("mClientState: "); pw.println(
- Helper.bundleToString(mClientState));
+ if (mClientState != null) {
+ pw.print(prefix); pw.print("mClientState: "); pw.print(mClientState.getSize()); pw
+ .println(" bytes");
+ }
pw.print(prefix); pw.print("mCompatMode: "); pw.println(mCompatMode);
+ pw.print(prefix); pw.print("mUrlBar: ");
+ if (mUrlBar == null) {
+ pw.println("N/A");
+ } else {
+ pw.print("id="); pw.print(mUrlBar.getAutofillId());
+ pw.print(" domain="); pw.print(mUrlBar.getWebDomain());
+ pw.print(" text="); Helper.printlnRedactedText(pw, mUrlBar.getText());
+ }
+ pw.print(prefix); pw.print("mSaveOnAllViewsInvisible: "); pw.println(
+ mSaveOnAllViewsInvisible);
pw.print(prefix); pw.print("mSelectedDatasetIds: "); pw.println(mSelectedDatasetIds);
mRemoteFillService.dump(prefix, pw);
}
@@ -2513,6 +2609,11 @@
*/
@GuardedBy("mLock")
void forceRemoveSelfLocked() {
+ forceRemoveSelfLocked(AutofillManager.STATE_UNKNOWN);
+ }
+
+ @GuardedBy("mLock")
+ void forceRemoveSelfLocked(int clientState) {
if (sVerbose) Slog.v(TAG, "forceRemoveSelfLocked(): " + mPendingSaveUi);
final boolean isPendingSaveUi = isSaveUiPendingLocked();
@@ -2521,7 +2622,7 @@
mUi.destroyAll(mPendingSaveUi, this, false);
if (!isPendingSaveUi) {
try {
- mClient.setSessionFinished(AutofillManager.STATE_UNKNOWN);
+ mClient.setSessionFinished(clientState);
} catch (RemoteException e) {
Slog.e(TAG, "Error notifying client to finish session", e);
}
@@ -2624,4 +2725,19 @@
Slog.wtf(TAG, message);
}
}
+
+ private static String actionAsString(int action) {
+ switch (action) {
+ case ACTION_START_SESSION:
+ return "START_SESSION";
+ case ACTION_VIEW_ENTERED:
+ return "VIEW_ENTERED";
+ case ACTION_VIEW_EXITED:
+ return "VIEW_EXITED";
+ case ACTION_VALUE_CHANGED:
+ return "VALUE_CHANGED";
+ default:
+ return "UNKNOWN_" + action;
+ }
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index 03c5850..9210de2 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -67,6 +67,10 @@
public static final int STATE_IGNORED = 0x080;
/** User manually request autofill in this view, after it was already autofilled. */
public static final int STATE_RESTARTED_SESSION = 0x100;
+ /** View is the URL bar of a package on compat mode. */
+ public static final int STATE_URL_BAR = 0x200;
+ /** View was asked to autofil but failed to do so. */
+ public static final int STATE_AUTOFILL_FAILED = 0x400;
public final AutofillId id;
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index edfc412..7c0671f 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -17,7 +17,9 @@
import static com.android.server.autofill.Helper.paramsToString;
import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sFullScreenMode;
import static com.android.server.autofill.Helper.sVerbose;
+import static com.android.server.autofill.Helper.sVisibleDatasetsMaxCount;
import android.annotation.AttrRes;
import android.annotation.NonNull;
@@ -51,6 +53,7 @@
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.FrameLayout;
+import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RemoteViews;
@@ -58,8 +61,6 @@
import com.android.server.UiThread;
import com.android.server.autofill.Helper;
-import static com.android.server.autofill.Helper.sVisibleDatasetsMaxCount;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
@@ -118,7 +119,9 @@
private final @NonNull Callback mCallback;
+ private final @Nullable View mHeader;
private final @NonNull ListView mListView;
+ private final @Nullable View mFooter;
private final @Nullable ItemsAdapter mAdapter;
@@ -127,12 +130,17 @@
private @Nullable AnnounceFilterResult mAnnounceFilterResult;
private final boolean mFullScreen;
+ private final int mVisibleDatasetsMaxCount;
private int mContentWidth;
private int mContentHeight;
private boolean mDestroyed;
public static boolean isFullScreen(Context context) {
+ if (sFullScreenMode != null) {
+ if (sVerbose) Slog.v(TAG, "forcing full-screen mode to " + sFullScreenMode);
+ return sFullScreenMode;
+ }
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
}
@@ -145,9 +153,18 @@
final LayoutInflater inflater = LayoutInflater.from(context);
- final ViewGroup decor = (ViewGroup) inflater.inflate(
- mFullScreen ? R.layout.autofill_dataset_picker_fullscreen
- : R.layout.autofill_dataset_picker, null);
+ final RemoteViews headerPresentation = response.getHeader();
+ final RemoteViews footerPresentation = response.getFooter();
+ final ViewGroup decor;
+ if (headerPresentation != null || footerPresentation != null) {
+ decor = (ViewGroup) inflater.inflate(
+ mFullScreen ? R.layout.autofill_dataset_picker_header_footer_fullscreen
+ : R.layout.autofill_dataset_picker_header_footer, null);
+ } else {
+ decor = (ViewGroup) inflater.inflate(
+ mFullScreen ? R.layout.autofill_dataset_picker_fullscreen
+ : R.layout.autofill_dataset_picker, null);
+ }
// if autofill ui is not fullscreen, send unhandled keyevent to app window.
if (!mFullScreen) {
@@ -174,6 +191,16 @@
}
}
+ if (sVisibleDatasetsMaxCount > 0) {
+ mVisibleDatasetsMaxCount = sVisibleDatasetsMaxCount;
+ if (sVerbose) {
+ Slog.v(TAG, "overriding maximum visible datasets to " + mVisibleDatasetsMaxCount);
+ }
+ } else {
+ mVisibleDatasetsMaxCount = mContext.getResources()
+ .getInteger(com.android.internal.R.integer.autofill_max_visible_datasets);
+ }
+
final RemoteViews.OnClickHandler interceptionHandler = new RemoteViews.OnClickHandler() {
@Override
public boolean onClickHandler(View view, PendingIntent pendingIntent,
@@ -186,7 +213,9 @@
};
if (response.getAuthentication() != null) {
+ mHeader = null;
mListView = null;
+ mFooter = null;
mAdapter = null;
// insert authentication item under autofill_dataset_container or decor
@@ -207,7 +236,7 @@
decor.setFocusable(true);
decor.setOnClickListener(v -> mCallback.onResponsePicked(response));
- Point maxSize = mTempPoint;
+ final Point maxSize = mTempPoint;
resolveMaxWindowSize(context, maxSize);
// fullScreen mode occupy the full width defined by autofill_dataset_picker_max_width
content.getLayoutParams().width = mFullScreen ? maxSize.x
@@ -226,38 +255,39 @@
requestShowFillUi();
} else {
final int datasetCount = response.getDatasets().size();
-
- // Total items include the (optional) header and footer - we cannot use listview's
- // addHeader() and addFooter() because it would complicate the scrolling logic.
- int totalItems = datasetCount;
-
- RemoteViews.OnClickHandler clickBlocker = null;
- final RemoteViews headerPresentation = response.getHeader();
- View header = null;
- if (headerPresentation != null) {
- clickBlocker = newClickBlocker();
- header = headerPresentation.apply(context, null, clickBlocker);
- totalItems++;
+ if (sVerbose) {
+ Slog.v(TAG, "Number datasets: " + datasetCount + " max visible: "
+ + mVisibleDatasetsMaxCount);
}
- final RemoteViews footerPresentation = response.getFooter();
- View footer = null;
+ RemoteViews.OnClickHandler clickBlocker = null;
+ if (headerPresentation != null) {
+ clickBlocker = newClickBlocker();
+ mHeader = headerPresentation.apply(context, null, clickBlocker);
+ final LinearLayout headerContainer =
+ decor.findViewById(R.id.autofill_dataset_header);
+ if (sVerbose) Slog.v(TAG, "adding header");
+ headerContainer.addView(mHeader);
+ headerContainer.setVisibility(View.VISIBLE);
+ } else {
+ mHeader = null;
+ }
+
if (footerPresentation != null) {
if (clickBlocker == null) { // already set for header
clickBlocker = newClickBlocker();
}
- footer = footerPresentation.apply(context, null, clickBlocker);
- totalItems++;
- }
- if (sVerbose) {
- Slog.v(TAG, "Number datasets: " + datasetCount + " Total items: " + totalItems);
+ mFooter = footerPresentation.apply(context, null, clickBlocker);
+ final LinearLayout footerContainer =
+ decor.findViewById(R.id.autofill_dataset_footer);
+ if (sVerbose) Slog.v(TAG, "adding footer");
+ footerContainer.addView(mFooter);
+ footerContainer.setVisibility(View.VISIBLE);
+ } else {
+ mFooter = null;
}
- final ArrayList<ViewItem> items = new ArrayList<>(totalItems);
- if (header != null) {
- if (sVerbose) Slog.v(TAG, "adding header");
- items.add(new ViewItem(null, null, false, null, header));
- }
+ final ArrayList<ViewItem> items = new ArrayList<>(datasetCount);
for (int i = 0; i < datasetCount; i++) {
final Dataset dataset = response.getDatasets().get(i);
final int index = dataset.getFieldIds().indexOf(focusedViewId);
@@ -299,10 +329,6 @@
items.add(new ViewItem(dataset, filterPattern, filterable, valueText, view));
}
}
- if (footer != null) {
- if (sVerbose) Slog.v(TAG, "adding footer");
- items.add(new ViewItem(null, null, false, null, footer));
- }
mAdapter = new ItemsAdapter(items);
@@ -311,11 +337,6 @@
mListView.setVisibility(View.VISIBLE);
mListView.setOnItemClickListener((adapter, view, position, id) -> {
final ViewItem vi = mAdapter.getItem(position);
- if (vi.dataset == null) {
- // Clicked on header or footer; ignore.
- if (sDebug) Slog.d(TAG, "Ignoring click on item " + position + ": " + view);
- return;
- }
mCallback.onDatasetPicked(vi.dataset);
});
@@ -375,7 +396,7 @@
}
requestShowFillUi();
}
- if (mAdapter.getCount() > sVisibleDatasetsMaxCount) {
+ if (mAdapter.getCount() > mVisibleDatasetsMaxCount) {
mListView.setVerticalScrollBarEnabled(true);
mListView.onVisibilityAggregated(true);
} else {
@@ -460,6 +481,13 @@
changed = true;
mContentWidth = maxSize.x;
}
+
+ if (mHeader != null) {
+ mHeader.measure(widthMeasureSpec, heightMeasureSpec);
+ changed |= updateWidth(mHeader, maxSize);
+ changed |= updateHeight(mHeader, maxSize);
+ }
+
for (int i = 0; i < itemCount; i++) {
final View view = mAdapter.getItem(i).view;
view.measure(widthMeasureSpec, heightMeasureSpec);
@@ -473,23 +501,40 @@
break;
}
} else {
- final int clampedMeasuredWidth = Math.min(view.getMeasuredWidth(), maxSize.x);
- final int newContentWidth = Math.max(mContentWidth, clampedMeasuredWidth);
- if (newContentWidth != mContentWidth) {
- mContentWidth = newContentWidth;
- changed = true;
- }
- // Update the width to fit only the first items up to max count
- if (i < sVisibleDatasetsMaxCount) {
- final int clampedMeasuredHeight = Math.min(view.getMeasuredHeight(), maxSize.y);
- final int newContentHeight = mContentHeight + clampedMeasuredHeight;
- if (newContentHeight != mContentHeight) {
- mContentHeight = newContentHeight;
- changed = true;
- }
+ changed |= updateWidth(view, maxSize);
+ if (i < mVisibleDatasetsMaxCount) {
+ changed |= updateHeight(view, maxSize);
}
}
}
+
+ if (mFooter != null) {
+ mFooter.measure(widthMeasureSpec, heightMeasureSpec);
+ changed |= updateWidth(mFooter, maxSize);
+ changed |= updateHeight(mFooter, maxSize);
+ }
+ return changed;
+ }
+
+ private boolean updateWidth(View view, Point maxSize) {
+ boolean changed = false;
+ final int clampedMeasuredWidth = Math.min(view.getMeasuredWidth(), maxSize.x);
+ final int newContentWidth = Math.max(mContentWidth, clampedMeasuredWidth);
+ if (newContentWidth != mContentWidth) {
+ mContentWidth = newContentWidth;
+ changed = true;
+ }
+ return changed;
+ }
+
+ private boolean updateHeight(View view, Point maxSize) {
+ boolean changed = false;
+ final int clampedMeasuredHeight = Math.min(view.getMeasuredHeight(), maxSize.y);
+ final int newContentHeight = mContentHeight + clampedMeasuredHeight;
+ if (newContentHeight != mContentHeight) {
+ mContentHeight = newContentHeight;
+ changed = true;
+ }
return changed;
}
@@ -501,7 +546,7 @@
private static void resolveMaxWindowSize(Context context, Point outPoint) {
context.getDisplay().getSize(outPoint);
- TypedValue typedValue = sTempTypedValue;
+ final TypedValue typedValue = sTempTypedValue;
context.getTheme().resolveAttribute(R.attr.autofillDatasetPickerMaxWidth,
typedValue, true);
outPoint.x = (int) typedValue.getFraction(outPoint.x, outPoint.x);
@@ -688,17 +733,29 @@
public void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("mCallback: "); pw.println(mCallback != null);
pw.print(prefix); pw.print("mFullScreen: "); pw.println(mFullScreen);
- pw.print(prefix); pw.print("mListView: "); pw.println(mListView);
- pw.print(prefix); pw.print("mAdapter: "); pw.println(mAdapter);
- pw.print(prefix); pw.print("mFilterText: ");
- Helper.printlnRedactedText(pw, mFilterText);
+ pw.print(prefix); pw.print("mVisibleDatasetsMaxCount: "); pw.println(
+ mVisibleDatasetsMaxCount);
+ if (mHeader != null) {
+ pw.print(prefix); pw.print("mHeader: "); pw.println(mHeader);
+ }
+ if (mListView != null) {
+ pw.print(prefix); pw.print("mListView: "); pw.println(mListView);
+ }
+ if (mFooter != null) {
+ pw.print(prefix); pw.print("mFooter: "); pw.println(mFooter);
+ }
+ if (mAdapter != null) {
+ pw.print(prefix); pw.print("mAdapter: "); pw.println(mAdapter);
+ }
+ if (mFilterText != null) {
+ pw.print(prefix); pw.print("mFilterText: ");
+ Helper.printlnRedactedText(pw, mFilterText);
+ }
pw.print(prefix); pw.print("mContentWidth: "); pw.println(mContentWidth);
pw.print(prefix); pw.print("mContentHeight: "); pw.println(mContentHeight);
pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed);
- pw.print(prefix); pw.print("mWindow: ");
- if (mWindow == null) {
- pw.println("N/A");
- } else {
+ if (mWindow != null) {
+ pw.print(prefix); pw.print("mWindow: ");
final String prefix2 = prefix + " ";
pw.println();
pw.print(prefix2); pw.print("showing: "); pw.println(mWindow.mShowing);
diff --git a/services/backup/java/com/android/server/backup/BackupAgentTimeoutParameters.java b/services/backup/java/com/android/server/backup/BackupAgentTimeoutParameters.java
index 4de2c9b..49fa1cc 100644
--- a/services/backup/java/com/android/server/backup/BackupAgentTimeoutParameters.java
+++ b/services/backup/java/com/android/server/backup/BackupAgentTimeoutParameters.java
@@ -21,6 +21,7 @@
import android.provider.Settings;
import android.util.KeyValueListParser;
import android.util.KeyValueSettingObserver;
+import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -31,6 +32,8 @@
* are represented as a comma-delimited key value list.
*/
public class BackupAgentTimeoutParameters extends KeyValueSettingObserver {
+ private static final String TAG = "BackupAgentTimeout";
+
@VisibleForTesting
public static final String SETTING = Settings.Global.BACKUP_AGENT_TIMEOUT_PARAMETERS;
@@ -120,30 +123,50 @@
public long getKvBackupAgentTimeoutMillis() {
synchronized (mLock) {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getKvBackupAgentTimeoutMillis(): " + mKvBackupAgentTimeoutMillis);
+ }
return mKvBackupAgentTimeoutMillis;
}
}
public long getFullBackupAgentTimeoutMillis() {
synchronized (mLock) {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getFullBackupAgentTimeoutMillis(): " + mFullBackupAgentTimeoutMillis);
+ }
return mFullBackupAgentTimeoutMillis;
}
}
public long getSharedBackupAgentTimeoutMillis() {
synchronized (mLock) {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(
+ TAG,
+ "getSharedBackupAgentTimeoutMillis(): " + mSharedBackupAgentTimeoutMillis);
+ }
return mSharedBackupAgentTimeoutMillis;
}
}
public long getRestoreAgentTimeoutMillis() {
synchronized (mLock) {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(TAG, "getRestoreAgentTimeoutMillis(): " + mRestoreAgentTimeoutMillis);
+ }
return mRestoreAgentTimeoutMillis;
}
}
public long getRestoreAgentFinishedTimeoutMillis() {
synchronized (mLock) {
+ if (BackupManagerService.DEBUG_SCHEDULING) {
+ Slog.v(
+ TAG,
+ "getRestoreAgentFinishedTimeoutMillis(): "
+ + mRestoreAgentFinishedTimeoutMillis);
+ }
return mRestoreAgentFinishedTimeoutMillis;
}
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index d6f6c6c..bd51af2 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -215,13 +215,6 @@
// Timeout interval for deciding that a bind or clear-data has taken too long
private static final long TIMEOUT_INTERVAL = 10 * 1000;
- // Timeout intervals for agent backup & restore operations
- public static final long TIMEOUT_BACKUP_INTERVAL = 30 * 1000;
- public static final long TIMEOUT_FULL_BACKUP_INTERVAL = 5 * 60 * 1000;
- public static final long TIMEOUT_SHARED_BACKUP_INTERVAL = 30 * 60 * 1000;
- public static final long TIMEOUT_RESTORE_INTERVAL = 60 * 1000;
- public static final long TIMEOUT_RESTORE_FINISHED_INTERVAL = 30 * 1000;
-
// User confirmation timeout for a full backup/restore operation. It's this long in
// order to give them time to enter the backup password.
private static final long TIMEOUT_FULL_CONFIRMATION = 60 * 1000;
@@ -232,6 +225,7 @@
private static final int BUSY_BACKOFF_FUZZ = 1000 * 60 * 60 * 2; // two hours
private BackupManagerConstants mConstants;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private Context mContext;
private PackageManager mPackageManager;
private IPackageManager mPackageManagerBinder;
@@ -315,6 +309,10 @@
return mConstants;
}
+ public BackupAgentTimeoutParameters getAgentTimeoutParameters() {
+ return mAgentTimeoutParameters;
+ }
+
public Context getContext() {
return mContext;
}
@@ -799,6 +797,10 @@
mBackupManagerBinder = Trampoline.asInterface(parent.asBinder());
+ mAgentTimeoutParameters = new
+ BackupAgentTimeoutParameters(Handler.getMain(), mContext.getContentResolver());
+ mAgentTimeoutParameters.start();
+
// spin up the backup/restore handler thread
mBackupHandler = new BackupHandler(this, backupThread.getLooper());
@@ -3407,7 +3409,7 @@
}
mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport);
mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
- TIMEOUT_RESTORE_INTERVAL);
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
}
return mActiveRestoreSession;
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
index 7b021c6..aabe7f6 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
@@ -191,4 +191,7 @@
void dump(FileDescriptor fd, PrintWriter pw, String[] args);
IBackupManager getBackupManagerBinder();
+
+ // Gets access to the backup/restore agent timeout parameters.
+ BackupAgentTimeoutParameters getAgentTimeoutParameters();
}
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
index 4755877..7f0030a 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
@@ -4,8 +4,8 @@
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
import static android.os.ParcelFileDescriptor.MODE_READ_WRITE;
import static android.os.ParcelFileDescriptor.MODE_TRUNCATE;
+
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
@@ -19,6 +19,7 @@
import android.os.SELinux;
import android.util.Slog;
+import com.android.internal.util.Preconditions;
import com.android.server.backup.utils.FullBackupUtils;
import libcore.io.IoUtils;
@@ -59,6 +60,7 @@
private ParcelFileDescriptor mSavedState;
private ParcelFileDescriptor mBackupData;
private ParcelFileDescriptor mNewState;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public KeyValueAdbBackupEngine(OutputStream output, PackageInfo packageInfo,
BackupManagerServiceInterface backupManagerService, PackageManager packageManager,
@@ -81,6 +83,9 @@
pkg + BACKUP_KEY_VALUE_NEW_STATE_FILENAME_SUFFIX);
mManifestFile = new File(mDataDir, BackupManagerService.BACKUP_MANIFEST_FILENAME);
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
public void backupOnePackage() throws IOException {
@@ -148,8 +153,9 @@
// Return true on backup success, false otherwise
private boolean invokeAgentForAdbBackup(String packageName, IBackupAgent agent) {
int token = mBackupManagerService.generateRandomIntegerToken();
+ long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
try {
- mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
+ mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
OP_TYPE_BACKUP_WAIT);
// Start backup and wait for BackupManagerService to get callback for success or timeout
@@ -231,14 +237,14 @@
}
private void writeBackupData() throws IOException {
-
int token = mBackupManagerService.generateRandomIntegerToken();
+ long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
ParcelFileDescriptor[] pipes = null;
try {
pipes = ParcelFileDescriptor.createPipe();
- mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
+ mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
OP_TYPE_BACKUP_WAIT);
// We will have to create a runnable that will read the manifest and backup data we
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
index 0582aba..5694659 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
@@ -25,9 +25,6 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
-import static com.android.server.backup.BackupManagerService
- .TIMEOUT_SHARED_BACKUP_INTERVAL;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
@@ -44,9 +41,11 @@
import android.util.Slog;
import android.util.StringBuilderPrinter;
+import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
-import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.utils.FullBackupUtils;
import java.io.BufferedOutputStream;
@@ -75,6 +74,7 @@
private final long mQuota;
private final int mOpToken;
private final int mTransportFlags;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
class FullBackupRunner implements Runnable {
@@ -137,8 +137,8 @@
final boolean isSharedStorage =
mPackage.packageName.equals(SHARED_BACKUP_AGENT_PACKAGE);
final long timeout = isSharedStorage ?
- TIMEOUT_SHARED_BACKUP_INTERVAL :
- TIMEOUT_FULL_BACKUP_INTERVAL;
+ mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
if (DEBUG) {
Slog.d(TAG, "Calling doFullBackup() on " + mPackage.packageName);
@@ -180,6 +180,9 @@
mQuota = quota;
mOpToken = opToken;
mTransportFlags = transportFlags;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
public int preflightCheck() throws RemoteException {
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
index 40b6967..bc7d9fc 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
@@ -19,7 +19,6 @@
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.app.backup.IBackupManager;
import android.content.ComponentName;
@@ -33,6 +32,8 @@
import android.util.Slog;
import com.android.internal.backup.IObbBackupService;
+import com.android.internal.util.Preconditions;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.utils.FullBackupUtils;
@@ -46,10 +47,14 @@
private BackupManagerService backupManagerService;
volatile IObbBackupService mService;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public FullBackupObbConnection(BackupManagerService backupManagerService) {
this.backupManagerService = backupManagerService;
mService = null;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
public void establish() {
@@ -75,8 +80,10 @@
try {
pipes = ParcelFileDescriptor.createPipe();
int token = backupManagerService.generateRandomIntegerToken();
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- token, TIMEOUT_FULL_BACKUP_INTERVAL, null, OP_TYPE_BACKUP_WAIT);
+ token, fullBackupAgentTimeoutMillis, null, OP_TYPE_BACKUP_WAIT);
mService.backupObbs(pkg.packageName, pipes[1], token,
backupManagerService.getBackupManagerBinder());
FullBackupUtils.routeSocketDataToOutput(pipes[0], out);
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 2c2dd85..a40afc3 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -22,7 +22,6 @@
import static com.android.server.backup.BackupManagerService.OP_PENDING;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.annotation.Nullable;
import android.app.IBackupAgent;
@@ -43,7 +42,9 @@
import android.util.Slog;
import com.android.internal.backup.IBackupTransport;
+import com.android.internal.util.Preconditions;
import com.android.server.EventLogTags;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FullBackupJob;
import com.android.server.backup.BackupManagerService;
@@ -146,6 +147,7 @@
private volatile boolean mIsDoingBackup;
private volatile boolean mCancelAll;
private final int mCurrentOpToken;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public PerformFullTransportBackupTask(BackupManagerService backupManagerService,
TransportClient transportClient,
@@ -167,6 +169,9 @@
mUserInitiated = userInitiated;
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken();
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
if (backupManagerService.isBackupOperationInProgress()) {
if (DEBUG) {
@@ -698,9 +703,11 @@
@Override
public int preflightFullBackup(PackageInfo pkg, IBackupAgent agent) {
int result;
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
backupManagerService.prepareOperationTimeout(
- mCurrentOpToken, TIMEOUT_FULL_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
+ mCurrentOpToken, fullBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
backupManagerService.addBackupTrace("preflighting");
if (MORE_DEBUG) {
Slog.d(TAG, "Preflighting full payload of " + pkg.packageName);
@@ -713,7 +720,7 @@
// timeout had been produced. In case of a real backstop timeout, mResult
// will still contain the value it was constructed with, AGENT_ERROR, which
// intentionaly falls into the "just report failure" code.
- mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
+ mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
long totalSize = mResult.get();
// If preflight timed out, mResult will contain error code as int.
@@ -769,8 +776,10 @@
@Override
public long getExpectedSizeOrErrorCode() {
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
+ mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
return mResult.get();
} catch (InterruptedException e) {
return BackupTransport.NO_MORE_DATA;
@@ -863,8 +872,10 @@
// If preflight succeeded, returns positive number - preflight size,
// otherwise return negative error code.
long getPreflightResultBlocking() {
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mPreflightLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
+ mPreflightLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
if (mIsCancelled) {
return BackupManager.ERROR_BACKUP_CANCELLED;
}
@@ -879,8 +890,10 @@
}
int getBackupResultBlocking() {
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mBackupLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
+ mBackupLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
if (mIsCancelled) {
return BackupManager.ERROR_BACKUP_CANCELLED;
}
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index 136fada..69f08ae 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -19,7 +19,6 @@
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
import android.app.backup.RestoreSet;
import android.content.Intent;
@@ -33,7 +32,9 @@
import android.util.Slog;
import com.android.internal.backup.IBackupTransport;
+import com.android.internal.util.Preconditions;
import com.android.server.EventLogTags;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
@@ -81,10 +82,14 @@
public static final int MSG_OP_COMPLETE = 21;
private final BackupManagerService backupManagerService;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public BackupHandler(BackupManagerService backupManagerService, Looper looper) {
super(looper);
this.backupManagerService = backupManagerService;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
public void handleMessage(Message msg) {
@@ -322,7 +327,8 @@
// Done: reset the session timeout clock
removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
- sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
+ sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
params.listener.onFinished(callerLogString);
}
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index 11394e66..ac605b1 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -24,7 +24,6 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
@@ -55,8 +54,10 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.backup.IBackupTransport;
+import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
@@ -142,6 +143,7 @@
private boolean mFinished;
private final boolean mUserInitiated;
private final boolean mNonIncremental;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private volatile boolean mCancelAll;
@@ -162,6 +164,9 @@
mPendingFullBackups = pendingFullBackups;
mUserInitiated = userInitiated;
mNonIncremental = nonIncremental;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
mStateDir = new File(backupManagerService.getBaseStateDir(), dirName);
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
@@ -711,8 +716,10 @@
// Initiate the target's backup pass
backupManagerService.addBackupTrace("setting timeout");
+ long kvBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- mEphemeralOpToken, TIMEOUT_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
+ mEphemeralOpToken, kvBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
backupManagerService.addBackupTrace("calling agent doBackup()");
agent.doBackup(
diff --git a/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
index e4f3a9d..a8c7ce6 100644
--- a/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
+++ b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
@@ -18,10 +18,11 @@
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.util.Slog;
+import com.android.internal.util.Preconditions;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
@@ -37,18 +38,24 @@
private BackupManagerService backupManagerService;
final CountDownLatch mLatch;
private final int mCurrentOpToken;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public AdbRestoreFinishedLatch(BackupManagerService backupManagerService,
int currentOpToken) {
this.backupManagerService = backupManagerService;
mLatch = new CountDownLatch(1);
mCurrentOpToken = currentOpToken;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
void await() {
boolean latched = false;
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- latched = mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
+ latched = mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Slog.w(TAG, "Interrupted!");
}
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index c1a1c1d..6bc7530 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -23,9 +23,6 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAIT;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
-import static com.android.server.backup.BackupManagerService
- .TIMEOUT_SHARED_BACKUP_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import android.app.ApplicationThreadConstants;
@@ -40,13 +37,17 @@
import android.content.pm.Signature;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
+import android.provider.Settings;
+import android.text.TextUtils;
import android.util.Slog;
+import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
+import com.android.server.backup.BackupAgentTimeoutParameters;
+import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
-import com.android.server.backup.BackupManagerService;
import com.android.server.backup.fullbackup.FullBackupObbConnection;
import com.android.server.backup.utils.BytesReadListener;
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
@@ -56,8 +57,11 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
/**
* Full restore engine, used by both adb restore and transport-based full restore.
@@ -121,6 +125,8 @@
final int mEphemeralOpToken;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
+
public FullRestoreEngine(BackupManagerService backupManagerService,
BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
@@ -135,6 +141,9 @@
mAllowObbs = allowObbs;
mBuffer = new byte[32 * 1024];
mBytes = 0;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
}
public IBackupAgent getAgent() {
@@ -320,12 +329,17 @@
pkg, 0);
// If we haven't sent any data to this app yet, we probably
- // need to clear it first. Check that.
+ // need to clear it first. Check that.
if (!mClearedPackages.contains(pkg)) {
- // apps with their own backup agents are
- // responsible for coherently managing a full
- // restore.
- if (mTargetApp.backupAgentName == null) {
+ // Apps with their own backup agents are responsible for coherently
+ // managing a full restore.
+ // In some rare cases they can't, especially in case of deferred
+ // restore. In this case check whether this app should be forced to
+ // clear up.
+ // TODO: Fix this properly with manifest parameter.
+ boolean forceClear = shouldForceClearAppDataOnFullRestore(
+ mTargetApp.packageName);
+ if (mTargetApp.backupAgentName == null || forceClear) {
if (DEBUG) {
Slog.d(TAG,
"Clearing app data preparatory to full restore");
@@ -381,8 +395,8 @@
long toCopy = info.size;
final boolean isSharedStorage = pkg.equals(SHARED_BACKUP_AGENT_PACKAGE);
final long timeout = isSharedStorage ?
- TIMEOUT_SHARED_BACKUP_INTERVAL :
- TIMEOUT_RESTORE_INTERVAL;
+ mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
try {
mBackupManagerService.prepareOperationTimeout(token,
timeout,
@@ -623,6 +637,24 @@
return true;
}
+ /**
+ * Returns whether the package is in the list of the packages for which clear app data should
+ * be called despite the fact that they have backup agent.
+ *
+ * <p>The list is read from {@link Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE}.
+ */
+ private boolean shouldForceClearAppDataOnFullRestore(String packageName) {
+ String packageListString = Settings.Secure.getString(
+ mBackupManagerService.getContext().getContentResolver(),
+ Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE);
+ if (TextUtils.isEmpty(packageListString)) {
+ return false;
+ }
+
+ List<String> packages = Arrays.asList(packageListString.split(";"));
+ return packages.contains(packageName);
+ }
+
void sendOnRestorePackage(String name) {
if (mObserver != null) {
try {
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index dacde0b..77163d3 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -16,8 +16,6 @@
package com.android.server.backup.restore;
-import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
-import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.BackupManagerService.BACKUP_MANIFEST_FILENAME;
@@ -28,8 +26,8 @@
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import android.app.ApplicationThreadConstants;
@@ -48,7 +46,9 @@
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
@@ -101,6 +101,7 @@
private byte[] mWidgetData = null;
private long mBytes;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
// Runner that can be placed on a separate thread to do in-process invocation
// of the "restore finished" API asynchronously. Used by adb restore.
@@ -155,6 +156,9 @@
mAgentPackage = null;
mTargetApp = null;
mObbConnection = new FullBackupObbConnection(backupManagerService);
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
// Which packages we've already wiped data on. We prepopulate this
// with a whitelist of packages known to be unclearable.
@@ -643,9 +647,11 @@
if (okay) {
boolean agentSuccess = true;
long toCopy = info.size;
+ long restoreAgentTimeoutMillis =
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
try {
mBackupManagerService.prepareOperationTimeout(
- token, TIMEOUT_RESTORE_INTERVAL, null, OP_TYPE_RESTORE_WAIT);
+ token, restoreAgentTimeoutMillis, null, OP_TYPE_RESTORE_WAIT);
if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) {
if (DEBUG) {
@@ -820,10 +826,12 @@
// In the adb restore case, we do restore-finished here
if (doRestoreFinished) {
final int token = mBackupManagerService.generateRandomIntegerToken();
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(
mBackupManagerService, token);
mBackupManagerService.prepareOperationTimeout(
- token, TIMEOUT_FULL_BACKUP_INTERVAL, latch, OP_TYPE_RESTORE_WAIT);
+ token, fullBackupAgentTimeoutMillis, latch, OP_TYPE_RESTORE_WAIT);
if (mTargetApp.processName.equals("system")) {
if (MORE_DEBUG) {
Slog.d(TAG, "system agent - restoreFinished on thread");
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 4b467e5..12d72d8 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -23,9 +23,6 @@
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupManagerService
- .TIMEOUT_RESTORE_FINISHED_INTERVAL;
-import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_SESSION_TIMEOUT;
@@ -56,9 +53,11 @@
import android.util.Slog;
import com.android.internal.backup.IBackupTransport;
+import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.BackupUtils;
import com.android.server.backup.PackageManagerBackupAgent;
@@ -160,6 +159,7 @@
ParcelFileDescriptor mNewState;
private final int mEphemeralOpToken;
+ private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
// This task can assume that the wakelock is properly held for it and doesn't have to worry
// about releasing it.
@@ -190,6 +190,9 @@
mFinished = false;
mDidLaunch = false;
mListener = listener;
+ mAgentTimeoutParameters = Preconditions.checkNotNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
if (targetPackage != null) {
// Single package restore
@@ -760,8 +763,9 @@
// Kick off the restore, checking for hung agents. The timeout or
// the operationComplete() callback will schedule the next step,
// so we do not do that here.
+ long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- mEphemeralOpToken, TIMEOUT_RESTORE_INTERVAL, this, OP_TYPE_RESTORE_WAIT);
+ mEphemeralOpToken, restoreAgentTimeoutMillis, this, OP_TYPE_RESTORE_WAIT);
mAgent.doRestore(mBackupData, appVersionCode, mNewState,
mEphemeralOpToken, backupManagerService.getBackupManagerBinder());
} catch (Exception e) {
@@ -813,9 +817,11 @@
Slog.d(TAG, "restoreFinished packageName=" + mCurrentPackage.packageName);
}
try {
+ long restoreAgentFinishedTimeoutMillis =
+ mAgentTimeoutParameters.getRestoreAgentFinishedTimeoutMillis();
backupManagerService
.prepareOperationTimeout(mEphemeralOpToken,
- TIMEOUT_RESTORE_FINISHED_INTERVAL, this,
+ restoreAgentFinishedTimeoutMillis, this,
OP_TYPE_RESTORE_WAIT);
mAgent.doRestoreFinished(mEphemeralOpToken,
backupManagerService.getBackupManagerBinder());
@@ -1109,9 +1115,10 @@
} else {
// We were invoked via an active restore session, not by the Package
// Manager, so start up the session timeout again.
+ long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
backupManagerService.getBackupHandler().sendEmptyMessageDelayed(
MSG_RESTORE_SESSION_TIMEOUT,
- TIMEOUT_RESTORE_INTERVAL);
+ restoreAgentTimeoutMillis);
}
// Kick off any work that may be needed regarding app widget restores
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 91d3afb..a1ef1ed 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -910,7 +910,12 @@
private Tethering makeTethering() {
// TODO: Move other elements into @Overridden getters.
- final TetheringDependencies deps = new TetheringDependencies();
+ final TetheringDependencies deps = new TetheringDependencies() {
+ @Override
+ public boolean isTetheringSupported() {
+ return ConnectivityService.this.isTetheringSupported();
+ }
+ };
return new Tethering(mContext, mNetd, mStatsService, mPolicyManager,
IoThread.get().getLooper(), new MockableSystemProperties(),
deps);
@@ -5320,7 +5325,6 @@
for (LinkProperties stacked : newNetwork.linkProperties.getStackedLinks()) {
final String stackedIface = stacked.getInterfaceName();
bs.noteNetworkInterfaceType(stackedIface, type);
- NetworkStatsFactory.noteStackedIface(stackedIface, baseIface);
}
} catch (RemoteException ignored) {
}
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index f6ff359..40f9476 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -266,9 +266,9 @@
@GuardedBy("LOCK")
private boolean mValue;
- public DebugFlag(String key) {
+ public DebugFlag(String key, boolean defaultValue) {
mKey = key;
- refresh();
+ mValue = SystemProperties.getBoolean(key, defaultValue);
}
void refresh() {
@@ -290,7 +290,7 @@
*/
private static final class DebugFlags {
static final DebugFlag FLAG_OPTIMIZE_START_INPUT =
- new DebugFlag("debug.optimize_startinput");
+ new DebugFlag("debug.optimize_startinput", false);
}
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index d09a161..cd90e3f 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -24,6 +24,8 @@
import static android.system.OsConstants.SOCK_DGRAM;
import static com.android.internal.util.Preconditions.checkNotNull;
+import android.annotation.NonNull;
+import android.app.AppOpsManager;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.IIpSecService;
@@ -42,6 +44,7 @@
import android.net.TrafficStats;
import android.net.util.NetdService;
import android.os.Binder;
+import android.os.DeadSystemException;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -931,7 +934,7 @@
return mPort;
}
- public FileDescriptor getSocket() {
+ public FileDescriptor getFileDescriptor() {
return mSocket;
}
@@ -974,6 +977,13 @@
return service;
}
+ @NonNull
+ private AppOpsManager getAppOpsManager() {
+ AppOpsManager appOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+ if(appOps == null) throw new RuntimeException("System Server couldn't get AppOps");
+ return appOps;
+ }
+
/** @hide */
@VisibleForTesting
public IpSecService(Context context, IpSecServiceConfiguration config) {
@@ -1065,7 +1075,10 @@
public synchronized IpSecSpiResponse allocateSecurityParameterIndex(
String destinationAddress, int requestedSpi, IBinder binder) throws RemoteException {
checkInetAddress(destinationAddress);
- /* requestedSpi can be anything in the int range, so no check is needed. */
+ // RFC 4303 Section 2.1 - 0=local, 1-255=reserved.
+ if (requestedSpi > 0 && requestedSpi < 256) {
+ throw new IllegalArgumentException("ESP SPI must not be in the range of 0-255.");
+ }
checkNotNull(binder, "Null Binder passed to allocateSecurityParameterIndex");
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
@@ -1237,7 +1250,9 @@
*/
@Override
public synchronized IpSecTunnelInterfaceResponse createTunnelInterface(
- String localAddr, String remoteAddr, Network underlyingNetwork, IBinder binder) {
+ String localAddr, String remoteAddr, Network underlyingNetwork, IBinder binder,
+ String callingPackage) {
+ enforceTunnelPermissions(callingPackage);
checkNotNull(binder, "Null Binder passed to createTunnelInterface");
checkNotNull(underlyingNetwork, "No underlying network was specified");
checkInetAddress(localAddr);
@@ -1317,8 +1332,8 @@
*/
@Override
public synchronized void addAddressToTunnelInterface(
- int tunnelResourceId, LinkAddress localAddr) {
- enforceNetworkStackPermission();
+ int tunnelResourceId, LinkAddress localAddr, String callingPackage) {
+ enforceTunnelPermissions(callingPackage);
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
// Get tunnelInterface record; if no such interface is found, will throw
@@ -1349,10 +1364,10 @@
*/
@Override
public synchronized void removeAddressFromTunnelInterface(
- int tunnelResourceId, LinkAddress localAddr) {
- enforceNetworkStackPermission();
- UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
+ int tunnelResourceId, LinkAddress localAddr, String callingPackage) {
+ enforceTunnelPermissions(callingPackage);
+ UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
// Get tunnelInterface record; if no such interface is found, will throw
// IllegalArgumentException
TunnelInterfaceRecord tunnelInterfaceInfo =
@@ -1380,7 +1395,9 @@
* server
*/
@Override
- public synchronized void deleteTunnelInterface(int resourceId) throws RemoteException {
+ public synchronized void deleteTunnelInterface(
+ int resourceId, String callingPackage) throws RemoteException {
+ enforceTunnelPermissions(callingPackage);
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
releaseResource(userRecord.mTunnelInterfaceRecords, resourceId);
}
@@ -1466,7 +1483,6 @@
case IpSecTransform.MODE_TRANSPORT:
break;
case IpSecTransform.MODE_TUNNEL:
- enforceNetworkStackPermission();
break;
default:
throw new IllegalArgumentException(
@@ -1474,9 +1490,20 @@
}
}
- private void enforceNetworkStackPermission() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.NETWORK_STACK,
- "IpSecService");
+ private void enforceTunnelPermissions(String callingPackage) {
+ checkNotNull(callingPackage, "Null calling package cannot create IpSec tunnels");
+ switch (getAppOpsManager().noteOp(
+ AppOpsManager.OP_MANAGE_IPSEC_TUNNELS,
+ Binder.getCallingUid(), callingPackage)) {
+ case AppOpsManager.MODE_DEFAULT:
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "IpSecService");
+ break;
+ case AppOpsManager.MODE_ALLOWED:
+ return;
+ default:
+ throw new SecurityException("Request to ignore AppOps for non-legacy API");
+ }
}
private void createOrUpdateTransform(
@@ -1532,8 +1559,12 @@
* result in all of those sockets becoming unable to send or receive data.
*/
@Override
- public synchronized IpSecTransformResponse createTransform(IpSecConfig c, IBinder binder)
- throws RemoteException {
+ public synchronized IpSecTransformResponse createTransform(
+ IpSecConfig c, IBinder binder, String callingPackage) throws RemoteException {
+ checkNotNull(c);
+ if (c.getMode() == IpSecTransform.MODE_TUNNEL) {
+ enforceTunnelPermissions(callingPackage);
+ }
checkIpSecConfig(c);
checkNotNull(binder, "Null Binder passed to createTransform");
final int resourceId = mNextResourceId++;
@@ -1654,8 +1685,9 @@
*/
@Override
public synchronized void applyTunnelModeTransform(
- int tunnelResourceId, int direction, int transformResourceId) throws RemoteException {
- enforceNetworkStackPermission();
+ int tunnelResourceId, int direction,
+ int transformResourceId, String callingPackage) throws RemoteException {
+ enforceTunnelPermissions(callingPackage);
checkDirection(direction);
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index b0a7443..6d6fd84 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -1869,10 +1869,10 @@
}
@Override
- public NetworkStats getNetworkStatsUidDetail(int uid) {
+ public NetworkStats getNetworkStatsUidDetail(int uid, String[] ifaces) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- return mStatsFactory.readNetworkStatsDetail(uid, null, TAG_ALL, null);
+ return mStatsFactory.readNetworkStatsDetail(uid, ifaces, TAG_ALL, null);
} catch (IOException e) {
throw new IllegalStateException(e);
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 3d7b21d..379658f 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -2668,6 +2668,9 @@
final int userId = UserHandle.getUserId(Binder.getCallingUid());
final UserEnvironment userEnv = new UserEnvironment(userId);
+ // Ignore requests to create directories while storage is locked
+ if (!isUserKeyUnlocked(userId)) return;
+
// Validate that reported package name belongs to caller
final AppOpsManager appOps = (AppOpsManager) mContext.getSystemService(
Context.APP_OPS_SERVICE);
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 539c001..83fe976 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1753,7 +1753,8 @@
long token = Binder.clearCallingIdentity();
try {
return LocationAccessPolicy.canAccessCellLocation(mContext,
- r.callingPackage, r.callerUid, r.callerPid);
+ r.callingPackage, r.callerUid, r.callerPid,
+ /*throwOnDeniedPermission*/ false);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index e84c5f4..f57e9ac 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -420,12 +420,36 @@
boolean forcedStandby = false;
if (appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
if (DEBUG_FOREGROUND_SERVICE) {
- Slog.d(TAG, "Forcing bg-only service start only for "
- + r.name.flattenToShortString());
+ Slog.d(TAG, "Forcing bg-only service start only for " + r.shortName);
}
forcedStandby = true;
}
+ // If this is a direct-to-foreground start, make sure it is allowed as per the app op.
+ boolean forceSilentAbort = false;
+ if (fgRequired) {
+ final int mode = mAm.mAppOpsService.checkOperation(
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
+ switch (mode) {
+ case AppOpsManager.MODE_ALLOWED:
+ case AppOpsManager.MODE_DEFAULT:
+ // All okay.
+ break;
+ case AppOpsManager.MODE_IGNORED:
+ // Not allowed, fall back to normal start service, failing siliently
+ // if background check restricts that.
+ Slog.w(TAG, "startForegroundService not allowed due to app op: service "
+ + service + " to " + r.name.flattenToShortString()
+ + " from pid=" + callingPid + " uid=" + callingUid
+ + " pkg=" + callingPackage);
+ fgRequired = false;
+ forceSilentAbort = true;
+ break;
+ default:
+ return new ComponentName("!!", "foreground not allowed as per app op");
+ }
+ }
+
// If this isn't a direct-to-foreground start, check our ability to kick off an
// arbitrary service
if (forcedStandby || (!r.startRequested && !fgRequired)) {
@@ -438,7 +462,7 @@
+ service + " to " + r.name.flattenToShortString()
+ " from pid=" + callingPid + " uid=" + callingUid
+ " pkg=" + callingPackage);
- if (allowed == ActivityManager.APP_START_MODE_DELAYED) {
+ if (allowed == ActivityManager.APP_START_MODE_DELAYED || forceSilentAbort) {
// In this case we are silently disabling the app, to disrupt as
// little as possible existing apps.
return null;
@@ -458,6 +482,7 @@
// is in the foreground passing it a pending intent to start the service when
// review is completed.
if (mAm.mPermissionReviewRequired) {
+ // XXX This is not dealing with fgRequired!
if (!requestStartTargetPermissionsReviewIfNeededLocked(r, callingPackage,
callingUid, service, callerFg, userId)) {
return null;
@@ -474,6 +499,12 @@
r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),
service, neededGrants, callingUid));
+ if (fgRequired) {
+ // We are now effectively running a foreground service.
+ mAm.mAppOpsService.startOperation(AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, true);
+ }
+
final ServiceMap smap = getServiceMapLocked(r.userId);
boolean addToStarting = false;
if (!callerFg && !fgRequired && r.app == null
@@ -1116,63 +1147,105 @@
android.Manifest.permission.FOREGROUND_SERVICE,
r.app.pid, r.appInfo.uid, "startForeground");
}
+ boolean alreadyStartedOp = false;
if (r.fgRequired) {
if (DEBUG_SERVICE || DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "Service called startForeground() as required: " + r);
}
r.fgRequired = false;
r.fgWaiting = false;
+ alreadyStartedOp = true;
mAm.mHandler.removeMessages(
ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r);
}
- // Apps under strict background restrictions simply don't get to have foreground
- // services, so now that we've enforced the startForegroundService() contract
- // we only do the machinery of making the service foreground when the app
- // is not restricted.
- if (!appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
- if (r.foregroundId != id) {
- cancelForegroundNotificationLocked(r);
- r.foregroundId = id;
+ try {
+ boolean ignoreForeground = false;
+ final int mode = mAm.mAppOpsService.checkOperation(
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
+ switch (mode) {
+ case AppOpsManager.MODE_ALLOWED:
+ case AppOpsManager.MODE_DEFAULT:
+ // All okay.
+ break;
+ case AppOpsManager.MODE_IGNORED:
+ // Whoops, silently ignore this.
+ Slog.w(TAG, "Service.startForeground() not allowed due to app op: service "
+ + r.shortName);
+ ignoreForeground = true;
+ break;
+ default:
+ throw new SecurityException("Foreground not allowed as per app op");
}
- notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
- r.foregroundNoti = notification;
- if (!r.isForeground) {
- final ServiceMap smap = getServiceMapLocked(r.userId);
- if (smap != null) {
- ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
- if (active == null) {
- active = new ActiveForegroundApp();
- active.mPackageName = r.packageName;
- active.mUid = r.appInfo.uid;
- active.mShownWhileScreenOn = mScreenOn;
- if (r.app != null) {
- active.mAppOnTop = active.mShownWhileTop =
- r.app.uidRecord.curProcState
- <= ActivityManager.PROCESS_STATE_TOP;
- }
- active.mStartTime = active.mStartVisibleTime
- = SystemClock.elapsedRealtime();
- smap.mActiveForegroundApps.put(r.packageName, active);
- requestUpdateActiveForegroundAppsLocked(smap, 0);
- }
- active.mNumActive++;
+
+ if (!ignoreForeground &&
+ appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
+ ignoreForeground = true;
+ Slog.w(TAG,
+ "Service.startForeground() not allowed due to bg restriction: service "
+ + r.shortName);
+ }
+
+ // Apps under strict background restrictions simply don't get to have foreground
+ // services, so now that we've enforced the startForegroundService() contract
+ // we only do the machinery of making the service foreground when the app
+ // is not restricted.
+ if (!ignoreForeground) {
+ if (r.foregroundId != id) {
+ cancelForegroundNotificationLocked(r);
+ r.foregroundId = id;
}
- r.isForeground = true;
- StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
- r.appInfo.uid, r.shortName,
- StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER);
+ notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
+ r.foregroundNoti = notification;
+ if (!r.isForeground) {
+ final ServiceMap smap = getServiceMapLocked(r.userId);
+ if (smap != null) {
+ ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
+ if (active == null) {
+ active = new ActiveForegroundApp();
+ active.mPackageName = r.packageName;
+ active.mUid = r.appInfo.uid;
+ active.mShownWhileScreenOn = mScreenOn;
+ if (r.app != null) {
+ active.mAppOnTop = active.mShownWhileTop =
+ r.app.uidRecord.curProcState
+ <= ActivityManager.PROCESS_STATE_TOP;
+ }
+ active.mStartTime = active.mStartVisibleTime
+ = SystemClock.elapsedRealtime();
+ smap.mActiveForegroundApps.put(r.packageName, active);
+ requestUpdateActiveForegroundAppsLocked(smap, 0);
+ }
+ active.mNumActive++;
+ }
+ r.isForeground = true;
+ mAm.mAppOpsService.startOperation(
+ AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName,
+ true);
+ StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
+ r.appInfo.uid, r.shortName,
+ StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER);
+ }
+ r.postNotification();
+ if (r.app != null) {
+ updateServiceForegroundLocked(r.app, true);
+ }
+ getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);
+ mAm.notifyPackageUse(r.serviceInfo.packageName,
+ PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
+ } else {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG, "Suppressing startForeground() for FAS " + r);
+ }
}
- r.postNotification();
- if (r.app != null) {
- updateServiceForegroundLocked(r.app, true);
- }
- getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);
- mAm.notifyPackageUse(r.serviceInfo.packageName,
- PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
- } else {
- if (DEBUG_FOREGROUND_SERVICE) {
- Slog.d(TAG, "Suppressing startForeground() for FAS " + r);
+ } finally {
+ if (alreadyStartedOp) {
+ // If we had previously done a start op for direct foreground start,
+ // we have cleared the flag so can now drop it.
+ mAm.mAppOpsService.finishOperation(
+ AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
}
}
} else {
@@ -1182,6 +1255,9 @@
decActiveForegroundAppLocked(smap, r);
}
r.isForeground = false;
+ mAm.mAppOpsService.finishOperation(
+ AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
r.appInfo.uid, r.shortName,
StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT);
@@ -2561,6 +2637,8 @@
+ r);
r.fgRequired = false;
r.fgWaiting = false;
+ mAm.mAppOpsService.finishOperation(AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
mAm.mHandler.removeMessages(
ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r);
if (r.app != null) {
@@ -2609,6 +2687,9 @@
cancelForegroundNotificationLocked(r);
if (r.isForeground) {
decActiveForegroundAppLocked(smap, r);
+ mAm.mAppOpsService.finishOperation(
+ AppOpsManager.getToken(mAm.mAppOpsService),
+ AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, r.appInfo.uid, r.shortName,
StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4f0acf7..f97c6d6 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -281,6 +281,7 @@
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
+import android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageManager;
@@ -819,7 +820,7 @@
public boolean canShowErrorDialogs() {
return mShowDialogs && !mSleeping && !mShuttingDown
- && !mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)
+ && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
&& !mUserController.hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
mUserController.getCurrentUserId())
&& !(UserManager.isDeviceInDemoMode(mContext)
@@ -1261,11 +1262,17 @@
}
public static GrantUri resolve(int defaultSourceUserHandle, Uri uri) {
- return new GrantUri(ContentProvider.getUserIdFromUri(uri, defaultSourceUserHandle),
- ContentProvider.getUriWithoutUserId(uri), false);
+ if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+ return new GrantUri(ContentProvider.getUserIdFromUri(uri, defaultSourceUserHandle),
+ ContentProvider.getUriWithoutUserId(uri), false);
+ } else {
+ return new GrantUri(defaultSourceUserHandle, uri, false);
+ }
}
}
+ boolean mSystemProvidersInstalled;
+
CoreSettingsObserver mCoreSettingsObserver;
FontScaleSettingObserver mFontScaleSettingObserver;
@@ -1523,6 +1530,11 @@
private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
/**
+ * State of external calls telling us if the device is awake or asleep.
+ */
+ private boolean mKeyguardShown = false;
+
+ /**
* Set if we are shutting down the system, similar to sleeping.
*/
boolean mShuttingDown = false;
@@ -2866,13 +2878,15 @@
}
/**
- * Encapsulates the globla setting "hidden_api_blacklist_exemptions", including tracking the
+ * Encapsulates the global setting "hidden_api_blacklist_exemptions", including tracking the
* latest value via a content observer.
*/
static class HiddenApiBlacklist extends ContentObserver {
private final Context mContext;
private boolean mBlacklistDisabled;
+ private String mExemptionsStr;
+ private List<String> mExemptions = Collections.emptyList();
public HiddenApiBlacklist(Handler handler, Context context) {
super(handler);
@@ -2888,8 +2902,22 @@
}
private void update() {
- mBlacklistDisabled = "*".equals(Settings.Global.getString(mContext.getContentResolver(),
- Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS));
+ String exemptions = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS);
+ if (!TextUtils.equals(exemptions, mExemptionsStr)) {
+ mExemptionsStr = exemptions;
+ if ("*".equals(exemptions)) {
+ mBlacklistDisabled = true;
+ mExemptions = Collections.emptyList();
+ } else {
+ mBlacklistDisabled = false;
+ mExemptions = TextUtils.isEmpty(exemptions)
+ ? Collections.emptyList()
+ : Arrays.asList(exemptions.split(","));
+ }
+ zygoteProcess.setApiBlacklistExemptions(mExemptions);
+ }
+
}
boolean isDisabled() {
@@ -4183,12 +4211,14 @@
runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
}
- if (!app.info.isAllowedToUseHiddenApi() &&
- !disableHiddenApiChecks &&
- !mHiddenApiBlacklist.isDisabled()) {
- // This app is not allowed to use undocumented and private APIs, or blacklisting is
- // enabled. Set up its runtime with the appropriate flag.
- runtimeFlags |= Zygote.ENABLE_HIDDEN_API_CHECKS;
+ if (!disableHiddenApiChecks && !mHiddenApiBlacklist.isDisabled()) {
+ @HiddenApiEnforcementPolicy int policy =
+ app.info.getHiddenApiEnforcementPolicy();
+ int policyBits = (policy << Zygote.API_ENFORCEMENT_POLICY_SHIFT);
+ if ((policyBits & Zygote.API_ENFORCEMENT_POLICY_MASK) != policyBits) {
+ throw new IllegalStateException("Invalid API policy: " + policy);
+ }
+ runtimeFlags |= policyBits;
}
String invokeWith = null;
@@ -4431,7 +4461,7 @@
buf.append(" ");
buf.append(app.hostingNameStr);
}
- Slog.i(TAG, buf.toString());
+ reportUidInfoMessageLocked(TAG, buf.toString(), app.startUid);
app.setPid(pid);
app.usingWrapper = usingWrapper;
app.pendingStart = false;
@@ -4468,8 +4498,8 @@
StatsLog.write(StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED,
component.app.uid, component.realActivity.getPackageName(),
component.realActivity.getShortClassName(), resumed ?
- StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__ACTIVITY__MOVE_TO_FOREGROUND :
- StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__ACTIVITY__MOVE_TO_BACKGROUND);
+ StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__FOREGROUND :
+ StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__BACKGROUND);
if (resumed) {
if (mUsageStatsService != null) {
mUsageStatsService.reportEvent(component.realActivity, component.userId,
@@ -4920,6 +4950,14 @@
}
}
+ void reportUidInfoMessageLocked(String tag, String msg, int uid) {
+ Slog.i(TAG, msg);
+ if (mCurOomAdjObserver != null && uid == mCurOomAdjUid) {
+ mUiHandler.obtainMessage(DISPATCH_OOM_ADJ_OBSERVER_MSG, msg).sendToTarget();
+ }
+
+ }
+
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
@@ -5912,9 +5950,10 @@
boolean doLowMem = app.instr == null;
boolean doOomAdj = doLowMem;
if (!app.killedByAm) {
- Slog.i(TAG, "Process " + app.processName + " (pid " + pid + ") has died: "
- + ProcessList.makeOomAdjString(app.setAdj)
- + ProcessList.makeProcStateString(app.setProcState));
+ reportUidInfoMessageLocked(TAG,
+ "Process " + app.processName + " (pid " + pid + ") has died: "
+ + ProcessList.makeOomAdjString(app.setAdj)
+ + ProcessList.makeProcStateString(app.setProcState), app.info.uid);
mAllowLowerMemLevel = true;
} else {
// Note that we always want to do oom adj to update our state with the
@@ -5936,8 +5975,9 @@
}
} else if (app.pid != pid) {
// A new process has already been started.
- Slog.i(TAG, "Process " + app.processName + " (pid " + pid
- + ") has died and restarted (pid " + app.pid + ").");
+ reportUidInfoMessageLocked(TAG,
+ "Process " + app.processName + " (pid " + pid
+ + ") has died and restarted (pid " + app.pid + ").", app.info.uid);
EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.userId, app.pid, app.processName);
} else if (DEBUG_PROCESSES) {
Slog.d(TAG_PROCESSES, "Received spurious death notification for thread "
@@ -10596,8 +10636,8 @@
intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
}
}
- final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp, 0,
- UserHandle.getUserId(callingUid));
+ final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
+ STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
if (ainfo.applicationInfo.uid != callingUid) {
throw new SecurityException(
"Can't add task for another application: target uid="
@@ -12110,6 +12150,14 @@
"Attempt to launch content provider before system ready");
}
+ // If system providers are not installed yet we aggressively crash to avoid
+ // creating multiple instance of these providers and then bad things happen!
+ if (!mSystemProvidersInstalled && cpi.applicationInfo.isSystemApp()
+ && "system".equals(cpi.processName)) {
+ throw new IllegalStateException("Cannot access system provider: '"
+ + cpi.authority + "' before system providers are installed!");
+ }
+
// Make sure that the user who owns this provider is running. If not,
// we don't want to allow it to run.
if (!mUserController.isUserRunning(userId, 0)) {
@@ -12607,8 +12655,10 @@
// As far as we're concerned, this is just like receiving a
// death notification... just a bit prematurely.
- Slog.i(TAG, "Process " + proc.processName + " (pid " + proc.pid
- + ") early provider death");
+ reportUidInfoMessageLocked(TAG,
+ "Process " + proc.processName + " (pid " + proc.pid
+ + ") early provider death",
+ proc.info.uid);
final long ident = Binder.clearCallingIdentity();
try {
appDiedLocked(proc);
@@ -12663,6 +12713,10 @@
mSystemThread.installSystemProviders(providers);
}
+ synchronized (this) {
+ mSystemProvidersInstalled = true;
+ }
+
mConstants.start(mContext.getContentResolver());
mCoreSettingsObserver = new CoreSettingsObserver(this);
mFontScaleSettingObserver = new FontScaleSettingObserver();
@@ -12852,7 +12906,7 @@
// owning application.
mBatteryStatsService.addIsolatedUid(uid, info.uid);
}
- final ProcessRecord r = new ProcessRecord(stats, info, proc, uid);
+ final ProcessRecord r = new ProcessRecord(this, stats, info, proc, uid);
if (!mBooted && !mBooting
&& userId == UserHandle.USER_SYSTEM
&& (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
@@ -13029,6 +13083,28 @@
return mSleeping;
}
+ void reportGlobalUsageEventLocked(int event) {
+ mUsageStatsService.reportEvent("android", mUserController.getCurrentUserId(), event);
+ int[] profiles = mUserController.getCurrentProfileIds();
+ if (profiles != null) {
+ for (int i = profiles.length - 1; i >= 0; i--) {
+ mUsageStatsService.reportEvent((String)null, profiles[i], event);
+ }
+ }
+ }
+
+ void reportCurWakefulnessUsageEventLocked() {
+ reportGlobalUsageEventLocked(mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE
+ ? UsageEvents.Event.SCREEN_INTERACTIVE
+ : UsageEvents.Event.SCREEN_NON_INTERACTIVE);
+ }
+
+ void reportCurKeyguardUsageEventLocked() {
+ reportGlobalUsageEventLocked(mKeyguardShown
+ ? UsageEvents.Event.KEYGUARD_SHOWN
+ : UsageEvents.Event.KEYGUARD_HIDDEN);
+ }
+
void onWakefulnessChanged(int wakefulness) {
synchronized(this) {
boolean wasAwake = mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -13038,6 +13114,7 @@
if (wasAwake != isAwake) {
// Also update state in a special way for running foreground services UI.
mServices.updateScreenStateLocked(isAwake);
+ reportCurWakefulnessUsageEventLocked();
mHandler.obtainMessage(DISPATCH_SCREEN_AWAKE_MSG, isAwake ? 1 : 0, 0)
.sendToTarget();
}
@@ -13125,10 +13202,6 @@
+ android.Manifest.permission.SHUTDOWN);
}
- // TODO: Where should the corresponding '1' (start) write go?
- StatsLog.write(StatsLog.DEVICE_ON_STATUS_CHANGED,
- StatsLog.DEVICE_ON_STATUS_CHANGED__STATE__OFF);
-
boolean timedout = false;
synchronized(this) {
@@ -13185,7 +13258,8 @@
}
@Override
- public void setLockScreenShown(boolean showing, int secondaryDisplayShowing) {
+ public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing,
+ int secondaryDisplayShowing) {
if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires permission "
@@ -13194,14 +13268,19 @@
synchronized(this) {
long ident = Binder.clearCallingIdentity();
+ if (mKeyguardShown != keyguardShowing) {
+ mKeyguardShown = keyguardShowing;
+ reportCurKeyguardUsageEventLocked();
+ }
try {
- mKeyguardController.setKeyguardShown(showing, secondaryDisplayShowing);
+ mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing,
+ secondaryDisplayShowing);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
- mHandler.obtainMessage(DISPATCH_SCREEN_KEYGUARD_MSG, showing ? 1 : 0, 0)
+ mHandler.obtainMessage(DISPATCH_SCREEN_KEYGUARD_MSG, keyguardShowing ? 1 : 0, 0)
.sendToTarget();
}
@@ -14012,6 +14091,18 @@
}
@Override
+ public boolean isUidActive(int uid, String callingPackage) {
+ if (!hasUsageStatsPermission(callingPackage)) {
+ enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
+ "getPackageProcessState");
+ }
+ synchronized (this) {
+ final UidRecord uidRecord = mActiveUids.get(uid);
+ return uidRecord != null && !uidRecord.setIdle;
+ }
+ }
+
+ @Override
public boolean convertFromTranslucent(IBinder token) {
final long origId = Binder.clearCallingIdentity();
try {
@@ -14762,7 +14853,7 @@
.setPackage("android")
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
broadcastIntent(null, intent, null, null, 0, null, null, null,
- OP_NONE, null, true, false, UserHandle.USER_ALL);
+ OP_NONE, null, false, false, UserHandle.USER_ALL);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -15129,6 +15220,22 @@
crashInfo.throwFileName,
crashInfo.throwLineNumber);
+ StatsLog.write(StatsLog.APP_CRASH_OCCURRED,
+ Binder.getCallingUid(),
+ eventType,
+ processName,
+ Binder.getCallingPid(),
+ (r != null && r.info != null) ? r.info.packageName : "",
+ (r != null && r.info != null) ? (r.info.isInstantApp()
+ ? StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__TRUE
+ : StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__FALSE)
+ : StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__UNAVAILABLE,
+ r != null ? (r.isInterestingToUserLocked()
+ ? StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__FOREGROUND
+ : StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__BACKGROUND)
+ : StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__UNKNOWN
+ );
+
addErrorToDropBox(eventType, r, processName, null, null, null, null, null, crashInfo);
mAppErrors.crashApplication(r, crashInfo);
@@ -15299,6 +15406,9 @@
EventLog.writeEvent(EventLogTags.AM_WTF, UserHandle.getUserId(callingUid), callingPid,
processName, r == null ? -1 : r.info.flags, tag, crashInfo.exceptionMessage);
+ StatsLog.write(StatsLog.WTF_OCCURRED, callingUid, tag, processName,
+ callingPid);
+
addErrorToDropBox("wtf", r, processName, null, null, tag, null, null, crashInfo);
return r;
@@ -15420,19 +15530,6 @@
final String dropboxTag = processClass(process) + "_" + eventType;
if (dbox == null || !dbox.isTagEnabled(dropboxTag)) return;
- // Log to StatsLog before the rate-limiting.
- // The logging below is adapated from appendDropboxProcessHeaders.
- StatsLog.write(StatsLog.DROPBOX_ERROR_CHANGED,
- process != null ? process.uid : -1,
- dropboxTag,
- processName,
- process != null ? process.pid : -1,
- (process != null && process.info != null) ?
- (process.info.isInstantApp() ? 1 : 0) : -1,
- activity != null ? activity.shortComponentName : null,
- activity != null ? activity.packageName : null,
- process != null ? (process.isInterestingToUserLocked() ? 1 : 0) : -1);
-
// Rate-limit how often we're willing to do the heavy lifting below to
// collect and record logs; currently 5 logs per 10 second period.
final long now = SystemClock.elapsedRealtime();
@@ -19712,6 +19809,7 @@
catPw.flush();
}
dropBuilder.append(catSw.toString());
+ StatsLog.write(StatsLog.LOW_MEM_REPORTED);
addErrorToDropBox("lowmem", null, "system_server", null,
null, tag.toString(), dropBuilder.toString(), null, null);
//Slog.i(TAG, "Sent to dropbox:");
@@ -20868,8 +20966,16 @@
// explicitly list each action as a protected broadcast, so we will check for that
// one safe case and allow it: an explicit broadcast, only being received by something
// that has protected itself.
- if (receivers != null && receivers.size() > 0
- && (intent.getPackage() != null || intent.getComponent() != null)) {
+ if (intent.getPackage() != null || intent.getComponent() != null) {
+ if (receivers == null || receivers.size() == 0) {
+ // Intent is explicit and there's no receivers.
+ // This happens, e.g. , when a system component sends a broadcast to
+ // its own runtime receiver, and there's no manifest receivers for it,
+ // because this method is called twice for each broadcast,
+ // for runtime receivers and manifest receivers and the later check would find
+ // no receivers.
+ return;
+ }
boolean allProtected = true;
for (int i = receivers.size()-1; i >= 0; i--) {
Object target = receivers.get(i);
@@ -21173,7 +21279,7 @@
ApplicationInfo aInfo = null;
try {
aInfo = AppGlobals.getPackageManager()
- .getApplicationInfo(ssp, 0 /*flags*/, userId);
+ .getApplicationInfo(ssp, STOCK_PM_FLAGS, userId);
} catch (RemoteException ignore) {}
if (aInfo == null) {
Slog.w(TAG, "Dropping ACTION_PACKAGE_REPLACED for non-existent pkg:"
@@ -21198,7 +21304,7 @@
try {
ApplicationInfo ai = AppGlobals.getPackageManager().
- getApplicationInfo(ssp, 0, 0);
+ getApplicationInfo(ssp, STOCK_PM_FLAGS, 0);
mBatteryStatsService.notePackageInstalled(ssp,
ai != null ? ai.versionCode : 0);
} catch (RemoteException e) {
@@ -22795,11 +22901,15 @@
app.cached = false;
final int activitiesSize = app.activities.size();
+ final int appUid = app.info.uid;
+ final int logUid = mCurOomAdjUid;
if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
// The max adjustment doesn't allow this app to be anything
// below foreground, so it is not worth doing work for it.
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making fixed: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making fixed: " + app);
+ }
app.adjType = "fixed";
app.adjSeq = mAdjSeq;
app.curRawAdj = app.maxAdj;
@@ -22851,20 +22961,26 @@
app.adjType = "top-activity";
foregroundActivities = true;
procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making top: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app);
+ }
} else if (app.runningRemoteAnimation) {
adj = ProcessList.VISIBLE_APP_ADJ;
schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
app.adjType = "running-remote-anim";
procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making running remote anim: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making running remote anim: " + app);
+ }
} else if (app.instr != null) {
// Don't want to kill running instrumentation.
adj = ProcessList.FOREGROUND_APP_ADJ;
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
app.adjType = "instrumentation";
procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making instrumentation: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making instrumentation: " + app);
+ }
} else if (isReceivingBroadcastLocked(app, mTmpBroadcastQueue)) {
// An app that is currently receiving a broadcast also
// counts as being in the foreground for OOM killer purposes.
@@ -22875,7 +22991,9 @@
? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
app.adjType = "broadcast";
procState = ActivityManager.PROCESS_STATE_RECEIVER;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making broadcast: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making broadcast: " + app);
+ }
} else if (app.executingServices.size() > 0) {
// An app that is currently executing a service callback also
// counts as being in the foreground.
@@ -22884,7 +23002,9 @@
ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;
app.adjType = "exec-service";
procState = ActivityManager.PROCESS_STATE_SERVICE;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making exec-service: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making exec-service: " + app);
+ }
//Slog.i(TAG, "EXEC " + (app.execServicesFg ? "FG" : "BG") + ": " + app);
} else if (app == TOP_APP) {
adj = ProcessList.FOREGROUND_APP_ADJ;
@@ -22892,7 +23012,9 @@
app.adjType = "top-sleeping";
foregroundActivities = true;
procState = PROCESS_STATE_CUR_TOP;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making top: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top (sleeping): " + app);
+ }
} else {
// As far as we know the process is empty. We may change our mind later.
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
@@ -22903,7 +23025,9 @@
app.cached = true;
app.empty = true;
app.adjType = "cch-empty";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Making empty: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making empty: " + app);
+ }
}
// Examine all activities if not already foreground.
@@ -22926,12 +23050,18 @@
if (adj > ProcessList.VISIBLE_APP_ADJ) {
adj = ProcessList.VISIBLE_APP_ADJ;
app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to vis-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to vis-activity: " + app);
+ }
}
if (procState > PROCESS_STATE_CUR_TOP) {
procState = PROCESS_STATE_CUR_TOP;
app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to vis-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to vis-activity (top): " + app);
+ }
}
if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
@@ -22951,12 +23081,18 @@
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to pause-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to pause-activity: " + app);
+ }
}
if (procState > PROCESS_STATE_CUR_TOP) {
procState = PROCESS_STATE_CUR_TOP;
app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to pause-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to pause-activity (top): " + app);
+ }
}
if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
@@ -22968,7 +23104,10 @@
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to stop-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to stop-activity: " + app);
+ }
}
// For the process state, we will at this point consider the
// process to be cached. It will be cached either as an activity
@@ -22981,7 +23120,10 @@
if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to stop-activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to stop-activity: " + app);
+ }
}
}
app.cached = false;
@@ -22991,7 +23133,10 @@
if (procState > ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
app.adjType = "cch-act";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to cached activity: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to cached activity: " + app);
+ }
}
}
}
@@ -23002,7 +23147,9 @@
if (procState > ActivityManager.PROCESS_STATE_CACHED_RECENT && app.recentTasks.size() > 0) {
procState = ActivityManager.PROCESS_STATE_CACHED_RECENT;
app.adjType = "cch-rec";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to cached recent: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to cached recent: " + app);
+ }
}
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
@@ -23014,7 +23161,9 @@
app.cached = false;
app.adjType = "fg-service";
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to fg service: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to fg service: " + app);
+ }
} else if (app.hasOverlayUi) {
// The process is display an overlay UI.
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
@@ -23022,7 +23171,9 @@
app.cached = false;
app.adjType = "has-overlay-ui";
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to overlay ui: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to overlay ui: " + app);
+ }
}
}
@@ -23038,7 +23189,9 @@
app.adjType = "force-imp";
app.adjSource = app.forcingToImportant;
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to force imp: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to force imp: " + app);
+ }
}
}
@@ -23049,12 +23202,16 @@
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
app.cached = false;
app.adjType = "heavy";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to heavy: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app);
+ }
}
if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
procState = ActivityManager.PROCESS_STATE_HEAVY_WEIGHT;
app.adjType = "heavy";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to heavy: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to heavy: " + app);
+ }
}
}
@@ -23066,12 +23223,16 @@
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
app.cached = false;
app.adjType = "home";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to home: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app);
+ }
}
if (procState > ActivityManager.PROCESS_STATE_HOME) {
procState = ActivityManager.PROCESS_STATE_HOME;
app.adjType = "home";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to home: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to home: " + app);
+ }
}
}
@@ -23084,12 +23245,16 @@
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
app.cached = false;
app.adjType = "previous";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to prev: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
+ }
}
if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
app.adjType = "previous";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to prev: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app);
+ }
}
}
@@ -23113,13 +23278,17 @@
procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
}
app.adjType = "backup";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to backup: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app);
+ }
app.cached = false;
}
if (procState > ActivityManager.PROCESS_STATE_BACKUP) {
procState = ActivityManager.PROCESS_STATE_BACKUP;
app.adjType = "backup";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to backup: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to backup: " + app);
+ }
}
}
@@ -23139,7 +23308,10 @@
if (procState > ActivityManager.PROCESS_STATE_SERVICE) {
procState = ActivityManager.PROCESS_STATE_SERVICE;
app.adjType = "started-services";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to started service: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to started service: " + app);
+ }
}
if (app.hasShownUi && app != mHomeProcess) {
// If this process has shown some UI, let it immediately
@@ -23157,7 +23329,10 @@
if (adj > ProcessList.SERVICE_ADJ) {
adj = ProcessList.SERVICE_ADJ;
app.adjType = "started-services";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to started service: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to started service: " + app);
+ }
app.cached = false;
}
}
@@ -23348,9 +23523,12 @@
app.adjSource = cr.binding.client;
app.adjSourceProcState = clientProcState;
app.adjTarget = s.name;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to " + adjType
- + ": " + app + ", due to " + cr.binding.client
- + " adj=" + adj + " procState=" + procState);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
+ + ": " + app + ", due to " + cr.binding.client
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
}
}
if ((cr.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
@@ -23375,8 +23553,10 @@
app.adjSource = a;
app.adjSourceProcState = procState;
app.adjTarget = s.name;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to service w/activity: "
- + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise to service w/activity: " + app);
+ }
}
}
}
@@ -23460,9 +23640,12 @@
app.adjSource = client;
app.adjSourceProcState = clientProcState;
app.adjTarget = cpr.name;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to " + adjType
- + ": " + app + ", due to " + client
- + " adj=" + adj + " procState=" + procState);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType
+ + ": " + app + ", due to " + client
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
}
}
// If the provider has external (non-framework) process
@@ -23475,10 +23658,15 @@
app.cached = false;
app.adjType = "ext-provider";
app.adjTarget = cpr.name;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to external provider: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to external provider: " + app);
+ }
}
if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to external provider: " + app);
}
}
}
@@ -23490,12 +23678,18 @@
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
app.cached = false;
app.adjType = "recent-provider";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to recent provider: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to recent provider: " + app);
+ }
}
if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
app.adjType = "recent-provider";
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "Raise to recent provider: " + app);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to recent provider: " + app);
+ }
}
}
@@ -23521,9 +23715,12 @@
app.adjType = mayBeTopType;
app.adjSource = mayBeTopSource;
app.adjTarget = mayBeTopTarget;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "May be top raise to " + mayBeTopType
- + ": " + app + ", due to " + mayBeTopSource
- + " adj=" + adj + " procState=" + procState);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
+ + ": " + app + ", due to " + mayBeTopSource
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
break;
default:
// Otherwise, top is a better choice, so take it.
@@ -23531,9 +23728,12 @@
app.adjType = mayBeTopType;
app.adjSource = mayBeTopSource;
app.adjTarget = mayBeTopTarget;
- if (DEBUG_OOM_ADJ_REASON) Slog.d(TAG, "May be top raise to " + mayBeTopType
- + ": " + app + ", due to " + mayBeTopSource
- + " adj=" + adj + " procState=" + procState);
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "May be top raise to " + mayBeTopType
+ + ": " + app + ", due to " + mayBeTopSource
+ + " adj=" + adj + " procState="
+ + ProcessList.makeProcStateString(procState));
+ }
break;
}
}
@@ -23995,7 +24195,7 @@
app.setSchedGroup = app.curSchedGroup;
if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) {
String msg = "Setting sched group of " + app.processName
- + " to " + app.curSchedGroup;
+ + " to " + app.curSchedGroup + ": " + app.adjType;
reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
}
if (app.waitingToKill != null && app.curReceivers.isEmpty()
@@ -24148,7 +24348,8 @@
if (app.setProcState != app.curProcState) {
if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) {
String msg = "Proc state change of " + app.processName
- + " to " + app.curProcState;
+ + " to " + ProcessList.makeProcStateString(app.curProcState)
+ + " (" + app.curProcState + ")" + ": " + app.adjType;
reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
}
boolean setImportant = app.setProcState < ActivityManager.PROCESS_STATE_SERVICE;
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 81dae39..dc9a5adb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -2962,7 +2962,7 @@
pw.println(" monitor [--gdb <port>]");
pw.println(" Start monitoring for crashes or ANRs.");
pw.println(" --gdb: start gdbserv on the given port at crash/ANR");
- pw.println(" watch-uids [--oom <uid>");
+ pw.println(" watch-uids [--oom <uid>]");
pw.println(" Start watching for and reporting uid state changes.");
pw.println(" --oom: specify a uid for which to report detailed change messages.");
pw.println(" hang [--allow-restart]");
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 724dd3f..47d0423 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -489,7 +489,7 @@
builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name);
mMetricsLogger.write(builder);
StatsLog.write(
- StatsLog.APP_START_CANCEL_CHANGED,
+ StatsLog.APP_START_CANCELED,
info.launchedActivity.appInfo.uid,
info.launchedActivity.packageName,
convertAppStartTransitionType(type),
@@ -561,7 +561,7 @@
packageOptimizationInfo.getCompilationFilter());
mMetricsLogger.write(builder);
StatsLog.write(
- StatsLog.APP_START_CHANGED,
+ StatsLog.APP_START_OCCURRED,
info.applicationInfo.uid,
info.packageName,
convertAppStartTransitionType(info.type),
@@ -582,15 +582,15 @@
private int convertAppStartTransitionType(int tronType) {
if (tronType == TYPE_TRANSITION_COLD_LAUNCH) {
- return StatsLog.APP_START_CHANGED__TYPE__COLD;
+ return StatsLog.APP_START_OCCURRED__TYPE__COLD;
}
if (tronType == TYPE_TRANSITION_WARM_LAUNCH) {
- return StatsLog.APP_START_CHANGED__TYPE__WARM;
+ return StatsLog.APP_START_OCCURRED__TYPE__WARM;
}
if (tronType == TYPE_TRANSITION_HOT_LAUNCH) {
- return StatsLog.APP_START_CHANGED__TYPE__HOT;
+ return StatsLog.APP_START_OCCURRED__TYPE__HOT;
}
- return StatsLog.APP_START_CHANGED__TYPE__APP_START_TRANSITION_TYPE_UNKNOWN;
+ return StatsLog.APP_START_OCCURRED__TYPE__UNKNOWN;
}
void logAppTransitionReportedDrawn(ActivityRecord r, boolean restoredFromBundle) {
@@ -611,12 +611,12 @@
info.currentTransitionProcessRunning ? 1 : 0);
mMetricsLogger.write(builder);
StatsLog.write(
- StatsLog.APP_START_FULLY_DRAWN_CHANGED,
+ StatsLog.APP_START_FULLY_DRAWN,
info.launchedActivity.appInfo.uid,
info.launchedActivity.packageName,
restoredFromBundle
- ? StatsLog.APP_START_FULLY_DRAWN_CHANGED__TYPE__WITH_BUNDLE
- : StatsLog.APP_START_FULLY_DRAWN_CHANGED__TYPE__WITHOUT_BUNDLE,
+ ? StatsLog.APP_START_FULLY_DRAWN__TYPE__WITH_BUNDLE
+ : StatsLog.APP_START_FULLY_DRAWN__TYPE__WITHOUT_BUNDLE,
info.launchedActivity.info.name,
info.currentTransitionProcessRunning,
startupTimeMs);
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index ccc17a3..1af4114 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -236,7 +236,8 @@
final IApplicationToken.Stub appToken; // window manager token
AppWindowContainerController mWindowContainerController;
final ActivityInfo info; // all about me
- final ApplicationInfo appInfo; // information about activity's app
+ // TODO: This is duplicated state already contained in info.applicationInfo - remove
+ ApplicationInfo appInfo; // information about activity's app
final int launchedFromPid; // always the pid who started the activity.
final int launchedFromUid; // always the uid who started the activity.
final String launchedFromPackage; // always the package who started the activity.
@@ -605,6 +606,11 @@
}
}
+ void updateApplicationInfo(ApplicationInfo aInfo) {
+ appInfo = aInfo;
+ info.applicationInfo = aInfo;
+ }
+
private boolean crossesHorizontalSizeThreshold(int firstDp, int secondDp) {
return crossesSizeThreshold(mHorizontalSizeConfigurations, firstDp, secondDp);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index aa462ec..00ebcbd 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1324,7 +1324,7 @@
final ActivityRecord ar = activities.get(activityNdx);
if ((userId == ar.userId) && packageName.equals(ar.packageName)) {
- ar.info.applicationInfo = aInfo;
+ ar.updateApplicationInfo(aInfo);
}
}
}
@@ -2019,8 +2019,9 @@
* @return true if {@param r} is visible taken Keyguard state into account, false otherwise
*/
boolean checkKeyguardVisibility(ActivityRecord r, boolean shouldBeVisible, boolean isTop) {
- final boolean keyguardShowing = mStackSupervisor.getKeyguardController().isKeyguardShowing(
- mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY);
+ final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;
+ final boolean keyguardOrAodShowing = mStackSupervisor.getKeyguardController()
+ .isKeyguardOrAodShowing(displayId);
final boolean keyguardLocked = mStackSupervisor.getKeyguardController().isKeyguardLocked();
final boolean showWhenLocked = r.canShowWhenLocked();
final boolean dismissKeyguard = r.hasDismissKeyguardWindows();
@@ -2041,10 +2042,9 @@
return true;
}
}
- if (keyguardShowing) {
-
+ if (keyguardOrAodShowing) {
// If keyguard is showing, nothing is visible, except if we are able to dismiss Keyguard
- // right away.
+ // right away and AOD isn't visible.
return shouldBeVisible && mStackSupervisor.getKeyguardController()
.canShowActivityWhileKeyguardShowing(r, dismissKeyguard);
} else if (keyguardLocked) {
@@ -3987,7 +3987,8 @@
} else {
try {
ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo(
- destIntent.getComponent(), 0, srec.userId);
+ destIntent.getComponent(), ActivityManagerService.STOCK_PM_FLAGS,
+ srec.userId);
// TODO(b/64750076): Check if calling pid should really be -1.
final int res = mService.getActivityStartController()
.obtainStarter(destIntent, "navigateUpTo")
@@ -5139,8 +5140,9 @@
mService, taskId, info, intent, voiceSession, voiceInteractor);
// add the task to stack first, mTaskPositioner might need the stack association
addTask(task, toTop, "createTaskRecord");
+ final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;
final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController()
- .isKeyguardShowing(mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY);
+ .isKeyguardOrAodShowing(displayId);
if (!mStackSupervisor.getLaunchParamsController()
.layoutTask(task, info.windowLayout, activity, source, options)
&& !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 265e4fa..d5dfdcf 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -3382,8 +3382,8 @@
stack.goToSleepIfPossible(false /* shuttingDown */);
} else {
stack.awakeFromSleepingLocked();
- if (isFocusedStack(stack)
- && !getKeyguardController().isKeyguardShowing(display.mDisplayId)) {
+ if (isFocusedStack(stack) && !getKeyguardController().isKeyguardOrAodShowing(
+ display.mDisplayId)) {
// If the keyguard is unlocked - resume immediately.
// It is possible that the display will not be awake at the time we
// process the keyguard going away, which can happen before the sleep token
diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java
index 868f90d..fb78838 100644
--- a/services/core/java/com/android/server/am/ActivityStartController.java
+++ b/services/core/java/com/android/server/am/ActivityStartController.java
@@ -198,9 +198,10 @@
// See if we should be showing the platform update setup UI.
final Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP);
- final List<ResolveInfo> ris = mService.mContext.getPackageManager()
- .queryIntentActivities(intent,
- PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA);
+ final List<ResolveInfo> ris =
+ mService.mContext.getPackageManager().queryIntentActivities(intent,
+ PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA
+ | ActivityManagerService.STOCK_PM_FLAGS);
if (!ris.isEmpty()) {
final ResolveInfo ri = ris.get(0);
String vers = ri.activityInfo.metaData != null
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index a30a944..1b7e1ed 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -46,6 +46,7 @@
import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
import static android.content.pm.ActivityInfo.DOCUMENT_LAUNCH_ALWAYS;
+import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
@@ -1205,9 +1206,20 @@
return START_RETURN_LOCK_TASK_MODE_VIOLATION;
}
- if (mStartActivity.getTask() == null) {
+ // True if we are clearing top and resetting of a standard (default) launch mode
+ // ({@code LAUNCH_MULTIPLE}) activity. The existing activity will be finished.
+ final boolean clearTopAndResetStandardLaunchMode =
+ (mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))
+ == (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ && mLaunchMode == LAUNCH_MULTIPLE;
+
+ // If mStartActivity does not have a task associated with it, associate it with the
+ // reused activity's task. Do not do so if we're clearing top and resetting for a
+ // standard launchMode activity.
+ if (mStartActivity.getTask() == null && !clearTopAndResetStandardLaunchMode) {
mStartActivity.setTask(reusedActivity.getTask());
}
+
if (reusedActivity.getTask().intent == null) {
// This task was started because of movement of the activity based on affinity...
// Now that we are actually launching it, we can assign the base intent.
@@ -1266,17 +1278,21 @@
resumeTargetStackIfNeeded();
return START_RETURN_INTENT_TO_CALLER;
}
- setTaskFromIntentActivity(reusedActivity);
- if (!mAddingToTask && mReuseTask == null) {
- // We didn't do anything... but it was needed (a.k.a., client don't use that
- // intent!) And for paranoia, make sure we have correctly resumed the top activity.
- resumeTargetStackIfNeeded();
- if (outActivity != null && outActivity.length > 0) {
- outActivity[0] = reusedActivity;
+ if (reusedActivity != null) {
+ setTaskFromIntentActivity(reusedActivity);
+
+ if (!mAddingToTask && mReuseTask == null) {
+ // We didn't do anything... but it was needed (a.k.a., client don't use that
+ // intent!) And for paranoia, make sure we have correctly resumed the top activity.
+
+ resumeTargetStackIfNeeded();
+ if (outActivity != null && outActivity.length > 0) {
+ outActivity[0] = reusedActivity;
+ }
+
+ return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
}
-
- return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
}
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index b2872e4..d5bb7ed 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -47,6 +47,7 @@
import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
+import android.util.StatsLog;
import android.util.SparseArray;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
@@ -1039,6 +1040,16 @@
Process.sendSignal(app.pid, Process.SIGNAL_QUIT);
}
+ StatsLog.write(StatsLog.ANR_OCCURRED, app.uid, app.processName,
+ activity == null ? "unknown": activity.shortComponentName, annotation,
+ (app.info != null) ? (app.info.isInstantApp()
+ ? StatsLog.ANROCCURRED__IS_INSTANT_APP__TRUE
+ : StatsLog.ANROCCURRED__IS_INSTANT_APP__FALSE)
+ : StatsLog.ANROCCURRED__IS_INSTANT_APP__UNAVAILABLE,
+ app != null ? (app.isInterestingToUserLocked()
+ ? StatsLog.ANROCCURRED__FOREGROUND_STATE__FOREGROUND
+ : StatsLog.ANROCCURRED__FOREGROUND_STATE__BACKGROUND)
+ : StatsLog.ANROCCURRED__FOREGROUND_STATE__UNKNOWN);
mService.addErrorToDropBox("anr", app, app.processName, activity, parent, annotation,
cpuInfo, tracesFile, null);
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 3c49ece..8ecd93e 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -17,10 +17,15 @@
package com.android.server.am;
import android.app.ActivityManager;
+import android.app.job.JobProtoEnums;
import android.bluetooth.BluetoothActivityEnergyInfo;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.hardware.usb.UsbManager;
import android.net.wifi.WifiActivityEnergyInfo;
import android.os.PowerManager.ServiceType;
import android.os.PowerSaveState;
@@ -34,6 +39,7 @@
import android.os.ParcelFormatException;
import android.os.PowerManagerInternal;
import android.os.Process;
+import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -70,7 +76,6 @@
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
@@ -332,7 +337,7 @@
synchronized (mStats) {
mStats.noteProcessStartLocked(name, uid);
StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
- StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__EVENT__PROCESS_STARTED);
+ StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__STARTED);
}
}
@@ -340,15 +345,13 @@
synchronized (mStats) {
mStats.noteProcessCrashLocked(name, uid);
StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
- StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__EVENT__PROCESS_CRASHED);
+ StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__CRASHED);
}
}
void noteProcessAnr(String name, int uid) {
synchronized (mStats) {
mStats.noteProcessAnrLocked(name, uid);
- StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
- StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__EVENT__PROCESS_ANRED);
}
}
@@ -356,7 +359,7 @@
synchronized (mStats) {
mStats.noteProcessFinishLocked(name, uid);
StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
- StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__EVENT__PROCESS_FINISHED);
+ StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__FINISHED);
}
}
@@ -438,6 +441,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteSyncStartLocked(name, uid);
+ StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, uid, null, name,
+ StatsLog.SYNC_STATE_CHANGED__STATE__ON);
}
}
@@ -445,6 +450,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteSyncFinishLocked(name, uid);
+ StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, uid, null, name,
+ StatsLog.SYNC_STATE_CHANGED__STATE__OFF);
}
}
@@ -452,6 +459,9 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteJobStartLocked(name, uid);
+ StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null,
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
+ JobProtoEnums.STOP_REASON_UNKNOWN);
}
}
@@ -459,6 +469,9 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteJobFinishLocked(name, uid, stopReason);
+ StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null,
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
+ stopReason);
}
}
@@ -573,6 +586,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteStartSensorLocked(uid, sensor);
+ StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, uid, null, sensor,
+ StatsLog.SENSOR_STATE_CHANGED__STATE__ON);
}
}
@@ -580,6 +595,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteStopSensorLocked(uid, sensor);
+ StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, uid, null,
+ sensor, StatsLog.SENSOR_STATE_CHANGED__STATE__OFF);
}
}
@@ -684,6 +701,13 @@
}
}
+ public void noteUsbConnectionState(boolean connected) {
+ enforceCallingPermission();
+ synchronized (mStats) {
+ mStats.noteUsbConnectionStateLocked(connected);
+ }
+ }
+
public void notePhoneSignalStrength(SignalStrength signalStrength) {
enforceCallingPermission();
synchronized (mStats) {
@@ -724,6 +748,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteAudioOnLocked(uid);
+ StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
+ StatsLog.AUDIO_STATE_CHANGED__STATE__ON);
}
}
@@ -731,6 +757,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteAudioOffLocked(uid);
+ StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
+ StatsLog.AUDIO_STATE_CHANGED__STATE__OFF);
}
}
@@ -738,6 +766,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteVideoOnLocked(uid);
+ StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid, null,
+ StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__ON);
}
}
@@ -745,6 +775,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteVideoOffLocked(uid);
+ StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid,
+ null, StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__OFF);
}
}
@@ -752,6 +784,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteResetAudioLocked();
+ StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, -1, null,
+ StatsLog.AUDIO_STATE_CHANGED__STATE__RESET);
}
}
@@ -759,6 +793,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteResetVideoLocked();
+ StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, -1, null,
+ StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__RESET);
}
}
@@ -766,6 +802,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteFlashlightOnLocked(uid);
+ StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, uid, null,
+ StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__ON);
}
}
@@ -773,6 +811,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteFlashlightOffLocked(uid);
+ StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, uid, null,
+ StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__OFF);
}
}
@@ -781,6 +821,8 @@
if (DBG) Slog.d(TAG, "begin noteStartCamera");
synchronized (mStats) {
mStats.noteCameraOnLocked(uid);
+ StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, uid, null,
+ StatsLog.CAMERA_STATE_CHANGED__STATE__ON);
}
if (DBG) Slog.d(TAG, "end noteStartCamera");
}
@@ -789,6 +831,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteCameraOffLocked(uid);
+ StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, uid, null,
+ StatsLog.CAMERA_STATE_CHANGED__STATE__OFF);
}
}
@@ -796,6 +840,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteResetCameraLocked();
+ StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, -1, null,
+ StatsLog.CAMERA_STATE_CHANGED__STATE__RESET);
}
}
@@ -803,6 +849,8 @@
enforceCallingPermission();
synchronized (mStats) {
mStats.noteResetFlashlightLocked();
+ StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, -1, null,
+ StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__RESET);
}
}
@@ -1116,6 +1164,35 @@
Binder.getCallingPid(), Binder.getCallingUid(), null);
}
+ public final static class UsbConnectionReceiver extends BroadcastReceiver {
+ private static final String TAG = UsbConnectionReceiver.class.getSimpleName();
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
+ final Intent usbState = context.registerReceiver(null, new IntentFilter(UsbManager.ACTION_USB_STATE));
+ if (usbState != null) {
+ handleUsbState(usbState);
+ }
+ } else if (UsbManager.ACTION_USB_STATE.equals(action)) {
+ handleUsbState(intent);
+ }
+ }
+ private void handleUsbState(Intent intent) {
+ IBatteryStats bs = getService();
+ if (bs == null) {
+ Slog.w(TAG, "Could not access batterystats");
+ return;
+ }
+ boolean connected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED);
+ try {
+ bs.noteUsbConnectionState(connected);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Could not access batterystats: ", e);
+ }
+ }
+ }
+
final class WakeupReasonThread extends Thread {
private static final int MAX_REASON_SIZE = 512;
private CharsetDecoder mDecoder;
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index b67dd0d..1b7f75b 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -62,6 +62,7 @@
private final ActivityStackSupervisor mStackSupervisor;
private WindowManagerService mWindowManager;
private boolean mKeyguardShowing;
+ private boolean mAodShowing;
private boolean mKeyguardGoingAway;
private boolean mOccluded;
private boolean mDismissalRequested;
@@ -82,6 +83,15 @@
}
/**
+ * @return true if either Keyguard or AOD are showing, not going away, and not being occluded
+ * on the given display, false otherwise
+ */
+ boolean isKeyguardOrAodShowing(int displayId) {
+ return (mKeyguardShowing || mAodShowing) && !mKeyguardGoingAway &&
+ (displayId == DEFAULT_DISPLAY ? !mOccluded : displayId == mSecondaryDisplayShowing);
+ }
+
+ /**
* @return true if Keyguard is showing, not going away, and not being occluded on the given
* display, false otherwise
*/
@@ -108,17 +118,19 @@
/**
* Update the Keyguard showing state.
*/
- void setKeyguardShown(boolean showing, int secondaryDisplayShowing) {
- boolean showingChanged = showing != mKeyguardShowing;
+ void setKeyguardShown(boolean keyguardShowing, boolean aodShowing,
+ int secondaryDisplayShowing) {
+ boolean showingChanged = keyguardShowing != mKeyguardShowing || aodShowing != mAodShowing;
if (!showingChanged && secondaryDisplayShowing == mSecondaryDisplayShowing) {
return;
}
- mKeyguardShowing = showing;
+ mKeyguardShowing = keyguardShowing;
+ mAodShowing = aodShowing;
mSecondaryDisplayShowing = secondaryDisplayShowing;
if (showingChanged) {
dismissDockedStackIfNeeded();
setKeyguardGoingAway(false);
- if (showing) {
+ if (keyguardShowing) {
mDismissalRequested = false;
}
}
@@ -230,8 +242,8 @@
// Allow to show it when we are about to dismiss Keyguard. This isn't allowed if r is
// already the dismissing activity, in which case we don't allow it to repeatedly dismiss
// Keyguard.
- return dismissKeyguard && canDismissKeyguard() &&
- (mDismissalRequested || r != mDismissingKeyguardActivity);
+ return dismissKeyguard && canDismissKeyguard() && !mAodShowing
+ && (mDismissalRequested || r != mDismissingKeyguardActivity);
}
/**
@@ -369,9 +381,9 @@
}
private void updateKeyguardSleepToken() {
- if (mSleepToken == null && isKeyguardShowing(DEFAULT_DISPLAY)) {
+ if (mSleepToken == null && isKeyguardOrAodShowing(DEFAULT_DISPLAY)) {
mSleepToken = mService.acquireSleepToken("Keyguard", DEFAULT_DISPLAY);
- } else if (mSleepToken != null && !isKeyguardShowing(DEFAULT_DISPLAY)) {
+ } else if (mSleepToken != null && !isKeyguardOrAodShowing(DEFAULT_DISPLAY)) {
mSleepToken.release();
mSleepToken = null;
}
@@ -380,6 +392,7 @@
void dump(PrintWriter pw, String prefix) {
pw.println(prefix + "KeyguardController:");
pw.println(prefix + " mKeyguardShowing=" + mKeyguardShowing);
+ pw.println(prefix + " mAodShowing=" + mAodShowing);
pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway);
pw.println(prefix + " mOccluded=" + mOccluded);
pw.println(prefix + " mDismissingKeyguardActivity=" + mDismissingKeyguardActivity);
diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java
index 106b37f..bef650b 100644
--- a/services/core/java/com/android/server/am/LockTaskController.java
+++ b/services/core/java/com/android/server/am/LockTaskController.java
@@ -285,6 +285,16 @@
return false;
}
+ /**
+ * @return the root task of the lock task.
+ */
+ TaskRecord getRootTask() {
+ if (mLockTaskModeTasks.isEmpty()) {
+ return null;
+ }
+ return mLockTaskModeTasks.get(0);
+ }
+
private boolean isLockTaskModeViolationInternal(TaskRecord task, boolean isNewClearTask) {
// TODO: Double check what's going on here. If the task is already in lock task mode, it's
// likely whitelisted, so will return false below.
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index e348bf4..03acb84 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -57,6 +57,7 @@
final class ProcessRecord {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessRecord" : TAG_AM;
+ private final ActivityManagerService mService; // where we came from
private final BatteryStatsImpl mBatteryStats; // where to collect runtime statistics
final ApplicationInfo info; // all about the first app in the process
final boolean isolated; // true if this is a special isolated process
@@ -486,8 +487,9 @@
}
}
- ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
- String _processName, int _uid) {
+ ProcessRecord(ActivityManagerService _service, BatteryStatsImpl _batteryStats,
+ ApplicationInfo _info, String _processName, int _uid) {
+ mService = _service;
mBatteryStats = _batteryStats;
info = _info;
isolated = _info.uid != _uid;
@@ -660,8 +662,10 @@
void kill(String reason, boolean noisy) {
if (!killedByAm) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");
- if (noisy) {
- Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
+ if (mService != null && (noisy || info.uid == mService.mCurOomAdjUid)) {
+ mService.reportUidInfoMessageLocked(TAG,
+ "Killing " + toShortString() + " (adj " + setAdj + "): " + reason,
+ info.uid);
}
if (pid > 0) {
EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index efd8153..1d305fb 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -600,7 +600,8 @@
// activities that are fully runnable based on
// current system state.
ai = pm.getActivityInfo(task.realActivity,
- PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
+ PackageManager.MATCH_DEBUG_TRIAGED_MISSING
+ | ActivityManagerService.STOCK_PM_FLAGS, userId);
} catch (RemoteException e) {
// Will never happen.
continue;
@@ -1154,6 +1155,11 @@
}
}
+ // If we're in lock task mode, ignore the root task
+ if (task == mService.mLockTaskController.getRootTask()) {
+ return false;
+ }
+
return true;
}
diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java
index da56ffd..9df321c 100644
--- a/services/core/java/com/android/server/am/RecentsAnimation.java
+++ b/services/core/java/com/android/server/am/RecentsAnimation.java
@@ -42,18 +42,13 @@
class RecentsAnimation implements RecentsAnimationCallbacks {
private static final String TAG = RecentsAnimation.class.getSimpleName();
- private static final int RECENTS_ANIMATION_TIMEOUT = 10 * 1000;
-
private final ActivityManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private final ActivityStartController mActivityStartController;
private final WindowManagerService mWindowManager;
private final UserController mUserController;
- private final Handler mHandler;
private final int mCallingPid;
- private final Runnable mCancelAnimationRunnable;
-
// The stack to restore the home stack behind when the animation is finished
private ActivityStack mRestoreHomeBehindStack;
@@ -63,16 +58,9 @@
mService = am;
mStackSupervisor = stackSupervisor;
mActivityStartController = activityStartController;
- mHandler = new Handler(mStackSupervisor.mLooper);
mWindowManager = wm;
mUserController = userController;
mCallingPid = callingPid;
-
- mCancelAnimationRunnable = () -> {
- // The caller has not finished the animation in a predefined amount of time, so
- // force-cancel the animation
- mWindowManager.cancelRecentsAnimation();
- };
}
void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner,
@@ -133,10 +121,6 @@
// duration of the gesture that is driven by the recents component
homeActivity.mLaunchTaskBehind = true;
- // Post a timeout for the animation. This needs to happen before initializing the
- // recents animation on the WM side since we may decide to cancel the animation there
- mHandler.postDelayed(mCancelAnimationRunnable, RECENTS_ANIMATION_TIMEOUT);
-
// Fetch all the surface controls and pass them to the client to get the animation
// started
mWindowManager.cancelRecentsAnimation();
@@ -157,7 +141,6 @@
@Override
public void onAnimationFinished(boolean moveHomeToTop) {
- mHandler.removeCallbacks(mCancelAnimationRunnable);
synchronized (mService) {
if (mWindowManager.getRecentsAnimationController() == null) return;
@@ -168,7 +151,7 @@
"RecentsAnimation#onAnimationFinished_inSurfaceTransaction");
mWindowManager.deferSurfaceLayout();
try {
- mWindowManager.cleanupRecentsAnimation();
+ mWindowManager.cleanupRecentsAnimation(moveHomeToTop);
// Move the home stack to the front
final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 0d125e0..a294334 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -47,6 +47,7 @@
import android.app.IStopUserCallback;
import android.app.IUserSwitchObserver;
import android.app.KeyguardManager;
+import android.app.usage.UsageEvents;
import android.content.Context;
import android.content.IIntentReceiver;
import android.content.Intent;
@@ -959,6 +960,8 @@
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
}
if (foreground) {
+ // Make sure the old user is no longer considering the display to be on.
+ mInjector.reportGlobalUsageEventLocked(UsageEvents.Event.SCREEN_NON_INTERACTIVE);
synchronized (mLock) {
mCurrentUserId = userId;
mTargetUserId = UserHandle.USER_NULL; // reset, mCurrentUserId has caught up
@@ -966,6 +969,7 @@
mInjector.updateUserConfiguration();
updateCurrentProfileIds();
mInjector.getWindowManager().setCurrentUser(userId, getCurrentProfileIds());
+ mInjector.reportCurWakefulnessUsageEvent();
// Once the internal notion of the active user has switched, we lock the device
// with the option to show the user switcher on the keyguard.
if (mUserSwitchUiEnabled) {
@@ -1589,6 +1593,7 @@
void onSystemReady() {
updateCurrentProfileIds();
+ mInjector.reportCurWakefulnessUsageEvent();
}
/**
@@ -2183,6 +2188,18 @@
d.show();
}
+ void reportGlobalUsageEventLocked(int event) {
+ synchronized (mService) {
+ mService.reportGlobalUsageEventLocked(event);
+ }
+ }
+
+ void reportCurWakefulnessUsageEvent() {
+ synchronized (mService) {
+ mService.reportCurWakefulnessUsageEventLocked();
+ }
+ }
+
void stackSupervisorRemoveUser(int userId) {
synchronized (mService) {
mService.mStackSupervisor.removeUserLocked(userId);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 041764f..c8b6b50 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -1422,21 +1422,24 @@
direction/*val1*/, flags/*val2*/, new StringBuilder(callingPackage)
.append("/").append(caller).append(" uid:").append(uid).toString()));
final int streamType;
- if (mUserSelectedVolumeControlStream) { // implies mVolumeControlStream != -1
- streamType = mVolumeControlStream;
- } else {
- final int maybeActiveStreamType = getActiveStreamType(suggestedStreamType);
- final boolean activeForReal;
- if (maybeActiveStreamType == AudioSystem.STREAM_RING
- || maybeActiveStreamType == AudioSystem.STREAM_NOTIFICATION) {
- activeForReal = wasStreamActiveRecently(maybeActiveStreamType, 0);
- } else {
- activeForReal = AudioSystem.isStreamActive(maybeActiveStreamType, 0);
- }
- if (activeForReal || mVolumeControlStream == -1) {
- streamType = maybeActiveStreamType;
- } else {
+ synchronized (mForceControlStreamLock) {
+ // Request lock in case mVolumeControlStream is changed by other thread.
+ if (mUserSelectedVolumeControlStream) { // implies mVolumeControlStream != -1
streamType = mVolumeControlStream;
+ } else {
+ final int maybeActiveStreamType = getActiveStreamType(suggestedStreamType);
+ final boolean activeForReal;
+ if (maybeActiveStreamType == AudioSystem.STREAM_RING
+ || maybeActiveStreamType == AudioSystem.STREAM_NOTIFICATION) {
+ activeForReal = wasStreamActiveRecently(maybeActiveStreamType, 0);
+ } else {
+ activeForReal = AudioSystem.isStreamActive(maybeActiveStreamType, 0);
+ }
+ if (activeForReal || mVolumeControlStream == -1) {
+ streamType = maybeActiveStreamType;
+ } else {
+ streamType = mVolumeControlStream;
+ }
}
}
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index 32b1d1a..7a6d964 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -17,6 +17,7 @@
package com.android.server.broadcastradio.hal1;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.hardware.radio.ITuner;
import android.hardware.radio.ITunerCallback;
import android.hardware.radio.ProgramList;
@@ -87,8 +88,9 @@
mTuner.close();
}
- void startProgramListUpdates(@NonNull ProgramList.Filter filter) {
- mProgramListFilter.set(Objects.requireNonNull(filter));
+ void startProgramListUpdates(@Nullable ProgramList.Filter filter) {
+ if (filter == null) filter = new ProgramList.Filter();
+ mProgramListFilter.set(filter);
sendProgramListUpdate();
}
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
index 6919282..9730c9a 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
@@ -232,6 +232,7 @@
* HAL implementation instance. */
1, // numTuners
1, // numAudioSources
+ false, // isInitializationRequired
false, // isCaptureSupported
amfmConfigToBands(amfmConfig),
@@ -374,7 +375,9 @@
);
}
- static @NonNull ProgramFilter programFilterToHal(@NonNull ProgramList.Filter filter) {
+ static @NonNull ProgramFilter programFilterToHal(@Nullable ProgramList.Filter filter) {
+ if (filter == null) filter = new ProgramList.Filter();
+
ProgramFilter hwFilter = new ProgramFilter();
filter.getIdentifierTypes().stream().forEachOrdered(hwFilter.identifierTypes::add);
diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
index 296b9ac..53a9544 100644
--- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
+++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
@@ -20,9 +20,13 @@
import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
+import static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN;
import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager.UsageCallback;
@@ -31,14 +35,19 @@
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkIdentity;
+import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkRequest;
import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.net.StringNetworkSpecifier;
+import android.os.BestClock;
import android.os.Handler;
+import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.util.DebugUtils;
+import android.util.Pair;
import android.util.Slog;
import com.android.internal.util.IndentingPrintWriter;
@@ -46,8 +55,14 @@
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.net.NetworkStatsManagerInternal;
+import java.time.Clock;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
/**
* Manages multipath data budgets.
@@ -68,6 +83,8 @@
private final Context mContext;
private final Handler mHandler;
+ private final Clock mClock;
+ private final Dependencies mDeps;
private ConnectivityManager mCM;
private NetworkPolicyManager mNPM;
@@ -79,9 +96,28 @@
// STOPSHIP: replace this with a configurable mechanism.
private static final long DEFAULT_DAILY_MULTIPATH_QUOTA = 2_500_000;
+ /**
+ * Divider to calculate opportunistic quota from user-set data limit or warning: 5% of user-set
+ * limit.
+ */
+ private static final int OPQUOTA_USER_SETTING_DIVIDER = 20;
+
+ public static class Dependencies {
+ public Clock getClock() {
+ return new BestClock(ZoneOffset.UTC, SystemClock.currentNetworkTimeClock(),
+ Clock.systemUTC());
+ }
+ }
+
public MultipathPolicyTracker(Context ctx, Handler handler) {
+ this(ctx, handler, new Dependencies());
+ }
+
+ public MultipathPolicyTracker(Context ctx, Handler handler, Dependencies deps) {
mContext = ctx;
mHandler = handler;
+ mClock = deps.getClock();
+ mDeps = deps;
// Because we are initialized by the ConnectivityService constructor, we can't touch any
// connectivity APIs. Service initialization is done in start().
}
@@ -127,9 +163,11 @@
private long mMultipathBudget;
private final NetworkTemplate mNetworkTemplate;
private final UsageCallback mUsageCallback;
+ private NetworkCapabilities mNetworkCapabilities;
public MultipathTracker(Network network, NetworkCapabilities nc) {
this.network = network;
+ this.mNetworkCapabilities = new NetworkCapabilities(nc);
try {
subId = Integer.parseInt(
((StringNetworkSpecifier) nc.getNetworkSpecifier()).toString());
@@ -166,32 +204,97 @@
updateMultipathBudget();
}
- private long getDailyNonDefaultDataUsage() {
- Calendar start = Calendar.getInstance();
- Calendar end = (Calendar) start.clone();
- start.set(Calendar.HOUR_OF_DAY, 0);
- start.set(Calendar.MINUTE, 0);
- start.set(Calendar.SECOND, 0);
- start.set(Calendar.MILLISECOND, 0);
+ public void setNetworkCapabilities(NetworkCapabilities nc) {
+ mNetworkCapabilities = new NetworkCapabilities(nc);
+ }
+ // TODO: calculate with proper timezone information
+ private long getDailyNonDefaultDataUsage() {
+ final ZonedDateTime end =
+ ZonedDateTime.ofInstant(mClock.instant(), ZoneId.systemDefault());
+ final ZonedDateTime start = end.truncatedTo(ChronoUnit.DAYS);
+
+ final long bytes = getNetworkTotalBytes(
+ start.toInstant().toEpochMilli(),
+ end.toInstant().toEpochMilli());
+ if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes);
+ return bytes;
+ }
+
+ private long getNetworkTotalBytes(long start, long end) {
try {
- final long bytes = LocalServices.getService(NetworkStatsManagerInternal.class)
- .getNetworkTotalBytes(mNetworkTemplate, start.getTimeInMillis(),
- end.getTimeInMillis());
- if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes);
- return bytes;
+ return LocalServices.getService(NetworkStatsManagerInternal.class)
+ .getNetworkTotalBytes(mNetworkTemplate, start, end);
} catch (RuntimeException e) {
Slog.w(TAG, "Failed to get data usage: " + e);
return -1;
}
}
+ private NetworkIdentity getTemplateMatchingNetworkIdentity(NetworkCapabilities nc) {
+ return new NetworkIdentity(
+ ConnectivityManager.TYPE_MOBILE,
+ 0 /* subType, unused for template matching */,
+ subscriberId,
+ null /* networkId, unused for matching mobile networks */,
+ !nc.hasCapability(NET_CAPABILITY_NOT_ROAMING),
+ !nc.hasCapability(NET_CAPABILITY_NOT_METERED),
+ false /* defaultNetwork, templates should have DEFAULT_NETWORK_ALL */);
+ }
+
+ private long getRemainingDailyBudget(long limitBytes,
+ Pair<ZonedDateTime, ZonedDateTime> cycle) {
+ final long start = cycle.first.toInstant().toEpochMilli();
+ final long end = cycle.second.toInstant().toEpochMilli();
+ final long totalBytes = getNetworkTotalBytes(start, end);
+ final long remainingBytes = totalBytes == -1 ? 0 : Math.max(0, limitBytes - totalBytes);
+ // 1 + ((end - now - 1) / millisInDay with integers is equivalent to:
+ // ceil((double)(end - now) / millisInDay)
+ final long remainingDays =
+ 1 + ((end - mClock.millis() - 1) / TimeUnit.DAYS.toMillis(1));
+
+ return remainingBytes / Math.max(1, remainingDays);
+ }
+
+ private long getUserPolicyOpportunisticQuotaBytes() {
+ // Keep the most restrictive applicable policy
+ long minQuota = Long.MAX_VALUE;
+ final NetworkIdentity identity = getTemplateMatchingNetworkIdentity(
+ mNetworkCapabilities);
+
+ final NetworkPolicy[] policies = mNPM.getNetworkPolicies();
+ for (NetworkPolicy policy : policies) {
+ if (hasActiveCycle(policy) && policy.template.matches(identity)) {
+ // Prefer user-defined warning, otherwise use hard limit
+ final long policyBytes = (policy.warningBytes == LIMIT_DISABLED)
+ ? policy.limitBytes : policy.warningBytes;
+
+ if (policyBytes != LIMIT_DISABLED) {
+ final long policyBudget = getRemainingDailyBudget(policyBytes,
+ policy.cycleIterator().next());
+ minQuota = Math.min(minQuota, policyBudget);
+ }
+ }
+ }
+
+ if (minQuota == Long.MAX_VALUE) {
+ return OPPORTUNISTIC_QUOTA_UNKNOWN;
+ }
+
+ return minQuota / OPQUOTA_USER_SETTING_DIVIDER;
+ }
+
void updateMultipathBudget() {
long quota = LocalServices.getService(NetworkPolicyManagerInternal.class)
.getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH);
if (DBG) Slog.d(TAG, "Opportunistic quota from data plan: " + quota + " bytes");
- if (quota == 0) {
+ // Fallback to user settings-based quota if not available from phone plan
+ if (quota == OPPORTUNISTIC_QUOTA_UNKNOWN) {
+ quota = getUserPolicyOpportunisticQuotaBytes();
+ }
+
+ if (quota == OPPORTUNISTIC_QUOTA_UNKNOWN) {
// STOPSHIP: replace this with a configurable mechanism.
quota = DEFAULT_DAILY_MULTIPATH_QUOTA;
if (DBG) Slog.d(TAG, "Setting quota: " + quota + " bytes");
@@ -261,6 +364,11 @@
}
}
+ private static boolean hasActiveCycle(NetworkPolicy policy) {
+ return policy.hasCycle() && policy.lastLimitSnooze <
+ policy.cycleIterator().next().first.toInstant().toEpochMilli();
+ }
+
// Only ever updated on the handler thread. Accessed from other binder threads to retrieve
// the tracker for a specific network.
private final ConcurrentHashMap <Network, MultipathTracker> mMultipathTrackers =
@@ -280,6 +388,7 @@
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
MultipathTracker existing = mMultipathTrackers.get(network);
if (existing != null) {
+ existing.setNetworkCapabilities(nc);
existing.updateMultipathBudget();
return;
}
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index eee830f..d37dd18 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -19,6 +19,27 @@
import static android.hardware.usb.UsbManager.USB_CONFIGURED;
import static android.hardware.usb.UsbManager.USB_CONNECTED;
import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_ADD_TETHER_TYPE;
+import static android.net.ConnectivityManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_ERRORED_TETHER;
+import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
+import static android.net.ConnectivityManager.EXTRA_PROVISION_CALLBACK;
+import static android.net.ConnectivityManager.EXTRA_REM_TETHER_TYPE;
+import static android.net.ConnectivityManager.EXTRA_RUN_PROVISION;
+import static android.net.ConnectivityManager.EXTRA_SET_ALARM;
+import static android.net.ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_SERVICE_UNAVAIL;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
+import static android.net.ConnectivityManager.TETHERING_INVALID;
+import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TETHERING_WIFI;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
@@ -45,7 +66,6 @@
import android.content.IntentFilter;
import android.content.res.Resources;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.IpPrefix;
@@ -56,6 +76,7 @@
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.RouteInfo;
+import android.net.util.InterfaceSet;
import android.net.util.PrefixUtils;
import android.net.util.SharedLog;
import android.net.util.VersionedBroadcastListener;
@@ -98,6 +119,7 @@
import com.android.server.connectivity.tethering.TetherInterfaceStateMachine;
import com.android.server.connectivity.tethering.TetheringConfiguration;
import com.android.server.connectivity.tethering.TetheringDependencies;
+import com.android.server.connectivity.tethering.TetheringInterfaceUtils;
import com.android.server.connectivity.tethering.UpstreamNetworkMonitor;
import com.android.server.net.BaseNetworkObserver;
@@ -146,7 +168,7 @@
stateMachine = sm;
// Assume all state machines start out available and with no errors.
lastState = IControlsTethering.STATE_AVAILABLE;
- lastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ lastError = TETHER_ERROR_NO_ERROR;
}
public boolean isCurrentlyServing() {
@@ -181,9 +203,10 @@
private final VersionedBroadcastListener mCarrierConfigChange;
// TODO: Delete SimChangeListener; it's obsolete.
private final SimChangeListener mSimChange;
+ private final TetheringDependencies mDeps;
private volatile TetheringConfiguration mConfig;
- private String mCurrentUpstreamIface;
+ private InterfaceSet mCurrentUpstreamIfaceSet;
private Notification.Builder mTetheredNotificationBuilder;
private int mLastNotificationId;
@@ -202,21 +225,22 @@
mPolicyManager = policyManager;
mLooper = looper;
mSystemProperties = systemProperties;
+ mDeps = deps;
mPublicSync = new Object();
mTetherStates = new ArrayMap<>();
- mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
+ mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps);
mTetherMasterSM.start();
final Handler smHandler = mTetherMasterSM.getHandler();
mOffloadController = new OffloadController(smHandler,
- deps.getOffloadHardwareInterface(smHandler, mLog),
+ mDeps.getOffloadHardwareInterface(smHandler, mLog),
mContext.getContentResolver(), mNMService,
mLog);
- mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
- mContext, mTetherMasterSM, mLog, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
+ mUpstreamNetworkMonitor = deps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
+ TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
mForwardedDownstreams = new HashSet<>();
IntentFilter filter = new IntentFilter();
@@ -239,7 +263,7 @@
mStateReceiver = new StateReceiver();
filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_STATE);
- filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ filter.addAction(CONNECTIVITY_ACTION);
filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
mContext.registerReceiver(mStateReceiver, filter, null, smHandler);
@@ -261,12 +285,6 @@
updateConfiguration();
}
- // We can't do this once in the Tethering() constructor and cache the value, because the
- // CONNECTIVITY_SERVICE is registered only after the Tethering() constructor has completed.
- private ConnectivityManager getConnectivityManager() {
- return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- }
-
private WifiManager getWifiManager() {
return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
}
@@ -292,7 +310,7 @@
if (up) {
maybeTrackNewInterfaceLocked(iface);
} else {
- if (ifaceNameToType(iface) == ConnectivityManager.TETHERING_BLUETOOTH) {
+ if (ifaceNameToType(iface) == TETHERING_BLUETOOTH) {
stopTrackingInterfaceLocked(iface);
} else {
// Ignore usb0 down after enabling RNDIS.
@@ -314,13 +332,13 @@
final TetheringConfiguration cfg = mConfig;
if (cfg.isWifi(iface)) {
- return ConnectivityManager.TETHERING_WIFI;
+ return TETHERING_WIFI;
} else if (cfg.isUsb(iface)) {
- return ConnectivityManager.TETHERING_USB;
+ return TETHERING_USB;
} else if (cfg.isBluetooth(iface)) {
- return ConnectivityManager.TETHERING_BLUETOOTH;
+ return TETHERING_BLUETOOTH;
}
- return ConnectivityManager.TETHERING_INVALID;
+ return TETHERING_INVALID;
}
@Override
@@ -422,26 +440,26 @@
boolean isProvisioningRequired = enable && isTetherProvisioningRequired();
int result;
switch (type) {
- case ConnectivityManager.TETHERING_WIFI:
+ case TETHERING_WIFI:
result = setWifiTethering(enable);
- if (isProvisioningRequired && result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (isProvisioningRequired && result == TETHER_ERROR_NO_ERROR) {
scheduleProvisioningRechecks(type);
}
sendTetherResult(receiver, result);
break;
- case ConnectivityManager.TETHERING_USB:
+ case TETHERING_USB:
result = setUsbTethering(enable);
- if (isProvisioningRequired && result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (isProvisioningRequired && result == TETHER_ERROR_NO_ERROR) {
scheduleProvisioningRechecks(type);
}
sendTetherResult(receiver, result);
break;
- case ConnectivityManager.TETHERING_BLUETOOTH:
+ case TETHERING_BLUETOOTH:
setBluetoothTethering(enable, receiver);
break;
default:
Log.w(TAG, "Invalid tether type.");
- sendTetherResult(receiver, ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE);
+ sendTetherResult(receiver, TETHER_ERROR_UNKNOWN_IFACE);
}
}
@@ -452,7 +470,7 @@
}
private int setWifiTethering(final boolean enable) {
- int rval = ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+ int rval = TETHER_ERROR_MASTER_ERROR;
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mPublicSync) {
@@ -460,7 +478,7 @@
final WifiManager mgr = getWifiManager();
if ((enable && mgr.startSoftAp(null /* use existing wifi config */)) ||
(!enable && mgr.stopSoftAp())) {
- rval = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ rval = TETHER_ERROR_NO_ERROR;
}
}
} finally {
@@ -474,7 +492,7 @@
if (adapter == null || !adapter.isEnabled()) {
Log.w(TAG, "Tried to enable bluetooth tethering with null or disabled adapter. null: " +
(adapter == null));
- sendTetherResult(receiver, ConnectivityManager.TETHER_ERROR_SERVICE_UNAVAIL);
+ sendTetherResult(receiver, TETHER_ERROR_SERVICE_UNAVAIL);
return;
}
@@ -487,12 +505,12 @@
((BluetoothPan) proxy).setBluetoothTethering(enable);
// TODO: Enabling bluetooth tethering can fail asynchronously here.
// We should figure out a way to bubble up that failure instead of sending success.
- int result = ((BluetoothPan) proxy).isTetheringOn() == enable ?
- ConnectivityManager.TETHER_ERROR_NO_ERROR :
- ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+ final int result = (((BluetoothPan) proxy).isTetheringOn() == enable)
+ ? TETHER_ERROR_NO_ERROR
+ : TETHER_ERROR_MASTER_ERROR;
sendTetherResult(receiver, result);
if (enable && isTetherProvisioningRequired()) {
- scheduleProvisioningRechecks(ConnectivityManager.TETHERING_BLUETOOTH);
+ scheduleProvisioningRechecks(TETHERING_BLUETOOTH);
}
adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
}
@@ -506,8 +524,8 @@
private void sendUiTetherProvisionIntent(int type, ResultReceiver receiver) {
Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING);
- intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
- intent.putExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK, receiver);
+ intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+ intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final long ident = Binder.clearCallingIdentity();
try {
@@ -530,7 +548,7 @@
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
// If provisioning is successful, enable tethering, otherwise just send the error.
- if (resultCode == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (resultCode == TETHER_ERROR_NO_ERROR) {
enableTetheringInternal(type, true, receiver);
} else {
sendTetherResult(receiver, resultCode);
@@ -550,8 +568,8 @@
private void scheduleProvisioningRechecks(int type) {
Intent intent = new Intent();
- intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
- intent.putExtra(ConnectivityManager.EXTRA_SET_ALARM, true);
+ intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+ intent.putExtra(EXTRA_SET_ALARM, true);
intent.setComponent(TETHER_SERVICE);
final long ident = Binder.clearCallingIdentity();
try {
@@ -568,9 +586,9 @@
private void sendSilentTetherProvisionIntent(int type, ResultReceiver receiver) {
Intent intent = new Intent();
- intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
- intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
- intent.putExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK, receiver);
+ intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+ intent.putExtra(EXTRA_RUN_PROVISION, true);
+ intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
intent.setComponent(TETHER_SERVICE);
final long ident = Binder.clearCallingIdentity();
try {
@@ -581,9 +599,9 @@
}
private void cancelTetherProvisioningRechecks(int type) {
- if (getConnectivityManager().isTetheringSupported()) {
+ if (mDeps.isTetheringSupported()) {
Intent intent = new Intent();
- intent.putExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE, type);
+ intent.putExtra(EXTRA_REM_TETHER_TYPE, type);
intent.setComponent(TETHER_SERVICE);
final long ident = Binder.clearCallingIdentity();
try {
@@ -598,8 +616,8 @@
// TODO: De-duplicate with above code, where possible.
private void startProvisionIntent(int tetherType) {
final Intent startProvIntent = new Intent();
- startProvIntent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, tetherType);
- startProvIntent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
+ startProvIntent.putExtra(EXTRA_ADD_TETHER_TYPE, tetherType);
+ startProvIntent.putExtra(EXTRA_RUN_PROVISION, true);
startProvIntent.setComponent(TETHER_SERVICE);
mContext.startServiceAsUser(startProvIntent, UserHandle.CURRENT);
}
@@ -614,13 +632,13 @@
TetherState tetherState = mTetherStates.get(iface);
if (tetherState == null) {
Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring");
- return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+ return TETHER_ERROR_UNKNOWN_IFACE;
}
// Ignore the error status of the interface. If the interface is available,
// the errors are referring to past tethering attempts anyway.
if (tetherState.lastState != IControlsTethering.STATE_AVAILABLE) {
Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
- return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+ return TETHER_ERROR_UNAVAIL_IFACE;
}
// NOTE: If a CMD_TETHER_REQUESTED message is already in the TISM's
// queue but not yet processed, this will be a no-op and it will not
@@ -629,7 +647,7 @@
// TODO: reexamine the threading and messaging model.
tetherState.stateMachine.sendMessage(
TetherInterfaceStateMachine.CMD_TETHER_REQUESTED, requestedState);
- return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ return TETHER_ERROR_NO_ERROR;
}
}
@@ -639,22 +657,22 @@
TetherState tetherState = mTetherStates.get(iface);
if (tetherState == null) {
Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
- return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+ return TETHER_ERROR_UNKNOWN_IFACE;
}
if (!tetherState.isCurrentlyServing()) {
Log.e(TAG, "Tried to untether an inactive iface :" + iface + ", ignoring");
- return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+ return TETHER_ERROR_UNAVAIL_IFACE;
}
tetherState.stateMachine.sendMessage(
TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
- return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ return TETHER_ERROR_NO_ERROR;
}
}
public void untetherAll() {
- stopTethering(ConnectivityManager.TETHERING_WIFI);
- stopTethering(ConnectivityManager.TETHERING_USB);
- stopTethering(ConnectivityManager.TETHERING_BLUETOOTH);
+ stopTethering(TETHERING_WIFI);
+ stopTethering(TETHERING_USB);
+ stopTethering(TETHERING_BLUETOOTH);
}
public int getLastTetherError(String iface) {
@@ -663,7 +681,7 @@
if (tetherState == null) {
Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface +
", ignoring");
- return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+ return TETHER_ERROR_UNKNOWN_IFACE;
}
return tetherState.lastError;
}
@@ -671,7 +689,7 @@
// TODO: Figure out how to update for local hotspot mode interfaces.
private void sendTetherStateChangedBroadcast() {
- if (!getConnectivityManager().isTetheringSupported()) return;
+ if (!mDeps.isTetheringSupported()) return;
final ArrayList<String> availableList = new ArrayList<>();
final ArrayList<String> tetherList = new ArrayList<>();
@@ -688,7 +706,7 @@
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
String iface = mTetherStates.keyAt(i);
- if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
erroredList.add(iface);
} else if (tetherState.lastState == IControlsTethering.STATE_AVAILABLE) {
availableList.add(iface);
@@ -706,13 +724,13 @@
}
}
}
- final Intent bcast = new Intent(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
+ final Intent bcast = new Intent(ACTION_TETHER_STATE_CHANGED);
bcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING |
Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_AVAILABLE_TETHER, availableList);
- bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
- bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_TETHER, tetherList);
- bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ERRORED_TETHER, erroredList);
+ bcast.putStringArrayListExtra(EXTRA_AVAILABLE_TETHER, availableList);
+ bcast.putStringArrayListExtra(EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
+ bcast.putStringArrayListExtra(EXTRA_ACTIVE_TETHER, tetherList);
+ bcast.putStringArrayListExtra(EXTRA_ERRORED_TETHER, erroredList);
mContext.sendStickyBroadcastAsUser(bcast, UserHandle.ALL);
if (DBG) {
Log.d(TAG, String.format(
@@ -835,7 +853,7 @@
if (action.equals(UsbManager.ACTION_USB_STATE)) {
handleUsbAction(intent);
- } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+ } else if (action.equals(CONNECTIVITY_ACTION)) {
handleConnectivityAction(intent);
} else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
handleWifiApAction(intent);
@@ -846,8 +864,8 @@
}
private void handleConnectivityAction(Intent intent) {
- final NetworkInfo networkInfo = (NetworkInfo)intent.getParcelableExtra(
- ConnectivityManager.EXTRA_NETWORK_INFO);
+ final NetworkInfo networkInfo =
+ (NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO);
if (networkInfo == null ||
networkInfo.getDetailedState() == NetworkInfo.DetailedState.FAILED) {
return;
@@ -883,14 +901,10 @@
synchronized (Tethering.this.mPublicSync) {
if (!usbConnected && mRndisEnabled) {
// Turn off tethering if it was enabled and there is a disconnect.
- tetherMatchingInterfaces(
- IControlsTethering.STATE_AVAILABLE,
- ConnectivityManager.TETHERING_USB);
+ tetherMatchingInterfaces(IControlsTethering.STATE_AVAILABLE, TETHERING_USB);
} else if (usbConfigured && rndisEnabled) {
// Tether if rndis is enabled and usb is configured.
- tetherMatchingInterfaces(
- IControlsTethering.STATE_TETHERED,
- ConnectivityManager.TETHERING_USB);
+ tetherMatchingInterfaces(IControlsTethering.STATE_TETHERED, TETHERING_USB);
}
mRndisEnabled = usbConfigured && rndisEnabled;
}
@@ -971,7 +985,7 @@
for (int i = 0; i < mTetherStates.size(); i++) {
TetherInterfaceStateMachine tism = mTetherStates.valueAt(i).stateMachine;
- if (tism.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+ if (tism.interfaceType() == TETHERING_WIFI) {
tism.unwanted();
return;
}
@@ -999,7 +1013,7 @@
}
if (!TextUtils.isEmpty(ifname)) {
- maybeTrackNewInterfaceLocked(ifname, ConnectivityManager.TETHERING_WIFI);
+ maybeTrackNewInterfaceLocked(ifname, TETHERING_WIFI);
changeInterfaceState(ifname, ipServingMode);
} else {
mLog.e(String.format(
@@ -1058,7 +1072,7 @@
Log.wtf(TAG, "Unknown interface state: " + requestedState);
return;
}
- if (result != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (result != TETHER_ERROR_NO_ERROR) {
Log.e(TAG, "unable start or stop tethering on iface " + ifname);
return;
}
@@ -1100,7 +1114,7 @@
usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_RNDIS
: UsbManager.FUNCTION_NONE);
}
- return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ return TETHER_ERROR_NO_ERROR;
}
// TODO review API - figure out how to delete these entirely.
@@ -1139,7 +1153,7 @@
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
- if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
list.add(mTetherStates.keyAt(i));
}
}
@@ -1160,12 +1174,11 @@
}
// Needed because the canonical source of upstream truth is just the
- // upstream interface name, |mCurrentUpstreamIface|. This is ripe for
- // future simplification, once the upstream Network is canonical.
+ // upstream interface set, |mCurrentUpstreamIfaceSet|.
private boolean pertainsToCurrentUpstream(NetworkState ns) {
- if (ns != null && ns.linkProperties != null && mCurrentUpstreamIface != null) {
+ if (ns != null && ns.linkProperties != null && mCurrentUpstreamIfaceSet != null) {
for (String ifname : ns.linkProperties.getAllInterfaceNames()) {
- if (mCurrentUpstreamIface.equals(ifname)) {
+ if (mCurrentUpstreamIfaceSet.ifnames.contains(ifname)) {
return true;
}
}
@@ -1186,7 +1199,7 @@
}
String iface = mTetherStates.keyAt(i);
int interfaceType = ifaceNameToType(iface);
- if (interfaceType != ConnectivityManager.TETHERING_INVALID) {
+ if (interfaceType != TETHERING_INVALID) {
tethered.add(interfaceType);
}
}
@@ -1241,7 +1254,7 @@
private static final int UPSTREAM_SETTLE_TIME_MS = 10000;
- TetherMasterSM(String name, Looper looper) {
+ TetherMasterSM(String name, Looper looper, TetheringDependencies deps) {
super(name, looper);
mInitialState = new InitialState();
@@ -1261,7 +1274,7 @@
addState(mSetDnsForwardersErrorState);
mNotifyList = new ArrayList<>();
- mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mLog);
+ mIPv6TetheringCoordinator = deps.getIPv6TetheringCoordinator(mNotifyList, mLog);
mOffload = new OffloadWrapper();
setInitialState(mInitialState);
@@ -1360,31 +1373,27 @@
}
protected void setUpstreamNetwork(NetworkState ns) {
- String iface = null;
+ InterfaceSet ifaces = null;
if (ns != null) {
// Find the interface with the default IPv4 route. It may be the
// interface described by linkProperties, or one of the interfaces
// stacked on top of it.
mLog.i("Looking for default routes on: " + ns.linkProperties);
- final String iface4 = getIPv4DefaultRouteInterface(ns);
- final String iface6 = getIPv6DefaultRouteInterface(ns);
- mLog.i("IPv4/IPv6 upstream interface(s): " + iface4 + "/" + iface6);
-
- iface = (iface4 != null) ? iface4 : null /* TODO: iface6 */;
+ ifaces = TetheringInterfaceUtils.getTetheringInterfaces(ns);
+ mLog.i("Found upstream interface(s): " + ifaces);
}
- if (iface != null) {
+ if (ifaces != null) {
setDnsForwarders(ns.network, ns.linkProperties);
}
- notifyDownstreamsOfNewUpstreamIface(iface);
+ notifyDownstreamsOfNewUpstreamIface(ifaces);
if (ns != null && pertainsToCurrentUpstream(ns)) {
// If we already have NetworkState for this network examine
// it immediately, because there likely will be no second
// EVENT_ON_AVAILABLE (it was already received).
handleNewUpstreamNetworkState(ns);
- } else if (mCurrentUpstreamIface == null) {
- // There are no available upstream networks, or none that
- // have an IPv4 default route (current metric for success).
+ } else if (mCurrentUpstreamIfaceSet == null) {
+ // There are no available upstream networks.
handleNewUpstreamNetworkState(null);
}
}
@@ -1411,12 +1420,10 @@
}
}
- protected void notifyDownstreamsOfNewUpstreamIface(String ifaceName) {
- mLog.log("Notifying downstreams of upstream=" + ifaceName);
- mCurrentUpstreamIface = ifaceName;
+ protected void notifyDownstreamsOfNewUpstreamIface(InterfaceSet ifaces) {
+ mCurrentUpstreamIfaceSet = ifaces;
for (TetherInterfaceStateMachine sm : mNotifyList) {
- sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_CONNECTION_CHANGED,
- ifaceName);
+ sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_CONNECTION_CHANGED, ifaces);
}
}
@@ -1442,7 +1449,7 @@
}
// If this is a Wi-Fi interface, notify WifiManager of the active serving state.
- if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+ if (who.interfaceType() == TETHERING_WIFI) {
final WifiManager mgr = getWifiManager();
final String iface = who.interfaceName();
switch (mode) {
@@ -1466,8 +1473,8 @@
mForwardedDownstreams.remove(who);
// If this is a Wi-Fi interface, tell WifiManager of any errors.
- if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
- if (who.lastError() != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (who.interfaceType() == TETHERING_WIFI) {
+ if (who.lastError() != TETHER_ERROR_NO_ERROR) {
getWifiManager().updateInterfaceIpState(
who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR);
}
@@ -1488,7 +1495,7 @@
// For example, after CONNECTIVITY_ACTION listening is removed, here
// is where we could observe a Wi-Fi network becoming available and
// passing validation.
- if (mCurrentUpstreamIface == null) {
+ if (mCurrentUpstreamIfaceSet == null) {
// If we have no upstream interface, try to run through upstream
// selection again. If, for example, IPv4 connectivity has shown up
// after IPv6 (e.g., 464xlat became available) we want the chance to
@@ -1512,8 +1519,7 @@
handleNewUpstreamNetworkState(ns);
break;
case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES:
- setDnsForwarders(ns.network, ns.linkProperties);
- handleNewUpstreamNetworkState(ns);
+ chooseUpstreamType(false);
break;
case UpstreamNetworkMonitor.EVENT_ON_LOST:
// TODO: Re-evaluate possible upstreams. Currently upstream
@@ -1586,7 +1592,7 @@
if (VDBG) Log.d(TAG, "Tether Mode requested by " + who);
handleInterfaceServingStateActive(message.arg1, who);
who.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_CONNECTION_CHANGED,
- mCurrentUpstreamIface);
+ mCurrentUpstreamIfaceSet);
// If there has been a change and an upstream is now
// desired, kick off the selection process.
final boolean previousUpstreamWanted = updateUpstreamWanted();
@@ -1673,7 +1679,7 @@
who.sendMessage(mErrorNotification);
break;
case CMD_CLEAR_ERROR:
- mErrorNotification = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ mErrorNotification = TETHER_ERROR_NO_ERROR;
transitionTo(mInitialState);
break;
default:
@@ -1864,7 +1870,7 @@
pw.println(" - lastError = " + tetherState.lastError);
}
pw.println("Upstream wanted: " + upstreamWanted());
- pw.println("Current upstream interface: " + mCurrentUpstreamIface);
+ pw.println("Current upstream interface(s): " + mCurrentUpstreamIfaceSet);
pw.decreaseIndent();
}
@@ -1935,7 +1941,7 @@
// If TetherMasterSM is in ErrorState, TetherMasterSM stays there.
// Thus we give a chance for TetherMasterSM to recover to InitialState
// by sending CMD_CLEAR_ERROR
- if (error == ConnectivityManager.TETHER_ERROR_MASTER_ERROR) {
+ if (error == TETHER_ERROR_MASTER_ERROR) {
mTetherMasterSM.sendMessage(TetherMasterSM.CMD_CLEAR_ERROR, who);
}
int which;
@@ -1979,7 +1985,7 @@
private void maybeTrackNewInterfaceLocked(final String iface) {
// If we don't care about this type of interface, ignore.
final int interfaceType = ifaceNameToType(iface);
- if (interfaceType == ConnectivityManager.TETHERING_INVALID) {
+ if (interfaceType == TETHERING_INVALID) {
mLog.log(iface + " is not a tetherable iface, ignoring");
return;
}
@@ -1997,7 +2003,7 @@
final TetherState tetherState = new TetherState(
new TetherInterfaceStateMachine(
iface, mLooper, interfaceType, mLog, mNMService, mStatsService,
- makeControlCallback(iface)));
+ makeControlCallback(iface), mDeps));
mTetherStates.put(iface, tetherState);
tetherState.stateMachine.start();
}
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index c9bdcf1..2fda08e 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -151,6 +151,13 @@
.multiply(BigInteger.valueOf(howManyPercentIsMost))
.divide(BigInteger.valueOf(100));
}
+ // How many routes to evaluate before bailing and declaring this Vpn should provide
+ // the INTERNET capability. This is necessary because computing the adress space is
+ // O(n²) and this is running in the system service, so a limit is needed to alleviate
+ // the risk of attack.
+ // This is taken as a total of IPv4 + IPV6 routes for simplicity, but the algorithm
+ // is actually O(n²)+O(n²).
+ private static final int MAX_ROUTES_TO_EVALUATE = 150;
// TODO: create separate trackers for each unique VPN to support
// automated reconnection
@@ -862,10 +869,12 @@
*/
@VisibleForTesting
static boolean providesRoutesToMostDestinations(LinkProperties lp) {
+ final List<RouteInfo> routes = lp.getAllRoutes();
+ if (routes.size() > MAX_ROUTES_TO_EVALUATE) return true;
final Comparator<IpPrefix> prefixLengthComparator = IpPrefix.lengthComparator();
TreeSet<IpPrefix> ipv4Prefixes = new TreeSet<>(prefixLengthComparator);
TreeSet<IpPrefix> ipv6Prefixes = new TreeSet<>(prefixLengthComparator);
- for (final RouteInfo route : lp.getAllRoutes()) {
+ for (final RouteInfo route : routes) {
IpPrefix destination = route.getDestination();
if (destination.isIPv4()) {
ipv4Prefixes.add(destination);
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
index 518f6c1..ba67c94 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
@@ -30,10 +30,8 @@
import java.net.Inet6Address;
import java.net.InetAddress;
-import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.LinkedList;
import java.util.Random;
@@ -119,7 +117,7 @@
if (VDBG) {
Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
}
- if (!canTetherIPv6(ns, mLog)) {
+ if (TetheringInterfaceUtils.getIPv6Interface(ns) == null) {
stopIPv6TetheringOnAllInterfaces();
setUpstreamNetworkState(null);
return;
@@ -208,70 +206,6 @@
return null;
}
- private static boolean canTetherIPv6(NetworkState ns, SharedLog sharedLog) {
- // Broadly speaking:
- //
- // [1] does the upstream have an IPv6 default route?
- //
- // and
- //
- // [2] does the upstream have one or more global IPv6 /64s
- // dedicated to this device?
- //
- // In lieu of Prefix Delegation and other evaluation of whether a
- // prefix may or may not be dedicated to this device, for now just
- // check whether the upstream is TRANSPORT_CELLULAR. This works
- // because "[t]he 3GPP network allocates each default bearer a unique
- // /64 prefix", per RFC 6459, Section 5.2.
-
- final boolean canTether =
- (ns != null) && (ns.network != null) &&
- (ns.linkProperties != null) && (ns.networkCapabilities != null) &&
- // At least one upstream DNS server:
- ns.linkProperties.isProvisioned() &&
- // Minimal amount of IPv6 provisioning:
- ns.linkProperties.hasIPv6DefaultRoute() &&
- ns.linkProperties.hasGlobalIPv6Address() &&
- // Temporary approximation of "dedicated prefix":
- ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
-
- // For now, we do not support separate IPv4 and IPv6 upstreams (e.g.
- // tethering with 464xlat involved). TODO: Rectify this shortcoming,
- // likely by calling NetworkManagementService#startInterfaceForwarding()
- // for all upstream interfaces.
- RouteInfo v4default = null;
- RouteInfo v6default = null;
- if (canTether) {
- for (RouteInfo r : ns.linkProperties.getAllRoutes()) {
- if (r.isIPv4Default()) {
- v4default = r;
- } else if (r.isIPv6Default()) {
- v6default = r;
- }
-
- if (v4default != null && v6default != null) {
- break;
- }
- }
- }
-
- final boolean supportedConfiguration =
- (v4default != null) && (v6default != null) &&
- (v4default.getInterface() != null) &&
- v4default.getInterface().equals(v6default.getInterface());
-
- final boolean outcome = canTether && supportedConfiguration;
-
- if (ns == null) {
- sharedLog.log("No available upstream.");
- } else {
- sharedLog.log(String.format("IPv6 tethering is %s for upstream: %s",
- (outcome ? "available" : "not available"), toDebugString(ns)));
- }
-
- return outcome;
- }
-
private static LinkProperties getIPv6OnlyLinkProperties(LinkProperties lp) {
final LinkProperties v6only = new LinkProperties();
if (lp == null) {
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index 2224913..5ed14a0 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -31,7 +31,7 @@
import android.net.ip.RouterAdvertisementDaemon;
import android.net.ip.RouterAdvertisementDaemon.RaParams;
import android.net.util.InterfaceParams;
-import android.net.util.NetdService;
+import android.net.util.InterfaceSet;
import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.Looper;
@@ -49,12 +49,12 @@
import java.net.Inet6Address;
import java.net.InetAddress;
-import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
import java.util.Random;
+import java.util.Set;
/**
* Provides the interface to IP-layer serving functionality for a given network
@@ -117,9 +117,11 @@
private final int mInterfaceType;
private final LinkProperties mLinkProperties;
+ private final TetheringDependencies mDeps;
+
private int mLastError;
private int mServingMode;
- private String mMyUpstreamIfaceName; // may change over time
+ private InterfaceSet mUpstreamIfaceSet; // may change over time
private InterfaceParams mInterfaceParams;
// TODO: De-duplicate this with mLinkProperties above. Currently, these link
// properties are those selected by the IPv6TetheringCoordinator and relayed
@@ -134,18 +136,19 @@
public TetherInterfaceStateMachine(
String ifaceName, Looper looper, int interfaceType, SharedLog log,
INetworkManagementService nMService, INetworkStatsService statsService,
- IControlsTethering tetherController) {
+ IControlsTethering tetherController,
+ TetheringDependencies deps) {
super(ifaceName, looper);
mLog = log.forSubComponent(ifaceName);
mNMService = nMService;
- // TODO: This should be passed in for testability.
- mNetd = NetdService.getInstance();
+ mNetd = deps.getNetdService();
mStatsService = statsService;
mTetherController = tetherController;
mInterfaceCtrl = new InterfaceController(ifaceName, nMService, mNetd, mLog);
mIfaceName = ifaceName;
mInterfaceType = interfaceType;
mLinkProperties = new LinkProperties();
+ mDeps = deps;
resetLinkProperties();
mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
mServingMode = IControlsTethering.STATE_AVAILABLE;
@@ -246,16 +249,14 @@
}
private boolean startIPv6() {
- // TODO: Refactor for better testability. This is one of the things
- // that prohibits unittesting IPv6 tethering setup.
- mInterfaceParams = InterfaceParams.getByName(mIfaceName);
+ mInterfaceParams = mDeps.getInterfaceParams(mIfaceName);
if (mInterfaceParams == null) {
mLog.e("Failed to find InterfaceParams");
stopIPv6();
return false;
}
- mRaDaemon = new RouterAdvertisementDaemon(mInterfaceParams);
+ mRaDaemon = mDeps.getRouterAdvertisementDaemon(mInterfaceParams);
if (!mRaDaemon.start()) {
stopIPv6();
return false;
@@ -621,10 +622,10 @@
}
private void cleanupUpstream() {
- if (mMyUpstreamIfaceName == null) return;
+ if (mUpstreamIfaceSet == null) return;
- cleanupUpstreamInterface(mMyUpstreamIfaceName);
- mMyUpstreamIfaceName = null;
+ for (String ifname : mUpstreamIfaceSet.ifnames) cleanupUpstreamInterface(ifname);
+ mUpstreamIfaceSet = null;
}
private void cleanupUpstreamInterface(String upstreamIface) {
@@ -660,34 +661,66 @@
mLog.e("CMD_TETHER_REQUESTED while already tethering.");
break;
case CMD_TETHER_CONNECTION_CHANGED:
- String newUpstreamIfaceName = (String)(message.obj);
- if ((mMyUpstreamIfaceName == null && newUpstreamIfaceName == null) ||
- (mMyUpstreamIfaceName != null &&
- mMyUpstreamIfaceName.equals(newUpstreamIfaceName))) {
+ final InterfaceSet newUpstreamIfaceSet = (InterfaceSet) message.obj;
+ if (noChangeInUpstreamIfaceSet(newUpstreamIfaceSet)) {
if (VDBG) Log.d(TAG, "Connection changed noop - dropping");
break;
}
- cleanupUpstream();
- if (newUpstreamIfaceName != null) {
+
+ if (newUpstreamIfaceSet == null) {
+ cleanupUpstream();
+ break;
+ }
+
+ for (String removed : upstreamInterfacesRemoved(newUpstreamIfaceSet)) {
+ cleanupUpstreamInterface(removed);
+ }
+
+ final Set<String> added = upstreamInterfacesAdd(newUpstreamIfaceSet);
+ // This makes the call to cleanupUpstream() in the error
+ // path for any interface neatly cleanup all the interfaces.
+ mUpstreamIfaceSet = newUpstreamIfaceSet;
+
+ for (String ifname : added) {
try {
- mNMService.enableNat(mIfaceName, newUpstreamIfaceName);
- mNMService.startInterfaceForwarding(mIfaceName,
- newUpstreamIfaceName);
+ mNMService.enableNat(mIfaceName, ifname);
+ mNMService.startInterfaceForwarding(mIfaceName, ifname);
} catch (Exception e) {
mLog.e("Exception enabling NAT: " + e);
- cleanupUpstreamInterface(newUpstreamIfaceName);
+ cleanupUpstream();
mLastError = ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
transitionTo(mInitialState);
return true;
}
}
- mMyUpstreamIfaceName = newUpstreamIfaceName;
break;
default:
return false;
}
return true;
}
+
+ private boolean noChangeInUpstreamIfaceSet(InterfaceSet newIfaces) {
+ if (mUpstreamIfaceSet == null && newIfaces == null) return true;
+ if (mUpstreamIfaceSet != null && newIfaces != null) {
+ return mUpstreamIfaceSet.equals(newIfaces);
+ }
+ return false;
+ }
+
+ private Set<String> upstreamInterfacesRemoved(InterfaceSet newIfaces) {
+ if (mUpstreamIfaceSet == null) return new HashSet<>();
+
+ final HashSet<String> removed = new HashSet<>(mUpstreamIfaceSet.ifnames);
+ removed.removeAll(newIfaces.ifnames);
+ return removed;
+ }
+
+ private Set<String> upstreamInterfacesAdd(InterfaceSet newIfaces) {
+ final HashSet<String> added = new HashSet<>(newIfaces.ifnames);
+ if (mUpstreamIfaceSet != null) added.removeAll(mUpstreamIfaceSet.ifnames);
+ return added;
+ }
}
/**
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
index b8174b6..0ac7a36 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
@@ -16,9 +16,18 @@
package com.android.server.connectivity.tethering;
+import android.content.Context;
+import android.net.INetd;
+import android.net.ip.RouterAdvertisementDaemon;
+import android.net.util.InterfaceParams;
+import android.net.util.NetdService;
import android.os.Handler;
import android.net.util.SharedLog;
+import com.android.internal.util.StateMachine;
+
+import java.util.ArrayList;
+
/**
* Capture tethering dependencies, for injection.
@@ -29,4 +38,30 @@
public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
return new OffloadHardwareInterface(h, log);
}
+
+ public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target,
+ SharedLog log, int what) {
+ return new UpstreamNetworkMonitor(ctx, target, log, what);
+ }
+
+ public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
+ ArrayList<TetherInterfaceStateMachine> notifyList, SharedLog log) {
+ return new IPv6TetheringCoordinator(notifyList, log);
+ }
+
+ public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) {
+ return new RouterAdvertisementDaemon(ifParams);
+ }
+
+ public InterfaceParams getInterfaceParams(String ifName) {
+ return InterfaceParams.getByName(ifName);
+ }
+
+ public INetd getNetdService() {
+ return NetdService.getInstance();
+ }
+
+ public boolean isTetheringSupported() {
+ return true;
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java b/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java
new file mode 100644
index 0000000..6c7ff91
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity.tethering;
+
+import android.annotation.Nullable;
+import android.net.LinkProperties;
+import android.net.NetworkCapabilities;
+import android.net.NetworkState;
+import android.net.RouteInfo;
+import android.net.util.InterfaceSet;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+
+/**
+ * @hide
+ */
+public final class TetheringInterfaceUtils {
+ /**
+ * Get upstream interfaces for tethering based on default routes for IPv4/IPv6.
+ * @return null if there is no usable interface, or a set of at least one interface otherwise.
+ */
+ public static @Nullable InterfaceSet getTetheringInterfaces(NetworkState ns) {
+ if (ns == null) {
+ return null;
+ }
+
+ final LinkProperties lp = ns.linkProperties;
+ final String if4 = getInterfaceForDestination(lp, Inet4Address.ANY);
+ final String if6 = getIPv6Interface(ns);
+
+ return (if4 == null && if6 == null) ? null : new InterfaceSet(if4, if6);
+ }
+
+ /**
+ * Get the upstream interface for IPv6 tethering.
+ * @return null if there is no usable interface, or the interface name otherwise.
+ */
+ public static @Nullable String getIPv6Interface(NetworkState ns) {
+ // Broadly speaking:
+ //
+ // [1] does the upstream have an IPv6 default route?
+ //
+ // and
+ //
+ // [2] does the upstream have one or more global IPv6 /64s
+ // dedicated to this device?
+ //
+ // In lieu of Prefix Delegation and other evaluation of whether a
+ // prefix may or may not be dedicated to this device, for now just
+ // check whether the upstream is TRANSPORT_CELLULAR. This works
+ // because "[t]he 3GPP network allocates each default bearer a unique
+ // /64 prefix", per RFC 6459, Section 5.2.
+ final boolean canTether =
+ (ns != null) && (ns.network != null) &&
+ (ns.linkProperties != null) && (ns.networkCapabilities != null) &&
+ // At least one upstream DNS server:
+ ns.linkProperties.hasIPv6DnsServer() &&
+ // Minimal amount of IPv6 provisioning:
+ ns.linkProperties.hasGlobalIPv6Address() &&
+ // Temporary approximation of "dedicated prefix":
+ ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
+
+ return canTether
+ ? getInterfaceForDestination(ns.linkProperties, Inet6Address.ANY)
+ : null;
+ }
+
+ private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) {
+ final RouteInfo ri = (lp != null)
+ ? RouteInfo.selectBestRoute(lp.getAllRoutes(), dst)
+ : null;
+ return (ri != null) ? ri.getInterface() : null;
+ }
+}
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 63308f8..b7bbb3b 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -26,6 +26,7 @@
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
+import android.content.ContentResolver.SyncExemption;
import android.content.Context;
import android.content.IContentService;
import android.content.ISyncStatusObserver;
@@ -78,7 +79,7 @@
*/
public final class ContentService extends IContentService.Stub {
static final String TAG = "ContentService";
- static final boolean DEBUG = false;
+ static final boolean DEBUG = true;
public static class Lifecycle extends SystemService {
private ContentService mService;
@@ -451,7 +452,7 @@
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
syncManager.scheduleLocalSync(null /* all accounts */, callingUserHandle, uid,
- uri.getAuthority(), /*isAppStandbyExempted=*/ isUidInForeground(uid));
+ uri.getAuthority(), getSyncExemptionForCaller(uid));
}
}
@@ -508,7 +509,7 @@
int uId = Binder.getCallingUid();
validateExtras(uId, extras);
- final boolean isForegroundSyncRequest = isForegroundSyncRequest(uId, extras);
+ final int syncExemption = getSyncExemptionAndCleanUpExtrasForCaller(uId, extras);
// This makes it so that future permission checks will be in the context of this
// process rather than the caller's process. We will restore this before returning.
@@ -518,7 +519,7 @@
if (syncManager != null) {
syncManager.scheduleSync(account, userId, uId, authority, extras,
SyncStorageEngine.AuthorityInfo.UNDEFINED,
- /*isAppStandbyExempted=*/ isForegroundSyncRequest);
+ syncExemption);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -561,7 +562,7 @@
final Bundle extras = request.getBundle();
validateExtras(callerUid, extras);
- final boolean isForegroundSyncRequest = isForegroundSyncRequest(callerUid, extras);
+ final int syncExemption = getSyncExemptionAndCleanUpExtrasForCaller(callerUid, extras);
// This makes it so that future permission checks will be in the context of this
// process rather than the caller's process. We will restore this before returning.
@@ -589,7 +590,7 @@
syncManager.scheduleSync(
request.getAccount(), userId, callerUid, request.getProvider(), extras,
SyncStorageEngine.AuthorityInfo.UNDEFINED,
- /*isAppStandbyExempted=*/ isForegroundSyncRequest);
+ syncExemption);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -777,13 +778,15 @@
"no permission to write the sync settings");
enforceCrossUserPermission(userId,
"no permission to modify the sync settings for user " + userId);
+ final int callingUid = Binder.getCallingUid();
+ final int syncExemptionFlag = getSyncExemptionForCaller(callingUid);
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
syncManager.getSyncStorageEngine().setSyncAutomatically(account, userId,
- providerName, sync);
+ providerName, sync, syncExemptionFlag, callingUid);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -910,6 +913,7 @@
"no permission to write the sync settings");
syncable = normalizeSyncable(syncable);
+ final int callingUid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
@@ -917,7 +921,7 @@
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
syncManager.getSyncStorageEngine().setIsSyncable(
- account, userId, providerName, syncable);
+ account, userId, providerName, syncable, callingUid);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -964,11 +968,14 @@
mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS,
"no permission to write the sync settings");
+ final int callingUid = Binder.getCallingUid();
+
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- syncManager.getSyncStorageEngine().setMasterSyncAutomatically(flag, userId);
+ syncManager.getSyncStorageEngine().setMasterSyncAutomatically(flag, userId,
+ getSyncExemptionForCaller(callingUid), callingUid);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -1263,9 +1270,7 @@
}
private void validateExtras(int callingUid, Bundle extras) {
- if (extras.containsKey(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC)
- || extras.containsKey(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC)
- ) {
+ if (extras.containsKey(ContentResolver.SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG)) {
switch (callingUid) {
case Process.ROOT_UID:
case Process.SHELL_UID:
@@ -1277,39 +1282,36 @@
}
}
- private boolean isForegroundSyncRequest(int callingUid, Bundle extras) {
- final boolean isForegroundRequest;
- if (extras.getBoolean(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC)) {
- isForegroundRequest = true;
- } else if (extras.getBoolean(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC)) {
- isForegroundRequest = false;
- } else {
- isForegroundRequest = isUidInForeground(callingUid);
- }
- extras.remove(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC);
- extras.remove(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC);
-
- return isForegroundRequest;
+ @SyncExemption
+ private int getSyncExemptionForCaller(int callingUid) {
+ return getSyncExemptionAndCleanUpExtrasForCaller(callingUid, null);
}
- private boolean isUidInForeground(int uid) {
- // If the caller is ADB, we assume it's a background request by default, because
- // that's also the default of requests from the requestsync command.
- // The requestsync command will always set either SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC or
- // SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC (for non-periodic sync requests),
- // so it shouldn't matter in practice.
- switch (uid) {
- case Process.SHELL_UID:
- case Process.ROOT_UID:
- return false;
+ @SyncExemption
+ private int getSyncExemptionAndCleanUpExtrasForCaller(int callingUid, Bundle extras) {
+ if (extras != null) {
+ final int exemption =
+ extras.getInt(ContentResolver.SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG, -1);
+
+ // Need to remove the virtual extra.
+ extras.remove(ContentResolver.SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG);
+ if (exemption != -1) {
+ return exemption;
+ }
}
final ActivityManagerInternal ami =
LocalServices.getService(ActivityManagerInternal.class);
- if (ami != null) {
- return ami.getUidProcessState(uid)
- <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ final int procState = (ami != null)
+ ? ami.getUidProcessState(callingUid)
+ : ActivityManager.PROCESS_STATE_NONEXISTENT;
+
+ if (procState <= ActivityManager.PROCESS_STATE_TOP) {
+ return ContentResolver.SYNC_EXEMPTION_ACTIVE_WITH_TEMP;
}
- return false;
+ if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
+ return ContentResolver.SYNC_EXEMPTION_ACTIVE;
+ }
+ return ContentResolver.SYNC_EXEMPTION_NONE;
}
/**
diff --git a/services/core/java/com/android/server/content/SyncAdapterStateFetcher.java b/services/core/java/com/android/server/content/SyncAdapterStateFetcher.java
new file mode 100644
index 0000000..62fb751
--- /dev/null
+++ b/services/core/java/com/android/server/content/SyncAdapterStateFetcher.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.content;
+
+import android.app.usage.UsageStatsManagerInternal;
+import android.os.SystemClock;
+import android.util.Pair;
+
+import com.android.server.AppStateTracker;
+import com.android.server.LocalServices;
+
+import java.util.HashMap;
+
+class SyncAdapterStateFetcher {
+
+ private final HashMap<Pair<Integer, String>, Integer> mBucketCache =
+ new HashMap<>();
+
+ public SyncAdapterStateFetcher() {
+ }
+
+ /**
+ * Return sync adapter state with a cache.
+ */
+ public int getStandbyBucket(int userId, String packageName) {
+ final Pair<Integer, String> key = Pair.create(userId, packageName);
+ final Integer cached = mBucketCache.get(key);
+ if (cached != null) {
+ return cached;
+ }
+ final UsageStatsManagerInternal usmi =
+ LocalServices.getService(UsageStatsManagerInternal.class);
+ if (usmi == null) {
+ return -1; // Unknown.
+ }
+
+ final int value = usmi.getAppStandbyBucket(packageName, userId,
+ SystemClock.elapsedRealtime());
+ mBucketCache.put(key, value);
+ return value;
+ }
+
+ /**
+ * Return UID active state.
+ */
+ public boolean isAppActive(int uid) {
+ final AppStateTracker ast =
+ LocalServices.getService(AppStateTracker.class);
+ if (ast == null) {
+ return false;
+ }
+
+ return ast.isUidActive(uid);
+ }
+}
diff --git a/services/core/java/com/android/server/content/SyncLogger.java b/services/core/java/com/android/server/content/SyncLogger.java
index 20aec7e..8c35e27 100644
--- a/services/core/java/com/android/server/content/SyncLogger.java
+++ b/services/core/java/com/android/server/content/SyncLogger.java
@@ -54,6 +54,9 @@
private static SyncLogger sInstance;
+ // Special UID used for logging to denote the self process.
+ public static final int CALLING_UID_SELF = -1;
+
SyncLogger() {
}
@@ -62,8 +65,10 @@
*/
public static synchronized SyncLogger getInstance() {
if (sInstance == null) {
- final boolean enable = "1".equals(SystemProperties.get("debug.synclog",
- Build.IS_DEBUGGABLE ? "1" : "0"));
+ final boolean enable =
+ Build.IS_DEBUGGABLE
+ || "1".equals(SystemProperties.get("debug.synclog"))
+ || Log.isLoggable(TAG, Log.VERBOSE);
if (enable) {
sInstance = new RotatingFileLogger();
} else {
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 7089268..a312fe1 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -29,9 +29,11 @@
import android.app.PendingIntent;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
+import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
+import android.content.ContentResolver.SyncExemption;
import android.content.Context;
import android.content.ISyncAdapter;
import android.content.ISyncAdapterUnsyncableAccountCallback;
@@ -49,8 +51,8 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ProviderInfo;
import android.content.pm.RegisteredServicesCache;
import android.content.pm.RegisteredServicesCacheListener;
@@ -70,6 +72,7 @@
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
+import android.os.Process;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -85,24 +88,25 @@
import android.util.Pair;
import android.util.Slog;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
-import com.android.internal.util.ArrayUtils;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-import com.android.server.job.JobSchedulerInternal;
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
import com.android.internal.R;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.DeviceIdleController;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
import com.android.server.accounts.AccountManagerService;
import com.android.server.backup.AccountSyncSettingsBackupHelper;
import com.android.server.content.SyncStorageEngine.AuthorityInfo;
import com.android.server.content.SyncStorageEngine.EndPoint;
import com.android.server.content.SyncStorageEngine.OnSyncRequestListener;
+import com.android.server.job.JobSchedulerInternal;
+
+import com.google.android.collect.Lists;
+import com.google.android.collect.Maps;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -550,10 +554,6 @@
return mJobScheduler;
}
- /**
- * Should only be created after {@link ContentService#systemReady()} so that
- * {@link PackageManager} is ready to query.
- */
public SyncManager(Context context, boolean factoryTest) {
// Initialize the SyncStorageEngine first, before registering observers
// and creating threads and so on; it may fail if the disk is full.
@@ -566,9 +566,9 @@
mSyncStorageEngine.setOnSyncRequestListener(new OnSyncRequestListener() {
@Override
public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras,
- boolean isAppStandbyExempted) {
+ @SyncExemption int syncExemptionFlag) {
scheduleSync(info.account, info.userId, reason, info.provider, extras,
- AuthorityInfo.UNDEFINED, isAppStandbyExempted);
+ AuthorityInfo.UNDEFINED, syncExemptionFlag);
}
});
@@ -599,7 +599,7 @@
scheduleSync(null, UserHandle.USER_ALL,
SyncOperation.REASON_SERVICE_CHANGED,
type.authority, null, AuthorityInfo.UNDEFINED,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
}
}
}, mSyncHandler);
@@ -649,7 +649,7 @@
scheduleSync(account, UserHandle.getUserId(uid),
SyncOperation.REASON_ACCOUNTS_UPDATED,
null, null, AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
}
});
@@ -883,9 +883,9 @@
*/
public void scheduleSync(Account requestedAccount, int userId, int reason,
String requestedAuthority, Bundle extras, int targetSyncState,
- boolean isAppStandbyExempted) {
+ @SyncExemption int syncExemptionFlag) {
scheduleSync(requestedAccount, userId, reason, requestedAuthority, extras, targetSyncState,
- 0 /* min delay */, true /* checkIfAccountReady */, isAppStandbyExempted);
+ 0 /* min delay */, true /* checkIfAccountReady */, syncExemptionFlag);
}
/**
@@ -894,7 +894,7 @@
private void scheduleSync(Account requestedAccount, int userId, int reason,
String requestedAuthority, Bundle extras, int targetSyncState,
final long minDelayMillis, boolean checkIfAccountReady,
- boolean isAppStandbyExempted) {
+ @SyncExemption int syncExemptionFlag) {
final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
if (extras == null) {
extras = new Bundle();
@@ -904,7 +904,7 @@
+ requestedAuthority
+ " reason=" + reason
+ " checkIfAccountReady=" + checkIfAccountReady
- + " isAppStandbyExempted=" + isAppStandbyExempted);
+ + " syncExemptionFlag=" + syncExemptionFlag);
}
AccountAndUser[] accounts = null;
@@ -1016,7 +1016,7 @@
scheduleSync(account.account, userId, reason, authority,
finalExtras, targetSyncState, minDelayMillis,
true /* checkIfAccountReady */,
- isAppStandbyExempted);
+ syncExemptionFlag);
}
}
));
@@ -1027,7 +1027,8 @@
final boolean isAlwaysSyncable = syncAdapterInfo.type.isAlwaysSyncable();
if (!checkIfAccountReady && isSyncable < 0 && isAlwaysSyncable) {
mSyncStorageEngine.setIsSyncable(
- account.account, account.userId, authority, AuthorityInfo.SYNCABLE);
+ account.account, account.userId, authority, AuthorityInfo.SYNCABLE,
+ SyncLogger.CALLING_UID_SELF);
isSyncable = AuthorityInfo.SYNCABLE;
}
@@ -1067,7 +1068,7 @@
sendOnUnsyncableAccount(mContext, syncAdapterInfo, account.userId,
() -> scheduleSync(account.account, account.userId, reason,
authority, finalExtras, targetSyncState, minDelayMillis,
- false, isAppStandbyExempted));
+ false, syncExemptionFlag));
} else {
// Initialisation sync.
Bundle newExtras = new Bundle();
@@ -1086,7 +1087,7 @@
new SyncOperation(account.account, account.userId,
owningUid, owningPackage, reason, source,
authority, newExtras, allowParallelSyncs,
- isAppStandbyExempted),
+ syncExemptionFlag),
minDelayMillis
);
}
@@ -1103,7 +1104,7 @@
postScheduleSyncMessage(
new SyncOperation(account.account, account.userId,
owningUid, owningPackage, reason, source,
- authority, extras, allowParallelSyncs, isAppStandbyExempted),
+ authority, extras, allowParallelSyncs, syncExemptionFlag),
minDelayMillis
);
}
@@ -1217,12 +1218,12 @@
* ms to batch syncs.
*/
public void scheduleLocalSync(Account account, int userId, int reason, String authority,
- boolean isAppStandbyExempted) {
+ @SyncExemption int syncExemptionFlag) {
final Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
scheduleSync(account, userId, reason, authority, extras,
AuthorityInfo.UNDEFINED, LOCAL_SYNC_DELAY, true /* checkIfAccountReady */,
- isAppStandbyExempted);
+ syncExemptionFlag);
}
public SyncAdapterType[] getSyncAdapterTypes(int userId) {
@@ -1493,7 +1494,7 @@
// If any of the duplicate ones has exemption, then we inherit it.
if (!syncOperation.isPeriodic) {
- boolean inheritAppStandbyExemption = false;
+ int inheritedSyncExemptionFlag = ContentResolver.SYNC_EXEMPTION_NONE;
// Check currently running syncs
for (ActiveSyncContext asc: mActiveSyncContexts) {
@@ -1534,10 +1535,11 @@
// This means the duplicate one has a negative expected run time, but it hasn't
// been executed possibly because of app-standby.
- if (syncOperation.isAppStandbyExempted
- && (minDelay == 0)
- && !syncToRun.isAppStandbyExempted) {
+ if ((minDelay == 0)
+ && (syncToRun.syncExemptionFlag < syncOperation.syncExemptionFlag)) {
syncToRun = syncOperation;
+ inheritedSyncExemptionFlag =
+ Math.max(inheritedSyncExemptionFlag, syncToRun.syncExemptionFlag);
}
}
@@ -1551,9 +1553,8 @@
if (isLoggable) {
Slog.v(TAG, "Cancelling duplicate sync " + op);
}
- if (op.isAppStandbyExempted) {
- inheritAppStandbyExemption = true;
- }
+ inheritedSyncExemptionFlag =
+ Math.max(inheritedSyncExemptionFlag, op.syncExemptionFlag);
cancelJob(op, "scheduleSyncOperationH-duplicate");
}
}
@@ -1570,8 +1571,9 @@
}
// If any of the duplicates had exemption, we exempt the current one.
- if (inheritAppStandbyExemption) {
- syncOperation.isAppStandbyExempted = true;
+ //
+ if (inheritedSyncExemptionFlag > ContentResolver.SYNC_EXEMPTION_NONE) {
+ syncOperation.syncExemptionFlag = inheritedSyncExemptionFlag;
}
}
@@ -1591,7 +1593,7 @@
// Note this logic means when an exempted sync fails,
// the back-off one will inherit it too, and will be exempted from app-standby.
- final int jobFlags = syncOperation.isAppStandbyExempted
+ final int jobFlags = syncOperation.isAppStandbyExempted()
? JobInfo.FLAG_EXEMPT_FROM_APP_STANDBY : 0;
JobInfo.Builder b = new JobInfo.Builder(syncOperation.jobId,
@@ -1615,6 +1617,19 @@
b.setRequiresCharging(true);
}
+ if (syncOperation.syncExemptionFlag
+ == ContentResolver.SYNC_EXEMPTION_ACTIVE_WITH_TEMP) {
+ DeviceIdleController.LocalService dic =
+ LocalServices.getService(DeviceIdleController.LocalService.class);
+ if (dic != null) {
+ dic.addPowerSaveTempWhitelistApp(Process.SYSTEM_UID,
+ syncOperation.owningPackage,
+ mConstants.getKeyExemptionTempWhitelistDurationInSeconds() * 1000,
+ UserHandle.getUserId(syncOperation.owningUid),
+ /* sync=*/ false, "sync by top app");
+ }
+ }
+
getJobScheduler().scheduleAsPackage(b.build(), syncOperation.owningPackage,
syncOperation.target.userId, syncOperation.wakeLockName());
}
@@ -1736,7 +1751,7 @@
mContext.getOpPackageName());
for (Account account : accounts) {
scheduleSync(account, userId, SyncOperation.REASON_USER_START, null, null,
- AuthorityInfo.NOT_INITIALIZED, /*isAppStandbyExempted=*/ false);
+ AuthorityInfo.NOT_INITIALIZED, ContentResolver.SYNC_EXEMPTION_NONE);
}
}
@@ -1930,7 +1945,10 @@
protected void dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
- dumpSyncState(ipw);
+
+ final SyncAdapterStateFetcher buckets = new SyncAdapterStateFetcher();
+
+ dumpSyncState(ipw, buckets);
mConstants.dump(pw, "");
dumpSyncAdapters(ipw);
@@ -1991,7 +2009,7 @@
return ret;
}
- protected void dumpPendingSyncs(PrintWriter pw) {
+ protected void dumpPendingSyncs(PrintWriter pw, SyncAdapterStateFetcher buckets) {
List<SyncOperation> pendingSyncs = getAllPendingSyncs();
pw.print("Pending Syncs: ");
@@ -2001,14 +2019,14 @@
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (!op.isPeriodic) {
- pw.println(op.dump(null, false));
+ pw.println(op.dump(null, false, buckets));
count++;
}
}
pw.println();
}
- protected void dumpPeriodicSyncs(PrintWriter pw) {
+ protected void dumpPeriodicSyncs(PrintWriter pw, SyncAdapterStateFetcher buckets) {
List<SyncOperation> pendingSyncs = getAllPendingSyncs();
pw.print("Periodic Syncs: ");
@@ -2018,7 +2036,7 @@
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (op.isPeriodic) {
- pw.println(op.dump(null, false));
+ pw.println(op.dump(null, false, buckets));
count++;
}
}
@@ -2075,7 +2093,7 @@
return true;
}
- protected void dumpSyncState(PrintWriter pw) {
+ protected void dumpSyncState(PrintWriter pw, SyncAdapterStateFetcher buckets) {
final StringBuilder sb = new StringBuilder();
pw.print("Data connected: "); pw.println(mDataConnectionIsConnected);
@@ -2150,13 +2168,13 @@
sb.setLength(0);
pw.print(formatDurationHMS(sb, durationInSeconds));
pw.print(" - ");
- pw.print(activeSyncContext.mSyncOperation.dump(pm, false));
+ pw.print(activeSyncContext.mSyncOperation.dump(pm, false, buckets));
pw.println();
}
pw.println();
- dumpPendingSyncs(pw);
- dumpPeriodicSyncs(pw);
+ dumpPendingSyncs(pw, buckets);
+ dumpPeriodicSyncs(pw, buckets);
// Join the installed sync adapter with the accounts list and emit for everything.
pw.println("Sync Status");
@@ -3219,7 +3237,7 @@
scheduleSync(syncTargets.account, syncTargets.userId,
SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider,
null, AuthorityInfo.NOT_INITIALIZED,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
}
}
@@ -3286,7 +3304,7 @@
syncAdapterInfo.componentName.getPackageName(), SyncOperation.REASON_PERIODIC,
SyncStorageEngine.SOURCE_PERIODIC, extras,
syncAdapterInfo.type.allowParallelSyncs(), true, SyncOperation.NO_JOB_ID,
- pollFrequencyMillis, flexMillis, /*isAppStandbyExempted=*/ false);
+ pollFrequencyMillis, flexMillis, ContentResolver.SYNC_EXEMPTION_NONE);
final int syncOpState = computeSyncOpState(op);
switch (syncOpState) {
@@ -3431,6 +3449,15 @@
Slog.v(TAG, syncContext.toString());
}
}
+ if (op.isAppStandbyExempted()) {
+ final UsageStatsManagerInternal usmi = LocalServices.getService(
+ UsageStatsManagerInternal.class);
+ if (usmi != null) {
+ usmi.reportExemptedSyncStart(op.owningPackage,
+ UserHandle.getUserId(op.owningUid));
+ }
+ }
+
// Connect to the sync adapter.
int targetUid;
ComponentName targetComponent;
@@ -3604,7 +3631,7 @@
syncOperation.retries++;
if (syncOperation.retries > mConstants.getMaxRetriesWithAppStandbyExemption()) {
- syncOperation.isAppStandbyExempted = false;
+ syncOperation.syncExemptionFlag = ContentResolver.SYNC_EXEMPTION_NONE;
}
// the operation failed so increase the backoff time
@@ -3672,7 +3699,7 @@
syncOperation.reason,
syncOperation.syncSource, info.provider, new Bundle(),
syncOperation.allowParallelSyncs,
- syncOperation.isAppStandbyExempted));
+ syncOperation.syncExemptionFlag));
}
}
diff --git a/services/core/java/com/android/server/content/SyncManagerConstants.java b/services/core/java/com/android/server/content/SyncManagerConstants.java
index 061e4ca..2a5858c 100644
--- a/services/core/java/com/android/server/content/SyncManagerConstants.java
+++ b/services/core/java/com/android/server/content/SyncManagerConstants.java
@@ -52,6 +52,12 @@
private static final int DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION = 5;
private int mMaxRetriesWithAppStandbyExemption = DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION;
+ private static final String KEY_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS =
+ "exemption_temp_whitelist_duration_in_seconds";
+ private static final int DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS = 10 * 60;
+ private int mKeyExemptionTempWhitelistDurationInSeconds
+ = DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS;
+
protected SyncManagerConstants(Context context) {
super(null);
mContext = context;
@@ -97,6 +103,11 @@
mMaxRetriesWithAppStandbyExemption = parser.getInt(
KEY_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION,
DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION);
+
+ mKeyExemptionTempWhitelistDurationInSeconds = parser.getInt(
+ KEY_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS,
+ DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS);
+
}
}
@@ -124,6 +135,12 @@
}
}
+ public int getKeyExemptionTempWhitelistDurationInSeconds() {
+ synchronized (mLock) {
+ return mKeyExemptionTempWhitelistDurationInSeconds;
+ }
+ }
+
public void dump(PrintWriter pw, String prefix) {
synchronized (mLock) {
pw.print(prefix);
@@ -144,6 +161,10 @@
pw.print(prefix);
pw.print(" mMaxRetriesWithAppStandbyExemption=");
pw.println(mMaxRetriesWithAppStandbyExemption);
+
+ pw.print(prefix);
+ pw.print(" mKeyExemptionTempWhitelistDurationInSeconds=");
+ pw.println(mKeyExemptionTempWhitelistDurationInSeconds);
}
}
}
diff --git a/services/core/java/com/android/server/content/SyncOperation.java b/services/core/java/com/android/server/content/SyncOperation.java
index 96bdaea..d097563 100644
--- a/services/core/java/com/android/server/content/SyncOperation.java
+++ b/services/core/java/com/android/server/content/SyncOperation.java
@@ -19,6 +19,7 @@
import android.accounts.Account;
import android.app.job.JobInfo;
import android.content.ContentResolver;
+import android.content.ContentResolver.SyncExemption;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -98,33 +99,33 @@
/** jobId of the JobScheduler job corresponding to this sync */
public int jobId;
- /** Whether this operation should be exempted from the app-standby throttling. */
- public boolean isAppStandbyExempted;
+ @SyncExemption
+ public int syncExemptionFlag;
public SyncOperation(Account account, int userId, int owningUid, String owningPackage,
int reason, int source, String provider, Bundle extras,
- boolean allowParallelSyncs, boolean isAppStandbyExempted) {
+ boolean allowParallelSyncs, @SyncExemption int syncExemptionFlag) {
this(new SyncStorageEngine.EndPoint(account, provider, userId), owningUid, owningPackage,
- reason, source, extras, allowParallelSyncs, isAppStandbyExempted);
+ reason, source, extras, allowParallelSyncs, syncExemptionFlag);
}
private SyncOperation(SyncStorageEngine.EndPoint info, int owningUid, String owningPackage,
int reason, int source, Bundle extras, boolean allowParallelSyncs,
- boolean isAppStandbyExempted) {
+ @SyncExemption int syncExemptionFlag) {
this(info, owningUid, owningPackage, reason, source, extras, allowParallelSyncs, false,
- NO_JOB_ID, 0, 0, isAppStandbyExempted);
+ NO_JOB_ID, 0, 0, syncExemptionFlag);
}
public SyncOperation(SyncOperation op, long periodMillis, long flexMillis) {
this(op.target, op.owningUid, op.owningPackage, op.reason, op.syncSource,
new Bundle(op.extras), op.allowParallelSyncs, op.isPeriodic, op.sourcePeriodicId,
- periodMillis, flexMillis, /*isAppStandbyExempted=*/ false);
+ periodMillis, flexMillis, ContentResolver.SYNC_EXEMPTION_NONE);
}
public SyncOperation(SyncStorageEngine.EndPoint info, int owningUid, String owningPackage,
int reason, int source, Bundle extras, boolean allowParallelSyncs,
boolean isPeriodic, int sourcePeriodicId, long periodMillis,
- long flexMillis, boolean isAppStandbyExempted) {
+ long flexMillis, @SyncExemption int syncExemptionFlag) {
this.target = info;
this.owningUid = owningUid;
this.owningPackage = owningPackage;
@@ -138,7 +139,7 @@
this.flexMillis = flexMillis;
this.jobId = NO_JOB_ID;
this.key = toKey();
- this.isAppStandbyExempted = isAppStandbyExempted;
+ this.syncExemptionFlag = syncExemptionFlag;
}
/* Get a one off sync operation instance from a periodic sync. */
@@ -148,7 +149,7 @@
}
SyncOperation op = new SyncOperation(target, owningUid, owningPackage, reason, syncSource,
new Bundle(extras), allowParallelSyncs, false, jobId /* sourcePeriodicId */,
- periodMillis, flexMillis, /*isAppStandbyExempted=*/ false);
+ periodMillis, flexMillis, ContentResolver.SYNC_EXEMPTION_NONE);
return op;
}
@@ -166,7 +167,7 @@
periodMillis = other.periodMillis;
flexMillis = other.flexMillis;
this.key = other.key;
- isAppStandbyExempted = other.isAppStandbyExempted;
+ syncExemptionFlag = other.syncExemptionFlag;
}
/**
@@ -235,7 +236,7 @@
jobInfoExtras.putLong("flexMillis", flexMillis);
jobInfoExtras.putLong("expectedRuntime", expectedRuntime);
jobInfoExtras.putInt("retries", retries);
- jobInfoExtras.putBoolean("isAppStandbyExempted", isAppStandbyExempted);
+ jobInfoExtras.putInt("syncExemptionFlag", syncExemptionFlag);
return jobInfoExtras;
}
@@ -256,7 +257,7 @@
Bundle extras;
boolean allowParallelSyncs, isPeriodic;
long periodMillis, flexMillis;
- boolean isAppStandbyExempted;
+ int syncExemptionFlag;
if (!jobExtras.getBoolean("SyncManagerJob", false)) {
return null;
@@ -275,7 +276,8 @@
initiatedBy = jobExtras.getInt("sourcePeriodicId", NO_JOB_ID);
periodMillis = jobExtras.getLong("periodMillis");
flexMillis = jobExtras.getLong("flexMillis");
- isAppStandbyExempted = jobExtras.getBoolean("isAppStandbyExempted", false);
+ syncExemptionFlag = jobExtras.getInt("syncExemptionFlag",
+ ContentResolver.SYNC_EXEMPTION_NONE);
extras = new Bundle();
PersistableBundle syncExtras = jobExtras.getPersistableBundle("syncExtras");
@@ -298,7 +300,7 @@
new SyncStorageEngine.EndPoint(account, provider, userId);
SyncOperation op = new SyncOperation(target, owningUid, owningPackage, reason, source,
extras, allowParallelSyncs, isPeriodic, initiatedBy, periodMillis, flexMillis,
- isAppStandbyExempted);
+ syncExemptionFlag);
op.jobId = jobExtras.getInt("jobId");
op.expectedRuntime = jobExtras.getLong("expectedRuntime");
op.retries = jobExtras.getInt("retries");
@@ -361,10 +363,10 @@
@Override
public String toString() {
- return dump(null, true);
+ return dump(null, true, null);
}
- String dump(PackageManager pm, boolean shorter) {
+ String dump(PackageManager pm, boolean shorter, SyncAdapterStateFetcher appStates) {
StringBuilder sb = new StringBuilder();
sb.append("JobId=").append(jobId)
.append(" ")
@@ -385,8 +387,18 @@
if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) {
sb.append(" EXPEDITED");
}
- if (isAppStandbyExempted) {
- sb.append(" STANDBY-EXEMPTED");
+ switch (syncExemptionFlag) {
+ case ContentResolver.SYNC_EXEMPTION_NONE:
+ break;
+ case ContentResolver.SYNC_EXEMPTION_ACTIVE:
+ sb.append(" STANDBY-EXEMPTED");
+ break;
+ case ContentResolver.SYNC_EXEMPTION_ACTIVE_WITH_TEMP:
+ sb.append(" STANDBY-EXEMPTED(TOP)");
+ break;
+ default:
+ sb.append(" ExemptionFlag=" + syncExemptionFlag);
+ break;
}
sb.append(" Reason=");
sb.append(reasonToString(pm, reason));
@@ -397,21 +409,31 @@
SyncManager.formatDurationHMS(sb, flexMillis);
sb.append(")");
}
+ if (retries > 0) {
+ sb.append(" Retries=");
+ sb.append(retries);
+ }
if (!shorter) {
sb.append(" Owner={");
UserHandle.formatUid(sb, owningUid);
sb.append(" ");
sb.append(owningPackage);
+ if (appStates != null) {
+ sb.append(" [");
+ sb.append(appStates.getStandbyBucket(
+ UserHandle.getUserId(owningUid), owningPackage));
+ sb.append("]");
+
+ if (appStates.isAppActive(owningUid)) {
+ sb.append(" [ACTIVE]");
+ }
+ }
sb.append("}");
if (!extras.keySet().isEmpty()) {
sb.append(" ");
extrasToStringBuilder(extras, sb);
}
}
- if (retries > 0) {
- sb.append(" Retries=");
- sb.append(retries);
- }
return sb.toString();
}
@@ -464,6 +486,10 @@
return extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false);
}
+ boolean isAppStandbyExempted() {
+ return syncExemptionFlag != ContentResolver.SYNC_EXEMPTION_NONE;
+ }
+
static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
if (bundle == null) {
sb.append("null");
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 8b67b7a..8dd229c 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -22,6 +22,7 @@
import android.app.backup.BackupManager;
import android.content.ComponentName;
import android.content.ContentResolver;
+import android.content.ContentResolver.SyncExemption;
import android.content.Context;
import android.content.ISyncStatusObserver;
import android.content.PeriodicSync;
@@ -42,7 +43,14 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.util.*;
+import android.util.ArrayMap;
+import android.util.AtomicFile;
+import android.util.EventLog;
+import android.util.Log;
+import android.util.Pair;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.Xml;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -341,7 +349,7 @@
/** Called when a sync is needed on an account(s) due to some change in state. */
public void onSyncRequest(EndPoint info, int reason, Bundle extras,
- boolean exemptFromAppStandby);
+ @SyncExemption int syncExemptionFlag);
}
interface PeriodicSyncAddedListener {
@@ -465,11 +473,13 @@
private boolean mGrantSyncAdaptersAccountAccess;
private final MyHandler mHandler;
+ private final SyncLogger mLogger;
private SyncStorageEngine(Context context, File dataDir, Looper looper) {
mHandler = new MyHandler(looper);
mContext = context;
sSyncStorageEngine = this;
+ mLogger = SyncLogger.getInstance();
mCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0"));
@@ -493,6 +503,14 @@
writeAccountInfoLocked();
writeStatusLocked();
writeStatisticsLocked();
+
+ if (mLogger.enabled()) {
+ final int size = mAuthorities.size();
+ mLogger.log("Loaded ", size, " items");
+ for (int i = 0; i < size; i++) {
+ mLogger.log(mAuthorities.valueAt(i));
+ }
+ }
}
public static SyncStorageEngine newTestInstance(Context context) {
@@ -647,11 +665,16 @@
}
public void setSyncAutomatically(Account account, int userId, String providerName,
- boolean sync) {
+ boolean sync, @SyncExemption int syncExemptionFlag, int callingUid) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Slog.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName
+ ", user " + userId + " -> " + sync);
}
+ mLogger.log("Set sync auto account=", account,
+ " user=", userId,
+ " authority=", providerName,
+ " value=", Boolean.toString(sync),
+ " callingUid=", callingUid);
synchronized (mAuthorities) {
AuthorityInfo authority =
getOrCreateAuthorityLocked(
@@ -677,7 +700,7 @@
if (sync) {
requestSync(account, userId, SyncOperation.REASON_SYNC_AUTO, providerName,
new Bundle(),
- /* exemptFromAppStandby=*/ false);
+ syncExemptionFlag);
}
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
queueBackup();
@@ -708,8 +731,10 @@
}
}
- public void setIsSyncable(Account account, int userId, String providerName, int syncable) {
- setSyncableStateForEndPoint(new EndPoint(account, providerName, userId), syncable);
+ public void setIsSyncable(Account account, int userId, String providerName, int syncable,
+ int callingUid) {
+ setSyncableStateForEndPoint(new EndPoint(account, providerName, userId), syncable,
+ callingUid);
}
/**
@@ -718,8 +743,10 @@
* @param target target to set value for.
* @param syncable 0 indicates unsyncable, <0 unknown, >0 is active/syncable.
*/
- private void setSyncableStateForEndPoint(EndPoint target, int syncable) {
+ private void setSyncableStateForEndPoint(EndPoint target, int syncable, int callingUid) {
AuthorityInfo aInfo;
+ mLogger.log("Set syncable ", target, " value=", Integer.toString(syncable),
+ " callingUid=", callingUid);
synchronized (mAuthorities) {
aInfo = getOrCreateAuthorityLocked(target, -1, false);
if (syncable < AuthorityInfo.NOT_INITIALIZED) {
@@ -739,7 +766,7 @@
}
if (syncable == AuthorityInfo.SYNCABLE) {
requestSync(aInfo, SyncOperation.REASON_IS_SYNCABLE, new Bundle(),
- /*exemptFromAppStandby=*/ false); // Or the caller FG state?
+ ContentResolver.SYNC_EXEMPTION_NONE);
}
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
@@ -900,7 +927,10 @@
return true;
}
- public void setMasterSyncAutomatically(boolean flag, int userId) {
+ public void setMasterSyncAutomatically(boolean flag, int userId,
+ @SyncExemption int syncExemptionFlag, int callingUid) {
+ mLogger.log("Set master enabled=", flag, " user=", userId,
+ " caller=" + callingUid);
synchronized (mAuthorities) {
Boolean auto = mMasterSyncAutomatically.get(userId);
if (auto != null && auto.equals(flag)) {
@@ -912,7 +942,7 @@
if (flag) {
requestSync(null, userId, SyncOperation.REASON_MASTER_SYNC_AUTO, null,
new Bundle(),
- /*exemptFromAppStandby=*/ false); // Or the caller FG state?
+ syncExemptionFlag);
}
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
mContext.sendBroadcast(ContentResolver.ACTION_SYNC_CONN_STATUS_CHANGED);
@@ -2046,7 +2076,8 @@
String value = c.getString(c.getColumnIndex("value"));
if (name == null) continue;
if (name.equals("listen_for_tickles")) {
- setMasterSyncAutomatically(value == null || Boolean.parseBoolean(value), 0);
+ setMasterSyncAutomatically(value == null || Boolean.parseBoolean(value), 0,
+ ContentResolver.SYNC_EXEMPTION_NONE, SyncLogger.CALLING_UID_SELF);
} else if (name.startsWith("sync_provider_")) {
String provider = name.substring("sync_provider_".length(),
name.length());
@@ -2143,11 +2174,11 @@
}
private void requestSync(AuthorityInfo authorityInfo, int reason, Bundle extras,
- boolean exemptFromAppStandby) {
+ @SyncExemption int syncExemptionFlag) {
if (android.os.Process.myUid() == android.os.Process.SYSTEM_UID
&& mSyncRequestListener != null) {
mSyncRequestListener.onSyncRequest(authorityInfo.target, reason, extras,
- exemptFromAppStandby);
+ syncExemptionFlag);
} else {
SyncRequest.Builder req =
new SyncRequest.Builder()
@@ -2159,7 +2190,7 @@
}
private void requestSync(Account account, int userId, int reason, String authority,
- Bundle extras, boolean exemptFromAppStandby) {
+ Bundle extras, @SyncExemption int syncExemptionFlag) {
// If this is happening in the system process, then call the syncrequest listener
// to make a request back to the SyncManager directly.
// If this is probably a test instance, then call back through the ContentResolver
@@ -2168,7 +2199,7 @@
&& mSyncRequestListener != null) {
mSyncRequestListener.onSyncRequest(
new EndPoint(account, authority, userId),
- reason, extras, exemptFromAppStandby);
+ reason, extras, syncExemptionFlag);
} else {
ContentResolver.requestSync(account, authority, extras);
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index c4b2b5e..c7ae1f4 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -695,6 +695,27 @@
}
}
+ private void setSaturationLevelInternal(float level) {
+ if (level < 0 || level > 1) {
+ throw new IllegalArgumentException("Saturation level must be between 0 and 1");
+ }
+ float[] matrix = (level == 1.0f ? null : computeSaturationMatrix(level));
+ DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
+ dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_SATURATION, matrix);
+ }
+
+ private static float[] computeSaturationMatrix(float saturation) {
+ float desaturation = 1.0f - saturation;
+ float[] luminance = {0.231f * desaturation, 0.715f * desaturation, 0.072f * desaturation};
+ float[] matrix = {
+ luminance[0] + saturation, luminance[0], luminance[0], 0,
+ luminance[1], luminance[1] + saturation, luminance[1], 0,
+ luminance[2], luminance[2], luminance[2] + saturation, 0,
+ 0, 0, 0, 1
+ };
+ return matrix;
+ }
+
private int createVirtualDisplayInternal(IVirtualDisplayCallback callback,
IMediaProjection projection, int callingUid, String packageName, String name, int width,
int height, int densityDpi, Surface surface, int flags, String uniqueId) {
@@ -1687,6 +1708,19 @@
}
@Override // Binder call
+ public void setSaturationLevel(float level) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.CONTROL_DISPLAY_SATURATION,
+ "Permission required to set display saturation level");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ setSaturationLevelInternal(level);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
public int createVirtualDisplay(IVirtualDisplayCallback callback,
IMediaProjection projection, String packageName, String name,
int width, int height, int densityDpi, Surface surface, int flags,
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index ff8b88b..1784ef1 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -500,7 +500,7 @@
}
public void onSwitchUser(@UserIdInt int newUserId) {
- handleSettingsChange();
+ handleSettingsChange(true /* userSwitch */);
mBrightnessTracker.onSwitchUser(newUserId);
}
@@ -1420,8 +1420,12 @@
mHandler.post(mOnStateChangedRunnable);
}
- private void handleSettingsChange() {
+ private void handleSettingsChange(boolean userSwitch) {
mPendingScreenBrightnessSetting = getScreenBrightnessSetting();
+ if (userSwitch) {
+ // Don't treat user switches as user initiated change.
+ mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
+ }
mPendingAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
// We don't bother with a pending variable for VR screen brightness since we just
// immediately adapt to it.
@@ -1735,7 +1739,7 @@
@Override
public void onChange(boolean selfChange, Uri uri) {
- handleSettingsChange();
+ handleSettingsChange(false /* userSwitch */);
}
}
diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java
index 000fcf3..a94f049 100644
--- a/services/core/java/com/android/server/display/DisplayTransformManager.java
+++ b/services/core/java/com/android/server/display/DisplayTransformManager.java
@@ -17,7 +17,6 @@
package com.android.server.display;
import android.app.ActivityManager;
-import android.app.IActivityManager;
import android.opengl.Matrix;
import android.os.IBinder;
import android.os.Parcel;
@@ -28,7 +27,6 @@
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
-
import com.android.internal.app.ColorDisplayController;
import java.util.Arrays;
@@ -46,6 +44,10 @@
*/
public static final int LEVEL_COLOR_MATRIX_NIGHT_DISPLAY = 100;
/**
+ * Color transform level used to adjust the color saturation of the display.
+ */
+ public static final int LEVEL_COLOR_MATRIX_SATURATION = 150;
+ /**
* Color transform level used by A11y services to make the display monochromatic.
*/
public static final int LEVEL_COLOR_MATRIX_GRAYSCALE = 200;
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index a52dd0b..8be2c9e 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -18,10 +18,10 @@
import android.content.Context;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
+import android.hardware.biometrics.BiometricDialog;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.hardware.fingerprint.Fingerprint;
-import android.hardware.fingerprint.FingerprintDialog;
import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.os.Bundle;
import android.os.IBinder;
@@ -46,22 +46,22 @@
public static final int LOCKOUT_PERMANENT = 2;
// Callback mechanism received from the client
- // (FingerprintDialog -> FingerprintManager -> FingerprintService -> AuthenticationClient)
- private IFingerprintDialogReceiver mDialogReceiverFromClient;
+ // (BiometricDialog -> FingerprintManager -> FingerprintService -> AuthenticationClient)
+ private IBiometricDialogReceiver mDialogReceiverFromClient;
private Bundle mBundle;
private IStatusBarService mStatusBarService;
private boolean mInLockout;
private final FingerprintManager mFingerprintManager;
protected boolean mDialogDismissed;
- // Receives events from SystemUI
- protected IFingerprintDialogReceiver mDialogReceiver = new IFingerprintDialogReceiver.Stub() {
+ // Receives events from SystemUI and handles them before forwarding them to FingerprintDialog
+ protected IBiometricDialogReceiver mDialogReceiver = new IBiometricDialogReceiver.Stub() {
@Override // binder call
public void onDialogDismissed(int reason) {
if (mBundle != null && mDialogReceiverFromClient != null) {
try {
mDialogReceiverFromClient.onDialogDismissed(reason);
- if (reason == FingerprintDialog.DISMISSED_REASON_USER_CANCEL) {
+ if (reason == BiometricDialog.DISMISSED_REASON_USER_CANCEL) {
onError(FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED,
0 /* vendorCode */);
}
@@ -88,7 +88,7 @@
public AuthenticationClient(Context context, long halDeviceId, IBinder token,
IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
boolean restricted, String owner, Bundle bundle,
- IFingerprintDialogReceiver dialogReceiver, IStatusBarService statusBarService) {
+ IBiometricDialogReceiver dialogReceiver, IStatusBarService statusBarService) {
super(context, halDeviceId, token, receiver, targetUserId, groupId, restricted, owner);
mOpId = opId;
mBundle = bundle;
@@ -299,7 +299,7 @@
// If the user already cancelled authentication (via some interaction with the
// dialog, we do not need to hide it since it's already hidden.
// If the device is in lockout, don't hide the dialog - it will automatically hide
- // after FingerprintDialog.HIDE_DIALOG_DELAY
+ // after BiometricDialog.HIDE_DIALOG_DELAY
if (mBundle != null && !mDialogDismissed && !mInLockout) {
try {
mStatusBarService.hideFingerprintDialog();
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index fc8aace..92d3772 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
+import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_FINGERPRINT;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
@@ -37,12 +38,12 @@
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
@@ -61,7 +62,6 @@
import android.os.SELinux;
import android.os.ServiceManager;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.security.KeyStore;
@@ -778,7 +778,11 @@
*/
private boolean canUseFingerprint(String opPackageName, boolean requireForeground, int uid,
int pid, int userId) {
- checkPermission(USE_FINGERPRINT);
+ if (getContext().checkCallingPermission(USE_FINGERPRINT)
+ != PackageManager.PERMISSION_GRANTED) {
+ checkPermission(USE_BIOMETRIC);
+ }
+
if (isKeyguard(opPackageName)) {
return true; // Keyguard is always allowed
}
@@ -845,7 +849,7 @@
private void startAuthentication(IBinder token, long opId, int callingUserId, int groupId,
IFingerprintServiceReceiver receiver, int flags, boolean restricted,
- String opPackageName, Bundle bundle, IFingerprintDialogReceiver dialogReceiver) {
+ String opPackageName, Bundle bundle, IBiometricDialogReceiver dialogReceiver) {
updateActiveGroup(groupId, opPackageName);
if (DEBUG) Slog.v(TAG, "startAuthentication(" + opPackageName + ")");
@@ -1156,7 +1160,7 @@
public void authenticate(final IBinder token, final long opId, final int groupId,
final IFingerprintServiceReceiver receiver, final int flags,
final String opPackageName, final Bundle bundle,
- final IFingerprintDialogReceiver dialogReceiver) {
+ final IBiometricDialogReceiver dialogReceiver) {
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
final int callingUserId = UserHandle.getCallingUserId();
@@ -1466,6 +1470,8 @@
proto.end(userToken);
}
proto.flush();
+ mPerformanceMap.clear();
+ mCryptoPerformanceMap.clear();
}
@Override
@@ -1483,10 +1489,7 @@
userId = getUserOrWorkProfileId(clientPackage, userId);
if (userId != mCurrentUserId) {
File baseDir;
- if (Build.VERSION.FIRST_SDK_INT <= Build.VERSION_CODES.O_MR1
- && !SystemProperties.getBoolean(
- "ro.treble.supports_vendor_data", false)) {
- // TODO(b/72405644) remove the override when possible.
+ if (Build.VERSION.FIRST_SDK_INT <= Build.VERSION_CODES.O_MR1) {
baseDir = Environment.getUserSystemDirectory(userId);
} else {
baseDir = Environment.getDataVendorDeDirectory(userId);
diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
index abe55bb..8365fd2 100644
--- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
@@ -160,7 +160,7 @@
private static boolean isRelaxedSatisfied(JobStatus jobStatus, Network network,
NetworkCapabilities capabilities, Constants constants) {
// Only consider doing this for prefetching jobs
- if ((jobStatus.getJob().getFlags() & JobInfo.FLAG_IS_PREFETCH) == 0) {
+ if (!jobStatus.getJob().isPrefetch()) {
return false;
}
diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java
index 1dbcfd6..40d2a3a 100644
--- a/services/core/java/com/android/server/job/controllers/IdleController.java
+++ b/services/core/java/com/android/server/job/controllers/IdleController.java
@@ -19,7 +19,6 @@
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import android.app.AlarmManager;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -101,18 +100,19 @@
final class IdlenessTracker extends BroadcastReceiver {
private AlarmManager mAlarm;
- private PendingIntent mIdleTriggerIntent;
- boolean mIdle;
- boolean mScreenOn;
+
+ // After construction, mutations of idle/screen-on state will only happen
+ // on the main looper thread, either in onReceive() or in an alarm callback.
+ private boolean mIdle;
+ private boolean mScreenOn;
+
+ private AlarmManager.OnAlarmListener mIdleAlarmListener = () -> {
+ handleIdleTrigger();
+ };
public IdlenessTracker() {
mAlarm = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(ActivityManagerService.ACTION_TRIGGER_IDLE)
- .setPackage("android")
- .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mIdleTriggerIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
-
// At boot we presume that the user has just "interacted" with the
// device in some meaningful way.
mIdle = false;
@@ -150,7 +150,7 @@
}
mScreenOn = true;
//cancel the alarm
- mAlarm.cancel(mIdleTriggerIntent);
+ mAlarm.cancel(mIdleAlarmListener);
if (mIdle) {
// possible transition to not-idle
mIdle = false;
@@ -169,20 +169,24 @@
}
mScreenOn = false;
mAlarm.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- when, mIdleWindowSlop, mIdleTriggerIntent);
+ when, mIdleWindowSlop, "JS idleness", mIdleAlarmListener, null);
} else if (action.equals(ActivityManagerService.ACTION_TRIGGER_IDLE)) {
- // idle time starts now. Do not set mIdle if screen is on.
- if (!mIdle && !mScreenOn) {
- if (DEBUG) {
- Slog.v(TAG, "Idle trigger fired @ " + sElapsedRealtimeClock.millis());
- }
- mIdle = true;
- reportNewIdleState(mIdle);
- } else {
- if (DEBUG) {
- Slog.v(TAG, "TRIGGER_IDLE received but not changing state; idle="
- + mIdle + " screen=" + mScreenOn);
- }
+ handleIdleTrigger();
+ }
+ }
+
+ private void handleIdleTrigger() {
+ // idle time starts now. Do not set mIdle if screen is on.
+ if (!mIdle && !mScreenOn) {
+ if (DEBUG) {
+ Slog.v(TAG, "Idle trigger fired @ " + sElapsedRealtimeClock.millis());
+ }
+ mIdle = true;
+ reportNewIdleState(mIdle);
+ } else {
+ if (DEBUG) {
+ Slog.v(TAG, "TRIGGER_IDLE received but not changing state; idle="
+ + mIdle + " screen=" + mScreenOn);
}
}
}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 3374b30..5955c9c 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -2513,6 +2513,8 @@
* this handler.
*/
private void handleInitialize() {
+ native_init_once();
+
/*
* A cycle of native_init() and native_cleanup() is needed so that callbacks are
* registered after bootup even when location is disabled.
@@ -2576,9 +2578,9 @@
// register for connectivity change events, this is equivalent to the deprecated way of
// registering for CONNECTIVITY_ACTION broadcasts
NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
- networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
- networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
- networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
+ networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+ networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN);
NetworkRequest networkRequest = networkRequestBuilder.build();
mConnMgr.registerNetworkCallback(networkRequest, mNetworkConnectivityCallback);
@@ -2899,6 +2901,8 @@
private static native boolean native_is_gnss_configuration_supported();
+ private static native void native_init_once();
+
private native boolean native_init();
private native void native_cleanup();
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 7c56f4d..4b58d53 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -21,6 +21,7 @@
import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_ENABLED_KEY;
import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_HANDLE_KEY;
@@ -524,6 +525,10 @@
public void onCleanupUser(int userId) {
hideEncryptionNotification(new UserHandle(userId));
+ // User is stopped with its CE key evicted. Require strong auth next time to be able to
+ // unlock the user's storage. Use STRONG_AUTH_REQUIRED_AFTER_BOOT since stopping and
+ // restarting a user later is equivalent to rebooting the device.
+ requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_BOOT, userId);
}
public void onStartUser(final int userId) {
@@ -2074,11 +2079,6 @@
}
@Override
- public byte[] generateAndStoreKey(@NonNull String alias) throws RemoteException {
- return mRecoverableKeyStoreManager.generateAndStoreKey(alias);
- }
-
- @Override
public @Nullable String generateKey(@NonNull String alias) throws RemoteException {
return mRecoverableKeyStoreManager.generateKey(alias);
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index a87adbd..4c4176a 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -20,9 +20,9 @@
import android.annotation.Nullable;
import android.content.Context;
-import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.util.Log;
@@ -77,6 +77,7 @@
private final PlatformKeyManager mPlatformKeyManager;
private final RecoverySnapshotStorage mRecoverySnapshotStorage;
private final RecoverySnapshotListenersStorage mSnapshotListenersStorage;
+ private final TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
public static KeySyncTask newInstance(
Context context,
@@ -96,7 +97,8 @@
credentialType,
credential,
credentialUpdated,
- PlatformKeyManager.getInstance(context, recoverableKeyStoreDb));
+ PlatformKeyManager.getInstance(context, recoverableKeyStoreDb),
+ new TestOnlyInsecureCertificateHelper());
}
/**
@@ -108,6 +110,7 @@
* @param credential The credential, encoded as a {@link String}.
* @param credentialUpdated signals weather credentials were updated.
* @param platformKeyManager platform key manager
+ * @param TestOnlyInsecureCertificateHelper utility class used for end-to-end tests
*/
@VisibleForTesting
KeySyncTask(
@@ -118,7 +121,8 @@
int credentialType,
String credential,
boolean credentialUpdated,
- PlatformKeyManager platformKeyManager) {
+ PlatformKeyManager platformKeyManager,
+ TestOnlyInsecureCertificateHelper TestOnlyInsecureCertificateHelper) {
mSnapshotListenersStorage = recoverySnapshotListenersStorage;
mRecoverableKeyStoreDb = recoverableKeyStoreDb;
mUserId = userId;
@@ -127,6 +131,7 @@
mCredentialUpdated = credentialUpdated;
mPlatformKeyManager = platformKeyManager;
mRecoverySnapshotStorage = snapshotStorage;
+ mTestOnlyInsecureCertificateHelper = TestOnlyInsecureCertificateHelper;
}
@Override
@@ -185,8 +190,13 @@
}
PublicKey publicKey;
+ String rootCertAlias =
+ mRecoverableKeyStoreDb.getActiveRootOfTrust(mUserId, recoveryAgentUid);
+ rootCertAlias = mTestOnlyInsecureCertificateHelper
+ .getDefaultCertificateAliasIfEmpty(rootCertAlias);
+
CertPath certPath = mRecoverableKeyStoreDb.getRecoveryServiceCertPath(mUserId,
- recoveryAgentUid);
+ recoveryAgentUid, rootCertAlias);
if (certPath != null) {
Log.d(TAG, "Using the public key in stored CertPath for syncing");
publicKey = certPath.getCertificates().get(0).getPublicKey();
@@ -206,6 +216,20 @@
return;
}
+ if (mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(rootCertAlias)) {
+ Log.w(TAG, "Insecure root certificate is used by recovery agent "
+ + recoveryAgentUid);
+ if (mTestOnlyInsecureCertificateHelper.doesCredentialSupportInsecureMode(
+ mCredentialType, mCredential)) {
+ Log.w(TAG, "Whitelisted credential is used to generate snapshot by "
+ + "recovery agent "+ recoveryAgentUid);
+ } else {
+ Log.w(TAG, "Non whitelisted credential is used to generate recovery snapshot by "
+ + recoveryAgentUid + " - ignore attempt.");
+ return; // User secret will not be used.
+ }
+ }
+
byte[] salt = generateSalt();
byte[] localLskfHash = hashCredentials(salt, mCredential);
@@ -225,6 +249,10 @@
return;
}
+ // Only include insecure key material for test
+ if (mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(rootCertAlias)) {
+ rawKeys = mTestOnlyInsecureCertificateHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ }
SecretKey recoveryKey;
try {
recoveryKey = generateRecoveryKey();
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index f0bcb81..c09d725 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -31,7 +31,6 @@
import android.app.PendingIntent;
import android.content.Context;
import android.os.Binder;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
@@ -39,7 +38,6 @@
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.RecoveryController;
-import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.security.KeyStore;
import android.util.ArrayMap;
@@ -100,8 +98,8 @@
private final RecoverableKeyGenerator mRecoverableKeyGenerator;
private final RecoverySnapshotStorage mSnapshotStorage;
private final PlatformKeyManager mPlatformKeyManager;
- private final KeyStore mKeyStore;
private final ApplicationKeyStorage mApplicationKeyStorage;
+ private final TestOnlyInsecureCertificateHelper mTestCertHelper;
/**
* Returns a new or existing instance.
@@ -126,14 +124,14 @@
mInstance = new RecoverableKeyStoreManager(
context.getApplicationContext(),
- keystore,
db,
new RecoverySessionStorage(),
Executors.newSingleThreadExecutor(),
- new RecoverySnapshotStorage(),
+ RecoverySnapshotStorage.newInstance(),
new RecoverySnapshotListenersStorage(),
platformKeyManager,
- applicationKeyStorage);
+ applicationKeyStorage,
+ new TestOnlyInsecureCertificateHelper());
}
return mInstance;
}
@@ -141,16 +139,15 @@
@VisibleForTesting
RecoverableKeyStoreManager(
Context context,
- KeyStore keystore,
RecoverableKeyStoreDb recoverableKeyStoreDb,
RecoverySessionStorage recoverySessionStorage,
ExecutorService executorService,
RecoverySnapshotStorage snapshotStorage,
RecoverySnapshotListenersStorage listenersStorage,
PlatformKeyManager platformKeyManager,
- ApplicationKeyStorage applicationKeyStorage) {
+ ApplicationKeyStorage applicationKeyStorage,
+ TestOnlyInsecureCertificateHelper TestOnlyInsecureCertificateHelper) {
mContext = context;
- mKeyStore = keystore;
mDatabase = recoverableKeyStoreDb;
mRecoverySessionStorage = recoverySessionStorage;
mExecutorService = executorService;
@@ -158,6 +155,7 @@
mSnapshotStorage = snapshotStorage;
mPlatformKeyManager = platformKeyManager;
mApplicationKeyStorage = applicationKeyStorage;
+ mTestCertHelper = TestOnlyInsecureCertificateHelper;
try {
mRecoverableKeyGenerator = RecoverableKeyGenerator.newInstance(mDatabase);
@@ -177,25 +175,39 @@
int userId = UserHandle.getCallingUserId();
int uid = Binder.getCallingUid();
+ rootCertificateAlias
+ = mTestCertHelper.getDefaultCertificateAliasIfEmpty(rootCertificateAlias);
+ if (!mTestCertHelper.isValidRootCertificateAlias(rootCertificateAlias)) {
+ throw new ServiceSpecificException(
+ ERROR_INVALID_CERTIFICATE, "Invalid root certificate alias");
+ }
+ // Always set active alias to the argument of the last call to initRecoveryService method,
+ // even if cert file is incorrect.
+ String activeRootAlias = mDatabase.getActiveRootOfTrust(userId, uid);
+ if (activeRootAlias == null) {
+ Log.d(TAG, "Root of trust for recovery agent + " + uid
+ + " is assigned for the first time to " + rootCertificateAlias);
+ mDatabase.setActiveRootOfTrust(userId, uid, rootCertificateAlias);
+ } else if (!activeRootAlias.equals(rootCertificateAlias)) {
+ Log.i(TAG, "Root of trust for recovery agent " + uid + " is changed to "
+ + rootCertificateAlias + " from " + activeRootAlias);
+ mDatabase.setActiveRootOfTrust(userId, uid, rootCertificateAlias);
+ }
+
CertXml certXml;
try {
certXml = CertXml.parse(recoveryServiceCertFile);
} catch (CertParsingException e) {
- // TODO: Do not use raw key bytes anymore once the other components are updated
Log.d(TAG, "Failed to parse the input as a cert file: " + HexDump.toHexString(
recoveryServiceCertFile));
- PublicKey publicKey = parseEcPublicKey(recoveryServiceCertFile);
- if (mDatabase.setRecoveryServicePublicKey(userId, uid, publicKey) > 0) {
- mDatabase.setShouldCreateSnapshot(userId, uid, true);
- }
- Log.d(TAG, "Successfully set the input as the raw public key");
- return;
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
}
// Check serial number
long newSerial = certXml.getSerial();
- Long oldSerial = mDatabase.getRecoveryServiceCertSerial(userId, uid);
- if (oldSerial != null && oldSerial >= newSerial) {
+ Long oldSerial = mDatabase.getRecoveryServiceCertSerial(userId, uid, rootCertificateAlias);
+ if (oldSerial != null && oldSerial >= newSerial
+ && !mTestCertHelper.isTestOnlyCertificateAlias(rootCertificateAlias)) {
if (oldSerial == newSerial) {
Log.i(TAG, "The cert file serial number is the same, so skip updating.");
} else {
@@ -207,28 +219,35 @@
// Randomly choose and validate an endpoint certificate from the list
CertPath certPath;
- X509Certificate rootCert = getRootCertificate(rootCertificateAlias);
+ X509Certificate rootCert =
+ mTestCertHelper.getRootCertificate(rootCertificateAlias);
try {
Log.d(TAG, "Getting and validating a random endpoint certificate");
certPath = certXml.getRandomEndpointCert(rootCert);
} catch (CertValidationException e) {
Log.e(TAG, "Invalid endpoint cert", e);
- throw new ServiceSpecificException(
- ERROR_INVALID_CERTIFICATE, "Failed to validate certificate.");
+ throw new ServiceSpecificException(ERROR_INVALID_CERTIFICATE, e.getMessage());
}
+ boolean wasInitialized = mDatabase.getRecoveryServiceCertPath(userId, uid,
+ rootCertificateAlias) != null;
+
// Save the chosen and validated certificate into database
try {
Log.d(TAG, "Saving the randomly chosen endpoint certificate to database");
- if (mDatabase.setRecoveryServiceCertPath(userId, uid, certPath) > 0) {
- mDatabase.setRecoveryServiceCertSerial(userId, uid, newSerial);
- mDatabase.setShouldCreateSnapshot(userId, uid, true);
+ if (mDatabase.setRecoveryServiceCertPath(userId, uid, rootCertificateAlias,
+ certPath) > 0) {
+ mDatabase.setRecoveryServiceCertSerial(userId, uid, rootCertificateAlias,
+ newSerial);
+ if (wasInitialized) {
+ Log.i(TAG, "This is a certificate change. Snapshot pending.");
+ mDatabase.setShouldCreateSnapshot(userId, uid, true);
+ }
mDatabase.setCounterId(userId, uid, new SecureRandom().nextLong());
}
} catch (CertificateEncodingException e) {
Log.e(TAG, "Failed to encode CertPath", e);
- throw new ServiceSpecificException(
- ERROR_BAD_CERTIFICATE_FORMAT, "Failed to encode CertPath.");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
}
}
@@ -248,9 +267,8 @@
@NonNull byte[] recoveryServiceSigFile)
throws RemoteException {
checkRecoverKeyStorePermission();
- if (rootCertificateAlias == null) {
- Log.e(TAG, "rootCertificateAlias is null");
- }
+ rootCertificateAlias =
+ mTestCertHelper.getDefaultCertificateAliasIfEmpty(rootCertificateAlias);
Preconditions.checkNotNull(recoveryServiceCertFile, "recoveryServiceCertFile is null");
Preconditions.checkNotNull(recoveryServiceSigFile, "recoveryServiceSigFile is null");
@@ -260,19 +278,18 @@
} catch (CertParsingException e) {
Log.d(TAG, "Failed to parse the sig file: " + HexDump.toHexString(
recoveryServiceSigFile));
- throw new ServiceSpecificException(
- ERROR_BAD_CERTIFICATE_FORMAT, "Failed to parse the sig file.");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
}
- X509Certificate rootCert = getRootCertificate(rootCertificateAlias);
+ X509Certificate rootCert =
+ mTestCertHelper.getRootCertificate(rootCertificateAlias);
try {
sigXml.verifyFileSignature(rootCert, recoveryServiceCertFile);
} catch (CertValidationException e) {
Log.d(TAG, "The signature over the cert file is invalid."
+ " Cert: " + HexDump.toHexString(recoveryServiceCertFile)
+ " Sig: " + HexDump.toHexString(recoveryServiceSigFile));
- throw new ServiceSpecificException(
- ERROR_INVALID_CERTIFICATE, "The signature over the cert file is invalid.");
+ throw new ServiceSpecificException(ERROR_INVALID_CERTIFICATE, e.getMessage());
}
initRecoveryService(rootCertificateAlias, recoveryServiceCertFile);
@@ -382,10 +399,26 @@
Preconditions.checkNotNull(secretTypes, "secretTypes is null");
int userId = UserHandle.getCallingUserId();
int uid = Binder.getCallingUid();
- long updatedRows = mDatabase.setRecoverySecretTypes(userId, uid, secretTypes);
- if (updatedRows > 0) {
- mDatabase.setShouldCreateSnapshot(userId, uid, true);
+
+ int[] currentSecretTypes = mDatabase.getRecoverySecretTypes(userId, uid);
+ if (Arrays.equals(secretTypes, currentSecretTypes)) {
+ Log.v(TAG, "Not updating secret types - same as old value.");
+ return;
}
+
+ long updatedRows = mDatabase.setRecoverySecretTypes(userId, uid, secretTypes);
+ if (updatedRows < 1) {
+ throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR,
+ "Database error trying to set secret types.");
+ }
+
+ if (currentSecretTypes.length == 0) {
+ Log.i(TAG, "Initialized secret types.");
+ return;
+ }
+
+ Log.i(TAG, "Updated secret types. Snapshot pending.");
+ mDatabase.setShouldCreateSnapshot(userId, uid, true);
}
/**
@@ -433,8 +466,7 @@
try {
publicKey = KeySyncUtils.deserializePublicKey(verifierPublicKey);
} catch (InvalidKeySpecException e) {
- throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
- "Not a valid X509 key");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
}
// The raw public key bytes contained in vaultParams must match the ones given in
// verifierPublicKey; otherwise, the user secret may be decrypted by a key that is not owned
@@ -488,9 +520,8 @@
@NonNull List<KeyChainProtectionParams> secrets)
throws RemoteException {
checkRecoverKeyStorePermission();
- if (rootCertificateAlias == null) {
- Log.e(TAG, "rootCertificateAlias is null");
- }
+ rootCertificateAlias =
+ mTestCertHelper.getDefaultCertificateAliasIfEmpty(rootCertificateAlias);
Preconditions.checkNotNull(sessionId, "invalid session");
Preconditions.checkNotNull(verifierCertPath, "verifierCertPath is null");
Preconditions.checkNotNull(vaultParams, "vaultParams is null");
@@ -500,12 +531,12 @@
try {
certPath = verifierCertPath.getCertPath();
} catch (CertificateException e) {
- throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
- "Failed decode the certificate path");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
}
try {
- CertUtils.validateCertPath(getRootCertificate(rootCertificateAlias), certPath);
+ CertUtils.validateCertPath(
+ mTestCertHelper.getRootCertificate(rootCertificateAlias), certPath);
} catch (CertValidationException e) {
Log.e(TAG, "Failed to validate the given cert path", e);
throw new ServiceSpecificException(ERROR_INVALID_CERTIFICATE, e.getMessage());
@@ -634,40 +665,6 @@
}
/**
- * Deprecated
- * Generates a key named {@code alias} in the recoverable store for the calling uid. Then
- * returns the raw key material.
- *
- * <p>TODO: Once AndroidKeyStore has added move api, do not return raw bytes.
- *
- * @deprecated
- * @hide
- */
- public byte[] generateAndStoreKey(@NonNull String alias) throws RemoteException {
- checkRecoverKeyStorePermission();
- int uid = Binder.getCallingUid();
- int userId = UserHandle.getCallingUserId();
-
- PlatformEncryptionKey encryptionKey;
- try {
- encryptionKey = mPlatformKeyManager.getEncryptKey(userId);
- } catch (NoSuchAlgorithmException e) {
- // Impossible: all algorithms must be supported by AOSP
- throw new RuntimeException(e);
- } catch (KeyStoreException | UnrecoverableKeyException e) {
- throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
- } catch (InsecureUserException e) {
- throw new ServiceSpecificException(ERROR_INSECURE_USER, e.getMessage());
- }
-
- try {
- return mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias);
- } catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
- throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
- }
- }
-
- /**
* Destroys the session with the given {@code sessionId}.
*/
public void closeSession(@NonNull String sessionId) throws RemoteException {
@@ -931,21 +928,6 @@
}
}
- private X509Certificate getRootCertificate(String rootCertificateAlias) throws RemoteException {
- if (rootCertificateAlias == null || rootCertificateAlias.isEmpty()) {
- // Use the default Google Key Vault Service CA certificate if the alias is not provided
- rootCertificateAlias = TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS;
- }
-
- X509Certificate rootCertificate =
- TrustedRootCertificates.getRootCertificate(rootCertificateAlias);
- if (rootCertificate == null) {
- throw new ServiceSpecificException(
- ERROR_INVALID_CERTIFICATE, "The provided root certificate alias is invalid");
- }
- return rootCertificate;
- }
-
private void checkRecoverKeyStorePermission() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.RECOVER_KEYSTORE,
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java
new file mode 100644
index 0000000..5ba3cce
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore;
+
+import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
+
+import com.android.internal.widget.LockPatternUtils;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.security.keystore.recovery.TrustedRootCertificates;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+import javax.crypto.SecretKey;
+
+/**
+ * The class provides helper methods to support end-to-end test with insecure certificate.
+ */
+public class TestOnlyInsecureCertificateHelper {
+ private static final String TAG = "TestCertHelper";
+
+ /**
+ * Constructor for the helper class.
+ */
+ public TestOnlyInsecureCertificateHelper() {
+ }
+
+ /**
+ * Returns a root certificate installed in the system for given alias.
+ * Returns default secure certificate if alias is empty or null.
+ * Can return insecure certificate for its alias.
+ */
+ public @NonNull X509Certificate
+ getRootCertificate(String rootCertificateAlias) throws RemoteException {
+ rootCertificateAlias = getDefaultCertificateAliasIfEmpty(rootCertificateAlias);
+ if (isTestOnlyCertificateAlias(rootCertificateAlias)) {
+ return TrustedRootCertificates.getTestOnlyInsecureCertificate();
+ }
+
+ X509Certificate rootCertificate =
+ TrustedRootCertificates.getRootCertificate(rootCertificateAlias);
+ if (rootCertificate == null) {
+ throw new ServiceSpecificException(
+ ERROR_INVALID_CERTIFICATE, "The provided root certificate alias is invalid");
+ }
+ return rootCertificate;
+ }
+
+ public @NonNull String getDefaultCertificateAliasIfEmpty(
+ @Nullable String rootCertificateAlias) {
+ if (rootCertificateAlias == null || rootCertificateAlias.isEmpty()) {
+ Log.e(TAG, "rootCertificateAlias is null or empty - use secure default value");
+ // Use the default Google Key Vault Service CA certificate if the alias is not provided
+ rootCertificateAlias = TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS;
+ }
+ return rootCertificateAlias;
+ }
+
+ public boolean isTestOnlyCertificateAlias(String rootCertificateAlias) {
+ return TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS
+ .equals(rootCertificateAlias);
+ }
+
+ public boolean isValidRootCertificateAlias(String rootCertificateAlias) {
+ return TrustedRootCertificates.getRootCertificates().containsKey(rootCertificateAlias)
+ || isTestOnlyCertificateAlias(rootCertificateAlias);
+ }
+
+ public boolean doesCredentialSupportInsecureMode(int credentialType, String credential) {
+ return (credentialType == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD)
+ && (credential != null)
+ && credential.startsWith(TrustedRootCertificates.INSECURE_PASSWORD_PREFIX);
+ }
+
+ public Map<String, SecretKey> keepOnlyWhitelistedInsecureKeys(Map<String, SecretKey> rawKeys) {
+ if (rawKeys == null) {
+ return null;
+ }
+ Map<String, SecretKey> filteredKeys = new HashMap<>();
+ for (Map.Entry<String, SecretKey> entry : rawKeys.entrySet()) {
+ String alias = entry.getKey();
+ if (alias != null
+ && alias.startsWith(TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX)) {
+ filteredKeys.put(entry.getKey(), entry.getValue());
+ Log.d(TAG, "adding key with insecure alias " + alias + " to the recovery snapshot");
+ }
+ }
+ return filteredKeys;
+ }
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java
new file mode 100644
index 0000000..f789155
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer.java
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore.serialization;
+
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.CERTIFICATE_FACTORY_TYPE;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.NAMESPACE;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.OUTPUT_ENCODING;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALGORITHM;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALIAS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEYS;
+
+import static com.android.server.locksettings.recoverablekeystore.serialization
+ .KeyChainSnapshotSchema.TAG_BACKEND_PUBLIC_KEY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_COUNTER_ID;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_SNAPSHOT;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_DERIVATION_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_LOCK_SCREEN_UI_TYPE;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MAX_ATTEMPTS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MEMORY_DIFFICULTY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SALT;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SERVER_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SNAPSHOT_VERSION;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_TRUSTED_HARDWARE_CERT_PATH;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_USER_SECRET_TYPE;
+
+import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
+import android.security.keystore.recovery.WrappedApplicationKey;
+import android.util.Base64;
+import android.util.Xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CertPath;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+/**
+ * Deserializes a {@link android.security.keystore.recovery.KeyChainSnapshot} instance from XML.
+ */
+public class KeyChainSnapshotDeserializer {
+
+ /**
+ * Deserializes a {@link KeyChainSnapshot} instance from the XML in the {@code inputStream}.
+ *
+ * @throws IOException if there is an IO error reading from the stream.
+ * @throws KeyChainSnapshotParserException if the XML does not conform to the expected XML for
+ * a snapshot.
+ */
+ public static KeyChainSnapshot deserialize(InputStream inputStream)
+ throws KeyChainSnapshotParserException, IOException {
+ try {
+ return deserializeInternal(inputStream);
+ } catch (XmlPullParserException e) {
+ throw new KeyChainSnapshotParserException("Malformed KeyChainSnapshot XML", e);
+ }
+ }
+
+ private static KeyChainSnapshot deserializeInternal(InputStream inputStream) throws IOException,
+ XmlPullParserException, KeyChainSnapshotParserException {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(inputStream, OUTPUT_ENCODING);
+
+ parser.nextTag();
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_KEY_CHAIN_SNAPSHOT);
+
+ KeyChainSnapshot.Builder builder = new KeyChainSnapshot.Builder();
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ switch (name) {
+ case TAG_SNAPSHOT_VERSION:
+ builder.setSnapshotVersion(readIntTag(parser, TAG_SNAPSHOT_VERSION));
+ break;
+
+ case TAG_RECOVERY_KEY_MATERIAL:
+ builder.setEncryptedRecoveryKeyBlob(
+ readBlobTag(parser, TAG_RECOVERY_KEY_MATERIAL));
+ break;
+
+ case TAG_COUNTER_ID:
+ builder.setCounterId(readLongTag(parser, TAG_COUNTER_ID));
+ break;
+
+ case TAG_SERVER_PARAMS:
+ builder.setServerParams(readBlobTag(parser, TAG_SERVER_PARAMS));
+ break;
+
+ case TAG_MAX_ATTEMPTS:
+ builder.setMaxAttempts(readIntTag(parser, TAG_MAX_ATTEMPTS));
+ break;
+
+ case TAG_TRUSTED_HARDWARE_CERT_PATH:
+ try {
+ builder.setTrustedHardwareCertPath(
+ readCertPathTag(parser, TAG_TRUSTED_HARDWARE_CERT_PATH));
+ } catch (CertificateException e) {
+ throw new KeyChainSnapshotParserException(
+ "Could not set trustedHardwareCertPath", e);
+ }
+ break;
+
+ case TAG_BACKEND_PUBLIC_KEY:
+ builder.setTrustedHardwarePublicKey(
+ readBlobTag(parser, TAG_BACKEND_PUBLIC_KEY));
+ break;
+
+ case TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST:
+ builder.setKeyChainProtectionParams(readKeyChainProtectionParamsList(parser));
+ break;
+
+ case TAG_APPLICATION_KEYS:
+ builder.setWrappedApplicationKeys(readWrappedApplicationKeys(parser));
+ break;
+
+ default:
+ throw new KeyChainSnapshotParserException(String.format(
+ Locale.US, "Unexpected tag %s in keyChainSnapshot", name));
+ }
+ }
+
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_KEY_CHAIN_SNAPSHOT);
+ try {
+ return builder.build();
+ } catch (NullPointerException e) {
+ throw new KeyChainSnapshotParserException("Failed to build KeyChainSnapshot", e);
+ }
+ }
+
+ private static List<WrappedApplicationKey> readWrappedApplicationKeys(XmlPullParser parser)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_APPLICATION_KEYS);
+ ArrayList<WrappedApplicationKey> keys = new ArrayList<>();
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ keys.add(readWrappedApplicationKey(parser));
+ }
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_APPLICATION_KEYS);
+ return keys;
+ }
+
+ private static WrappedApplicationKey readWrappedApplicationKey(XmlPullParser parser)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_APPLICATION_KEY);
+ WrappedApplicationKey.Builder builder = new WrappedApplicationKey.Builder();
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ switch (name) {
+ case TAG_ALIAS:
+ builder.setAlias(readStringTag(parser, TAG_ALIAS));
+ break;
+
+ case TAG_KEY_MATERIAL:
+ builder.setEncryptedKeyMaterial(readBlobTag(parser, TAG_KEY_MATERIAL));
+ break;
+
+ default:
+ throw new KeyChainSnapshotParserException(String.format(
+ Locale.US, "Unexpected tag %s in wrappedApplicationKey", name));
+ }
+ }
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_APPLICATION_KEY);
+
+ try {
+ return builder.build();
+ } catch (NullPointerException e) {
+ throw new KeyChainSnapshotParserException("Failed to build WrappedApplicationKey", e);
+ }
+ }
+
+ private static List<KeyChainProtectionParams> readKeyChainProtectionParamsList(
+ XmlPullParser parser) throws IOException, XmlPullParserException,
+ KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST);
+
+ ArrayList<KeyChainProtectionParams> keyChainProtectionParamsList = new ArrayList<>();
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ keyChainProtectionParamsList.add(readKeyChainProtectionParams(parser));
+ }
+
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST);
+ return keyChainProtectionParamsList;
+ }
+
+ private static KeyChainProtectionParams readKeyChainProtectionParams(XmlPullParser parser)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS);
+
+ KeyChainProtectionParams.Builder builder = new KeyChainProtectionParams.Builder();
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ switch (name) {
+ case TAG_LOCK_SCREEN_UI_TYPE:
+ builder.setLockScreenUiFormat(readIntTag(parser, TAG_LOCK_SCREEN_UI_TYPE));
+ break;
+
+ case TAG_USER_SECRET_TYPE:
+ builder.setUserSecretType(readIntTag(parser, TAG_USER_SECRET_TYPE));
+ break;
+
+ case TAG_KEY_DERIVATION_PARAMS:
+ builder.setKeyDerivationParams(readKeyDerivationParams(parser));
+ break;
+
+ default:
+ throw new KeyChainSnapshotParserException(String.format(
+ Locale.US,
+ "Unexpected tag %s in keyChainProtectionParams",
+ name));
+
+ }
+ }
+
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS);
+
+ try {
+ return builder.build();
+ } catch (NullPointerException e) {
+ throw new KeyChainSnapshotParserException(
+ "Failed to build KeyChainProtectionParams", e);
+ }
+ }
+
+ private static KeyDerivationParams readKeyDerivationParams(XmlPullParser parser)
+ throws XmlPullParserException, IOException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_KEY_DERIVATION_PARAMS);
+
+ int memoryDifficulty = -1;
+ int algorithm = -1;
+ byte[] salt = null;
+
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ switch (name) {
+ case TAG_MEMORY_DIFFICULTY:
+ memoryDifficulty = readIntTag(parser, TAG_MEMORY_DIFFICULTY);
+ break;
+
+ case TAG_ALGORITHM:
+ algorithm = readIntTag(parser, TAG_ALGORITHM);
+ break;
+
+ case TAG_SALT:
+ salt = readBlobTag(parser, TAG_SALT);
+ break;
+
+ default:
+ throw new KeyChainSnapshotParserException(
+ String.format(
+ Locale.US,
+ "Unexpected tag %s in keyDerivationParams",
+ name));
+ }
+ }
+
+ if (salt == null) {
+ throw new KeyChainSnapshotParserException("salt was not set in keyDerivationParams");
+ }
+
+ KeyDerivationParams keyDerivationParams = null;
+
+ switch (algorithm) {
+ case KeyDerivationParams.ALGORITHM_SHA256:
+ keyDerivationParams = KeyDerivationParams.createSha256Params(salt);
+ break;
+
+ case KeyDerivationParams.ALGORITHM_SCRYPT:
+ keyDerivationParams = KeyDerivationParams.createScryptParams(
+ salt, memoryDifficulty);
+ break;
+
+ default:
+ throw new KeyChainSnapshotParserException(
+ "Unknown algorithm in keyDerivationParams");
+ }
+
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, TAG_KEY_DERIVATION_PARAMS);
+ return keyDerivationParams;
+ }
+
+ private static int readIntTag(XmlPullParser parser, String tagName)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, tagName);
+ String text = readText(parser);
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, tagName);
+ try {
+ return Integer.valueOf(text);
+ } catch (NumberFormatException e) {
+ throw new KeyChainSnapshotParserException(
+ String.format(
+ Locale.US, "%s expected int but got '%s'", tagName, text), e);
+ }
+ }
+
+ private static long readLongTag(XmlPullParser parser, String tagName)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, tagName);
+ String text = readText(parser);
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, tagName);
+ try {
+ return Long.valueOf(text);
+ } catch (NumberFormatException e) {
+ throw new KeyChainSnapshotParserException(
+ String.format(
+ Locale.US, "%s expected long but got '%s'", tagName, text), e);
+ }
+ }
+
+ private static String readStringTag(XmlPullParser parser, String tagName)
+ throws IOException, XmlPullParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, tagName);
+ String text = readText(parser);
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, tagName);
+ return text;
+ }
+
+ private static byte[] readBlobTag(XmlPullParser parser, String tagName)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, tagName);
+ String text = readText(parser);
+ parser.require(XmlPullParser.END_TAG, NAMESPACE, tagName);
+
+ try {
+ return Base64.decode(text, /*flags=*/ Base64.DEFAULT);
+ } catch (IllegalArgumentException e) {
+ throw new KeyChainSnapshotParserException(
+ String.format(
+ Locale.US,
+ "%s expected base64 encoded bytes but got '%s'",
+ tagName, text), e);
+ }
+ }
+
+ private static CertPath readCertPathTag(XmlPullParser parser, String tagName)
+ throws IOException, XmlPullParserException, KeyChainSnapshotParserException {
+ byte[] bytes = readBlobTag(parser, tagName);
+ try {
+ return CertificateFactory.getInstance(CERTIFICATE_FACTORY_TYPE)
+ .generateCertPath(new ByteArrayInputStream(bytes));
+ } catch (CertificateException e) {
+ throw new KeyChainSnapshotParserException("Could not parse CertPath in tag " + tagName,
+ e);
+ }
+ }
+
+ private static String readText(XmlPullParser parser)
+ throws IOException, XmlPullParserException {
+ String result = "";
+ if (parser.next() == XmlPullParser.TEXT) {
+ result = parser.getText();
+ parser.nextTag();
+ }
+ return result;
+ }
+
+ // Statics only
+ private KeyChainSnapshotDeserializer() {}
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotParserException.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotParserException.java
new file mode 100644
index 0000000..a3208af
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotParserException.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore.serialization;
+
+/**
+ * Error thrown when parsing invalid XML, while trying to read a
+ * {@link android.security.keystore.recovery.KeyChainSnapshot}.
+ */
+public class KeyChainSnapshotParserException extends Exception {
+
+ public KeyChainSnapshotParserException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public KeyChainSnapshotParserException(String message) {
+ super(message);
+ }
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java
new file mode 100644
index 0000000..ff30ecd
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSchema.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore.serialization;
+
+/**
+ * Describes the XML schema of the {@link android.security.keystore.recovery.KeyChainSnapshot} file.
+ */
+class KeyChainSnapshotSchema {
+ static final String NAMESPACE = null;
+
+ static final String OUTPUT_ENCODING = "UTF-8";
+
+ static final String CERTIFICATE_FACTORY_TYPE = "X.509";
+ static final String CERT_PATH_ENCODING = "PkiPath";
+
+ static final String TAG_KEY_CHAIN_SNAPSHOT = "keyChainSnapshot";
+
+ static final String TAG_SNAPSHOT_VERSION = "snapshotVersion";
+ static final String TAG_COUNTER_ID = "counterId";
+ static final String TAG_MAX_ATTEMPTS = "maxAttempts";
+ static final String TAG_RECOVERY_KEY_MATERIAL = "recoveryKeyMaterial";
+ static final String TAG_SERVER_PARAMS = "serverParams";
+ static final String TAG_TRUSTED_HARDWARE_CERT_PATH = "thmCertPath";
+ static final String TAG_BACKEND_PUBLIC_KEY = "backendPublicKey";
+
+ static final String TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST =
+ "keyChainProtectionParamsList";
+ static final String TAG_KEY_CHAIN_PROTECTION_PARAMS = "keyChainProtectionParams";
+ static final String TAG_USER_SECRET_TYPE = "userSecretType";
+ static final String TAG_LOCK_SCREEN_UI_TYPE = "lockScreenUiType";
+
+ static final String TAG_KEY_DERIVATION_PARAMS = "keyDerivationParams";
+ static final String TAG_ALGORITHM = "algorithm";
+ static final String TAG_MEMORY_DIFFICULTY = "memoryDifficulty";
+ static final String TAG_SALT = "salt";
+
+ static final String TAG_APPLICATION_KEYS = "applicationKeysList";
+ static final String TAG_APPLICATION_KEY = "applicationKey";
+ static final String TAG_ALIAS = "alias";
+ static final String TAG_KEY_MATERIAL = "keyMaterial";
+
+ // Statics only
+ private KeyChainSnapshotSchema() {}
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java
new file mode 100644
index 0000000..17a16bf
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializer.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore.serialization;
+
+
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.CERT_PATH_ENCODING;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.NAMESPACE;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.OUTPUT_ENCODING;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALGORITHM;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_ALIAS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_APPLICATION_KEYS;
+
+import static com.android.server.locksettings.recoverablekeystore.serialization
+ .KeyChainSnapshotSchema.TAG_BACKEND_PUBLIC_KEY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_COUNTER_ID;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_RECOVERY_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_CHAIN_SNAPSHOT;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_DERIVATION_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_KEY_MATERIAL;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_LOCK_SCREEN_UI_TYPE;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MAX_ATTEMPTS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_MEMORY_DIFFICULTY;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SALT;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SERVER_PARAMS;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_SNAPSHOT_VERSION;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_TRUSTED_HARDWARE_CERT_PATH;
+import static com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSchema.TAG_USER_SECRET_TYPE;
+
+import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
+import android.security.keystore.recovery.WrappedApplicationKey;
+import android.util.Base64;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.cert.CertPath;
+import java.security.cert.CertificateEncodingException;
+import java.util.List;
+
+/**
+ * Serializes a {@link KeyChainSnapshot} instance to XML.
+ */
+public class KeyChainSnapshotSerializer {
+
+ /**
+ * Serializes {@code keyChainSnapshot} to XML, writing to {@code outputStream}.
+ *
+ * @throws IOException if there was an IO error writing to the stream.
+ * @throws CertificateEncodingException if the {@link CertPath} from
+ * {@link KeyChainSnapshot#getTrustedHardwareCertPath()} is not encoded correctly.
+ */
+ public static void serialize(KeyChainSnapshot keyChainSnapshot, OutputStream outputStream)
+ throws IOException, CertificateEncodingException {
+ XmlSerializer xmlSerializer = Xml.newSerializer();
+ xmlSerializer.setOutput(outputStream, OUTPUT_ENCODING);
+ xmlSerializer.startDocument(
+ /*encoding=*/ null,
+ /*standalone=*/ null);
+ xmlSerializer.startTag(NAMESPACE, TAG_KEY_CHAIN_SNAPSHOT);
+ writeKeyChainSnapshotProperties(xmlSerializer, keyChainSnapshot);
+ writeKeyChainProtectionParams(xmlSerializer,
+ keyChainSnapshot.getKeyChainProtectionParams());
+ writeApplicationKeys(xmlSerializer,
+ keyChainSnapshot.getWrappedApplicationKeys());
+ xmlSerializer.endTag(NAMESPACE, TAG_KEY_CHAIN_SNAPSHOT);
+ xmlSerializer.endDocument();
+ }
+
+ private static void writeApplicationKeys(
+ XmlSerializer xmlSerializer, List<WrappedApplicationKey> wrappedApplicationKeys)
+ throws IOException {
+ xmlSerializer.startTag(NAMESPACE, TAG_APPLICATION_KEYS);
+ for (WrappedApplicationKey key : wrappedApplicationKeys) {
+ xmlSerializer.startTag(NAMESPACE, TAG_APPLICATION_KEY);
+ writeApplicationKeyProperties(xmlSerializer, key);
+ xmlSerializer.endTag(NAMESPACE, TAG_APPLICATION_KEY);
+ }
+ xmlSerializer.endTag(NAMESPACE, TAG_APPLICATION_KEYS);
+ }
+
+ private static void writeApplicationKeyProperties(
+ XmlSerializer xmlSerializer, WrappedApplicationKey applicationKey) throws IOException {
+ writePropertyTag(xmlSerializer, TAG_ALIAS, applicationKey.getAlias());
+ writePropertyTag(xmlSerializer, TAG_KEY_MATERIAL, applicationKey.getEncryptedKeyMaterial());
+ }
+
+ private static void writeKeyChainProtectionParams(
+ XmlSerializer xmlSerializer,
+ List<KeyChainProtectionParams> keyChainProtectionParamsList) throws IOException {
+ xmlSerializer.startTag(NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST);
+ for (KeyChainProtectionParams keyChainProtectionParams : keyChainProtectionParamsList) {
+ xmlSerializer.startTag(NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS);
+ writeKeyChainProtectionParamsProperties(xmlSerializer, keyChainProtectionParams);
+ xmlSerializer.endTag(NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS);
+ }
+ xmlSerializer.endTag(NAMESPACE, TAG_KEY_CHAIN_PROTECTION_PARAMS_LIST);
+ }
+
+ private static void writeKeyChainProtectionParamsProperties(
+ XmlSerializer xmlSerializer, KeyChainProtectionParams keyChainProtectionParams)
+ throws IOException {
+ writePropertyTag(xmlSerializer, TAG_USER_SECRET_TYPE,
+ keyChainProtectionParams.getUserSecretType());
+ writePropertyTag(xmlSerializer, TAG_LOCK_SCREEN_UI_TYPE,
+ keyChainProtectionParams.getLockScreenUiFormat());
+
+ // NOTE: Do not serialize the 'secret' field. It should never be set anyway for snapshots
+ // we generate.
+
+ writeKeyDerivationParams(xmlSerializer, keyChainProtectionParams.getKeyDerivationParams());
+ }
+
+ private static void writeKeyDerivationParams(
+ XmlSerializer xmlSerializer, KeyDerivationParams keyDerivationParams)
+ throws IOException {
+ xmlSerializer.startTag(NAMESPACE, TAG_KEY_DERIVATION_PARAMS);
+ writeKeyDerivationParamsProperties(
+ xmlSerializer, keyDerivationParams);
+ xmlSerializer.endTag(NAMESPACE, TAG_KEY_DERIVATION_PARAMS);
+ }
+
+ private static void writeKeyDerivationParamsProperties(
+ XmlSerializer xmlSerializer, KeyDerivationParams keyDerivationParams)
+ throws IOException {
+ writePropertyTag(xmlSerializer, TAG_ALGORITHM, keyDerivationParams.getAlgorithm());
+ writePropertyTag(xmlSerializer, TAG_SALT, keyDerivationParams.getSalt());
+ writePropertyTag(xmlSerializer, TAG_MEMORY_DIFFICULTY,
+ keyDerivationParams.getMemoryDifficulty());
+ }
+
+ private static void writeKeyChainSnapshotProperties(
+ XmlSerializer xmlSerializer, KeyChainSnapshot keyChainSnapshot)
+ throws IOException, CertificateEncodingException {
+
+ writePropertyTag(xmlSerializer, TAG_SNAPSHOT_VERSION,
+ keyChainSnapshot.getSnapshotVersion());
+ writePropertyTag(xmlSerializer, TAG_MAX_ATTEMPTS, keyChainSnapshot.getMaxAttempts());
+ writePropertyTag(xmlSerializer, TAG_COUNTER_ID, keyChainSnapshot.getCounterId());
+ writePropertyTag(xmlSerializer, TAG_RECOVERY_KEY_MATERIAL,
+ keyChainSnapshot.getEncryptedRecoveryKeyBlob());
+ writePropertyTag(xmlSerializer, TAG_SERVER_PARAMS, keyChainSnapshot.getServerParams());
+ writePropertyTag(xmlSerializer, TAG_TRUSTED_HARDWARE_CERT_PATH,
+ keyChainSnapshot.getTrustedHardwareCertPath());
+ if (keyChainSnapshot.getTrustedHardwarePublicKey() != null) {
+ writePropertyTag(xmlSerializer, TAG_BACKEND_PUBLIC_KEY,
+ keyChainSnapshot.getTrustedHardwarePublicKey());
+ }
+ }
+
+ private static void writePropertyTag(
+ XmlSerializer xmlSerializer, String propertyName, long propertyValue)
+ throws IOException {
+ xmlSerializer.startTag(NAMESPACE, propertyName);
+ xmlSerializer.text(Long.toString(propertyValue));
+ xmlSerializer.endTag(NAMESPACE, propertyName);
+ }
+
+ private static void writePropertyTag(
+ XmlSerializer xmlSerializer, String propertyName, String propertyValue)
+ throws IOException {
+ xmlSerializer.startTag(NAMESPACE, propertyName);
+ xmlSerializer.text(propertyValue);
+ xmlSerializer.endTag(NAMESPACE, propertyName);
+ }
+
+ private static void writePropertyTag(
+ XmlSerializer xmlSerializer, String propertyName, byte[] propertyValue)
+ throws IOException {
+ xmlSerializer.startTag(NAMESPACE, propertyName);
+ xmlSerializer.text(Base64.encodeToString(propertyValue, /*flags=*/ Base64.DEFAULT));
+ xmlSerializer.endTag(NAMESPACE, propertyName);
+ }
+
+ private static void writePropertyTag(
+ XmlSerializer xmlSerializer, String propertyName, CertPath certPath)
+ throws IOException, CertificateEncodingException {
+ writePropertyTag(xmlSerializer, propertyName, certPath.getEncoded(CERT_PATH_ENCODING));
+ }
+
+ // Statics only
+ private KeyChainSnapshotSerializer() {}
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
index 2676ee8..53c972f 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
@@ -26,9 +26,11 @@
import android.text.TextUtils;
import android.util.Log;
+import com.android.server.locksettings.recoverablekeystore.TestOnlyInsecureCertificateHelper;
import com.android.server.locksettings.recoverablekeystore.WrappedKey;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.KeysEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RecoveryServiceMetadataEntry;
+import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RootOfTrustEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.UserMetadataEntry;
import java.io.ByteArrayInputStream;
@@ -61,6 +63,7 @@
private static final String CERT_PATH_ENCODING = "PkiPath";
private final RecoverableKeyStoreDbHelper mKeyStoreDbHelper;
+ private final TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
/**
* A new instance, storing the database in the user directory of {@code context}.
@@ -76,6 +79,7 @@
private RecoverableKeyStoreDb(RecoverableKeyStoreDbHelper keyStoreDbHelper) {
this.mKeyStoreDbHelper = keyStoreDbHelper;
+ this.mTestOnlyInsecureCertificateHelper = new TestOnlyInsecureCertificateHelper();
}
/**
@@ -385,13 +389,15 @@
*
* @param userId The userId of the profile the application is running under.
* @param uid The uid of the application who initializes the local recovery components.
+ * @param rootAlias The root of trust alias.
* @return The value that were previously set, or null if there's none.
*
* @hide
*/
@Nullable
- public Long getRecoveryServiceCertSerial(int userId, int uid) {
- return getLong(userId, uid, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL);
+ public Long getRecoveryServiceCertSerial(int userId, int uid, @NonNull String rootAlias) {
+ return getLong(userId, uid, rootAlias,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL);
}
/**
@@ -399,13 +405,16 @@
*
* @param userId The userId of the profile the application is running under.
* @param uid The uid of the application who initializes the local recovery components.
+ * @param rootAlias The root of trust alias.
* @param serial The serial number contained in the XML file for recovery service certificates.
* @return The primary key of the inserted row, or -1 if failed.
*
* @hide
*/
- public long setRecoveryServiceCertSerial(int userId, int uid, long serial) {
- return setLong(userId, uid, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL, serial);
+ public long setRecoveryServiceCertSerial(int userId, int uid, @NonNull String rootAlias,
+ long serial) {
+ return setLong(userId, uid, rootAlias, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL,
+ serial);
}
/**
@@ -413,13 +422,15 @@
*
* @param userId The userId of the profile the application is running under.
* @param uid The uid of the application who initializes the local recovery components.
+ * @param rootAlias The root of trust alias.
* @return The value that were previously set, or null if there's none.
*
* @hide
*/
@Nullable
- public CertPath getRecoveryServiceCertPath(int userId, int uid) {
- byte[] bytes = getBytes(userId, uid, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH);
+ public CertPath getRecoveryServiceCertPath(int userId, int uid, @NonNull String rootAlias) {
+ byte[] bytes = getBytes(userId, uid, rootAlias,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH);
if (bytes == null) {
return null;
}
@@ -440,16 +451,17 @@
*
* @param userId The userId of the profile the application is running under.
* @param uid The uid of the application who initializes the local recovery components.
+ * @param rootAlias The root of trust alias.
* @param certPath The certificate path of the recovery service.
* @return The primary key of the inserted row, or -1 if failed.
* @hide
*/
- public long setRecoveryServiceCertPath(int userId, int uid, CertPath certPath) throws
- CertificateEncodingException {
+ public long setRecoveryServiceCertPath(int userId, int uid, @NonNull String rootAlias,
+ CertPath certPath) throws CertificateEncodingException {
if (certPath.getCertificates().size() == 0) {
throw new CertificateEncodingException("No certificate contained in the cert path.");
}
- return setBytes(userId, uid, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH,
+ return setBytes(userId, uid, rootAlias, RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH,
certPath.getEncoded(CERT_PATH_ENCODING));
}
@@ -608,6 +620,86 @@
}
/**
+ * Active root of trust for the recovery agent.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application.
+ * @param rootAlias The root of trust alias.
+ * @return The primary key of the updated row, or -1 if failed.
+ *
+ * @hide
+ */
+ public long setActiveRootOfTrust(int userId, int uid, @Nullable String rootAlias) {
+ // TODO: Call getDefaultCertificateAliasIfEmpty() here too?
+ SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST, rootAlias);
+ String selection =
+ RecoveryServiceMetadataEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RecoveryServiceMetadataEntry.COLUMN_NAME_UID + " = ?";
+ ensureRecoveryServiceMetadataEntryExists(userId, uid);
+ return db.update(RecoveryServiceMetadataEntry.TABLE_NAME, values,
+ selection, new String[] {String.valueOf(userId), String.valueOf(uid)});
+ }
+
+ /**
+ * Active root of trust for the recovery agent.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application who initialized the local recovery components.
+ * @return Active root of trust alias of null if it was not set
+ *
+ * @hide
+ */
+ public @Nullable String getActiveRootOfTrust(int userId, int uid) {
+ SQLiteDatabase db = mKeyStoreDbHelper.getReadableDatabase();
+
+ String[] projection = {
+ RecoveryServiceMetadataEntry._ID,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_USER_ID,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_UID,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST};
+ String selection =
+ RecoveryServiceMetadataEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RecoveryServiceMetadataEntry.COLUMN_NAME_UID + " = ?";
+ String[] selectionArguments = {Integer.toString(userId), Integer.toString(uid)};
+
+ try (
+ Cursor cursor = db.query(
+ RecoveryServiceMetadataEntry.TABLE_NAME,
+ projection,
+ selection,
+ selectionArguments,
+ /*groupBy=*/ null,
+ /*having=*/ null,
+ /*orderBy=*/ null)
+ ) {
+ int count = cursor.getCount();
+ if (count == 0) {
+ return null;
+ }
+ if (count > 1) {
+ Log.wtf(TAG,
+ String.format(Locale.US,
+ "%d deviceId entries found for userId=%d uid=%d. "
+ + "Should only ever be 0 or 1.", count, userId, uid));
+ return null;
+ }
+ cursor.moveToFirst();
+ int idx = cursor.getColumnIndexOrThrow(
+ RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST);
+ if (cursor.isNull(idx)) {
+ return null;
+ }
+ String result = cursor.getString(idx);
+ if (TextUtils.isEmpty(result)) {
+ return null;
+ }
+ return result;
+ }
+ }
+
+ /**
* Updates the counterId
*
* @param userId The userId of the profile the application is running under.
@@ -874,7 +966,6 @@
*
* @hide
*/
-
private long setBytes(int userId, int uid, String key, byte[] value) {
SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
@@ -890,6 +981,180 @@
}
/**
+ * Returns given binary value from the database.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application who initialized the local recovery components.
+ * @param rootAlias The root of trust alias.
+ * @param key from {@code RootOfTrustEntry}
+ * @return The value that were previously set, or null if there's none.
+ *
+ * @hide
+ */
+ private byte[] getBytes(int userId, int uid, String rootAlias, String key) {
+ rootAlias = mTestOnlyInsecureCertificateHelper.getDefaultCertificateAliasIfEmpty(rootAlias);
+ SQLiteDatabase db = mKeyStoreDbHelper.getReadableDatabase();
+
+ String[] projection = {
+ RootOfTrustEntry._ID,
+ RootOfTrustEntry.COLUMN_NAME_USER_ID,
+ RootOfTrustEntry.COLUMN_NAME_UID,
+ RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS,
+ key};
+ String selection =
+ RootOfTrustEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_UID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + " = ?";
+ String[] selectionArguments = {Integer.toString(userId), Integer.toString(uid), rootAlias};
+
+ try (
+ Cursor cursor = db.query(
+ RootOfTrustEntry.TABLE_NAME,
+ projection,
+ selection,
+ selectionArguments,
+ /*groupBy=*/ null,
+ /*having=*/ null,
+ /*orderBy=*/ null)
+ ) {
+ int count = cursor.getCount();
+ if (count == 0) {
+ return null;
+ }
+ if (count > 1) {
+ Log.wtf(TAG,
+ String.format(Locale.US,
+ "%d entries found for userId=%d uid=%d. "
+ + "Should only ever be 0 or 1.", count, userId, uid));
+ return null;
+ }
+ cursor.moveToFirst();
+ int idx = cursor.getColumnIndexOrThrow(key);
+ if (cursor.isNull(idx)) {
+ return null;
+ } else {
+ return cursor.getBlob(idx);
+ }
+ }
+ }
+
+ /**
+ * Sets a binary value in the database.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application who initialized the local recovery components.
+ * @param rootAlias The root of trust alias.
+ * @param key defined in {@code RootOfTrustEntry}
+ * @param value new value.
+ * @return The primary key of the inserted row, or -1 if failed.
+ *
+ * @hide
+ */
+ private long setBytes(int userId, int uid, String rootAlias, String key, byte[] value) {
+ rootAlias = mTestOnlyInsecureCertificateHelper.getDefaultCertificateAliasIfEmpty(rootAlias);
+ SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(key, value);
+ String selection =
+ RootOfTrustEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_UID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + " = ?";
+ String[] selectionArguments = {Integer.toString(userId), Integer.toString(uid), rootAlias};
+
+ ensureRootOfTrustEntryExists(userId, uid, rootAlias);
+ return db.update(
+ RootOfTrustEntry.TABLE_NAME, values, selection, selectionArguments);
+ }
+
+ /**
+ * Returns given long value from the database.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application who initialized the local recovery components.
+ * @param rootAlias The root of trust alias.
+ * @param key from {@code RootOfTrustEntry}
+ * @return The value that were previously set, or null if there's none.
+ *
+ * @hide
+ */
+ private Long getLong(int userId, int uid, String rootAlias, String key) {
+ rootAlias = mTestOnlyInsecureCertificateHelper.getDefaultCertificateAliasIfEmpty(rootAlias);
+ SQLiteDatabase db = mKeyStoreDbHelper.getReadableDatabase();
+
+ String[] projection = {
+ RootOfTrustEntry._ID,
+ RootOfTrustEntry.COLUMN_NAME_USER_ID,
+ RootOfTrustEntry.COLUMN_NAME_UID,
+ RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS,
+ key};
+ String selection =
+ RootOfTrustEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_UID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + " = ?";
+ String[] selectionArguments = {Integer.toString(userId), Integer.toString(uid), rootAlias};
+
+ try (
+ Cursor cursor = db.query(
+ RootOfTrustEntry.TABLE_NAME,
+ projection,
+ selection,
+ selectionArguments,
+ /*groupBy=*/ null,
+ /*having=*/ null,
+ /*orderBy=*/ null)
+ ) {
+ int count = cursor.getCount();
+ if (count == 0) {
+ return null;
+ }
+ if (count > 1) {
+ Log.wtf(TAG,
+ String.format(Locale.US,
+ "%d entries found for userId=%d uid=%d. "
+ + "Should only ever be 0 or 1.", count, userId, uid));
+ return null;
+ }
+ cursor.moveToFirst();
+ int idx = cursor.getColumnIndexOrThrow(key);
+ if (cursor.isNull(idx)) {
+ return null;
+ } else {
+ return cursor.getLong(idx);
+ }
+ }
+ }
+
+ /**
+ * Sets a long value in the database.
+ *
+ * @param userId The userId of the profile the application is running under.
+ * @param uid The uid of the application who initialized the local recovery components.
+ * @param rootAlias The root of trust alias.
+ * @param key defined in {@code RootOfTrustEntry}
+ * @param value new value.
+ * @return The primary key of the inserted row, or -1 if failed.
+ *
+ * @hide
+ */
+
+ private long setLong(int userId, int uid, String rootAlias, String key, long value) {
+ rootAlias = mTestOnlyInsecureCertificateHelper.getDefaultCertificateAliasIfEmpty(rootAlias);
+ SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(key, value);
+ String selection =
+ RootOfTrustEntry.COLUMN_NAME_USER_ID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_UID + " = ? AND "
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + " = ?";
+ String[] selectionArguments = {Integer.toString(userId), Integer.toString(uid), rootAlias};
+
+ ensureRootOfTrustEntryExists(userId, uid, rootAlias);
+ return db.update(
+ RootOfTrustEntry.TABLE_NAME, values, selection, selectionArguments);
+ }
+
+
+ /**
* Creates an empty row in the recovery service metadata table if such a row doesn't exist for
* the given userId and uid, so db.update will succeed.
*/
@@ -903,6 +1168,20 @@
}
/**
+ * Creates an empty row in the root of trust table if such a row doesn't exist for
+ * the given userId and uid, so db.update will succeed.
+ */
+ private void ensureRootOfTrustEntryExists(int userId, int uid, String rootAlias) {
+ SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(RootOfTrustEntry.COLUMN_NAME_USER_ID, userId);
+ values.put(RootOfTrustEntry.COLUMN_NAME_UID, uid);
+ values.put(RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS, rootAlias);
+ db.insertWithOnConflict(RootOfTrustEntry.TABLE_NAME, /*nullColumnHack=*/ null,
+ values, SQLiteDatabase.CONFLICT_IGNORE);
+ }
+
+ /**
* Closes all open connections to the database.
*/
public void close() {
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
index 2c3d3ab..7ee809a 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
@@ -70,121 +70,6 @@
}
/**
- * Table holding encrypted snapshots of the recoverable key store.
- */
- static class SnapshotsEntry implements BaseColumns {
- static final String TABLE_NAME = "snapshots";
-
- /**
- * The version number of the snapshot.
- */
- static final String COLUMN_NAME_VERSION = "version";
-
- /**
- * The ID of the user whose keystore was snapshotted.
- */
- static final String COLUMN_NAME_USER_ID = "user_id";
-
- /**
- * The UID of the app that owns the snapshot (i.e., the recovery agent).
- */
- static final String COLUMN_NAME_UID = "uid";
-
- /**
- * The maximum number of attempts allowed to attempt to decrypt the recovery key.
- */
- static final String COLUMN_NAME_MAX_ATTEMPTS = "max_attempts";
-
- /**
- * The ID of the counter in the trusted hardware module.
- */
- static final String COLUMN_NAME_COUNTER_ID = "counter_id";
-
- /**
- * Server parameters used to help identify the device (during recovery).
- */
- static final String SERVER_PARAMS = "server_params";
-
- /**
- * The public key of the trusted hardware module. This key has been used to encrypt the
- * snapshot, to ensure that it can only be read by the trusted module.
- */
- static final String TRUSTED_HARDWARE_PUBLIC_KEY = "thm_public_key";
-
- /**
- * {@link java.security.cert.CertPath} signing the trusted hardware module to whose public
- * key this snapshot is encrypted.
- */
- static final String CERT_PATH = "cert_path";
-
- /**
- * The recovery key, encrypted with the user's lock screen and the trusted hardware module's
- * public key.
- */
- static final String ENCRYPTED_RECOVERY_KEY = "encrypted_recovery_key";
- }
-
- /**
- * Table holding encrypted keys belonging to a particular snapshot.
- */
- static class SnapshotKeysEntry implements BaseColumns {
- static final String TABLE_NAME = "snapshot_keys";
-
- /**
- * ID of the associated snapshot entry in {@link SnapshotsEntry}.
- */
- static final String COLUMN_NAME_SNAPSHOT_ID = "snapshot_id";
-
- /**
- * Alias of the key.
- */
- static final String COLUMN_NAME_ALIAS = "alias";
-
- /**
- * Key material, encrypted with the recovery key from the snapshot.
- */
- static final String COLUMN_NAME_ENCRYPTED_BYTES = "encrypted_key_bytes";
- }
-
- /**
- * A layer of protection associated with a snapshot.
- */
- static class SnapshotProtectionParams implements BaseColumns {
- static final String TABLE_NAME = "snapshot_protection_params";
-
- /**
- * ID of the associated snapshot entry in {@link SnapshotsEntry}.
- */
- static final String COLUMN_NAME_SNAPSHOT_ID = "snapshot_id";
-
- /**
- * Type of secret used to generate recovery key. One of
- * {@link android.security.keystore.recovery.KeyChainProtectionParams#TYPE_LOCKSCREEN} or
- */
- static final String COLUMN_NAME_SECRET_TYPE = "secret_type";
-
- /**
- * If a lock screen, the type of UI used. One of
- * {@link android.security.keystore.recovery.KeyChainProtectionParams#UI_FORMAT_PATTERN},
- * {@link android.security.keystore.recovery.KeyChainProtectionParams#UI_FORMAT_PIN}, or
- * {@link android.security.keystore.recovery.KeyChainProtectionParams#UI_FORMAT_PASSWORD}.
- */
- static final String COLUMN_NAME_LOCKSCREEN_UI_TYPE = "lock_screen_ui_type";
-
- /**
- * The algorithm used to derive cryptographic material from the key and salt. One of
- * {@link android.security.keystore.recovery.KeyDerivationParams#ALGORITHM_SHA256} or
- * {@link android.security.keystore.recovery.KeyDerivationParams#ALGORITHM_SCRYPT}.
- */
- static final String COLUMN_NAME_KEY_DERIVATION_ALGORITHM = "key_derivation_algorithm";
-
- /**
- * The salt used along with the secret to generate cryptographic material.
- */
- static final String COLUMN_NAME_KEY_DERIVATION_SALT = "key_derivation_salt";
- }
-
- /**
* Recoverable KeyStore metadata for a specific user profile.
*/
static class UserMetadataEntry implements BaseColumns {
@@ -230,16 +115,19 @@
/**
* The public key of the recovery service.
+ * Deprecated.
*/
static final String COLUMN_NAME_PUBLIC_KEY = "public_key";
/**
* The certificate path of the recovery service.
+ * Deprecated.
*/
static final String COLUMN_NAME_CERT_PATH = "cert_path";
/**
* The serial number contained in the certificate XML file of the recovery service.
+ * Deprecated.
*/
static final String COLUMN_NAME_CERT_SERIAL = "cert_serial";
@@ -257,5 +145,42 @@
* The server parameters of the recovery service.
*/
static final String COLUMN_NAME_SERVER_PARAMS = "server_params";
+
+ /**
+ * Active root of trust
+ */
+ static final String COLUMN_NAME_ACTIVE_ROOT_OF_TRUST = "active_root_of_trust";
+ }
+
+ /**
+ * Table data for given recovery agent and root of trust pair.
+ */
+ static class RootOfTrustEntry implements BaseColumns {
+ static final String TABLE_NAME = "root_of_trust";
+
+ /**
+ * The user id of the profile the application is running under.
+ */
+ static final String COLUMN_NAME_USER_ID = "user_id";
+
+ /**
+ * The uid of the application that initializes the local recovery components.
+ */
+ static final String COLUMN_NAME_UID = "uid";
+
+ /**
+ * Root of trust alias
+ */
+ static final String COLUMN_NAME_ROOT_ALIAS = "root_alias";
+
+ /**
+ * The certificate path of the recovery service.
+ */
+ static final String COLUMN_NAME_CERT_PATH = "cert_path";
+
+ /**
+ * The serial number contained in the certificate XML file of the recovery service.
+ */
+ static final String COLUMN_NAME_CERT_SERIAL = "cert_serial";
}
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
index 8a89f2d..43efe9c 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper.java
@@ -23,6 +23,7 @@
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.KeysEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RecoveryServiceMetadataEntry;
+import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RootOfTrustEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.UserMetadataEntry;
/**
@@ -31,7 +32,7 @@
class RecoverableKeyStoreDbHelper extends SQLiteOpenHelper {
private static final String TAG = "RecoverableKeyStoreDbHp";
- static final int DATABASE_VERSION = 3;
+ static final int DATABASE_VERSION = 4;
private static final String DATABASE_NAME = "recoverablekeystore.db";
private static final String SQL_CREATE_KEYS_ENTRY =
@@ -61,6 +62,7 @@
+ RecoveryServiceMetadataEntry.COLUMN_NAME_UID + " INTEGER,"
+ RecoveryServiceMetadataEntry.COLUMN_NAME_SNAPSHOT_VERSION + " INTEGER,"
+ RecoveryServiceMetadataEntry.COLUMN_NAME_SHOULD_CREATE_SNAPSHOT + " INTEGER,"
+ + RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST + " TEXT,"
+ RecoveryServiceMetadataEntry.COLUMN_NAME_PUBLIC_KEY + " BLOB,"
+ RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_PATH + " BLOB,"
+ RecoveryServiceMetadataEntry.COLUMN_NAME_CERT_SERIAL + " INTEGER,"
@@ -71,6 +73,19 @@
+ RecoveryServiceMetadataEntry.COLUMN_NAME_USER_ID + ","
+ RecoveryServiceMetadataEntry.COLUMN_NAME_UID + "))";
+ private static final String SQL_CREATE_ROOT_OF_TRUST_ENTRY =
+ "CREATE TABLE " + RootOfTrustEntry.TABLE_NAME + " ("
+ + RootOfTrustEntry._ID + " INTEGER PRIMARY KEY,"
+ + RootOfTrustEntry.COLUMN_NAME_USER_ID + " INTEGER,"
+ + RootOfTrustEntry.COLUMN_NAME_UID + " INTEGER,"
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + " TEST,"
+ + RootOfTrustEntry.COLUMN_NAME_CERT_PATH + " BLOB,"
+ + RootOfTrustEntry.COLUMN_NAME_CERT_SERIAL + " INTEGER,"
+ + "UNIQUE("
+ + RootOfTrustEntry.COLUMN_NAME_USER_ID + ","
+ + RootOfTrustEntry.COLUMN_NAME_UID + ","
+ + RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS + "))";
+
private static final String SQL_DELETE_KEYS_ENTRY =
"DROP TABLE IF EXISTS " + KeysEntry.TABLE_NAME;
@@ -80,6 +95,9 @@
private static final String SQL_DELETE_RECOVERY_SERVICE_METADATA_ENTRY =
"DROP TABLE IF EXISTS " + RecoveryServiceMetadataEntry.TABLE_NAME;
+ private static final String SQL_DELETE_ROOT_OF_TRUST_ENTRY =
+ "DROP TABLE IF EXISTS " + RootOfTrustEntry.TABLE_NAME;
+
RecoverableKeyStoreDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@@ -89,21 +107,44 @@
db.execSQL(SQL_CREATE_KEYS_ENTRY);
db.execSQL(SQL_CREATE_USER_METADATA_ENTRY);
db.execSQL(SQL_CREATE_RECOVERY_SERVICE_METADATA_ENTRY);
+ db.execSQL(SQL_CREATE_ROOT_OF_TRUST_ENTRY);
+ }
+
+ @Override
+ public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.e(TAG, "Recreating recoverablekeystore after unexpected version downgrade.");
+ dropAllKnownTables(db); // Wipe database.
+ onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
- db.execSQL(SQL_DELETE_KEYS_ENTRY);
- db.execSQL(SQL_DELETE_USER_METADATA_ENTRY);
- db.execSQL(SQL_DELETE_RECOVERY_SERVICE_METADATA_ENTRY);
+ dropAllKnownTables(db); // Wipe database.
onCreate(db);
return;
}
- if (oldVersion < 3) {
+ if (oldVersion < 3 && newVersion >= 3) {
upgradeDbForVersion3(db);
+ oldVersion = 3;
}
+
+ if (oldVersion < 4 && newVersion >= 4) {
+ upgradeDbForVersion4(db);
+ oldVersion = 4;
+ }
+
+ if (oldVersion != newVersion) {
+ Log.e(TAG, "Failed to update recoverablekeystore database to the most recent version");
+ }
+ }
+
+ private void dropAllKnownTables(SQLiteDatabase db) {
+ db.execSQL(SQL_DELETE_KEYS_ENTRY);
+ db.execSQL(SQL_DELETE_USER_METADATA_ENTRY);
+ db.execSQL(SQL_DELETE_RECOVERY_SERVICE_METADATA_ENTRY);
+ db.execSQL(SQL_DELETE_ROOT_OF_TRUST_ENTRY);
}
private void upgradeDbForVersion3(SQLiteDatabase db) {
@@ -115,6 +156,16 @@
null);
}
+ private void upgradeDbForVersion4(SQLiteDatabase db) {
+ Log.d(TAG, "Updating recoverable keystore database to version 4");
+ // Add new table with two columns for cert path and cert serial number.
+ db.execSQL(SQL_CREATE_ROOT_OF_TRUST_ENTRY);
+ // adds column to store root of trust currently used by the recovery agent
+ addColumnToTable(db, RecoveryServiceMetadataEntry.TABLE_NAME,
+ RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST, "TEXT",
+ /*defaultStr=*/ null);
+ }
+
private static void addColumnToTable(
SQLiteDatabase db, String tableName, String column, String columnType,
String defaultStr) {
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage.java
index 3f93cc6..c02b103 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage.java
@@ -17,13 +17,28 @@
package com.android.server.locksettings.recoverablekeystore.storage;
import android.annotation.Nullable;
+import android.os.Environment;
import android.security.keystore.recovery.KeyChainSnapshot;
+import android.util.Log;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.locksettings.recoverablekeystore.serialization
+ .KeyChainSnapshotDeserializer;
+import com.android.server.locksettings.recoverablekeystore.serialization
+ .KeyChainSnapshotParserException;
+import com.android.server.locksettings.recoverablekeystore.serialization.KeyChainSnapshotSerializer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.security.cert.CertificateEncodingException;
+import java.util.Locale;
/**
- * In-memory storage for recovery snapshots.
+ * Storage for recovery snapshots. Stores snapshots in memory, backed by disk storage.
*
* <p>Recovery snapshots are generated after a successful screen unlock. They are only generated if
* the recoverable keystore has been mutated since the previous snapshot. This class stores only the
@@ -33,14 +48,46 @@
* {@link com.android.server.locksettings.recoverablekeystore.KeySyncTask} thread.
*/
public class RecoverySnapshotStorage {
+
+ private static final String TAG = "RecoverySnapshotStorage";
+
+ private static final String ROOT_PATH = "system";
+ private static final String STORAGE_PATH = "recoverablekeystore/snapshots/";
+
@GuardedBy("this")
private final SparseArray<KeyChainSnapshot> mSnapshotByUid = new SparseArray<>();
+ private final File rootDirectory;
+
+ /**
+ * A new instance, storing snapshots in /data/system/recoverablekeystore/snapshots.
+ *
+ * <p>NOTE: calling this multiple times DOES NOT return the same instance, so will NOT be backed
+ * by the same in-memory store.
+ */
+ public static RecoverySnapshotStorage newInstance() {
+ return new RecoverySnapshotStorage(
+ new File(Environment.getDataDirectory(), ROOT_PATH));
+ }
+
+ @VisibleForTesting
+ public RecoverySnapshotStorage(File rootDirectory) {
+ this.rootDirectory = rootDirectory;
+ }
+
/**
* Sets the latest {@code snapshot} for the recovery agent {@code uid}.
*/
public synchronized void put(int uid, KeyChainSnapshot snapshot) {
mSnapshotByUid.put(uid, snapshot);
+
+ try {
+ writeToDisk(uid, snapshot);
+ } catch (IOException | CertificateEncodingException e) {
+ Log.e(TAG,
+ String.format(Locale.US, "Error persisting snapshot for %d to disk", uid),
+ e);
+ }
}
/**
@@ -48,7 +95,17 @@
*/
@Nullable
public synchronized KeyChainSnapshot get(int uid) {
- return mSnapshotByUid.get(uid);
+ KeyChainSnapshot snapshot = mSnapshotByUid.get(uid);
+ if (snapshot != null) {
+ return snapshot;
+ }
+
+ try {
+ return readFromDisk(uid);
+ } catch (IOException | KeyChainSnapshotParserException e) {
+ Log.e(TAG, String.format(Locale.US, "Error reading snapshot for %d from disk", uid), e);
+ return null;
+ }
}
/**
@@ -56,5 +113,66 @@
*/
public synchronized void remove(int uid) {
mSnapshotByUid.remove(uid);
+ getSnapshotFile(uid).delete();
+ }
+
+ /**
+ * Writes the snapshot for recovery agent {@code uid} to disk.
+ *
+ * @throws IOException if an IO error occurs writing to disk.
+ */
+ private void writeToDisk(int uid, KeyChainSnapshot snapshot)
+ throws IOException, CertificateEncodingException {
+ File snapshotFile = getSnapshotFile(uid);
+
+ try (
+ FileOutputStream fileOutputStream = new FileOutputStream(snapshotFile)
+ ) {
+ KeyChainSnapshotSerializer.serialize(snapshot, fileOutputStream);
+ } catch (IOException | CertificateEncodingException e) {
+ // If we fail to write the latest snapshot, we should delete any older snapshot that
+ // happens to be around. Otherwise snapshot syncs might end up going 'back in time'.
+ snapshotFile.delete();
+ throw e;
+ }
+ }
+
+ /**
+ * Reads the last snapshot for recovery agent {@code uid} from disk.
+ *
+ * @return The snapshot, or null if none existed.
+ * @throws IOException if an IO error occurs reading from disk.
+ */
+ @Nullable
+ private KeyChainSnapshot readFromDisk(int uid)
+ throws IOException, KeyChainSnapshotParserException {
+ File snapshotFile = getSnapshotFile(uid);
+
+ try (
+ FileInputStream fileInputStream = new FileInputStream(snapshotFile)
+ ) {
+ return KeyChainSnapshotDeserializer.deserialize(fileInputStream);
+ } catch (IOException | KeyChainSnapshotParserException e) {
+ // If we fail to read the latest snapshot, we should delete it in case it is in some way
+ // corrupted. We can regenerate snapshots anyway.
+ snapshotFile.delete();
+ throw e;
+ }
+ }
+
+ private File getSnapshotFile(int uid) {
+ File folder = getStorageFolder();
+ String fileName = getSnapshotFileName(uid);
+ return new File(folder, fileName);
+ }
+
+ private String getSnapshotFileName(int uid) {
+ return String.format(Locale.US, "%d.xml", uid);
+ }
+
+ private File getStorageFolder() {
+ File folder = new File(rootDirectory, STORAGE_PATH);
+ folder.mkdirs();
+ return folder;
}
}
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 664d2f9..0d1644b 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -71,8 +71,6 @@
*/
private static final int OPTIMISTIC_VOLUME_TIMEOUT = 1000;
- private static final int UID_NOT_SET = -1;
-
private final MessageHandler mHandler;
private final int mOwnerPid;
@@ -117,9 +115,6 @@
private boolean mIsActive = false;
private boolean mDestroyed = false;
- private int mCallingUid = UID_NOT_SET;
- private String mCallingPackage;
-
public MediaSessionRecord(int ownerPid, int ownerUid, int userId, String ownerPackageName,
ISessionCallback cb, String tag, MediaSessionService service, Looper handlerLooper) {
mOwnerPid = ownerPid;
@@ -234,14 +229,14 @@
* {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE},
* {@link AudioManager#ADJUST_SAME}.
*
+ * @param packageName The package that made the original volume request.
+ * @param pid The pid that made the original volume request.
+ * @param uid The uid that made the original volume request.
* @param direction The direction to adjust volume in.
* @param flags Any of the flags from {@link AudioManager}.
- * @param packageName The package that made the original volume request.
- * @param uid The uid that made the original volume request.
* @param useSuggested True to use adjustSuggestedStreamVolume instead of
- * adjustStreamVolume.
*/
- public void adjustVolume(int direction, int flags, String packageName, int uid,
+ public void adjustVolume(String packageName, int pid, int uid, int direction, int flags,
boolean useSuggested) {
int previousFlagPlaySound = flags & AudioManager.FLAG_PLAY_SOUND;
if (isPlaybackActive() || hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY)) {
@@ -263,7 +258,7 @@
Log.w(TAG, "Muting remote playback is not supported");
return;
}
- mSessionCb.adjustVolume(direction);
+ mSessionCb.adjustVolume(packageName, pid, uid, direction);
int volumeBefore = (mOptimisticVolume < 0 ? mCurrentVolume : mOptimisticVolume);
mOptimisticVolume = volumeBefore + direction;
@@ -282,7 +277,7 @@
}
}
- public void setVolumeTo(int value, int flags, String packageName, int uid) {
+ public void setVolumeTo(String packageName, int pid, int uid, int value, int flags) {
if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
mAudioManagerInternal.setStreamVolumeForUid(stream, value, flags, packageName, uid);
@@ -292,7 +287,7 @@
return;
}
value = Math.max(0, Math.min(value, mMaxVolume));
- mSessionCb.setVolumeTo(value);
+ mSessionCb.setVolumeTo(packageName, pid, uid, value);
int volumeBefore = (mOptimisticVolume < 0 ? mCurrentVolume : mOptimisticVolume);
mOptimisticVolume = Math.max(0, Math.min(value, mMaxVolume));
@@ -423,10 +418,9 @@
return mSessionCb.mCb;
}
- public void sendMediaButton(KeyEvent ke, int sequenceId,
- ResultReceiver cb, int uid, String packageName) {
- updateCallingPackage(uid, packageName);
- mSessionCb.sendMediaButton(ke, sequenceId, cb);
+ public void sendMediaButton(String packageName, int pid, int uid, KeyEvent ke, int sequenceId,
+ ResultReceiver cb) {
+ mSessionCb.sendMediaButton(packageName, pid, uid, ke, sequenceId, cb);
}
public void dump(PrintWriter pw, String prefix) {
@@ -703,22 +697,6 @@
return -1;
}
- private void updateCallingPackage() {
- updateCallingPackage(UID_NOT_SET, null);
- }
-
- private void updateCallingPackage(int uid, String packageName) {
- if (uid == UID_NOT_SET) {
- uid = Binder.getCallingUid();
- }
- synchronized (mLock) {
- if (mCallingUid == UID_NOT_SET || mCallingUid != uid) {
- mCallingUid = uid;
- mCallingPackage = packageName != null ? packageName : getPackageName(uid);
- }
- }
- }
-
private String getPackageName(int uid) {
Context context = mService.getContext();
if (context == null) {
@@ -920,11 +898,6 @@
mHandler.post(MessageHandler.MSG_UPDATE_VOLUME);
}
}
-
- @Override
- public String getCallingPackage() {
- return mCallingPackage;
- }
}
class SessionCb {
@@ -934,11 +907,12 @@
mCb = cb;
}
- public boolean sendMediaButton(KeyEvent keyEvent, int sequenceId, ResultReceiver cb) {
+ public boolean sendMediaButton(String packageName, int pid, int uid, KeyEvent keyEvent,
+ int sequenceId, ResultReceiver cb) {
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
try {
- mCb.onMediaButton(mediaButtonIntent, sequenceId, cb);
+ mCb.onMediaButton(packageName, pid, uid, mediaButtonIntent, sequenceId, cb);
return true;
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in sendMediaRequest.", e);
@@ -946,169 +920,176 @@
return false;
}
- public void sendCommand(String command, Bundle args, ResultReceiver cb) {
+ public void sendCommand(String packageName, int pid, int uid, String command, Bundle args,
+ ResultReceiver cb) {
try {
- mCb.onCommand(command, args, cb);
+ mCb.onCommand(packageName, pid, uid, command, args, cb);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in sendCommand.", e);
}
}
- public void sendCustomAction(String action, Bundle args) {
+ public void sendCustomAction(String packageName, int pid, int uid, String action,
+ Bundle args) {
try {
- mCb.onCustomAction(action, args);
+ mCb.onCustomAction(packageName, pid, uid, action, args);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in sendCustomAction.", e);
}
}
- public void prepare() {
+ public void prepare(String packageName, int pid, int uid) {
try {
- mCb.onPrepare();
+ mCb.onPrepare(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in prepare.", e);
}
}
- public void prepareFromMediaId(String mediaId, Bundle extras) {
+ public void prepareFromMediaId(String packageName, int pid, int uid, String mediaId,
+ Bundle extras) {
try {
- mCb.onPrepareFromMediaId(mediaId, extras);
+ mCb.onPrepareFromMediaId(packageName, pid, uid, mediaId, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in prepareFromMediaId.", e);
}
}
- public void prepareFromSearch(String query, Bundle extras) {
+ public void prepareFromSearch(String packageName, int pid, int uid, String query,
+ Bundle extras) {
try {
- mCb.onPrepareFromSearch(query, extras);
+ mCb.onPrepareFromSearch(packageName, pid, uid, query, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in prepareFromSearch.", e);
}
}
- public void prepareFromUri(Uri uri, Bundle extras) {
+ public void prepareFromUri(String packageName, int pid, int uid, Uri uri,
+ Bundle extras) {
try {
- mCb.onPrepareFromUri(uri, extras);
+ mCb.onPrepareFromUri(packageName, pid, uid, uri, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in prepareFromUri.", e);
}
}
- public void play() {
+ public void play(String packageName, int pid, int uid) {
try {
- mCb.onPlay();
+ mCb.onPlay(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in play.", e);
}
}
- public void playFromMediaId(String mediaId, Bundle extras) {
+ public void playFromMediaId(String packageName, int pid, int uid, String mediaId,
+ Bundle extras) {
try {
- mCb.onPlayFromMediaId(mediaId, extras);
+ mCb.onPlayFromMediaId(packageName, pid, uid, mediaId, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in playFromMediaId.", e);
}
}
- public void playFromSearch(String query, Bundle extras) {
+ public void playFromSearch(String packageName, int pid, int uid, String query,
+ Bundle extras) {
try {
- mCb.onPlayFromSearch(query, extras);
+ mCb.onPlayFromSearch(packageName, pid, uid, query, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in playFromSearch.", e);
}
}
- public void playFromUri(Uri uri, Bundle extras) {
+ public void playFromUri(String packageName, int pid, int uid, Uri uri, Bundle extras) {
try {
- mCb.onPlayFromUri(uri, extras);
+ mCb.onPlayFromUri(packageName, pid, uid, uri, extras);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in playFromUri.", e);
}
}
- public void skipToTrack(long id) {
+ public void skipToTrack(String packageName, int pid, int uid, long id) {
try {
- mCb.onSkipToTrack(id);
+ mCb.onSkipToTrack(packageName, pid, uid, id);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in skipToTrack", e);
}
}
- public void pause() {
+ public void pause(String packageName, int pid, int uid) {
try {
- mCb.onPause();
+ mCb.onPause(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in pause.", e);
}
}
- public void stop() {
+ public void stop(String packageName, int pid, int uid) {
try {
- mCb.onStop();
+ mCb.onStop(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in stop.", e);
}
}
- public void next() {
+ public void next(String packageName, int pid, int uid) {
try {
- mCb.onNext();
+ mCb.onNext(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in next.", e);
}
}
- public void previous() {
+ public void previous(String packageName, int pid, int uid) {
try {
- mCb.onPrevious();
+ mCb.onPrevious(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in previous.", e);
}
}
- public void fastForward() {
+ public void fastForward(String packageName, int pid, int uid) {
try {
- mCb.onFastForward();
+ mCb.onFastForward(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in fastForward.", e);
}
}
- public void rewind() {
+ public void rewind(String packageName, int pid, int uid) {
try {
- mCb.onRewind();
+ mCb.onRewind(packageName, pid, uid);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in rewind.", e);
}
}
- public void seekTo(long pos) {
+ public void seekTo(String packageName, int pid, int uid, long pos) {
try {
- mCb.onSeekTo(pos);
+ mCb.onSeekTo(packageName, pid, uid, pos);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in seekTo.", e);
}
}
- public void rate(Rating rating) {
+ public void rate(String packageName, int pid, int uid, Rating rating) {
try {
- mCb.onRate(rating);
+ mCb.onRate(packageName, pid, uid, rating);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in rate.", e);
}
}
- public void adjustVolume(int direction) {
+ public void adjustVolume(String packageName, int pid, int uid, int direction) {
try {
- mCb.onAdjustVolume(direction);
+ mCb.onAdjustVolume(packageName, pid, uid, direction);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in adjustVolume.", e);
}
}
- public void setVolumeTo(int value) {
+ public void setVolumeTo(String packageName, int pid, int uid, int value) {
try {
- mCb.onSetVolumeTo(value);
+ mCb.onSetVolumeTo(packageName, pid, uid, value);
} catch (RemoteException e) {
Slog.e(TAG, "Remote failure in setVolumeTo.", e);
}
@@ -1117,16 +1098,16 @@
class ControllerStub extends ISessionController.Stub {
@Override
- public void sendCommand(String command, Bundle args, ResultReceiver cb)
- throws RemoteException {
- updateCallingPackage();
- mSessionCb.sendCommand(command, args, cb);
+ public void sendCommand(String packageName, String command, Bundle args,
+ ResultReceiver cb) {
+ mSessionCb.sendCommand(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ command, args, cb);
}
@Override
- public boolean sendMediaButton(KeyEvent mediaButtonIntent) {
- updateCallingPackage();
- return mSessionCb.sendMediaButton(mediaButtonIntent, 0, null);
+ public boolean sendMediaButton(String packageName, KeyEvent mediaButtonIntent) {
+ return mSessionCb.sendMediaButton(packageName, Binder.getCallingPid(),
+ Binder.getCallingUid(), mediaButtonIntent, 0, null);
}
@Override
@@ -1207,137 +1188,125 @@
}
@Override
- public void adjustVolume(int direction, int flags, String packageName) {
- updateCallingPackage();
+ public void adjustVolume(String packageName, int direction, int flags) {
+ int pid = Binder.getCallingPid();
int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- MediaSessionRecord.this.adjustVolume(direction, flags, packageName, uid, false);
+ MediaSessionRecord.this.adjustVolume(packageName, pid, uid, direction, flags,
+ false /* useSuggested */);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
- public void setVolumeTo(int value, int flags, String packageName) {
- updateCallingPackage();
+ public void setVolumeTo(String packageName, int value, int flags) {
+ int pid = Binder.getCallingPid();
int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- MediaSessionRecord.this.setVolumeTo(value, flags, packageName, uid);
+ MediaSessionRecord.this.setVolumeTo(packageName, pid, uid, value, flags);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
- public void prepare() throws RemoteException {
- updateCallingPackage();
- mSessionCb.prepare();
+ public void prepare(String packageName) {
+ mSessionCb.prepare(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void prepareFromMediaId(String mediaId, Bundle extras)
- throws RemoteException {
- updateCallingPackage();
- mSessionCb.prepareFromMediaId(mediaId, extras);
+ public void prepareFromMediaId(String packageName, String mediaId, Bundle extras) {
+ mSessionCb.prepareFromMediaId(packageName, Binder.getCallingPid(),
+ Binder.getCallingUid(), mediaId, extras);
}
@Override
- public void prepareFromSearch(String query, Bundle extras) throws RemoteException {
- updateCallingPackage();
- mSessionCb.prepareFromSearch(query, extras);
+ public void prepareFromSearch(String packageName, String query, Bundle extras) {
+ mSessionCb.prepareFromSearch(packageName, Binder.getCallingPid(),
+ Binder.getCallingUid(), query, extras);
}
@Override
- public void prepareFromUri(Uri uri, Bundle extras) throws RemoteException {
- updateCallingPackage();
- mSessionCb.prepareFromUri(uri, extras);
+ public void prepareFromUri(String packageName, Uri uri, Bundle extras) {
+ mSessionCb.prepareFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ uri, extras);
}
@Override
- public void play() throws RemoteException {
- updateCallingPackage();
- mSessionCb.play();
+ public void play(String packageName) {
+ mSessionCb.play(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void playFromMediaId(String mediaId, Bundle extras) throws RemoteException {
- updateCallingPackage();
- mSessionCb.playFromMediaId(mediaId, extras);
+ public void playFromMediaId(String packageName, String mediaId, Bundle extras) {
+ mSessionCb.playFromMediaId(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ mediaId, extras);
}
@Override
- public void playFromSearch(String query, Bundle extras) throws RemoteException {
- updateCallingPackage();
- mSessionCb.playFromSearch(query, extras);
+ public void playFromSearch(String packageName, String query, Bundle extras) {
+ mSessionCb.playFromSearch(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ query, extras);
}
@Override
- public void playFromUri(Uri uri, Bundle extras) throws RemoteException {
- updateCallingPackage();
- mSessionCb.playFromUri(uri, extras);
+ public void playFromUri(String packageName, Uri uri, Bundle extras) {
+ mSessionCb.playFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ uri, extras);
}
@Override
- public void skipToQueueItem(long id) {
- updateCallingPackage();
- mSessionCb.skipToTrack(id);
+ public void skipToQueueItem(String packageName, long id) {
+ mSessionCb.skipToTrack(packageName, Binder.getCallingPid(), Binder.getCallingUid(), id);
}
@Override
- public void pause() throws RemoteException {
- updateCallingPackage();
- mSessionCb.pause();
+ public void pause(String packageName) {
+ mSessionCb.pause(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void stop() throws RemoteException {
- updateCallingPackage();
- mSessionCb.stop();
+ public void stop(String packageName) {
+ mSessionCb.stop(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void next() throws RemoteException {
- updateCallingPackage();
- mSessionCb.next();
+ public void next(String packageName) {
+ mSessionCb.next(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void previous() throws RemoteException {
- updateCallingPackage();
- mSessionCb.previous();
+ public void previous(String packageName) {
+ mSessionCb.previous(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void fastForward() throws RemoteException {
- updateCallingPackage();
- mSessionCb.fastForward();
+ public void fastForward(String packageName) {
+ mSessionCb.fastForward(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void rewind() throws RemoteException {
- updateCallingPackage();
- mSessionCb.rewind();
+ public void rewind(String packageName) {
+ mSessionCb.rewind(packageName, Binder.getCallingPid(), Binder.getCallingUid());
}
@Override
- public void seekTo(long pos) throws RemoteException {
- updateCallingPackage();
- mSessionCb.seekTo(pos);
+ public void seekTo(String packageName, long pos) {
+ mSessionCb.seekTo(packageName, Binder.getCallingPid(), Binder.getCallingUid(), pos);
}
@Override
- public void rate(Rating rating) throws RemoteException {
- updateCallingPackage();
- mSessionCb.rate(rating);
+ public void rate(String packageName, Rating rating) {
+ mSessionCb.rate(packageName, Binder.getCallingPid(), Binder.getCallingUid(), rating);
}
@Override
- public void sendCustomAction(String action, Bundle args)
- throws RemoteException {
- updateCallingPackage();
- mSessionCb.sendCustomAction(action, args);
+ public void sendCustomAction(String packageName, String action, Bundle args) {
+ mSessionCb.sendCustomAction(packageName, Binder.getCallingPid(), Binder.getCallingUid(),
+ action, args);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 7348b84..6413ba9 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -101,6 +101,7 @@
*/
public class MediaSessionService extends SystemService implements Monitor {
private static final String TAG = "MediaSessionService";
+ static final boolean USE_MEDIA2_APIS = false; // TODO: Change this to true when we're ready.
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
// Leave log for key event always.
private static final boolean DEBUG_KEY_EVENT = true;
@@ -508,6 +509,9 @@
}
private void buildMediaSessionService2List() {
+ if (!USE_MEDIA2_APIS) {
+ return;
+ }
if (DEBUG) {
Log.d(TAG, "buildMediaSessionService2List");
}
@@ -1531,8 +1535,11 @@
*/
@Override
public boolean createSession2(Bundle sessionToken) {
+ if (!USE_MEDIA2_APIS) {
+ return false;
+ }
final int uid = Binder.getCallingUid();
- final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken);
+ final SessionToken2 token = SessionToken2.fromBundle(sessionToken);
if (token == null || token.getUid() != uid) {
Log.w(TAG, "onSessionCreated failed, expected caller uid=" + token.getUid()
+ " but from uid=" + uid);
@@ -1570,8 +1577,11 @@
*/
@Override
public void destroySession2(Bundle sessionToken) {
+ if (!USE_MEDIA2_APIS) {
+ return;
+ }
final int uid = Binder.getCallingUid();
- final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken);
+ final SessionToken2 token = SessionToken2.fromBundle(sessionToken);
if (token == null || token.getUid() != uid) {
Log.w(TAG, "onSessionDestroyed failed, expected caller uid=" + token.getUid()
+ " but from uid=" + uid);
@@ -1586,6 +1596,9 @@
@Override
public List<Bundle> getSessionTokens(boolean activeSessionOnly,
boolean sessionServiceOnly, String packageName) throws RemoteException {
+ if (!USE_MEDIA2_APIS) {
+ return null;
+ }
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
@@ -1614,6 +1627,9 @@
@Override
public void addSessionTokensListener(ISessionTokensListener listener, int userId,
String packageName) throws RemoteException {
+ if (!USE_MEDIA2_APIS) {
+ return;
+ }
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
@@ -1637,6 +1653,9 @@
@Override
public void removeSessionTokensListener(ISessionTokensListener listener,
String packageName) throws RemoteException {
+ if (!USE_MEDIA2_APIS) {
+ return;
+ }
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
@@ -1785,8 +1804,8 @@
}
});
} else {
- session.adjustVolume(direction, flags, getContext().getPackageName(),
- Process.SYSTEM_UID, true);
+ session.adjustVolume(getContext().getPackageName(), Process.myPid(),
+ Process.SYSTEM_UID, direction, flags, true);
}
}
@@ -1824,10 +1843,12 @@
mKeyEventReceiver.aquireWakeLockLocked();
}
// If we don't need a wakelock use -1 as the id so we won't release it later.
- session.sendMediaButton(keyEvent,
+ session.sendMediaButton(getContext().getPackageName(),
+ Process.myPid(),
+ Process.SYSTEM_UID,
+ keyEvent,
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
- mKeyEventReceiver, Process.SYSTEM_UID,
- getContext().getPackageName());
+ mKeyEventReceiver);
if (mCurrentFullUserRecord.mCallback != null) {
try {
mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession(
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index efca159..29d2e55 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -149,7 +149,6 @@
import android.net.wifi.WifiManager;
import android.os.BestClock;
import android.os.Binder;
-import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
@@ -230,9 +229,11 @@
import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
import java.time.Clock;
+import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@@ -274,6 +275,11 @@
private static final boolean LOGD = NetworkPolicyLogger.LOGD;
private static final boolean LOGV = NetworkPolicyLogger.LOGV;
+ /**
+ * No opportunistic quota could be calculated from user data plan or data settings.
+ */
+ public static final int OPPORTUNISTIC_QUOTA_UNKNOWN = -1;
+
private static final int VERSION_INIT = 1;
private static final int VERSION_ADDED_SNOOZE = 2;
private static final int VERSION_ADDED_RESTRICT_BACKGROUND = 3;
@@ -360,6 +366,8 @@
private static final int UID_MSG_STATE_CHANGED = 100;
private static final int UID_MSG_GONE = 101;
+ private static final String PROP_SUB_PLAN_OWNER = "persist.sys.sub_plan_owner";
+
private final Context mContext;
private final IActivityManager mActivityManager;
private NetworkStatsManagerInternal mNetworkStats;
@@ -1141,7 +1149,7 @@
// TODO: support shared UIDs
if (maxBytes > 0 && maxBytes > totalBytes / 2) {
final String[] packageNames = mContext.getPackageManager().getPackagesForUid(maxUid);
- if (packageNames.length == 1) {
+ if (packageNames != null && packageNames.length == 1) {
try {
return mContext.getPackageManager().getApplicationInfo(packageNames[0],
MATCH_ANY_USER | MATCH_DISABLED_COMPONENTS | MATCH_DIRECT_BOOT_AWARE
@@ -1732,12 +1740,10 @@
final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId);
if (plan == null) continue;
- // By default assume we have no quota
- long quotaBytes = 0;
-
+ final long quotaBytes;
final long limitBytes = plan.getDataLimitBytes();
if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) {
- // Ignore missing limits
+ quotaBytes = OPPORTUNISTIC_QUOTA_UNKNOWN;
} else if (limitBytes == SubscriptionPlan.BYTES_UNLIMITED) {
// Unlimited data; let's use 20MiB/day (600MiB/month)
quotaBytes = DataUnit.MEBIBYTES.toBytes(20);
@@ -1746,14 +1752,19 @@
final Pair<ZonedDateTime, ZonedDateTime> cycle = plan.cycleIterator().next();
final long start = cycle.first.toInstant().toEpochMilli();
final long end = cycle.second.toInstant().toEpochMilli();
+ final Instant now = mClock.instant();
+ final long startOfDay = ZonedDateTime.ofInstant(now, cycle.first.getZone())
+ .truncatedTo(ChronoUnit.DAYS)
+ .toInstant().toEpochMilli();
final long totalBytes = getTotalBytes(
- NetworkTemplate.buildTemplateMobileAll(state.subscriberId), start, end);
+ NetworkTemplate.buildTemplateMobileAll(state.subscriberId),
+ start, startOfDay);
final long remainingBytes = limitBytes - totalBytes;
- final long remainingDays = Math.max(1, (end - mClock.millis())
- / TimeUnit.DAYS.toMillis(1));
- if (remainingBytes > 0) {
- quotaBytes = (remainingBytes / remainingDays) / 10;
- }
+ // Number of remaining days including current day
+ final long remainingDays =
+ 1 + ((end - now.toEpochMilli() - 1) / TimeUnit.DAYS.toMillis(1));
+
+ quotaBytes = Math.max(0, (remainingBytes / remainingDays) / 10);
}
mSubscriptionOpportunisticQuota.put(subId, quotaBytes);
@@ -2338,7 +2349,7 @@
}
private void setUidPolicyUncheckedUL(int uid, int oldPolicy, int policy, boolean persist) {
- setUidPolicyUncheckedUL(uid, policy, persist);
+ setUidPolicyUncheckedUL(uid, policy, false);
final boolean notifyApp;
if (!isUidValidForWhitelistRules(uid)) {
@@ -2361,6 +2372,11 @@
}
mHandler.obtainMessage(MSG_POLICIES_CHANGED, uid, policy, Boolean.valueOf(notifyApp))
.sendToTarget();
+ if (persist) {
+ synchronized (mNetworkPoliciesSecondLock) {
+ writePolicyAL();
+ }
+ }
}
private void setUidPolicyUncheckedUL(int uid, int policy, boolean persist) {
@@ -2781,10 +2797,17 @@
return;
}
- // Fourth check: is caller a testing app on a debug build?
- final boolean enableDebug = Build.IS_USERDEBUG || Build.IS_ENG;
- if (enableDebug && callingPackage
- .equals(SystemProperties.get("fw.sub_plan_owner." + subId, null))) {
+ // Fourth check: is caller a testing app?
+ final String testPackage = SystemProperties.get(PROP_SUB_PLAN_OWNER + "." + subId, null);
+ if (!TextUtils.isEmpty(testPackage)
+ && Objects.equals(testPackage, callingPackage)) {
+ return;
+ }
+
+ // Fifth check: is caller a legacy testing app?
+ final String legacyTestPackage = SystemProperties.get("fw.sub_plan_owner." + subId, null);
+ if (!TextUtils.isEmpty(legacyTestPackage)
+ && Objects.equals(legacyTestPackage, callingPackage)) {
return;
}
@@ -2985,6 +3008,14 @@
}
}
+ /**
+ * Only visible for testing purposes. This doesn't give any access to
+ * existing plans; it simply lets the debug package define new plans.
+ */
+ void setSubscriptionPlansOwner(int subId, String packageName) {
+ SystemProperties.set(PROP_SUB_PLAN_OWNER + "." + subId, packageName);
+ }
+
@Override
public String getSubscriptionPlansOwner(int subId) {
if (UserHandle.getCallingAppId() != android.os.Process.SYSTEM_UID) {
@@ -3203,20 +3234,14 @@
this, in, out, err, args, callback, resultReceiver);
}
- @Override
+ @VisibleForTesting
public boolean isUidForeground(int uid) {
- mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
-
synchronized (mUidRulesFirstLock) {
- return isUidForegroundUL(uid);
+ return isUidStateForeground(
+ mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY));
}
}
- private boolean isUidForegroundUL(int uid) {
- return isUidStateForegroundUL(
- mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY));
- }
-
private boolean isUidForegroundOnRestrictBackgroundUL(int uid) {
final int procState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
return isProcStateAllowedWhileOnRestrictBackground(procState);
@@ -3227,9 +3252,9 @@
return isProcStateAllowedWhileIdleOrPowerSaveMode(procState);
}
- private boolean isUidStateForegroundUL(int state) {
+ private boolean isUidStateForeground(int state) {
// only really in foreground when screen is also on
- return state <= ActivityManager.PROCESS_STATE_TOP;
+ return state <= NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE;
}
/**
@@ -3256,7 +3281,7 @@
}
updateRulesForPowerRestrictionsUL(uid);
}
- updateNetworkStats(uid, isUidStateForegroundUL(uidState));
+ updateNetworkStats(uid, isUidStateForeground(uidState));
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
@@ -4658,7 +4683,8 @@
public long getSubscriptionOpportunisticQuota(Network network, int quotaType) {
synchronized (mNetworkPoliciesSecondLock) {
// TODO: handle splitting quota between use-cases
- return mSubscriptionOpportunisticQuota.get(getSubIdLocked(network));
+ return mSubscriptionOpportunisticQuota.get(getSubIdLocked(network),
+ OPPORTUNISTIC_QUOTA_UNKNOWN);
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
index b65b9d7..56d41c5 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
@@ -21,7 +21,6 @@
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import android.content.Context;
-import android.net.INetworkPolicyManager;
import android.net.NetworkPolicyManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -33,10 +32,10 @@
class NetworkPolicyManagerShellCommand extends ShellCommand {
- private final INetworkPolicyManager mInterface;
+ private final NetworkPolicyManagerService mInterface;
private final WifiManager mWifiManager;
- NetworkPolicyManagerShellCommand(Context context, INetworkPolicyManager service) {
+ NetworkPolicyManagerShellCommand(Context context, NetworkPolicyManagerService service) {
mInterface = service;
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}
@@ -97,6 +96,8 @@
pw.println(" Toggles whether the given wi-fi network is metered.");
pw.println(" set restrict-background BOOLEAN");
pw.println(" Sets the global restrict background usage status.");
+ pw.println(" set sub-plan-owner subId [packageName]");
+ pw.println(" Sets the data plan owner package for subId.");
}
private int runGet() throws RemoteException {
@@ -126,6 +127,8 @@
return setMeteredWifiNetwork();
case "restrict-background":
return setRestrictBackground();
+ case "sub-plan-owner":
+ return setSubPlanOwner();
}
pw.println("Error: unknown set type '" + type + "'");
return -1;
@@ -227,6 +230,13 @@
return 0;
}
+ private int setSubPlanOwner() throws RemoteException {
+ final int subId = Integer.parseInt(getNextArgRequired());
+ final String packageName = getNextArg();
+ mInterface.setSubscriptionPlansOwner(subId, packageName);
+ return 0;
+ }
+
private int setUidPolicy(int policy) throws RemoteException {
final int uid = getUidFromNextArg();
if (uid < 0) {
diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java
index a5f8dc7..2ef754e 100644
--- a/services/core/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java
@@ -16,9 +16,9 @@
package com.android.server.net;
-import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
+import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.METERED_NO;
import static android.net.NetworkStats.METERED_YES;
import static android.net.NetworkStats.ROAMING_NO;
@@ -42,9 +42,11 @@
import android.service.NetworkStatsCollectionProto;
import android.service.NetworkStatsCollectionStatsProto;
import android.telephony.SubscriptionPlan;
+import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.AtomicFile;
import android.util.IntArray;
+import android.util.MathUtils;
import android.util.Pair;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -245,7 +247,10 @@
+ " is forbidden for caller " + callerUid);
}
- final int bucketEstimate = (int) ((end - start) / mBucketDuration);
+ // 180 days of history should be enough for anyone; if we end up needing
+ // more, we'll dynamically grow the history object.
+ final int bucketEstimate = (int) MathUtils.constrain(((end - start) / mBucketDuration), 0,
+ (180 * DateUtils.DAY_IN_MILLIS) / mBucketDuration);
final NetworkStatsHistory combined = new NetworkStatsHistory(
mBucketDuration, bucketEstimate, fields);
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 93c04fe..4e848f8 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -27,6 +27,7 @@
import static android.net.ConnectivityManager.isNetworkTypeMobile;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.IFACE_ALL;
+import static android.net.NetworkStats.INTERFACES_ALL;
import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.ROAMING_ALL;
import static android.net.NetworkStats.SET_ALL;
@@ -34,6 +35,7 @@
import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.STATS_PER_IFACE;
import static android.net.NetworkStats.STATS_PER_UID;
+import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static android.net.NetworkStatsHistory.FIELD_ALL;
@@ -127,6 +129,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.net.VpnInfo;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
@@ -739,7 +742,8 @@
final long token = Binder.clearCallingIdentity();
final NetworkStats networkLayer;
try {
- networkLayer = mNetworkManager.getNetworkStatsUidDetail(uid);
+ networkLayer = mNetworkManager.getNetworkStatsUidDetail(uid,
+ NetworkStats.INTERFACES_ALL);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -761,6 +765,18 @@
}
@Override
+ public NetworkStats getDetailedUidStats(String[] requiredIfaces) {
+ try {
+ final String[] ifacesToQuery =
+ NetworkStatsFactory.augmentWithStackedInterfaces(requiredIfaces);
+ return getNetworkStatsUidDetail(ifacesToQuery);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error compiling UID stats", e);
+ return new NetworkStats(0L, 0);
+ }
+ }
+
+ @Override
public String[] getMobileIfaces() {
return mMobileIfaces;
}
@@ -1119,6 +1135,8 @@
if (isMobile) {
mobileIfaces.add(stackedIface);
}
+
+ NetworkStatsFactory.noteStackedIface(stackedIface, baseIface);
}
}
}
@@ -1141,7 +1159,7 @@
private void recordSnapshotLocked(long currentTime) throws RemoteException {
// snapshot and record current counters; read UID stats first to
// avoid over counting dev stats.
- final NetworkStats uidSnapshot = getNetworkStatsUidDetail();
+ final NetworkStats uidSnapshot = getNetworkStatsUidDetail(INTERFACES_ALL);
final NetworkStats xtSnapshot = getNetworkStatsXt();
final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev();
@@ -1501,12 +1519,21 @@
* Return snapshot of current UID statistics, including any
* {@link TrafficStats#UID_TETHERING}, video calling data usage, and {@link #mUidOperations}
* values.
+ *
+ * @param ifaces A list of interfaces the stats should be restricted to, or
+ * {@link NetworkStats#INTERFACES_ALL}.
*/
- private NetworkStats getNetworkStatsUidDetail() throws RemoteException {
- final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL);
+ private NetworkStats getNetworkStatsUidDetail(String[] ifaces)
+ throws RemoteException {
+
+ // TODO: remove 464xlat adjustments from NetworkStatsFactory and apply all at once here.
+ final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL,
+ ifaces);
// fold tethering stats and operations into uid snapshot
final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID);
+ tetherSnapshot.filter(UID_ALL, ifaces, TAG_ALL);
+ NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot);
uidSnapshot.combineAllValues(tetherSnapshot);
final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
@@ -1515,8 +1542,11 @@
// fold video calling data usage stats into uid snapshot
final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID);
if (vtStats != null) {
+ vtStats.filter(UID_ALL, ifaces, TAG_ALL);
+ NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats);
uidSnapshot.combineAllValues(vtStats);
}
+
uidSnapshot.combineAllValues(mUidOperations);
return uidSnapshot;
diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java
index 6907c58..29b1339 100644
--- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java
+++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java
@@ -171,7 +171,7 @@
Slog.w(TAG, "Only shell is allowed to call network watchlist shell commands");
return;
}
- (new NetworkWatchlistShellCommand(mContext)).exec(this, in, out, err, args, callback,
+ (new NetworkWatchlistShellCommand(this, mContext)).exec(this, in, out, err, args, callback,
resultReceiver);
}
@@ -262,6 +262,21 @@
mNetworkWatchlistHandler.reportWatchlistIfNecessary();
}
+ /**
+ * Force generate watchlist report for testing.
+ *
+ * @param lastReportTime Watchlist report will cotain all records before this time.
+ * @return True if operation success.
+ */
+ public boolean forceReportWatchlistForTest(long lastReportTime) {
+ if (mConfig.isConfigSecure()) {
+ // Should not force generate report under production config.
+ return false;
+ }
+ mNetworkWatchlistHandler.forceReportWatchlistForTest(lastReportTime);
+ return true;
+ }
+
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
index 9533823..17c5868 100644
--- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
+++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
@@ -19,9 +19,11 @@
import android.content.Context;
import android.content.Intent;
import android.net.NetworkWatchlistManager;
+import android.os.Binder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ShellCommand;
+import android.provider.Settings;
import java.io.FileInputStream;
import java.io.IOException;
@@ -34,10 +36,12 @@
*/
class NetworkWatchlistShellCommand extends ShellCommand {
- final NetworkWatchlistManager mNetworkWatchlistManager;
+ final Context mContext;
+ final NetworkWatchlistService mService;
- NetworkWatchlistShellCommand(Context context) {
- mNetworkWatchlistManager = new NetworkWatchlistManager(context);
+ NetworkWatchlistShellCommand(NetworkWatchlistService service, Context context) {
+ mContext = context;
+ mService = service;
}
@Override
@@ -51,11 +55,13 @@
switch(cmd) {
case "set-test-config":
return runSetTestConfig();
+ case "force-generate-report":
+ return runForceGenerateReport();
default:
return handleDefaultCommands(cmd);
}
- } catch (RemoteException e) {
- pw.println("Remote exception: " + e);
+ } catch (Exception e) {
+ pw.println("Exception: " + e);
}
return -1;
}
@@ -73,22 +79,44 @@
WatchlistConfig.getInstance().setTestMode(fileStream);
}
pw.println("Success!");
- } catch (RuntimeException | IOException ex) {
+ } catch (Exception ex) {
pw.println("Error: " + ex.toString());
return -1;
}
return 0;
}
+ private int runForceGenerateReport() throws RemoteException {
+ final PrintWriter pw = getOutPrintWriter();
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ // Reset last report time
+ if (!WatchlistConfig.getInstance().isConfigSecure()) {
+ pw.println("Error: Cannot force generate report under production config");
+ return -1;
+ }
+ Settings.Global.putLong(mContext.getContentResolver(),
+ Settings.Global.NETWORK_WATCHLIST_LAST_REPORT_TIME, 0L);
+ mService.forceReportWatchlistForTest(System.currentTimeMillis());
+ pw.println("Success!");
+ } catch (Exception ex) {
+ pw.println("Error: " + ex);
+ return -1;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ return 0;
+ }
+
@Override
public void onHelp() {
final PrintWriter pw = getOutPrintWriter();
pw.println("Network watchlist manager commands:");
pw.println(" help");
pw.println(" Print this help text.");
- pw.println("");
pw.println(" set-test-config your_watchlist_config.xml");
- pw.println();
- Intent.printIntentArgsHelp(pw , "");
+ pw.println(" Set network watchlist test config file.");
+ pw.println(" force-generate-report");
+ pw.println(" Force generate watchlist test report.");
}
}
diff --git a/services/core/java/com/android/server/net/watchlist/PrivacyUtils.java b/services/core/java/com/android/server/net/watchlist/PrivacyUtils.java
index c1231fa..408a9ed 100644
--- a/services/core/java/com/android/server/net/watchlist/PrivacyUtils.java
+++ b/services/core/java/com/android/server/net/watchlist/PrivacyUtils.java
@@ -19,6 +19,7 @@
import android.privacy.DifferentialPrivacyEncoder;
import android.privacy.internal.longitudinalreporting.LongitudinalReportingConfig;
import android.privacy.internal.longitudinalreporting.LongitudinalReportingEncoder;
+import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -32,6 +33,7 @@
class PrivacyUtils {
private static final String TAG = "PrivacyUtils";
+ private static final boolean DEBUG = NetworkWatchlistService.DEBUG;
/**
* Parameters used for encoding watchlist reports.
@@ -84,6 +86,7 @@
@VisibleForTesting
static Map<String, Boolean> createDpEncodedReportMap(boolean isSecure, byte[] userSecret,
List<String> appDigestList, WatchlistReportDbHelper.AggregatedResult aggregatedResult) {
+ if (DEBUG) Slog.i(TAG, "createDpEncodedReportMap start");
final int appDigestListSize = appDigestList.size();
final HashMap<String, Boolean> resultMap = new HashMap<>(appDigestListSize);
for (int i = 0; i < appDigestListSize; i++) {
@@ -93,6 +96,7 @@
? createSecureDPEncoder(userSecret, appDigest)
: createInsecureDPEncoderForTest(appDigest);
final boolean visitedWatchlist = aggregatedResult.appDigestList.contains(appDigest);
+ if (DEBUG) Slog.i(TAG, appDigest + ": " + visitedWatchlist);
// Get the least significant bit of first byte, and set result to True if it is 1
boolean encodedVisitedWatchlist = ((int) encoder.encodeBoolean(visitedWatchlist)[0]
& 0x1) == 0x1;
diff --git a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
index 2a8f4d5..a482e05 100644
--- a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
+++ b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
@@ -49,6 +49,7 @@
* Apply DP on watchlist results, and generate a serialized watchlist report ready to store
* in DropBox.
*/
+ @Nullable
static byte[] encodeWatchlistReport(WatchlistConfig config, byte[] userSecret,
List<String> appDigestList, WatchlistReportDbHelper.AggregatedResult aggregatedResult) {
Map<String, Boolean> resultMap = PrivacyUtils.createDpEncodedReportMap(
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
index 2714d5e..8352ca6 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
@@ -16,6 +16,7 @@
package com.android.server.net.watchlist;
+import android.annotation.Nullable;
import android.os.FileUtils;
import android.util.AtomicFile;
import android.util.Log;
@@ -55,9 +56,6 @@
private static final String NETWORK_WATCHLIST_DB_FOR_TEST_PATH =
"/data/misc/network_watchlist/network_watchlist_for_test.xml";
- // Hash for null / unknown config, a 32 byte array filled with content 0x00
- private static final byte[] UNKNOWN_CONFIG_HASH = new byte[32];
-
private static class XmlTags {
private static final String WATCHLIST_CONFIG = "watchlist-config";
private static final String SHA256_DOMAIN = "sha256-domain";
@@ -107,6 +105,10 @@
* Reload watchlist by reading config file.
*/
public void reloadConfig() {
+ if (!mXmlFile.exists()) {
+ // No config file
+ return;
+ }
try (FileInputStream stream = new FileInputStream(mXmlFile)){
final List<byte[]> crc32DomainList = new ArrayList<>();
final List<byte[]> sha256DomainList = new ArrayList<>();
@@ -224,16 +226,21 @@
return mIsSecureConfig;
}
+ @Nullable
+ /**
+ * Get watchlist config SHA-256 digest.
+ * Return null if watchlist config does not exist.
+ */
public byte[] getWatchlistConfigHash() {
if (!mXmlFile.exists()) {
- return UNKNOWN_CONFIG_HASH;
+ return null;
}
try {
return DigestUtils.getSha256Hash(mXmlFile);
} catch (IOException | NoSuchAlgorithmException e) {
Log.e(TAG, "Unable to get watchlist config hash", e);
}
- return UNKNOWN_CONFIG_HASH;
+ return null;
}
/**
@@ -267,8 +274,10 @@
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println("Watchlist config hash: " + HexDump.toHexString(getWatchlistConfigHash()));
+ final byte[] hash = getWatchlistConfigHash();
+ pw.println("Watchlist config hash: " + (hash != null ? HexDump.toHexString(hash) : null));
pw.println("Domain CRC32 digest list:");
+ // mDomainDigests won't go from non-null to null so it's safe
if (mDomainDigests != null) {
mDomainDigests.crc32Digests.dump(fd, pw, args);
}
@@ -277,6 +286,7 @@
mDomainDigests.sha256Digests.dump(fd, pw, args);
}
pw.println("Ip CRC32 digest list:");
+ // mIpDigests won't go from non-null to null so it's safe
if (mIpDigests != null) {
mIpDigests.crc32Digests.dump(fd, pw, args);
}
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
index e8b39c0..864ce5d 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
@@ -43,6 +43,7 @@
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
+import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -61,6 +62,8 @@
static final int LOG_WATCHLIST_EVENT_MSG = 1;
@VisibleForTesting
static final int REPORT_RECORDS_IF_NECESSARY_MSG = 2;
+ @VisibleForTesting
+ static final int FORCE_REPORT_RECORDS_NOW_FOR_TEST_MSG = 3;
private static final long ONE_DAY_MS = TimeUnit.DAYS.toMillis(1);
private static final String DROPBOX_TAG = "network_watchlist_report";
@@ -110,7 +113,15 @@
break;
}
case REPORT_RECORDS_IF_NECESSARY_MSG:
- tryAggregateRecords();
+ tryAggregateRecords(getLastMidnightTime());
+ break;
+ case FORCE_REPORT_RECORDS_NOW_FOR_TEST_MSG:
+ if (msg.obj instanceof Long) {
+ long lastRecordTime = (Long) msg.obj;
+ tryAggregateRecords(lastRecordTime);
+ } else {
+ Slog.e(TAG, "Msg.obj needs to be a Long object.");
+ }
break;
default: {
Slog.d(TAG, "WatchlistLoggingHandler received an unknown of message.");
@@ -146,6 +157,12 @@
sendMessage(msg);
}
+ public void forceReportWatchlistForTest(long lastReportTime) {
+ final Message msg = obtainMessage(FORCE_REPORT_RECORDS_NOW_FOR_TEST_MSG);
+ msg.obj = lastReportTime;
+ sendMessage(msg);
+ }
+
/**
* Insert network traffic event to watchlist async queue processor.
*/
@@ -177,8 +194,14 @@
}
private boolean insertRecord(int uid, String cncHost, long timestamp) {
+ if (DEBUG) {
+ Slog.i(TAG, "trying to insert record with host: " + cncHost + ", uid: " + uid);
+ }
if (!mConfig.isConfigSecure() && !isPackageTestOnly(uid)) {
// Skip package if config is not secure and package is not TestOnly app.
+ if (DEBUG) {
+ Slog.i(TAG, "uid: " + uid + " is not test only package");
+ }
return true;
}
final byte[] digest = getDigestFromUid(uid);
@@ -187,50 +210,56 @@
return false;
}
final boolean result = mDbHelper.insertNewRecord(digest, cncHost, timestamp);
- tryAggregateRecords();
return result;
}
- private boolean shouldReportNetworkWatchlist() {
+ private boolean shouldReportNetworkWatchlist(long lastRecordTime) {
final long lastReportTime = Settings.Global.getLong(mResolver,
Settings.Global.NETWORK_WATCHLIST_LAST_REPORT_TIME, 0L);
- final long currentTimestamp = System.currentTimeMillis();
- if (currentTimestamp < lastReportTime) {
+ if (lastRecordTime < lastReportTime) {
Slog.i(TAG, "Last report time is larger than current time, reset report");
- mDbHelper.cleanup();
+ mDbHelper.cleanup(lastReportTime);
return false;
}
- return currentTimestamp >= lastReportTime + ONE_DAY_MS;
+ return lastRecordTime >= lastReportTime + ONE_DAY_MS;
}
- private void tryAggregateRecords() {
- // Check if it's necessary to generate watchlist report now.
- if (!shouldReportNetworkWatchlist()) {
- Slog.i(TAG, "No need to aggregate record yet.");
- return;
- }
- Slog.i(TAG, "Start aggregating watchlist records.");
- if (mDropBoxManager != null && mDropBoxManager.isTagEnabled(DROPBOX_TAG)) {
- Settings.Global.putLong(mResolver,
- Settings.Global.NETWORK_WATCHLIST_LAST_REPORT_TIME,
- System.currentTimeMillis());
- final WatchlistReportDbHelper.AggregatedResult aggregatedResult =
- mDbHelper.getAggregatedRecords();
- if (aggregatedResult == null) {
- Slog.i(TAG, "Cannot get result from database");
+ private void tryAggregateRecords(long lastRecordTime) {
+ long startTime = System.currentTimeMillis();
+ try {
+ // Check if it's necessary to generate watchlist report now.
+ if (!shouldReportNetworkWatchlist(lastRecordTime)) {
+ Slog.i(TAG, "No need to aggregate record yet.");
return;
}
- // Get all digests for watchlist report, it should include all installed
- // application digests and previously recorded app digests.
- final List<String> digestsForReport = getAllDigestsForReport(aggregatedResult);
- final byte[] secretKey = mSettings.getPrivacySecretKey();
- final byte[] encodedResult = ReportEncoder.encodeWatchlistReport(mConfig,
- secretKey, digestsForReport, aggregatedResult);
- if (encodedResult != null) {
- addEncodedReportToDropBox(encodedResult);
+ Slog.i(TAG, "Start aggregating watchlist records.");
+ if (mDropBoxManager != null && mDropBoxManager.isTagEnabled(DROPBOX_TAG)) {
+ Settings.Global.putLong(mResolver,
+ Settings.Global.NETWORK_WATCHLIST_LAST_REPORT_TIME,
+ lastRecordTime);
+ final WatchlistReportDbHelper.AggregatedResult aggregatedResult =
+ mDbHelper.getAggregatedRecords(lastRecordTime);
+ if (aggregatedResult == null) {
+ Slog.i(TAG, "Cannot get result from database");
+ return;
+ }
+ // Get all digests for watchlist report, it should include all installed
+ // application digests and previously recorded app digests.
+ final List<String> digestsForReport = getAllDigestsForReport(aggregatedResult);
+ final byte[] secretKey = mSettings.getPrivacySecretKey();
+ final byte[] encodedResult = ReportEncoder.encodeWatchlistReport(mConfig,
+ secretKey, digestsForReport, aggregatedResult);
+ if (encodedResult != null) {
+ addEncodedReportToDropBox(encodedResult);
+ }
+ } else {
+ Slog.w(TAG, "Network Watchlist dropbox tag is not enabled");
}
+ mDbHelper.cleanup(lastRecordTime);
+ } finally {
+ long endTime = System.currentTimeMillis();
+ Slog.i(TAG, "Milliseconds spent on tryAggregateRecords(): " + (endTime - startTime));
}
- mDbHelper.cleanup();
}
/**
@@ -317,6 +346,7 @@
* @param ipAddresses Ip address that you want to search in watchlist.
* @return Ip address that exists in watchlist, null if it does not match anything.
*/
+ @Nullable
private String searchIpInWatchlist(String[] ipAddresses) {
for (String ipAddress : ipAddresses) {
if (isIpInWatchlist(ipAddress)) {
@@ -348,6 +378,7 @@
* @param host Host that we want to search.
* @return Domain that exists in watchlist, null if it does not match anything.
*/
+ @Nullable
private String searchAllSubDomainsInWatchlist(String host) {
if (host == null) {
return null;
@@ -363,6 +394,7 @@
/** Get all sub-domains in a host */
@VisibleForTesting
+ @Nullable
static String[] getAllSubDomains(String host) {
if (host == null) {
return null;
@@ -379,4 +411,19 @@
}
return subDomainList.toArray(new String[0]);
}
+
+ static long getLastMidnightTime() {
+ return getMidnightTimestamp(0);
+ }
+
+ static long getMidnightTimestamp(int daysBefore) {
+ java.util.Calendar date = new GregorianCalendar();
+ // reset hour, minutes, seconds and millis
+ date.set(java.util.Calendar.HOUR_OF_DAY, 0);
+ date.set(java.util.Calendar.MINUTE, 0);
+ date.set(java.util.Calendar.SECOND, 0);
+ date.set(java.util.Calendar.MILLISECOND, 0);
+ date.add(java.util.Calendar.DAY_OF_MONTH, -daysBefore);
+ return date.getTimeInMillis();
+ }
}
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java b/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
index 4b577bb..c69934a 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
@@ -141,11 +141,11 @@
}
/**
- * Aggregate all records before most recent local midnight in database, and return a
+ * Aggregate all records in database before input timestamp, and return a
* rappor encoded result.
*/
- public AggregatedResult getAggregatedRecords() {
- final long lastMidnightTime = getLastMidnightTime();
+ @Nullable
+ public AggregatedResult getAggregatedRecords(long untilTimestamp) {
final String selectStatement = WhiteListReportContract.TIMESTAMP + " < ?";
final SQLiteDatabase db = getReadableDatabase();
@@ -153,7 +153,7 @@
try {
c = db.query(true /* distinct */,
WhiteListReportContract.TABLE, DIGEST_DOMAIN_PROJECTION, selectStatement,
- new String[]{"" + lastMidnightTime}, null, null,
+ new String[]{Long.toString(untilTimestamp)}, null, null,
null, null);
if (c == null) {
return null;
@@ -181,29 +181,13 @@
}
/**
- * Remove all the records before most recent local midnight.
+ * Remove all the records before input timestamp.
*
* @return True if success.
*/
- public boolean cleanup() {
+ public boolean cleanup(long untilTimestamp) {
final SQLiteDatabase db = getWritableDatabase();
- final long midnightTime = getLastMidnightTime();
- final String clause = WhiteListReportContract.TIMESTAMP + "< " + midnightTime;
+ final String clause = WhiteListReportContract.TIMESTAMP + "< " + untilTimestamp;
return db.delete(WhiteListReportContract.TABLE, clause, null) != 0;
}
-
- static long getLastMidnightTime() {
- return getMidnightTimestamp(0);
- }
-
- static long getMidnightTimestamp(int daysBefore) {
- java.util.Calendar date = new GregorianCalendar();
- // reset hour, minutes, seconds and millis
- date.set(java.util.Calendar.HOUR_OF_DAY, 0);
- date.set(java.util.Calendar.MINUTE, 0);
- date.set(java.util.Calendar.SECOND, 0);
- date.set(java.util.Calendar.MILLISECOND, 0);
- date.add(java.util.Calendar.DAY_OF_MONTH, -daysBefore);
- return date.getTimeInMillis();
- }
}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
index f5ba889..c2f3ba0 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
@@ -86,7 +86,11 @@
}
}
- public void reloadSettings() {
+ private void reloadSettings() {
+ if (!mXmlFile.exists()) {
+ // No settings config
+ return;
+ }
try (FileInputStream stream = mXmlFile.openRead()){
XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, StandardCharsets.UTF_8.name());
@@ -97,7 +101,7 @@
mPrivacySecretKey = parseSecretKey(parser);
}
}
- Log.i(TAG, "Reload watchlist settings done");
+ Slog.i(TAG, "Reload watchlist settings done");
} catch (IllegalStateException | NullPointerException | NumberFormatException |
XmlPullParserException | IOException | IndexOutOfBoundsException e) {
Slog.e(TAG, "Failed parsing xml", e);
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index b7842d5..d5a32aa 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -982,7 +982,11 @@
Slog.w(TAG, getCaption() + " binding died: " + name);
synchronized (mMutex) {
mServicesBinding.remove(servicesBindingTag);
- mContext.unbindService(this);
+ try {
+ mContext.unbindService(this);
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "failed to unbind " + name, e);
+ }
if (!mServicesRebinding.contains(servicesBindingTag)) {
mServicesRebinding.add(servicesBindingTag);
mHandler.postDelayed(new Runnable() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 59cd561..f31ca0a 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -182,6 +182,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BackgroundThread;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.util.ArrayUtils;
@@ -898,6 +899,8 @@
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
+ // update system notification channels
+ SystemNotificationChannels.createAll(context);
mZenModeHelper.updateDefaultZenRules();
mRankingHelper.onLocaleChanged(context, ActivityManager.getCurrentUser());
}
@@ -2149,7 +2152,8 @@
final NotificationChannel channel = channels.get(i);
Preconditions.checkNotNull(channel, "channel in list is null");
mRankingHelper.createNotificationChannel(pkg, uid, channel,
- true /* fromTargetApp */);
+ true /* fromTargetApp */, mConditionProviders.isPackageOrComponentAllowed(
+ pkg, UserHandle.getUserId(uid)));
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(uid),
mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), false),
@@ -4691,11 +4695,12 @@
private boolean playSound(final NotificationRecord record, Uri soundUri) {
boolean looping = (record.getNotification().flags & Notification.FLAG_INSISTENT) != 0;
- // do not play notifications if there is a user of exclusive audio focus
- // or the device is in vibrate mode
- if (!mAudioManager.isAudioFocusExclusive() && (mAudioManager.getRingerModeInternal()
- != AudioManager.RINGER_MODE_VIBRATE || mAudioManager.getStreamVolume(
- AudioAttributes.toLegacyStreamType(record.getAudioAttributes())) != 0)) {
+ // play notifications if there is no user of exclusive audio focus
+ // and the stream volume is not 0 (non-zero volume implies not silenced by SILENT or
+ // VIBRATE ringer mode)
+ if (!mAudioManager.isAudioFocusExclusive()
+ && (mAudioManager.getStreamVolume(
+ AudioAttributes.toLegacyStreamType(record.getAudioAttributes())) != 0)) {
final long identity = Binder.clearCallingIdentity();
try {
final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
@@ -5969,6 +5974,7 @@
}
private boolean isPackageSuspendedForUser(String pkg, int uid) {
+ final long identity = Binder.clearCallingIdentity();
int userId = UserHandle.getUserId(uid);
try {
return mPackageManager.isPackageSuspendedForUser(pkg, userId);
@@ -5977,6 +5983,8 @@
} catch (IllegalArgumentException ex) {
// Package not found.
return false;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java
index b1b0bf2..af64683 100644
--- a/services/core/java/com/android/server/notification/RankingConfig.java
+++ b/services/core/java/com/android/server/notification/RankingConfig.java
@@ -38,7 +38,7 @@
ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
int uid, boolean includeDeleted, boolean includeNonGrouped);
void createNotificationChannel(String pkg, int uid, NotificationChannel channel,
- boolean fromTargetApp);
+ boolean fromTargetApp, boolean hasDndAccess);
void updateNotificationChannel(String pkg, int uid, NotificationChannel channel, boolean fromUser);
NotificationChannel getNotificationChannel(String pkg, int uid, String channelId, boolean includeDeleted);
void deleteNotificationChannel(String pkg, int uid, String channelId);
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index f163113..98d5c9a 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -569,7 +569,7 @@
@Override
public void createNotificationChannel(String pkg, int uid, NotificationChannel channel,
- boolean fromTargetApp) {
+ boolean fromTargetApp, boolean hasDndAccess) {
Preconditions.checkNotNull(pkg);
Preconditions.checkNotNull(channel);
Preconditions.checkNotNull(channel.getId());
@@ -610,8 +610,9 @@
existing.setImportance(channel.getImportance());
}
- // system apps can bypass dnd if the user hasn't changed any fields on the channel yet
- if (existing.getUserLockedFields() == 0 & isSystemApp) {
+ // system apps and dnd access apps can bypass dnd if the user hasn't changed any
+ // fields on the channel yet
+ if (existing.getUserLockedFields() == 0 && (isSystemApp || hasDndAccess)) {
existing.setBypassDnd(channel.canBypassDnd());
}
@@ -624,7 +625,7 @@
}
// Reset fields that apps aren't allowed to set.
- if (fromTargetApp && !isSystemApp) {
+ if (fromTargetApp && !(isSystemApp || hasDndAccess)) {
channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
}
if (fromTargetApp) {
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index c0c66b2..6cf8f86 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -468,12 +468,14 @@
private final LinkedList<String> mPendingLookups;
private final Context mContext;
+ // Amount of time to wait for a result from the contacts db before rechecking affinity.
+ private static final long LOOKUP_TIME = 1000;
private float mContactAffinity = NONE;
private NotificationRecord mRecord;
private PeopleRankingReconsideration(Context context, String key,
LinkedList<String> pendingLookups) {
- super(key);
+ super(key, LOOKUP_TIME);
mContext = context;
mPendingLookups = pendingLookups;
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 5c82343..586abc1 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -933,11 +933,7 @@
}
break;
case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
- if (ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(mConfig)
- && ringerModeInternal != AudioManager.RINGER_MODE_SILENT) {
- setPreviousRingerModeSetting(ringerModeInternal);
- newRingerModeInternal = AudioManager.RINGER_MODE_SILENT;
- }
+ // do not apply zen to ringer, streams zen muted in AudioService
break;
case Global.ZEN_MODE_OFF:
if (ringerModeInternal == AudioManager.RINGER_MODE_SILENT) {
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index e315bc5..0774672 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -472,10 +472,17 @@
if (params.getJobId() == JOB_POST_BOOT_UPDATE) {
mAbortPostBootUpdate.set(true);
+
+ // Do not reschedule.
+ // TODO: We should reschedule if we didn't process all apps, yet.
+ return false;
} else {
mAbortIdleOptimization.set(true);
+
+ // Reschedule the run.
+ // TODO: Should this be dependent on the stop reason?
+ return true;
}
- return false;
}
private void notifyPinService(ArraySet<String> updatedPackages) {
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 24abf86..45f1a2b 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -67,6 +67,8 @@
public static final int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10;
/** Indicates that dexopt should convert to CompactDex. */
public static final int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11;
+ /** Indicates that dexopt should generate an app image */
+ public static final int DEXOPT_GENERATE_APP_IMAGE = 1 << 12;
// NOTE: keep in sync with installd
public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
@@ -484,11 +486,11 @@
}
}
- public void installApkVerity(String filePath, FileDescriptor verityInput)
+ public void installApkVerity(String filePath, FileDescriptor verityInput, int contentSize)
throws InstallerException {
if (!checkBeforeRemote()) return;
try {
- mInstalld.installApkVerity(filePath, verityInput);
+ mInstalld.installApkVerity(filePath, verityInput, contentSize);
} catch (Exception e) {
throw InstallerException.from(e);
}
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index fb38398..8e78703f 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -364,6 +364,17 @@
}
@Override
+ public Bundle getSuspendedPackageLauncherExtras(String packageName,
+ UserHandle user) {
+ if (!canAccessProfile(user.getIdentifier(), "Cannot get launcher extras")) {
+ return null;
+ }
+ final PackageManagerInternal pmi =
+ LocalServices.getService(PackageManagerInternal.class);
+ return pmi.getSuspendedPackageLauncherExtras(packageName, user.getIdentifier());
+ }
+
+ @Override
public ApplicationInfo getApplicationInfo(
String callingPackage, String packageName, int flags, UserHandle user)
throws RemoteException {
@@ -732,7 +743,7 @@
}
@Override
- public void onPackagesSuspended(String[] packages) {
+ public void onPackagesSuspended(String[] packages, Bundle launcherExtras) {
UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast();
try {
@@ -741,7 +752,7 @@
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
if (!isEnabledProfileOf(cookie.user, user, "onPackagesSuspended")) continue;
try {
- listener.onPackagesSuspended(user, packages);
+ listener.onPackagesSuspended(user, packages, launcherExtras);
} catch (RemoteException re) {
Slog.d(TAG, "Callback failed ", re);
}
@@ -750,7 +761,7 @@
mListeners.finishBroadcast();
}
- super.onPackagesSuspended(packages);
+ super.onPackagesSuspended(packages, launcherExtras);
}
@Override
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index 5a7893a..320affb 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -267,7 +267,7 @@
final StringBuilder builder = new StringBuilder();
// The current version.
- builder.append("8 ");
+ builder.append("9 ");
builder.append("dexopt");
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 9e7ad47..ebab1a7 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -47,6 +47,8 @@
import dalvik.system.DexFile;
+import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_NONE;
+
import static com.android.server.pm.Installer.DEXOPT_BOOTCOMPLETE;
import static com.android.server.pm.Installer.DEXOPT_DEBUGGABLE;
import static com.android.server.pm.Installer.DEXOPT_PROFILE_GUIDED;
@@ -58,6 +60,7 @@
import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB;
import static com.android.server.pm.Installer.DEXOPT_ENABLE_HIDDEN_API_CHECKS;
import static com.android.server.pm.Installer.DEXOPT_GENERATE_COMPACT_DEX;
+import static com.android.server.pm.Installer.DEXOPT_GENERATE_APP_IMAGE;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
@@ -447,13 +450,13 @@
pw.increaseIndent();
for (String isa : dexCodeInstructionSets) {
- String status = null;
try {
- status = DexFile.getDexFileStatus(path, isa);
+ DexFile.OptimizationInfo info = DexFile.getDexFileOptimizationInfo(path, isa);
+ pw.println(isa + ": [status=" + info.getStatus()
+ +"] [reason=" + info.getReason() + "]");
} catch (IOException ioe) {
- status = "[Exception]: " + ioe.getMessage();
+ pw.println(isa + ": [Exception]: " + ioe.getMessage());
}
- pw.println(isa + ": " + status);
}
if (useInfo.isUsedByOtherApps(path)) {
@@ -519,6 +522,10 @@
return getDexFlags(pkg.applicationInfo, compilerFilter, options);
}
+ private boolean isAppImageEnabled() {
+ return SystemProperties.get("dalvik.vm.appimageformat", "").length() > 0;
+ }
+
private int getDexFlags(ApplicationInfo info, String compilerFilter, DexoptOptions options) {
int flags = info.flags;
boolean debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
@@ -532,7 +539,10 @@
int profileFlag = isProfileGuidedFilter ? DEXOPT_PROFILE_GUIDED : 0;
// Some apps are executed with restrictions on hidden API usage. If this app is one
// of them, pass a flag to dexopt to enable the same restrictions during compilation.
- int hiddenApiFlag = info.isAllowedToUseHiddenApi() ? 0 : DEXOPT_ENABLE_HIDDEN_API_CHECKS;
+ // TODO we should pass the actual flag value to dexopt, rather than assuming blacklist
+ int hiddenApiFlag = info.getHiddenApiEnforcementPolicy() == HIDDEN_API_ENFORCEMENT_NONE
+ ? 0
+ : DEXOPT_ENABLE_HIDDEN_API_CHECKS;
// Avoid generating CompactDex for modes that are latency critical.
final int compilationReason = options.getCompilationReason();
boolean generateCompactDex = true;
@@ -542,6 +552,14 @@
case PackageManagerService.REASON_INSTALL:
generateCompactDex = false;
}
+ // Use app images only if it is enabled and we are compiling
+ // profile-guided (so the app image doesn't conservatively contain all classes).
+ // If the app didn't request for the splits to be loaded in isolation or if it does not
+ // declare inter-split dependencies, then all the splits will be loaded in the base
+ // apk class loader (in the order of their definition, otherwise disable app images
+ // because they are unsupported for multiple class loaders. b/7269679
+ boolean generateAppImage = isProfileGuidedFilter && (info.splitDependencies == null ||
+ !info.requestsIsolatedSplitLoading()) && isAppImageEnabled();
int dexFlags =
(isPublic ? DEXOPT_PUBLIC : 0)
| (debuggable ? DEXOPT_DEBUGGABLE : 0)
@@ -549,6 +567,7 @@
| (options.isBootComplete() ? DEXOPT_BOOTCOMPLETE : 0)
| (options.isDexoptIdleBackgroundJob() ? DEXOPT_IDLE_BACKGROUND_JOB : 0)
| (generateCompactDex ? DEXOPT_GENERATE_COMPACT_DEX : 0)
+ | (generateAppImage ? DEXOPT_GENERATE_APP_IMAGE : 0)
| hiddenApiFlag;
return adjustDexoptFlags(dexFlags);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 950d8df..2e530af 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -92,6 +92,7 @@
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
+import static com.android.internal.util.ArrayUtils.appendElement;
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
@@ -185,6 +186,7 @@
import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
+import android.content.pm.SELinuxUtil;
import android.content.pm.ServiceInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.Signature;
@@ -778,8 +780,14 @@
return PackageManagerService.this.hasSystemFeature(feature, 0);
}
- final List<PackageParser.Package> getStaticOverlayPackagesLocked(
+ final List<PackageParser.Package> getStaticOverlayPackages(
Collection<PackageParser.Package> allPackages, String targetPackageName) {
+ if ("android".equals(targetPackageName)) {
+ // Static RROs targeting to "android", ie framework-res.apk, are already applied by
+ // native AssetManager.
+ return null;
+ }
+
List<PackageParser.Package> overlayPackages = null;
for (PackageParser.Package p : allPackages) {
if (targetPackageName.equals(p.mOverlayTarget) && p.mOverlayIsStatic) {
@@ -800,16 +808,8 @@
return overlayPackages;
}
- @GuardedBy("mInstallLock")
- final String[] getStaticOverlayPathsLocked(Collection<PackageParser.Package> allPackages,
- String targetPackageName, String targetPath) {
- if ("android".equals(targetPackageName)) {
- // Static RROs targeting to "android", ie framework-res.apk, are already applied by
- // native AssetManager.
- return null;
- }
- List<PackageParser.Package> overlayPackages =
- getStaticOverlayPackagesLocked(allPackages, targetPackageName);
+ final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages,
+ String targetPath) {
if (overlayPackages == null || overlayPackages.isEmpty()) {
return null;
}
@@ -845,9 +845,15 @@
}
String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
- synchronized (mPackages) {
- return getStaticOverlayPathsLocked(
- mPackages.values(), targetPackageName, targetPath);
+ List<PackageParser.Package> overlayPackages;
+ synchronized (mInstallLock) {
+ synchronized (mPackages) {
+ overlayPackages = getStaticOverlayPackages(
+ mPackages.values(), targetPackageName);
+ }
+ // It is safe to keep overlayPackages without holding mPackages because static overlay
+ // packages can't be uninstalled or disabled.
+ return getStaticOverlayPaths(overlayPackages, targetPath);
}
}
@@ -881,9 +887,13 @@
synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
// We can trust mOverlayPackages without holding mPackages because package uninstall
// can't happen while running parallel parsing.
- // Moreover holding mPackages on each parsing thread causes dead-lock.
+ // And we can call mInstaller inside getStaticOverlayPaths without holding mInstallLock
+ // because mInstallLock is held before running parallel parsing.
+ // Moreover holding mPackages or mInstallLock on each parsing thread causes dead-lock.
return mOverlayPackages == null ? null :
- getStaticOverlayPathsLocked(mOverlayPackages, targetPackageName, targetPath);
+ getStaticOverlayPaths(
+ getStaticOverlayPackages(mOverlayPackages, targetPackageName),
+ targetPath);
}
}
@@ -8756,7 +8766,10 @@
&& !pkgSetting.isSystem()) {
if (!pkg.mSigningDetails.checkCapability(pkgSetting.signatures.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ && !pkgSetting.signatures.mSigningDetails.checkCapability(
+ pkg.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
logCriticalInfo(Log.WARN,
"System package signature mismatch;"
+ " name: " + pkgSetting.name);
@@ -10217,7 +10230,7 @@
}
if (changedAbiCodePath != null && changedAbiCodePath.size() > 0) {
- for (int i = changedAbiCodePath.size() - 1; i <= 0; --i) {
+ for (int i = changedAbiCodePath.size() - 1; i >= 0; --i) {
final String codePathString = changedAbiCodePath.get(i);
try {
mInstaller.rmdex(codePathString,
@@ -10355,7 +10368,7 @@
if (Build.IS_DEBUGGABLE &&
pkg.isPrivileged() &&
- !SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, true)) {
+ SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, false)) {
PackageManagerServiceUtils.logPackageHasUncompressedCode(pkg);
}
@@ -10438,6 +10451,14 @@
reportSettingsProblem(Log.WARN, msg);
}
+ final int userId = (user == null ? UserHandle.USER_SYSTEM : user.getIdentifier());
+ // for existing packages, change the install state; but, only if it's explicitly specified
+ if (!createNewPackage) {
+ final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
+ final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
+ setInstantAppForUser(pkgSetting, userId, instantApp, fullApp);
+ }
+
if (disabledPkgSetting != null) {
pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
}
@@ -10460,6 +10481,8 @@
pkg.applicationInfo.seInfo = SELinuxMMAC.getSeInfo(pkg, isPrivileged,
pkg.applicationInfo.targetSandboxVersion, targetSdkVersion);
+ pkg.applicationInfo.seInfoUser = SELinuxUtil.assignSeinfoUser(pkgSetting.readUserState(
+ userId == UserHandle.USER_ALL ? UserHandle.USER_SYSTEM : userId));
pkg.mExtras = pkgSetting;
pkg.applicationInfo.processName = fixProcessName(
@@ -13809,11 +13832,15 @@
info.sendPackageRemovedBroadcasts(true /*killApp*/);
}
- private void sendPackagesSuspendedForUser(String[] pkgList, int userId, boolean suspended) {
+ private void sendPackagesSuspendedForUser(String[] pkgList, int userId, boolean suspended,
+ PersistableBundle launcherExtras) {
if (pkgList.length > 0) {
Bundle extras = new Bundle(1);
extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
-
+ if (launcherExtras != null) {
+ extras.putBundle(Intent.EXTRA_LAUNCHER_EXTRAS,
+ new Bundle(launcherExtras.deepCopy()));
+ }
sendPackageBroadcast(
suspended ? Intent.ACTION_PACKAGES_SUSPENDED
: Intent.ACTION_PACKAGES_UNSUSPENDED,
@@ -13930,7 +13957,7 @@
return PackageManager.INSTALL_SUCCEEDED;
}
- void setInstantAppForUser(PackageSetting pkgSetting, int userId,
+ static void setInstantAppForUser(PackageSetting pkgSetting, int userId,
boolean instantApp, boolean fullApp) {
// no state specified; do nothing
if (!instantApp && !fullApp) {
@@ -13987,18 +14014,15 @@
return packageNames;
}
- // List of package names for whom the suspended state has changed.
- final List<String> changedPackages = new ArrayList<>(packageNames.length);
- // List of package names for whom the suspended state is not set as requested in this
- // method.
+ final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
final long callingId = Binder.clearCallingIdentity();
try {
synchronized (mPackages) {
for (int i = 0; i < packageNames.length; i++) {
final String packageName = packageNames[i];
- if (packageName == callingPackage) {
- Slog.w(TAG, "Calling package: " + callingPackage + "trying to "
+ if (callingPackage.equals(packageName)) {
+ Slog.w(TAG, "Calling package: " + callingPackage + " trying to "
+ (suspended ? "" : "un") + "suspend itself. Ignoring");
unactionedPackages.add(packageName);
continue;
@@ -14018,17 +14042,18 @@
}
pkgSetting.setSuspended(suspended, callingPackage, appExtras,
launcherExtras, userId);
- changedPackages.add(packageName);
+ changedPackagesList.add(packageName);
}
}
}
} finally {
Binder.restoreCallingIdentity(callingId);
}
- // TODO (b/75036698): Also send each package a broadcast when suspended state changed
- if (!changedPackages.isEmpty()) {
- sendPackagesSuspendedForUser(changedPackages.toArray(
- new String[changedPackages.size()]), userId, suspended);
+ if (!changedPackagesList.isEmpty()) {
+ final String[] changedPackages = changedPackagesList.toArray(
+ new String[changedPackagesList.size()]);
+ sendPackagesSuspendedForUser(changedPackages, userId, suspended, launcherExtras);
+ sendMyPackageSuspendedOrUnsuspended(changedPackages, suspended, appExtras, userId);
synchronized (mPackages) {
scheduleWritePackageRestrictionsLocked(userId);
}
@@ -14038,7 +14063,7 @@
}
@Override
- public PersistableBundle getPackageSuspendedAppExtras(String packageName, int userId) {
+ public PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
if (getPackageUid(packageName, 0, userId) != callingUid) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
@@ -14049,7 +14074,10 @@
throw new IllegalArgumentException("Unknown target package: " + packageName);
}
final PackageUserState packageUserState = ps.readUserState(userId);
- return packageUserState.suspended ? packageUserState.suspendedAppExtras : null;
+ if (packageUserState.suspended) {
+ return packageUserState.suspendedAppExtras;
+ }
+ return null;
}
}
@@ -14065,12 +14093,49 @@
}
final PackageUserState packageUserState = ps.readUserState(userId);
if (packageUserState.suspended) {
- // TODO (b/75036698): Also send this package a broadcast with the new app extras
packageUserState.suspendedAppExtras = appExtras;
+ sendMyPackageSuspendedOrUnsuspended(new String[] {packageName}, true, appExtras,
+ userId);
}
}
}
+ private void sendMyPackageSuspendedOrUnsuspended(String[] affectedPackages, boolean suspended,
+ PersistableBundle appExtras, int userId) {
+ final String action;
+ final Bundle intentExtras = new Bundle();
+ if (suspended) {
+ action = Intent.ACTION_MY_PACKAGE_SUSPENDED;
+ if (appExtras != null) {
+ final Bundle bundledAppExtras = new Bundle(appExtras.deepCopy());
+ intentExtras.putBundle(Intent.EXTRA_SUSPENDED_PACKAGE_EXTRAS, bundledAppExtras);
+ }
+ } else {
+ action = Intent.ACTION_MY_PACKAGE_UNSUSPENDED;
+ }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ final IActivityManager am = ActivityManager.getService();
+ if (am == null) {
+ Slog.wtf(TAG, "IActivityManager null. Cannot send MY_PACKAGE_ "
+ + (suspended ? "" : "UN") + "SUSPENDED broadcasts");
+ return;
+ }
+ final int[] targetUserIds = new int[] {userId};
+ for (String packageName : affectedPackages) {
+ doSendBroadcast(am, action, null, intentExtras,
+ Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, packageName, null,
+ targetUserIds, false);
+ }
+ } catch (RemoteException ex) {
+ // Shouldn't happen as AMS is in the same process.
+ }
+ }
+ });
+ }
+
@Override
public boolean isPackageSuspendedForUser(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
@@ -16155,7 +16220,10 @@
// default to original signature matching
if (!pkg.mSigningDetails.checkCapability(oldPackage.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ && !oldPackage.mSigningDetails.checkCapability(
+ pkg.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
"New package has a different signature: " + pkgName);
return;
@@ -16401,10 +16469,6 @@
childPs.oldCodePaths = ps.oldCodePaths;
}
}
- // set instant app status, but, only if it's explicitly specified
- final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
- final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
- setInstantAppForUser(ps, user.getIdentifier(), instantApp, fullApp);
prepareAppDataAfterInstallLIF(newPackage);
addedPkg = true;
mDexManager.notifyPackageUpdated(newPackage.packageName,
@@ -16756,12 +16820,6 @@
if (userId != UserHandle.USER_ALL) {
ps.setInstalled(true, userId);
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, userId, installerPackageName);
- } else {
- for (int currentUserId : sUserManager.getUserIds()) {
- ps.setInstalled(true, currentUserId);
- ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, currentUserId,
- installerPackageName);
- }
}
// When replacing an existing package, preserve the original install reason for all
@@ -17281,8 +17339,11 @@
if (Build.IS_DEBUGGABLE) Slog.i(TAG, "Enabling apk verity to " + apkPath);
FileDescriptor fd = result.getUnownedFileDescriptor();
try {
- mInstaller.installApkVerity(apkPath, fd);
- } catch (InstallerException e) {
+ final byte[] signedRootHash = VerityUtils.generateFsverityRootHash(apkPath);
+ mInstaller.installApkVerity(apkPath, fd, result.getContentSize());
+ mInstaller.assertFsverityRootHashMatches(apkPath, signedRootHash);
+ } catch (InstallerException | IOException | DigestException |
+ NoSuchAlgorithmException e) {
res.setError(INSTALL_FAILED_INTERNAL_ERROR,
"Failed to set up verity: " + e);
return;
@@ -18890,7 +18951,7 @@
return true;
}
- private static final class ClearStorageConnection implements ServiceConnection {
+ private final class ClearStorageConnection implements ServiceConnection {
IMediaContainerService mContainerService;
@Override
@@ -21611,37 +21672,35 @@
// the given package is involved with.
if (dumpState.onTitlePrinted()) pw.println();
- try (final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120)) {
- ipw.println();
- ipw.println("Frozen packages:");
- ipw.increaseIndent();
- if (mFrozenPackages.size() == 0) {
- ipw.println("(none)");
- } else {
- for (int i = 0; i < mFrozenPackages.size(); i++) {
- ipw.println(mFrozenPackages.valueAt(i));
- }
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
+ ipw.println();
+ ipw.println("Frozen packages:");
+ ipw.increaseIndent();
+ if (mFrozenPackages.size() == 0) {
+ ipw.println("(none)");
+ } else {
+ for (int i = 0; i < mFrozenPackages.size(); i++) {
+ ipw.println(mFrozenPackages.valueAt(i));
}
- ipw.decreaseIndent();
}
+ ipw.decreaseIndent();
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_VOLUMES) && packageName == null) {
if (dumpState.onTitlePrinted()) pw.println();
- try (final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120)) {
- ipw.println();
- ipw.println("Loaded volumes:");
- ipw.increaseIndent();
- if (mLoadedVolumes.size() == 0) {
- ipw.println("(none)");
- } else {
- for (int i = 0; i < mLoadedVolumes.size(); i++) {
- ipw.println(mLoadedVolumes.valueAt(i));
- }
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
+ ipw.println();
+ ipw.println("Loaded volumes:");
+ ipw.increaseIndent();
+ if (mLoadedVolumes.size() == 0) {
+ ipw.println("(none)");
+ } else {
+ for (int i = 0; i < mLoadedVolumes.size(); i++) {
+ ipw.println(mLoadedVolumes.valueAt(i));
}
- ipw.decreaseIndent();
}
+ ipw.decreaseIndent();
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS)
@@ -21770,63 +21829,61 @@
}
private void dumpDexoptStateLPr(PrintWriter pw, String packageName) {
- try (final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ")) {
- ipw.println();
- ipw.println("Dexopt state:");
- ipw.increaseIndent();
- Collection<PackageParser.Package> packages = null;
- if (packageName != null) {
- PackageParser.Package targetPackage = mPackages.get(packageName);
- if (targetPackage != null) {
- packages = Collections.singletonList(targetPackage);
- } else {
- ipw.println("Unable to find package: " + packageName);
- return;
- }
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ ipw.println();
+ ipw.println("Dexopt state:");
+ ipw.increaseIndent();
+ Collection<PackageParser.Package> packages = null;
+ if (packageName != null) {
+ PackageParser.Package targetPackage = mPackages.get(packageName);
+ if (targetPackage != null) {
+ packages = Collections.singletonList(targetPackage);
} else {
- packages = mPackages.values();
+ ipw.println("Unable to find package: " + packageName);
+ return;
}
+ } else {
+ packages = mPackages.values();
+ }
- for (PackageParser.Package pkg : packages) {
- ipw.println("[" + pkg.packageName + "]");
- ipw.increaseIndent();
- mPackageDexOptimizer.dumpDexoptState(ipw, pkg,
- mDexManager.getPackageUseInfoOrDefault(pkg.packageName));
- ipw.decreaseIndent();
- }
+ for (PackageParser.Package pkg : packages) {
+ ipw.println("[" + pkg.packageName + "]");
+ ipw.increaseIndent();
+ mPackageDexOptimizer.dumpDexoptState(ipw, pkg,
+ mDexManager.getPackageUseInfoOrDefault(pkg.packageName));
+ ipw.decreaseIndent();
}
}
private void dumpCompilerStatsLPr(PrintWriter pw, String packageName) {
- try (final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ")) {
- ipw.println();
- ipw.println("Compiler stats:");
- ipw.increaseIndent();
- Collection<PackageParser.Package> packages = null;
- if (packageName != null) {
- PackageParser.Package targetPackage = mPackages.get(packageName);
- if (targetPackage != null) {
- packages = Collections.singletonList(targetPackage);
- } else {
- ipw.println("Unable to find package: " + packageName);
- return;
- }
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ ipw.println();
+ ipw.println("Compiler stats:");
+ ipw.increaseIndent();
+ Collection<PackageParser.Package> packages = null;
+ if (packageName != null) {
+ PackageParser.Package targetPackage = mPackages.get(packageName);
+ if (targetPackage != null) {
+ packages = Collections.singletonList(targetPackage);
} else {
- packages = mPackages.values();
+ ipw.println("Unable to find package: " + packageName);
+ return;
}
+ } else {
+ packages = mPackages.values();
+ }
- for (PackageParser.Package pkg : packages) {
- ipw.println("[" + pkg.packageName + "]");
- ipw.increaseIndent();
+ for (PackageParser.Package pkg : packages) {
+ ipw.println("[" + pkg.packageName + "]");
+ ipw.increaseIndent();
- CompilerStats.PackageStats stats = getCompilerPackageStats(pkg.packageName);
- if (stats == null) {
- ipw.println("(No recorded stats)");
- } else {
- stats.dump(ipw);
- }
- ipw.decreaseIndent();
+ CompilerStats.PackageStats stats = getCompilerPackageStats(pkg.packageName);
+ if (stats == null) {
+ ipw.println("(No recorded stats)");
+ } else {
+ stats.dump(ipw);
}
+ ipw.decreaseIndent();
}
}
@@ -22378,17 +22435,25 @@
+ Integer.toHexString(flags));
}
+ final PackageSetting ps;
+ synchronized (mPackages) {
+ ps = mSettings.mPackages.get(pkg.packageName);
+ }
final String volumeUuid = pkg.volumeUuid;
final String packageName = pkg.packageName;
- final ApplicationInfo app = pkg.applicationInfo;
+ final ApplicationInfo app = (ps == null)
+ ? pkg.applicationInfo
+ : PackageParser.generateApplicationInfo(pkg, 0, ps.readUserState(userId), userId);
+
final int appId = UserHandle.getAppId(app.uid);
Preconditions.checkNotNull(app.seInfo);
+ final String seInfo = app.seInfo + (app.seInfoUser != null ? app.seInfoUser : "");
long ceDataInode = -1;
try {
ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
- appId, app.seInfo, app.targetSdkVersion);
+ appId, seInfo, app.targetSdkVersion);
} catch (InstallerException e) {
if (app.isSystemApp()) {
logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName
@@ -22396,7 +22461,7 @@
destroyAppDataLeafLIF(pkg, userId, flags);
try {
ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
- appId, app.seInfo, app.targetSdkVersion);
+ appId, seInfo, app.targetSdkVersion);
logCriticalInfo(Log.DEBUG, "Recovery succeeded!");
} catch (InstallerException e2) {
logCriticalInfo(Log.DEBUG, "Recovery failed!");
@@ -22419,7 +22484,6 @@
if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 && ceDataInode != -1) {
// TODO: mark this structure as dirty so we persist it!
synchronized (mPackages) {
- final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps != null) {
ps.setCeDataInode(ceDataInode, userId);
}
@@ -23704,6 +23768,18 @@
}
@Override
+ public Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) {
+ synchronized (mPackages) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ PersistableBundle launcherExtras = null;
+ if (ps != null) {
+ launcherExtras = ps.readUserState(userId).suspendedLauncherExtras;
+ }
+ return (launcherExtras != null) ? new Bundle(launcherExtras.deepCopy()) : null;
+ }
+ }
+
+ @Override
public int getPackageUid(String packageName, int flags, int userId) {
return PackageManagerService.this
.getPackageUid(packageName, flags, userId);
@@ -24053,6 +24129,33 @@
}
}
+ @Override
+ public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
+ enforceSystemOrPhoneCaller("grantDefaultPermissionsToActiveLuiApp");
+ synchronized (mPackages) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mDefaultPermissionPolicy.grantDefaultPermissionsToActiveLuiApp(
+ packageName, userId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+
+ @Override
+ public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
+ enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromLuiApps");
+ synchronized (mPackages) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mDefaultPermissionPolicy.revokeDefaultPermissionsFromLuiApps(packageNames, userId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+
private static void enforceSystemOrPhoneCaller(String tag) {
int callingUid = Binder.getCallingUid();
if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
index fce8285..5fc5bac 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
@@ -25,7 +25,7 @@
*/
public class PackageManagerServiceCompilerMapping {
// Names for compilation reasons.
- static final String REASON_STRINGS[] = {
+ public static final String REASON_STRINGS[] = {
"first-boot", "boot", "install", "bg-dexopt", "ab-ota", "inactive", "shared"
};
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 5060c4d..4b907f4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -331,18 +331,18 @@
ZipEntry entry = it.next();
if (entry.getName().endsWith(".dex")) {
if (entry.getMethod() != ZipEntry.STORED) {
- Slog.wtf(TAG, "APK " + fileName + " has compressed dex code " +
+ Slog.w(TAG, "APK " + fileName + " has compressed dex code " +
entry.getName());
} else if ((entry.getDataOffset() & 0x3) != 0) {
- Slog.wtf(TAG, "APK " + fileName + " has unaligned dex code " +
+ Slog.w(TAG, "APK " + fileName + " has unaligned dex code " +
entry.getName());
}
} else if (entry.getName().endsWith(".so")) {
if (entry.getMethod() != ZipEntry.STORED) {
- Slog.wtf(TAG, "APK " + fileName + " has compressed native code " +
+ Slog.w(TAG, "APK " + fileName + " has compressed native code " +
entry.getName());
} else if ((entry.getDataOffset() & (0x1000 - 1)) != 0) {
- Slog.wtf(TAG, "APK " + fileName + " has unaligned native code " +
+ Slog.w(TAG, "APK " + fileName + " has unaligned native code " +
entry.getName());
}
}
@@ -576,7 +576,10 @@
PackageParser.collectCertificates(disabledPkgSetting.pkg, true /* skipVerify */);
if (pkgSetting.signatures.mSigningDetails.checkCapability(
disabledPkgSetting.signatures.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ || disabledPkgSetting.signatures.mSigningDetails.checkCapability(
+ pkgSetting.signatures.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
return true;
} else {
logCriticalInfo(Log.ERROR, "Updated system app mismatches cert on /system: " +
@@ -616,7 +619,10 @@
// Already existing package. Make sure signatures match
boolean match = parsedSignatures.checkCapability(
pkgSetting.signatures.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA);
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ || pkgSetting.signatures.mSigningDetails.checkCapability(
+ parsedSignatures,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK);
if (!match && compareCompat) {
match = matchSignaturesCompat(packageName, pkgSetting.signatures,
parsedSignatures);
@@ -627,7 +633,12 @@
packageName,
pkgSetting.signatures.mSigningDetails,
parsedSignatures,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA);
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ || matchSignaturesRecover(
+ packageName,
+ parsedSignatures,
+ pkgSetting.signatures.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK);
}
if (!match && isApkVerificationForced(disabledPkgSetting)) {
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index c362274..9ca02ba 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -559,7 +559,7 @@
android.provider.Settings.Global.AIRPLANE_MODE_ON, 0);
// Post the intent.
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.putExtra("state", 0);
+ intent.putExtra("state", false);
context.sendBroadcastAsUser(intent, UserHandle.ALL);
}
}
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 41ed6f2..9c2ad463 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -27,19 +27,18 @@
import android.content.pm.dex.ArtManager.ProfileType;
import android.content.pm.dex.ArtManagerInternal;
import android.content.pm.dex.DexMetadataHelper;
+import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
import android.content.pm.dex.PackageOptimizationInfo;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.system.Os;
import android.util.ArrayMap;
import android.util.Slog;
-
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
@@ -47,9 +46,8 @@
import com.android.server.LocalServices;
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
-
+import com.android.server.pm.PackageManagerServiceCompilerMapping;
import dalvik.system.DexFile;
-
import dalvik.system.VMRuntime;
import java.io.File;
import java.io.FileNotFoundException;
@@ -88,6 +86,10 @@
private final Handler mHandler;
+ static {
+ verifyTronLoggingConstants();
+ }
+
public ArtManagerService(IPackageManager pm, Installer installer, Object installLock) {
mPackageManager = pm;
mInstaller = installer;
@@ -423,6 +425,100 @@
return result;
}
+ // Constants used for logging compilation filter to TRON.
+ // DO NOT CHANGE existing values.
+ //
+ // NOTE: '-1' value is reserved for the case where we cannot produce a valid
+ // PackageOptimizationInfo because the ArtManagerInternal is not ready to be used by the
+ // ActivityMetricsLoggers.
+ private static final int TRON_COMPILATION_FILTER_ERROR = 0;
+ private static final int TRON_COMPILATION_FILTER_UNKNOWN = 1;
+ private static final int TRON_COMPILATION_FILTER_ASSUMED_VERIFIED = 2;
+ private static final int TRON_COMPILATION_FILTER_EXTRACT = 3;
+ private static final int TRON_COMPILATION_FILTER_VERIFY = 4;
+ private static final int TRON_COMPILATION_FILTER_QUICKEN = 5;
+ private static final int TRON_COMPILATION_FILTER_SPACE_PROFILE = 6;
+ private static final int TRON_COMPILATION_FILTER_SPACE = 7;
+ private static final int TRON_COMPILATION_FILTER_SPEED_PROFILE = 8;
+ private static final int TRON_COMPILATION_FILTER_SPEED = 9;
+ private static final int TRON_COMPILATION_FILTER_EVERYTHING_PROFILE = 10;
+ private static final int TRON_COMPILATION_FILTER_EVERYTHING = 11;
+ private static final int TRON_COMPILATION_FILTER_FAKE_RUN_FROM_APK = 12;
+ private static final int TRON_COMPILATION_FILTER_FAKE_RUN_FROM_APK_FALLBACK = 13;
+ private static final int TRON_COMPILATION_FILTER_FAKE_RUN_FROM_VDEX_FALLBACK = 14;
+
+ // Constants used for logging compilation reason to TRON.
+ // DO NOT CHANGE existing values.
+ //
+ // NOTE: '-1' value is reserved for the case where we cannot produce a valid
+ // PackageOptimizationInfo because the ArtManagerInternal is not ready to be used by the
+ // ActivityMetricsLoggers.
+ private static final int TRON_COMPILATION_REASON_ERROR = 0;
+ private static final int TRON_COMPILATION_REASON_UNKNOWN = 1;
+ private static final int TRON_COMPILATION_REASON_FIRST_BOOT = 2;
+ private static final int TRON_COMPILATION_REASON_BOOT = 3;
+ private static final int TRON_COMPILATION_REASON_INSTALL = 4;
+ private static final int TRON_COMPILATION_REASON_BG_DEXOPT = 5;
+ private static final int TRON_COMPILATION_REASON_AB_OTA = 6;
+ private static final int TRON_COMPILATION_REASON_INACTIVE = 7;
+ private static final int TRON_COMPILATION_REASON_SHARED = 8;
+
+ /**
+ * Convert the compilation reason to an int suitable to be logged to TRON.
+ */
+ private static int getCompilationReasonTronValue(String compilationReason) {
+ switch (compilationReason) {
+ case "unknown" : return TRON_COMPILATION_REASON_UNKNOWN;
+ case "error" : return TRON_COMPILATION_REASON_ERROR;
+ case "first-boot" : return TRON_COMPILATION_REASON_FIRST_BOOT;
+ case "boot" : return TRON_COMPILATION_REASON_BOOT;
+ case "install" : return TRON_COMPILATION_REASON_INSTALL;
+ case "bg-dexopt" : return TRON_COMPILATION_REASON_BG_DEXOPT;
+ case "ab-ota" : return TRON_COMPILATION_REASON_AB_OTA;
+ case "inactive" : return TRON_COMPILATION_REASON_INACTIVE;
+ case "shared" : return TRON_COMPILATION_REASON_SHARED;
+ default: return TRON_COMPILATION_REASON_UNKNOWN;
+ }
+ }
+
+ /**
+ * Convert the compilation filter to an int suitable to be logged to TRON.
+ */
+ private static int getCompilationFilterTronValue(String compilationFilter) {
+ switch (compilationFilter) {
+ case "error" : return TRON_COMPILATION_FILTER_ERROR;
+ case "unknown" : return TRON_COMPILATION_FILTER_UNKNOWN;
+ case "assume-verified" : return TRON_COMPILATION_FILTER_ASSUMED_VERIFIED;
+ case "extract" : return TRON_COMPILATION_FILTER_EXTRACT;
+ case "verify" : return TRON_COMPILATION_FILTER_VERIFY;
+ case "quicken" : return TRON_COMPILATION_FILTER_QUICKEN;
+ case "space-profile" : return TRON_COMPILATION_FILTER_SPACE_PROFILE;
+ case "space" : return TRON_COMPILATION_FILTER_SPACE;
+ case "speed-profile" : return TRON_COMPILATION_FILTER_SPEED_PROFILE;
+ case "speed" : return TRON_COMPILATION_FILTER_SPEED;
+ case "everything-profile" : return TRON_COMPILATION_FILTER_EVERYTHING_PROFILE;
+ case "everything" : return TRON_COMPILATION_FILTER_EVERYTHING;
+ case "run-from-apk" : return TRON_COMPILATION_FILTER_FAKE_RUN_FROM_APK;
+ case "run-from-apk-fallback" :
+ return TRON_COMPILATION_FILTER_FAKE_RUN_FROM_APK_FALLBACK;
+ case "run-from-vdex-fallback" :
+ return TRON_COMPILATION_FILTER_FAKE_RUN_FROM_VDEX_FALLBACK;
+ default: return TRON_COMPILATION_FILTER_UNKNOWN;
+ }
+ }
+
+ private static void verifyTronLoggingConstants() {
+ for (int i = 0; i < PackageManagerServiceCompilerMapping.REASON_STRINGS.length; i++) {
+ String reason = PackageManagerServiceCompilerMapping.REASON_STRINGS[i];
+ int value = getCompilationReasonTronValue(reason);
+ if (value == TRON_COMPILATION_REASON_ERROR
+ || value == TRON_COMPILATION_REASON_UNKNOWN) {
+ throw new IllegalArgumentException("Compilation reason not configured for TRON "
+ + "logging: " + reason);
+ }
+ }
+ }
+
private class ArtManagerInternalImpl extends ArtManagerInternal {
@Override
public PackageOptimizationInfo getPackageOptimizationInfo(
@@ -431,9 +527,10 @@
String compilationFilter;
try {
String isa = VMRuntime.getInstructionSet(abi);
- String[] stats = DexFile.getDexFileOptimizationStatus(info.getBaseCodePath(), isa);
- compilationFilter = stats[0];
- compilationReason = stats[1];
+ DexFile.OptimizationInfo optInfo =
+ DexFile.getDexFileOptimizationInfo(info.getBaseCodePath(), isa);
+ compilationFilter = optInfo.getStatus();
+ compilationReason = optInfo.getReason();
} catch (FileNotFoundException e) {
Slog.e(TAG, "Could not get optimizations status for " + info.getBaseCodePath(), e);
compilationFilter = "error";
@@ -445,7 +542,11 @@
compilationReason = "error";
}
- return new PackageOptimizationInfo(compilationFilter, compilationReason);
+ int compilationFilterTronValue = getCompilationFilterTronValue(compilationFilter);
+ int compilationReasonTronValue = getCompilationReasonTronValue(compilationReason);
+
+ return new PackageOptimizationInfo(
+ compilationFilterTronValue, compilationReasonTronValue);
}
}
}
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 3116480..518d464 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -972,6 +972,7 @@
grantRuntimePermissions(imsServicePackage, MICROPHONE_PERMISSIONS, userId);
grantRuntimePermissions(imsServicePackage, LOCATION_PERMISSIONS, userId);
grantRuntimePermissions(imsServicePackage, CAMERA_PERMISSIONS, userId);
+ grantRuntimePermissions(imsServicePackage, CONTACTS_PERMISSIONS, userId);
}
}
}
@@ -1010,6 +1011,32 @@
}
}
+ public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
+ Log.i(TAG, "Granting permissions to active LUI app for user:" + userId);
+ if (packageName == null) {
+ return;
+ }
+ PackageParser.Package luiAppPackage = getSystemPackage(packageName);
+ if (luiAppPackage != null
+ && doesPackageSupportRuntimePermissions(luiAppPackage)) {
+ grantRuntimePermissions(luiAppPackage, CAMERA_PERMISSIONS, true, userId);
+ }
+ }
+
+ public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
+ Log.i(TAG, "Revoke permissions from LUI apps for user:" + userId);
+ if (packageNames == null) {
+ return;
+ }
+ for (String packageName : packageNames) {
+ PackageParser.Package luiAppPackage = getSystemPackage(packageName);
+ if (luiAppPackage != null
+ && doesPackageSupportRuntimePermissions(luiAppPackage)) {
+ revokeRuntimePermissions(luiAppPackage, CAMERA_PERMISSIONS, true, userId);
+ }
+ }
+ }
+
public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
Log.i(TAG, "Granting permissions to default browser for user:" + userId);
if (packageName == null) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 4dc68ac..9a25dcc 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1330,6 +1330,9 @@
mHandler.post(mHiddenNavPanic);
}
+ // Abort possibly stuck animations.
+ mHandler.post(mWindowManagerFuncs::triggerAnimationFailsafe);
+
// Latch power key state to detect screenshot chord.
if (interactive && !mScreenshotChordPowerKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
@@ -3027,7 +3030,7 @@
// Show IME over the keyguard if the target allows it
boolean allowWhenLocked = (win.isInputMethodWindow() || imeTarget == this)
- && showImeOverKeyguard;;
+ && showImeOverKeyguard;
if (isKeyguardLocked() && isKeyguardOccluded()) {
// Show SHOW_WHEN_LOCKED windows if Keyguard is occluded.
@@ -4362,6 +4365,9 @@
* given the situation with the keyguard.
*/
void launchHomeFromHotKey(final boolean awakenFromDreams, final boolean respectKeyguard) {
+ // Abort possibly stuck animations.
+ mHandler.post(mWindowManagerFuncs::triggerAnimationFailsafe);
+
if (respectKeyguard) {
if (isKeyguardShowingAndNotOccluded()) {
// don't launch home if keyguard showing
@@ -4970,13 +4976,14 @@
private void setAttachedWindowFrames(WindowState win, int fl, int adjust, WindowState attached,
boolean insetDecors, Rect pf, Rect df, Rect of, Rect cf, Rect vf,
DisplayFrames displayFrames) {
- if (win.getSurfaceLayer() > mDockLayer && attached.getSurfaceLayer() < mDockLayer) {
- // Here's a special case: if this attached window is a panel that is above the dock
- // window, and the window it is attached to is below the dock window, then the frames we
- // computed for the window it is attached to can not be used because the dock is
- // effectively part of the underlying window and the attached window is floating on top
- // of the whole thing. So, we ignore the attached window and explicitly compute the
- // frames that would be appropriate without the dock.
+ if (!win.isInputMethodTarget() && attached.isInputMethodTarget()) {
+ // Here's a special case: if the child window is not the 'dock window'
+ // or input method target, and the window it is attached to is below
+ // the dock window, then the frames we computed for the window it is
+ // attached to can not be used because the dock is effectively part
+ // of the underlying window and the attached window is floating on top
+ // of the whole thing. So, we ignore the attached window and explicitly
+ // compute the frames that would be appropriate without the dock.
vf.set(displayFrames.mDock);
cf.set(displayFrames.mDock);
of.set(displayFrames.mDock);
@@ -5003,7 +5010,7 @@
cf.set(attached.getContentFrameLw());
if (attached.isVoiceInteraction()) {
cf.intersectUnchecked(displayFrames.mVoiceContent);
- } else if (attached.getSurfaceLayer() < mDockLayer) {
+ } else if (win.isInputMethodTarget() || attached.isInputMethodTarget()) {
cf.intersectUnchecked(displayFrames.mContent);
}
}
@@ -5494,7 +5501,6 @@
win.computeFrameLw(pf, df, of, cf, vf, dcf, sf, osf, displayFrames.mDisplayCutout,
parentFrameWasClippedByDisplayCutout);
-
// Dock windows carve out the bottom of the screen, so normal windows
// can't appear underneath them.
if (type == TYPE_INPUT_METHOD && win.isVisibleLw()
@@ -7175,7 +7181,7 @@
}
@Override
- public int rotationForOrientationLw(int orientation, int lastRotation) {
+ public int rotationForOrientationLw(int orientation, int lastRotation, boolean defaultDisplay) {
if (false) {
Slog.v(TAG, "rotationForOrientationLw(orient="
+ orientation + ", last=" + lastRotation
@@ -7196,7 +7202,11 @@
}
final int preferredRotation;
- if (mLidState == LID_OPEN && mLidOpenRotation >= 0) {
+ if (!defaultDisplay) {
+ // For secondary displays we ignore things like displays sensors, docking mode and
+ // rotation lock, and always prefer a default rotation.
+ preferredRotation = Surface.ROTATION_0;
+ } else if (mLidState == LID_OPEN && mLidOpenRotation >= 0) {
// Ignore sensor when lid switch is open and rotation is forced.
preferredRotation = mLidOpenRotation;
} else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index ec0521d..ccbf502 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -407,7 +407,10 @@
/**
* Returns true if this window has been shown on screen at some time in
* the past. Must be called with the window manager lock held.
+ *
+ * @deprecated Use {@link #isDrawnLw} or any of the other drawn/visibility methods.
*/
+ @Deprecated
public boolean hasDrawnLw();
/**
@@ -471,6 +474,8 @@
public boolean isInputMethodWindow();
+ public boolean isInputMethodTarget();
+
public int getDisplayId();
/**
@@ -649,6 +654,12 @@
return Integer.toString(lens);
}
}
+
+ /**
+ * Hint to window manager that the user has started a navigation action that should
+ * abort animations that have no timeout, in case they got stuck.
+ */
+ void triggerAnimationFailsafe();
}
/** Window has been added to the screen. */
@@ -1426,10 +1437,13 @@
* @param orientation An orientation constant, such as
* {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}.
* @param lastRotation The most recently used rotation.
+ * @param defaultDisplay Flag indicating whether the rotation is computed for the default
+ * display. Currently for all non-default displays sensors, docking mode,
+ * rotation lock and other factors are ignored.
* @return The surface rotation to use.
*/
public int rotationForOrientationLw(@ActivityInfo.ScreenOrientation int orientation,
- int lastRotation);
+ int lastRotation, boolean defaultDisplay);
/**
* Given an orientation constant and a rotation, returns true if the rotation
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 062b154..81a8c55 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -213,7 +213,8 @@
// There are no longer any keyguard windows on secondary displays, so pass
// INVALID_DISPLAY. All that means is that showWhenLocked activities on
// secondary displays now get to show.
- ActivityManager.getService().setLockScreenShown(true, INVALID_DISPLAY);
+ ActivityManager.getService().setLockScreenShown(true /* keyguardShowing */,
+ false /* aodShowing */, INVALID_DISPLAY);
} catch (RemoteException e) {
// Local call.
}
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
index 941cd44..e56caf8 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
@@ -19,6 +19,8 @@
import android.app.ActivityManager;
import android.content.Context;
import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.security.IKeystoreService;
import android.util.Slog;
import com.android.internal.policy.IKeyguardService;
@@ -51,11 +53,16 @@
private final LockPatternUtils mLockPatternUtils;
private final StateCallback mCallback;
+ IKeystoreService mKeystoreService;
+
public KeyguardStateMonitor(Context context, IKeyguardService service, StateCallback callback) {
mLockPatternUtils = new LockPatternUtils(context);
mCurrentUserId = ActivityManager.getCurrentUser();
mCallback = callback;
+ mKeystoreService = IKeystoreService.Stub.asInterface(ServiceManager
+ .getService("android.security.keystore"));
+
try {
service.addStateMonitorCallback(this);
} catch (RemoteException e) {
@@ -86,6 +93,12 @@
@Override // Binder interface
public void onShowingStateChanged(boolean showing) {
mIsShowing = showing;
+
+ try {
+ mKeystoreService.onKeyguardVisibilityChanged(showing, mCurrentUserId);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error informing keystore of screen lock", e);
+ }
}
@Override // Binder interface
@@ -130,4 +143,4 @@
pw.println(prefix + "mTrusted=" + mTrusted);
pw.println(prefix + "mCurrentUserId=" + mCurrentUserId);
}
-}
\ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
index 5b3182e..2860521 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
@@ -26,6 +26,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.BackgroundThread;
import com.android.server.power.BatterySaverPolicy;
import com.android.server.power.BatterySaverStateMachineProto;
@@ -124,25 +125,33 @@
if (DEBUG) {
Slog.d(TAG, "onBootCompleted");
}
- synchronized (mLock) {
+ // This is called with the power manager lock held. Don't do any
+ runOnBgThread(() -> {
+ synchronized (mLock) {
- final ContentResolver cr = mContext.getContentResolver();
- cr.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.LOW_POWER_MODE),
- false, mSettingsObserver, UserHandle.USER_SYSTEM);
- cr.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.LOW_POWER_MODE_STICKY),
- false, mSettingsObserver, UserHandle.USER_SYSTEM);
- cr.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
- false, mSettingsObserver, UserHandle.USER_SYSTEM);
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE),
+ false, mSettingsObserver, UserHandle.USER_SYSTEM);
+ cr.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE_STICKY),
+ false, mSettingsObserver, UserHandle.USER_SYSTEM);
+ cr.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
+ false, mSettingsObserver, UserHandle.USER_SYSTEM);
- mBootCompleted = true;
+ mBootCompleted = true;
- refreshSettingsLocked();
+ refreshSettingsLocked();
- doAutoBatterySaverLocked();
- }
+ doAutoBatterySaverLocked();
+ }
+ });
+ }
+
+ @VisibleForTesting
+ void runOnBgThread(Runnable r) {
+ BackgroundThread.getHandler().post(r);
}
void refreshSettingsLocked() {
diff --git a/services/core/java/com/android/server/security/VerityUtils.java b/services/core/java/com/android/server/security/VerityUtils.java
index d2d0e60..180f343 100644
--- a/services/core/java/com/android/server/security/VerityUtils.java
+++ b/services/core/java/com/android/server/security/VerityUtils.java
@@ -26,6 +26,7 @@
import android.util.apk.ApkSignatureVerifier;
import android.util.apk.ByteBufferFactory;
import android.util.apk.SignatureNotFoundException;
+import android.util.Pair;
import android.util.Slog;
import java.io.FileDescriptor;
@@ -59,12 +60,15 @@
return SetupResult.skipped();
}
- shm = generateApkVerityIntoSharedMemory(apkPath, signedRootHash);
+ Pair<SharedMemory, Integer> result = generateApkVerityIntoSharedMemory(apkPath,
+ signedRootHash);
+ shm = result.first;
+ int contentSize = result.second;
FileDescriptor rfd = shm.getFileDescriptor();
if (rfd == null || !rfd.valid()) {
return SetupResult.failed();
}
- return SetupResult.ok(Os.dup(rfd));
+ return SetupResult.ok(Os.dup(rfd), contentSize);
} catch (IOException | SecurityException | DigestException | NoSuchAlgorithmException |
SignatureNotFoundException | ErrnoException e) {
Slog.e(TAG, "Failed to set up apk verity: ", e);
@@ -85,10 +89,20 @@
}
/**
- * Returns a {@code SharedMemory} that contains Merkle tree and fsverity headers for the given
- * apk, in the form that can immediately be used for fsverity setup.
+ * {@see ApkSignatureVerifier#getVerityRootHash(String)}.
*/
- private static SharedMemory generateApkVerityIntoSharedMemory(
+ public static byte[] getVerityRootHash(@NonNull String apkPath)
+ throws IOException, SignatureNotFoundException, SecurityException {
+ return ApkSignatureVerifier.getVerityRootHash(apkPath);
+ }
+
+ /**
+ * Returns a pair of {@code SharedMemory} and {@code Integer}. The {@code SharedMemory} contains
+ * Merkle tree and fsverity headers for the given apk, in the form that can immediately be used
+ * for fsverity setup. The data is aligned to the beginning of {@code SharedMemory}, and has
+ * length equals to the returned {@code Integer}.
+ */
+ private static Pair<SharedMemory, Integer> generateApkVerityIntoSharedMemory(
String apkPath, byte[] expectedRootHash)
throws IOException, SecurityException, DigestException, NoSuchAlgorithmException,
SignatureNotFoundException {
@@ -101,6 +115,7 @@
throw new SecurityException("Locally generated verity root hash does not match");
}
+ int contentSize = shmBufferFactory.getBufferLimit();
SharedMemory shm = shmBufferFactory.releaseSharedMemory();
if (shm == null) {
throw new IllegalStateException("Failed to generate verity tree into shared memory");
@@ -108,7 +123,7 @@
if (!shm.setProtect(PROT_READ)) {
throw new SecurityException("Failed to set up shared memory correctly");
}
- return shm;
+ return Pair.create(shm, contentSize);
}
public static class SetupResult {
@@ -123,22 +138,24 @@
private final int mCode;
private final FileDescriptor mFileDescriptor;
+ private final int mContentSize;
- public static SetupResult ok(@NonNull FileDescriptor fileDescriptor) {
- return new SetupResult(RESULT_OK, fileDescriptor);
+ public static SetupResult ok(@NonNull FileDescriptor fileDescriptor, int contentSize) {
+ return new SetupResult(RESULT_OK, fileDescriptor, contentSize);
}
public static SetupResult skipped() {
- return new SetupResult(RESULT_SKIPPED, null);
+ return new SetupResult(RESULT_SKIPPED, null, -1);
}
public static SetupResult failed() {
- return new SetupResult(RESULT_FAILED, null);
+ return new SetupResult(RESULT_FAILED, null, -1);
}
- private SetupResult(int code, FileDescriptor fileDescriptor) {
+ private SetupResult(int code, FileDescriptor fileDescriptor, int contentSize) {
this.mCode = code;
this.mFileDescriptor = fileDescriptor;
+ this.mContentSize = contentSize;
}
public boolean isFailed() {
@@ -152,6 +169,10 @@
public @NonNull FileDescriptor getUnownedFileDescriptor() {
return mFileDescriptor;
}
+
+ public int getContentSize() {
+ return mContentSize;
+ }
}
/** A {@code ByteBufferFactory} that creates a shared memory backed {@code ByteBuffer}. */
@@ -188,5 +209,9 @@
mShm = null;
return tmp;
}
+
+ public int getBufferLimit() {
+ return mBuffer == null ? -1 : mBuffer.limit();
+ }
}
}
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index 0b7d9d0..fd0b6f1 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -168,7 +168,8 @@
}
@Override
- public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException {
+ public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token)
+ throws RemoteException {
verifyCaller(pkg);
enforceAccess(pkg, uri);
int user = Binder.getCallingUserHandle().getIdentifier();
@@ -210,7 +211,8 @@
}
@Override
- public int checkSlicePermission(Uri uri, String pkg, int pid, int uid) throws RemoteException {
+ public int checkSlicePermission(Uri uri, String pkg, int pid, int uid,
+ String[] autoGrantPermissions) throws RemoteException {
if (mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
== PERMISSION_GRANTED) {
return SliceManager.PERMISSION_GRANTED;
@@ -218,6 +220,11 @@
if (hasFullSliceAccess(pkg, UserHandle.getUserId(uid))) {
return SliceManager.PERMISSION_GRANTED;
}
+ for (String perm : autoGrantPermissions) {
+ if (mContext.checkPermission(perm, pid, uid) == PERMISSION_GRANTED) {
+ return SliceManager.PERMISSION_USER_GRANTED;
+ }
+ }
synchronized (mLock) {
if (mUserGrants.contains(new SliceGrant(uri, pkg, UserHandle.getUserId(uid)))) {
return SliceManager.PERMISSION_USER_GRANTED;
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index b3d28fc..d4625e9 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -39,6 +39,7 @@
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
+import android.os.FileUtils;
import android.os.IBinder;
import android.os.IStatsCompanionService;
import android.os.IStatsManager;
@@ -68,14 +69,21 @@
import com.android.internal.os.KernelWakelockReader;
import com.android.internal.os.KernelWakelockStats;
import com.android.internal.os.PowerProfile;
+import com.android.internal.util.DumpUtils;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import java.io.File;
+import java.io.FileDescriptor;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
@@ -89,14 +97,17 @@
* How long to wait on an individual subsystem to return its stats.
*/
private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
+ private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
public static final String RESULT_RECEIVER_CONTROLLER_KEY = "controller_activity";
+ public static final String CONFIG_DIR = "/data/misc/stats-service";
static final String TAG = "StatsCompanionService";
static final boolean DEBUG = false;
public static final int CODE_DATA_BROADCAST = 1;
public static final int CODE_SUBSCRIBER_BROADCAST = 1;
+ public static final int DEATH_THRESHOLD = 10;
private final Context mContext;
private final AlarmManager mAlarmManager;
@@ -119,6 +130,10 @@
new StatFs(Environment.getRootDirectory().getAbsolutePath());
private final StatFs mStatFsTemp =
new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
+ @GuardedBy("sStatsdLock")
+ private final HashSet<Long> mDeathTimeMillis = new HashSet<>();
+ @GuardedBy("sStatsdLock")
+ private final HashMap<Long, String> mDeletedFiles = new HashMap<>();
private KernelUidCpuTimeReader mKernelUidCpuTimeReader = new KernelUidCpuTimeReader();
private KernelCpuSpeedReader[] mKernelCpuSpeedReaders;
@@ -156,7 +171,7 @@
informAllUidsLocked(context);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to inform statsd latest update of all apps", e);
- forgetEverything();
+ forgetEverythingLocked();
}
}
}
@@ -364,7 +379,7 @@
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG)
- Slog.d(TAG, "Time to poll something.");
+ Slog.d(TAG, "Time to trigger periodic alarm.");
synchronized (sStatsdLock) {
if (sStatsd == null) {
Slog.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
@@ -440,13 +455,13 @@
public void setAlarmForSubscriberTriggering(long timestampMs) {
enforceCallingPermission();
if (DEBUG)
- Slog.d(TAG, "Setting periodic alarm at " + timestampMs);
+ Slog.d(TAG, "Setting periodic alarm in about " +
+ (timestampMs - SystemClock.elapsedRealtime()));
final long callingToken = Binder.clearCallingIdentity();
try {
// using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
// only fire when it awakens.
- // This alarm is inexact, leaving its exactness completely up to the OS optimizations.
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
@@ -466,34 +481,32 @@
}
@Override // Binder call
- public void setPullingAlarms(long timestampMs, long intervalMs) {
- enforceCallingPermission();
- if (DEBUG)
- Slog.d(TAG, "Setting pulling alarm for " + timestampMs + " every " + intervalMs + "ms");
- final long callingToken = Binder.clearCallingIdentity();
- try {
- // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
- // only fire when it awakens.
- // This alarm is inexact, leaving its exactness completely up to the OS optimizations.
- // TODO: totally inexact means that stats per bucket could be quite off. Is this okay?
- mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, timestampMs, intervalMs,
- mPullingAlarmIntent);
- } finally {
- Binder.restoreCallingIdentity(callingToken);
- }
+ public void setPullingAlarm(long nextPullTimeMs) {
+ enforceCallingPermission();
+ if (DEBUG)
+ Slog.d(TAG,
+ "Setting pulling alarm in about " + (nextPullTimeMs - SystemClock.elapsedRealtime()));
+ final long callingToken = Binder.clearCallingIdentity();
+ try {
+ // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
+ // only fire when it awakens.
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, mPullingAlarmIntent);
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
}
@Override // Binder call
- public void cancelPullingAlarms() {
- enforceCallingPermission();
- if (DEBUG)
- Slog.d(TAG, "Cancelling pulling alarm");
- final long callingToken = Binder.clearCallingIdentity();
- try {
- mAlarmManager.cancel(mPullingAlarmIntent);
- } finally {
- Binder.restoreCallingIdentity(callingToken);
- }
+ public void cancelPullingAlarm() {
+ enforceCallingPermission();
+ if (DEBUG)
+ Slog.d(TAG, "Cancelling pulling alarm");
+ final long callingToken = Binder.clearCallingIdentity();
+ try {
+ mAlarmManager.cancel(mPullingAlarmIntent);
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
}
private void addNetworkStats(
@@ -660,12 +673,14 @@
private void pullBluetoothBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) {
BluetoothActivityEnergyInfo info = pullBluetoothData();
long elapsedNanos = SystemClock.elapsedRealtimeNanos();
- for (UidTraffic traffic : info.getUidTraffic()) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3);
- e.writeInt(traffic.getUid());
- e.writeLong(traffic.getRxBytes());
- e.writeLong(traffic.getTxBytes());
- pulledData.add(e);
+ if (info.getUidTraffic() != null) {
+ for (UidTraffic traffic : info.getUidTraffic()) {
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3);
+ e.writeInt(traffic.getUid());
+ e.writeLong(traffic.getRxBytes());
+ e.writeLong(traffic.getTxBytes());
+ pulledData.add(e);
+ }
}
}
@@ -753,7 +768,7 @@
});
}
- private void pullWifiActivityEnergyInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
+ private void pullWifiActivityInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
if (mWifiManager == null) {
mWifiManager =
@@ -921,8 +936,8 @@
pullKernelUidCpuActiveTime(tagId, ret);
break;
}
- case StatsLog.WIFI_ACTIVITY_ENERGY_INFO: {
- pullWifiActivityEnergyInfo(tagId, ret);
+ case StatsLog.WIFI_ACTIVITY_INFO: {
+ pullWifiActivityInfo(tagId, ret);
break;
}
case StatsLog.MODEM_ACTIVITY_INFO: {
@@ -1057,7 +1072,7 @@
sStatsd.asBinder().linkToDeath(new StatsdDeathRecipient(), 0);
} catch (RemoteException e) {
Slog.e(TAG, "linkToDeath(StatsdDeathRecipient) failed", e);
- forgetEverything();
+ forgetEverythingLocked();
}
// Setup broadcast receiver for updates.
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REPLACED);
@@ -1089,7 +1104,7 @@
Slog.i(TAG, "Told statsd that StatsCompanionService is alive.");
} catch (RemoteException e) {
Slog.e(TAG, "Failed to inform statsd that statscompanion is ready", e);
- forgetEverything();
+ forgetEverythingLocked();
}
}
}
@@ -1098,18 +1113,60 @@
@Override
public void binderDied() {
Slog.i(TAG, "Statsd is dead - erase all my knowledge.");
- forgetEverything();
+ synchronized (sStatsdLock) {
+ long now = SystemClock.elapsedRealtime();
+ for (Long timeMillis : mDeathTimeMillis) {
+ long ageMillis = now - timeMillis;
+ if (ageMillis > MILLIS_IN_A_DAY) {
+ mDeathTimeMillis.remove(timeMillis);
+ }
+ }
+ for (Long timeMillis : mDeletedFiles.keySet()) {
+ long ageMillis = now - timeMillis;
+ if (ageMillis > MILLIS_IN_A_DAY * 7) {
+ mDeletedFiles.remove(timeMillis);
+ }
+ }
+ mDeathTimeMillis.add(now);
+ if (mDeathTimeMillis.size() >= DEATH_THRESHOLD) {
+ mDeathTimeMillis.clear();
+ File[] configs = FileUtils.listFilesOrEmpty(new File(CONFIG_DIR));
+ if (configs.length > 0) {
+ String fileName = configs[0].getName();
+ if (configs[0].delete()) {
+ mDeletedFiles.put(now, fileName);
+ }
+ }
+ }
+ forgetEverythingLocked();
+ }
}
}
- private void forgetEverything() {
+ private void forgetEverythingLocked() {
+ sStatsd = null;
+ mContext.unregisterReceiver(mAppUpdateReceiver);
+ mContext.unregisterReceiver(mUserUpdateReceiver);
+ mContext.unregisterReceiver(mShutdownEventReceiver);
+ cancelAnomalyAlarm();
+ cancelPullingAlarm();
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) return;
+
synchronized (sStatsdLock) {
- sStatsd = null;
- mContext.unregisterReceiver(mAppUpdateReceiver);
- mContext.unregisterReceiver(mUserUpdateReceiver);
- mContext.unregisterReceiver(mShutdownEventReceiver);
- cancelAnomalyAlarm();
- cancelPullingAlarms();
+ writer.println("Number of configuration files deleted: " + mDeletedFiles.size());
+ if (mDeletedFiles.size() > 0) {
+ writer.println(" timestamp, deleted file name");
+ }
+ long lastBootMillis =
+ SystemClock.currentThreadTimeMillis() - SystemClock.elapsedRealtime();
+ for (Long elapsedMillis : mDeletedFiles.keySet()) {
+ long deletionMillis = lastBootMillis + elapsedMillis;
+ writer.println(" " + deletionMillis + ", " + mDeletedFiles.get(elapsedMillis));
+ }
}
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 0678d08..8af1101 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -23,7 +23,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Rect;
-import android.hardware.fingerprint.IFingerprintDialogReceiver;
+import android.hardware.biometrics.IBiometricDialogReceiver;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -547,7 +547,7 @@
}
@Override
- public void showFingerprintDialog(Bundle bundle, IFingerprintDialogReceiver receiver) {
+ public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
if (mBar != null) {
try {
mBar.showFingerprintDialog(bundle, receiver);
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index 6df7092..2742b0f 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -37,7 +37,8 @@
import android.util.SparseArray;
import android.view.textclassifier.SelectionEvent;
import android.view.textclassifier.TextClassification;
-import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextClassificationContext;
+import android.view.textclassifier.TextClassificationSessionId;
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
@@ -121,22 +122,21 @@
@Override
public void onSuggestSelection(
- CharSequence text, int selectionStartIndex, int selectionEndIndex,
- TextSelection.Options options, ITextSelectionCallback callback)
+ TextClassificationSessionId sessionId,
+ TextSelection.Request request, ITextSelectionCallback callback)
throws RemoteException {
- validateInput(text, selectionStartIndex, selectionEndIndex, callback);
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
synchronized (mLock) {
UserState userState = getCallingUserStateLocked();
if (!userState.bindLocked()) {
callback.onFailure();
} else if (userState.isBoundLocked()) {
- userState.mService.onSuggestSelection(
- text, selectionStartIndex, selectionEndIndex, options, callback);
+ userState.mService.onSuggestSelection(sessionId, request, callback);
} else {
userState.mPendingRequests.add(new PendingRequest(
- () -> onSuggestSelection(
- text, selectionStartIndex, selectionEndIndex, options, callback),
+ () -> onSuggestSelection(sessionId, request, callback),
callback::onFailure, callback.asBinder(), this, userState));
}
}
@@ -144,20 +144,21 @@
@Override
public void onClassifyText(
- CharSequence text, int startIndex, int endIndex,
- TextClassification.Options options, ITextClassificationCallback callback)
+ TextClassificationSessionId sessionId,
+ TextClassification.Request request, ITextClassificationCallback callback)
throws RemoteException {
- validateInput(text, startIndex, endIndex, callback);
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
synchronized (mLock) {
UserState userState = getCallingUserStateLocked();
if (!userState.bindLocked()) {
callback.onFailure();
} else if (userState.isBoundLocked()) {
- userState.mService.onClassifyText(text, startIndex, endIndex, options, callback);
+ userState.mService.onClassifyText(sessionId, request, callback);
} else {
userState.mPendingRequests.add(new PendingRequest(
- () -> onClassifyText(text, startIndex, endIndex, options, callback),
+ () -> onClassifyText(sessionId, request, callback),
callback::onFailure, callback.asBinder(), this, userState));
}
}
@@ -165,35 +166,77 @@
@Override
public void onGenerateLinks(
- CharSequence text, TextLinks.Options options, ITextLinksCallback callback)
+ TextClassificationSessionId sessionId,
+ TextLinks.Request request, ITextLinksCallback callback)
throws RemoteException {
- validateInput(text, callback);
+ Preconditions.checkNotNull(request);
+ Preconditions.checkNotNull(callback);
synchronized (mLock) {
UserState userState = getCallingUserStateLocked();
if (!userState.bindLocked()) {
callback.onFailure();
} else if (userState.isBoundLocked()) {
- userState.mService.onGenerateLinks(text, options, callback);
+ userState.mService.onGenerateLinks(sessionId, request, callback);
} else {
userState.mPendingRequests.add(new PendingRequest(
- () -> onGenerateLinks(text, options, callback),
+ () -> onGenerateLinks(sessionId, request, callback),
callback::onFailure, callback.asBinder(), this, userState));
}
}
}
@Override
- public void onSelectionEvent(SelectionEvent event) throws RemoteException {
- validateInput(event, mContext);
+ public void onSelectionEvent(
+ TextClassificationSessionId sessionId, SelectionEvent event) throws RemoteException {
+ Preconditions.checkNotNull(event);
+ validateInput(event.getPackageName(), mContext);
synchronized (mLock) {
UserState userState = getCallingUserStateLocked();
if (userState.isBoundLocked()) {
- userState.mService.onSelectionEvent(event);
+ userState.mService.onSelectionEvent(sessionId, event);
} else {
userState.mPendingRequests.add(new PendingRequest(
- () -> onSelectionEvent(event),
+ () -> onSelectionEvent(sessionId, event),
+ null /* onServiceFailure */, null /* binder */, this, userState));
+ }
+ }
+ }
+
+ @Override
+ public void onCreateTextClassificationSession(
+ TextClassificationContext classificationContext, TextClassificationSessionId sessionId)
+ throws RemoteException {
+ Preconditions.checkNotNull(sessionId);
+ Preconditions.checkNotNull(classificationContext);
+ validateInput(classificationContext.getPackageName(), mContext);
+
+ synchronized (mLock) {
+ UserState userState = getCallingUserStateLocked();
+ if (userState.isBoundLocked()) {
+ userState.mService.onCreateTextClassificationSession(
+ classificationContext, sessionId);
+ } else {
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onCreateTextClassificationSession(classificationContext, sessionId),
+ null /* onServiceFailure */, null /* binder */, this, userState));
+ }
+ }
+ }
+
+ @Override
+ public void onDestroyTextClassificationSession(TextClassificationSessionId sessionId)
+ throws RemoteException {
+ Preconditions.checkNotNull(sessionId);
+
+ synchronized (mLock) {
+ UserState userState = getCallingUserStateLocked();
+ if (userState.isBoundLocked()) {
+ userState.mService.onDestroyTextClassificationSession(sessionId);
+ } else {
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onDestroyTextClassificationSession(sessionId),
null /* onServiceFailure */, null /* binder */, this, userState));
}
}
@@ -277,31 +320,11 @@
e -> Slog.d(LOG_TAG, "Error " + opDesc + ": " + e.getMessage()));
}
- private static void validateInput(
- CharSequence text, int startIndex, int endIndex, Object callback)
- throws RemoteException {
- try {
- TextClassifier.Utils.validate(text, startIndex, endIndex, true /* allowInMainThread */);
- Preconditions.checkNotNull(callback);
- } catch (IllegalArgumentException | NullPointerException e) {
- throw new RemoteException(e.getMessage());
- }
- }
-
- private static void validateInput(CharSequence text, Object callback) throws RemoteException {
- try {
- TextClassifier.Utils.validate(text, true /* allowInMainThread */);
- Preconditions.checkNotNull(callback);
- } catch (IllegalArgumentException | NullPointerException e) {
- throw new RemoteException(e.getMessage());
- }
- }
-
- private static void validateInput(SelectionEvent event, Context context)
+ private static void validateInput(String packageName, Context context)
throws RemoteException {
try {
final int uid = context.getPackageManager()
- .getPackageUid(event.getPackageName(), 0);
+ .getPackageUid(packageName, 0);
Preconditions.checkArgument(Binder.getCallingUid() == uid);
} catch (IllegalArgumentException | NullPointerException |
PackageManager.NameNotFoundException e) {
@@ -335,7 +358,6 @@
@GuardedBy("mLock")
private void handlePendingRequestsLocked() {
- // TODO(b/72481146): Implement PendingRequest similar to that in RemoteFillService.
PendingRequest request;
while ((request = mPendingRequests.poll()) != null) {
if (isBoundLocked()) {
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 8901b04..d123099c 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -1428,7 +1428,7 @@
void clearWallpaperLocked(boolean defaultFailed, int which, int userId, IRemoteCallback reply) {
if (which != FLAG_SYSTEM && which != FLAG_LOCK) {
- throw new IllegalArgumentException("Must specify exactly one kind of wallpaper to read");
+ throw new IllegalArgumentException("Must specify exactly one kind of wallpaper to clear");
}
WallpaperData wallpaper = null;
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index 9b787de..9177d25 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -37,6 +37,8 @@
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
+
import com.android.internal.R;
import com.android.server.policy.IconUtilities;
@@ -109,6 +111,8 @@
final String message = context.getString(R.string.alert_windows_notification_message,
appName);
+ Bundle extras = new Bundle();
+ extras.putStringArray(Notification.EXTRA_FOREGROUND_APPS, new String[] {mPackageName});
final Notification.Builder builder = new Notification.Builder(context, mNotificationTag)
.setOngoing(true)
.setContentTitle(
@@ -118,6 +122,7 @@
.setColor(context.getColor(R.color.system_notification_accent_color))
.setStyle(new Notification.BigTextStyle().bigText(message))
.setLocalOnly(true)
+ .addExtras(extras)
.setContentIntent(getContentIntent(context, mPackageName));
if (aInfo != null) {
diff --git a/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
index ae343da..416469b 100644
--- a/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
+++ b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
@@ -19,6 +19,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
+import java.io.PrintWriter;
import java.util.ArrayList;
/**
@@ -88,4 +89,13 @@
}
mTmpRunnableList.clear();
}
+
+ void dump(PrintWriter pw, String header, String prefix) {
+ if (!mAnimatingTokens.isEmpty() || !mFinishedTokens.isEmpty()) {
+ pw.print(prefix); pw.println(header);
+ prefix = prefix + " ";
+ pw.print(prefix); pw.print("mAnimatingTokens="); pw.println(mAnimatingTokens);
+ pw.print(prefix); pw.print("mFinishedTokens="); pw.println(mFinishedTokens);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 41ae48a..c6f156b 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -34,6 +34,8 @@
import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND;
import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_UNSET;
import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE;
import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE;
@@ -114,6 +116,7 @@
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
+import com.android.internal.R;
import com.android.internal.util.DumpUtils.Dump;
import com.android.server.AttributeCache;
import com.android.server.wm.WindowManagerService.H;
@@ -1652,14 +1655,26 @@
+ " Callers=" + Debug.getCallers(3));
}
} else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_OPEN_CROSS_PROFILE_APPS && enter) {
-
- a = loadAnimationRes("android", enter
- ? com.android.internal.R.anim.task_open_enter_cross_profile_apps
- : com.android.internal.R.anim.task_open_exit);
+ a = loadAnimationRes("android",
+ com.android.internal.R.anim.task_open_enter_cross_profile_apps);
Slog.v(TAG,
"applyAnimation NEXT_TRANSIT_TYPE_OPEN_CROSS_PROFILE_APPS:"
+ " anim=" + a + " transit=" + appTransitionToString(transit)
- + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3));
+ + " isEntrance=true" + " Callers=" + Debug.getCallers(3));
+ } else if (transit == TRANSIT_TRANSLUCENT_ACTIVITY_OPEN && enter) {
+ a = loadAnimationRes("android",
+ com.android.internal.R.anim.activity_translucent_open_enter);
+ Slog.v(TAG,
+ "applyAnimation TRANSIT_TRANSLUCENT_ACTIVITY_OPEN:"
+ + " anim=" + a + " transit=" + appTransitionToString(transit)
+ + " isEntrance=true" + " Callers=" + Debug.getCallers(3));
+ } else if (transit == TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE && !enter) {
+ a = loadAnimationRes("android",
+ com.android.internal.R.anim.activity_translucent_close_exit);
+ Slog.v(TAG,
+ "applyAnimation TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE:"
+ + " anim=" + a + " transit=" + appTransitionToString(transit)
+ + " isEntrance=false" + " Callers=" + Debug.getCallers(3));
} else {
int animAttr = 0;
switch (transit) {
@@ -2001,6 +2016,12 @@
case TRANSIT_KEYGUARD_UNOCCLUDE: {
return "TRANSIT_KEYGUARD_UNOCCLUDE";
}
+ case TRANSIT_TRANSLUCENT_ACTIVITY_OPEN: {
+ return "TRANSIT_TRANSLUCENT_ACTIVITY_OPEN";
+ }
+ case TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE: {
+ return "TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE";
+ }
default: {
return "<UNKNOWN>";
}
@@ -2173,16 +2194,20 @@
|| transit == TRANSIT_KEYGUARD_UNOCCLUDE;
}
- private static boolean isTaskTransit(int transit) {
- return transit == TRANSIT_TASK_OPEN
+ static boolean isTaskTransit(int transit) {
+ return isTaskOpenTransit(transit)
|| transit == TRANSIT_TASK_CLOSE
- || transit == TRANSIT_TASK_OPEN_BEHIND
|| transit == TRANSIT_TASK_TO_BACK
- || transit == TRANSIT_TASK_TO_FRONT
|| transit == TRANSIT_TASK_IN_PLACE;
}
- private static boolean isActivityTransit(int transit) {
+ private static boolean isTaskOpenTransit(int transit) {
+ return transit == TRANSIT_TASK_OPEN
+ || transit == TRANSIT_TASK_OPEN_BEHIND
+ || transit == TRANSIT_TASK_TO_FRONT;
+ }
+
+ static boolean isActivityTransit(int transit) {
return transit == TRANSIT_ACTIVITY_OPEN
|| transit == TRANSIT_ACTIVITY_CLOSE
|| transit == TRANSIT_ACTIVITY_RELAUNCH;
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 85436da..f19c554 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1485,7 +1485,7 @@
if (w == null || winHint != null && w != winHint) {
return;
}
- final boolean surfaceReady = w.hasDrawnLw() // Regular case
+ final boolean surfaceReady = w.isDrawnLw() // Regular case
|| w.mWinAnimator.mSurfaceDestroyDeferred // The preserved surface is still ready.
|| w.isDragResizeChanged(); // Waiting for relayoutWindow to call preserveSurface.
final boolean needsLetterbox = w.isLetterboxedAppWindow() && fillsParent() && surfaceReady;
@@ -1660,6 +1660,10 @@
true /* topToBottom */);
}
+ SurfaceControl getAppAnimationLayer() {
+ return getAppAnimationLayer(needsZBoost());
+ }
+
@Override
public SurfaceControl getAnimationLeashParent() {
// All normal app transitions take place in an animation layer which is below the pinned
@@ -1855,7 +1859,7 @@
leash.setLayer(layer);
final DisplayContent dc = getDisplayContent();
- dc.assignStackOrdering(t);
+ dc.assignStackOrdering();
if (mAnimatingAppWindowTokenRegistry != null) {
mAnimatingAppWindowTokenRegistry.notifyStarting(this);
}
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index d000bb6..1f95868 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -110,6 +110,11 @@
SurfaceAnimator mSurfaceAnimator;
/**
+ * Determines whether the dim layer should animate before destroying.
+ */
+ boolean mAnimateExit = true;
+
+ /**
* Used for Dims not associated with a WindowContainer. See {@link Dimmer#dimAbove} for
* details on Dim lifecycle.
*/
@@ -260,6 +265,12 @@
}
}
+ void dontAnimateExit() {
+ if (mDimState != null) {
+ mDimState.mAnimateExit = false;
+ }
+ }
+
/**
* Call after invoking {@link WindowContainer#prepareSurfaces} on children as
* described in {@link #resetDimStates}.
@@ -274,7 +285,11 @@
}
if (!mDimState.mDimming) {
- startDimExit(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t);
+ if (!mDimState.mAnimateExit) {
+ t.destroy(mDimState.mDimLayer);
+ } else {
+ startDimExit(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t);
+ }
mDimState = null;
return false;
} else {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3e47ea6..c4f2bd4 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -385,6 +385,11 @@
*/
private int mSurfaceSize;
+ /**
+ * Sequence number for the current layout pass.
+ */
+ int mLayoutSeq = 0;
+
/** Temporary float array to retrieve 3x3 matrix values. */
private final float[] mTmpFloats = new float[9];
@@ -554,7 +559,7 @@
w.prelayout();
final boolean firstLayout = !w.isLaidOut();
mService.mPolicy.layoutWindowLw(w, null, mDisplayFrames);
- w.mLayoutSeq = mService.mLayoutSeq;
+ w.mLayoutSeq = mLayoutSeq;
// If this is the first layout, we need to initialize the last inset values as
// otherwise we'd immediately cause an unnecessary resize.
@@ -593,7 +598,7 @@
w.mLayoutNeeded = false;
w.prelayout();
mService.mPolicy.layoutWindowLw(w, w.getParentWindow(), mDisplayFrames);
- w.mLayoutSeq = mService.mLayoutSeq;
+ w.mLayoutSeq = mLayoutSeq;
if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame=" + w.mFrame
+ " mContainingFrame=" + w.mContainingFrame
+ " mDisplayFrame=" + w.mDisplayFrame);
@@ -904,6 +909,7 @@
return mRotation;
}
+ @VisibleForTesting
void setRotation(int newRotation) {
mRotation = newRotation;
}
@@ -969,7 +975,11 @@
final int oldRotation = mRotation;
final int lastOrientation = mLastOrientation;
final boolean oldAltOrientation = mAltOrientation;
- int rotation = mService.mPolicy.rotationForOrientationLw(lastOrientation, oldRotation);
+ final int rotation = mService.mPolicy.rotationForOrientationLw(lastOrientation, oldRotation,
+ isDefaultDisplay);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Computed rotation=" + rotation + " for display id="
+ + mDisplayId + " based on lastOrientation=" + lastOrientation
+ + " and oldRotation=" + oldRotation);
boolean mayRotateSeamlessly = mService.mPolicy.shouldRotateSeamlessly(oldRotation,
rotation);
@@ -1005,7 +1015,8 @@
final boolean altOrientation = !mService.mPolicy.rotationHasCompatibleMetricsLw(
lastOrientation, rotation);
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Selected orientation " + lastOrientation
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ + " selected orientation " + lastOrientation
+ ", got rotation " + rotation + " which has "
+ (altOrientation ? "incompatible" : "compatible") + " metrics");
@@ -1014,7 +1025,8 @@
return false;
}
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Rotation changed to " + rotation
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ + " rotation changed to " + rotation
+ (altOrientation ? " (alt)" : "") + " from " + oldRotation
+ (oldAltOrientation ? " (alt)" : "") + ", lastOrientation=" + lastOrientation);
@@ -1642,8 +1654,8 @@
if (mService.mDisplayFrozen) {
if (mLastWindowForcedOrientation != SCREEN_ORIENTATION_UNSPECIFIED) {
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "Display is frozen, return " + mLastWindowForcedOrientation);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ + " is frozen, return " + mLastWindowForcedOrientation);
// If the display is frozen, some activities may be in the middle of restarting, and
// thus have removed their old window. If the window has the flag to hide the lock
// screen, then the lock screen can re-appear and inflict its own orientation on us.
@@ -1655,8 +1667,8 @@
// window. We don't want to check the show when locked window directly though as
// things aren't stable while the display is frozen, for example the window could be
// momentarily unavailable due to activity relaunch.
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display is frozen while keyguard locked, "
- + "return " + mLastOrientation);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display id=" + mDisplayId
+ + " is frozen while keyguard locked, return " + mLastOrientation);
return mLastOrientation;
}
} else {
@@ -2219,6 +2231,9 @@
pw.println(" mTouchExcludeRegion=" + mTouchExcludeRegion);
pw.println();
+ pw.print(prefix); pw.print("mLayoutSeq="); pw.println(mLayoutSeq);
+
+ pw.println();
pw.println(prefix + "Application tokens in top down Z order:");
for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
final TaskStack stack = mTaskStackContainers.getChildAt(stackNdx);
@@ -2649,6 +2664,8 @@
// wallpaper, don't bother waiting for it
boolean wallpaperEnabled = mService.mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enableWallpaperService)
+ && mService.mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_checkWallpaperAtBoot)
&& !mService.mOnlyCore;
if (DEBUG_SCREEN_ON || DEBUG_BOOT) Slog.i(TAG_WM,
@@ -2927,9 +2944,9 @@
mService.mScreenRect.set(0, 0, dw, dh);
}
- int seq = mService.mLayoutSeq + 1;
+ int seq = mLayoutSeq + 1;
if (seq < 0) seq = 0;
- mService.mLayoutSeq = seq;
+ mLayoutSeq = seq;
// Used to indicate that we have processed the dream window and all additional windows are
// behind it.
@@ -3172,6 +3189,7 @@
* A control placed at the appropriate level for transitions to occur.
*/
SurfaceControl mAppAnimationLayer = null;
+ SurfaceControl mBoostedAppAnimationLayer = null;
/**
* Given that the split-screen divider does not have an AppWindowToken, it
@@ -3494,19 +3512,22 @@
// In a car, you cannot physically rotate the screen, so it doesn't make sense to
// allow anything but the default orientation.
if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "Forcing UNSPECIFIED orientation in car. Ignoring " + orientation);
+ "Forcing UNSPECIFIED orientation in car for display id=" + mDisplayId
+ + ". Ignoring " + orientation);
return SCREEN_ORIENTATION_UNSPECIFIED;
}
if (orientation != SCREEN_ORIENTATION_UNSET
&& orientation != SCREEN_ORIENTATION_BEHIND) {
if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "App is requesting an orientation, return " + orientation);
+ "App is requesting an orientation, return " + orientation
+ + " for display id=" + mDisplayId);
return orientation;
}
if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "No app is requesting an orientation, return " + mLastOrientation);
+ "No app is requesting an orientation, return " + mLastOrientation
+ + " for display id=" + mDisplayId);
// The next app has not been requested to be visible, so we keep the current orientation
// to prevent freezing/unfreezing the display too early.
return mLastOrientation;
@@ -3523,12 +3544,14 @@
}
void assignStackOrdering(SurfaceControl.Transaction t) {
+
final int HOME_STACK_STATE = 0;
final int NORMAL_STACK_STATE = 1;
final int ALWAYS_ON_TOP_STATE = 2;
int layer = 0;
int layerForAnimationLayer = 0;
+ int layerForBoostedAnimationLayer = 0;
for (int state = 0; state <= ALWAYS_ON_TOP_STATE; state++) {
for (int i = 0; i < mChildren.size(); i++) {
@@ -3550,16 +3573,22 @@
// highest animating stack and no higher.
layerForAnimationLayer = layer++;
}
+ if (state != ALWAYS_ON_TOP_STATE) {
+ layerForBoostedAnimationLayer = layer++;
+ }
}
}
if (mAppAnimationLayer != null) {
t.setLayer(mAppAnimationLayer, layerForAnimationLayer);
}
+ if (mBoostedAppAnimationLayer != null) {
+ t.setLayer(mBoostedAppAnimationLayer, layerForBoostedAnimationLayer);
+ }
}
@Override
- SurfaceControl getAppAnimationLayer() {
- return mAppAnimationLayer;
+ SurfaceControl getAppAnimationLayer(boolean boosted) {
+ return boosted ? mBoostedAppAnimationLayer : mAppAnimationLayer;
}
SurfaceControl getSplitScreenDividerAnchor() {
@@ -3573,16 +3602,22 @@
mAppAnimationLayer = makeChildSurface(null)
.setName("animationLayer")
.build();
+ mBoostedAppAnimationLayer = makeChildSurface(null)
+ .setName("boostedAnimationLayer")
+ .build();
mSplitScreenDividerAnchor = makeChildSurface(null)
.setName("splitScreenDividerAnchor")
.build();
getPendingTransaction()
.show(mAppAnimationLayer)
+ .show(mBoostedAppAnimationLayer)
.show(mSplitScreenDividerAnchor);
scheduleAnimation();
} else {
mAppAnimationLayer.destroy();
mAppAnimationLayer = null;
+ mBoostedAppAnimationLayer.destroy();
+ mBoostedAppAnimationLayer = null;
mSplitScreenDividerAnchor.destroy();
mSplitScreenDividerAnchor = null;
}
@@ -3685,7 +3720,8 @@
return SCREEN_ORIENTATION_UNSET;
}
}
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req
+ + " for display id=" + mDisplayId);
return (mLastWindowForcedOrientation = req);
}
@@ -3864,7 +3900,7 @@
super.prepareSurfaces();
}
- void assignStackOrdering(SurfaceControl.Transaction t) {
- mTaskStackContainers.assignStackOrdering(t);
+ void assignStackOrdering() {
+ mTaskStackContainers.assignStackOrdering(getPendingTransaction());
}
}
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 19d6691..7274aee 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -34,6 +34,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Binder;
+import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -41,7 +42,6 @@
import android.util.Slog;import android.util.proto.ProtoOutputStream;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import android.util.proto.ProtoOutputStream;
import android.view.IRecentsAnimationController;
import android.view.IRecentsAnimationRunner;
import android.view.RemoteAnimationTarget;
@@ -51,6 +51,7 @@
import com.google.android.collect.Sets;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+import com.android.server.wm.utils.InsetUtils;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -61,15 +62,17 @@
* window manager when the animation is completed. In addition, window manager may also notify the
* app if it requires the animation to be canceled at any time (ie. due to timeout, etc.)
*/
-public class RecentsAnimationController {
+public class RecentsAnimationController implements DeathRecipient {
private static final String TAG = TAG_WITH_CLASS_NAME ? "RecentsAnimationController" : TAG_WM;
private static final boolean DEBUG = false;
+ private static final long FAILSAFE_DELAY = 1000;
private final WindowManagerService mService;
private final IRecentsAnimationRunner mRunner;
private final RecentsAnimationCallbacks mCallbacks;
private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>();
private final int mDisplayId;
+ private final Runnable mFailsafeRunnable = this::cancelAnimation;
// The recents component app token that is shown behind the visibile tasks
private AppWindowToken mHomeAppToken;
@@ -223,6 +226,13 @@
return;
}
+ try {
+ mRunner.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ cancelAnimation();
+ return;
+ }
+
// Adjust the wallpaper visibility for the showing home activity
final AppWindowToken recentsComponentAppToken =
dc.getHomeStack().getTopChild().getTopFullscreenAppToken();
@@ -296,6 +306,7 @@
// We've already canceled the animation
return;
}
+ mService.mH.removeCallbacks(mFailsafeRunnable);
mCanceled = true;
try {
mRunner.onAnimationCanceled();
@@ -308,20 +319,34 @@
mCallbacks.onAnimationFinished(false /* moveHomeToTop */);
}
- void cleanupAnimation() {
+ void cleanupAnimation(boolean moveHomeToTop) {
if (DEBUG) Log.d(TAG, "cleanupAnimation(): mPendingAnimations="
+ mPendingAnimations.size());
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
final TaskAnimationAdapter adapter = mPendingAnimations.get(i);
adapter.mTask.setCanAffectSystemUiFlags(true);
+ if (moveHomeToTop) {
+ adapter.mTask.dontAnimateDimExit();
+ }
adapter.mCapturedFinishCallback.onAnimationFinished(adapter);
}
mPendingAnimations.clear();
+ mRunner.asBinder().unlinkToDeath(this, 0);
+
mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
mService.destroyInputConsumer(INPUT_CONSUMER_RECENTS_ANIMATION);
}
+ void scheduleFailsafe() {
+ mService.mH.postDelayed(mFailsafeRunnable, FAILSAFE_DELAY);
+ }
+
+ @Override
+ public void binderDied() {
+ cancelAnimation();
+ }
+
void checkAnimationReady(WallpaperController wallpaperController) {
if (mPendingStart) {
final boolean wallpaperReady = !isHomeAppOverWallpaper()
@@ -400,9 +425,11 @@
if (mainWindow == null) {
return null;
}
+ final Rect insets = new Rect(mainWindow.mContentInsets);
+ InsetUtils.addInsets(insets, mainWindow.mAppToken.getLetterboxInsets());
mTarget = new RemoteAnimationTarget(mTask.mTaskId, MODE_CLOSING, mCapturedLeash,
!mTask.fillsParent(), mainWindow.mWinAnimator.mLastClipRect,
- mainWindow.mContentInsets, mTask.getPrefixOrderIndex(), position, bounds,
+ insets, mTask.getPrefixOrderIndex(), position, bounds,
mTask.getWindowConfiguration(), mIsRecentTaskInvisible);
return mTarget;
}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index c590067..3be7b235 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -16,15 +16,17 @@
package com.android.server.wm;
+import static com.android.server.wm.AnimationAdapterProto.REMOTE;
+import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.AnimationAdapterProto.REMOTE;
-import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.Binder;
import android.os.Handler;
+import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Slog;
@@ -37,6 +39,7 @@
import com.android.internal.util.FastPrintWriter;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+import com.android.server.wm.utils.InsetUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -45,7 +48,7 @@
/**
* Helper class to run app animations in a remote process.
*/
-class RemoteAnimationController {
+class RemoteAnimationController implements DeathRecipient {
private static final String TAG = TAG_WITH_CLASS_NAME ? "RemoteAnimationController" : TAG_WM;
private static final long TIMEOUT_MS = 2000;
@@ -54,12 +57,10 @@
private final ArrayList<RemoteAnimationAdapterWrapper> mPendingAnimations = new ArrayList<>();
private final Rect mTmpRect = new Rect();
private final Handler mHandler;
- private FinishedCallback mFinishedCallback;
+ private final Runnable mTimeoutRunnable = this::cancelAnimation;
- private final Runnable mTimeoutRunnable = () -> {
- onAnimationFinished();
- invokeAnimationCancelled();
- };
+ private FinishedCallback mFinishedCallback;
+ private boolean mCanceled;
RemoteAnimationController(WindowManagerService service,
RemoteAnimationAdapter remoteAnimationAdapter, Handler handler) {
@@ -88,7 +89,7 @@
* Called when the transition is ready to be started, and all leashes have been set up.
*/
void goodToGo() {
- if (mPendingAnimations.isEmpty()) {
+ if (mPendingAnimations.isEmpty() || mCanceled) {
onAnimationFinished();
return;
}
@@ -105,8 +106,8 @@
}
mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
try {
- mRemoteAnimationAdapter.getRunner().onAnimationStart(animations,
- mFinishedCallback);
+ mRemoteAnimationAdapter.getRunner().asBinder().linkToDeath(this, 0);
+ mRemoteAnimationAdapter.getRunner().onAnimationStart(animations, mFinishedCallback);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to start remote animation", e);
onAnimationFinished();
@@ -118,6 +119,17 @@
}
}
+ private void cancelAnimation() {
+ synchronized (mService.getWindowManagerLock()) {
+ if (mCanceled) {
+ return;
+ }
+ mCanceled = true;
+ }
+ onAnimationFinished();
+ invokeAnimationCancelled();
+ }
+
private void writeStartDebugStatement() {
Slog.i(TAG, "Starting remote animation");
final StringWriter sw = new StringWriter();
@@ -132,11 +144,18 @@
private RemoteAnimationTarget[] createAnimations() {
final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>();
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
+ final RemoteAnimationAdapterWrapper wrapper = mPendingAnimations.get(i);
final RemoteAnimationTarget target =
mPendingAnimations.get(i).createRemoteAppAnimation();
if (target != null) {
targets.add(target);
} else {
+
+ // We can't really start an animation but we still need to make sure to finish the
+ // pending animation that was started by SurfaceAnimator
+ if (wrapper.mCapturedFinishCallback != null) {
+ wrapper.mCapturedFinishCallback.onAnimationFinished(wrapper);
+ }
mPendingAnimations.remove(i);
}
}
@@ -145,6 +164,7 @@
private void onAnimationFinished() {
mHandler.removeCallbacks(mTimeoutRunnable);
+ mRemoteAnimationAdapter.getRunner().asBinder().unlinkToDeath(this, 0);
synchronized (mService.mWindowMap) {
releaseFinishedCallback();
mService.openSurfaceTransaction();
@@ -184,6 +204,11 @@
mService.sendSetRunningRemoteAnimation(pid, running);
}
+ @Override
+ public void binderDied() {
+ cancelAnimation();
+ }
+
private static final class FinishedCallback extends IRemoteAnimationFinishedCallback.Stub {
RemoteAnimationController mOuter;
@@ -194,12 +219,17 @@
@Override
public void onAnimationFinished() throws RemoteException {
- if (mOuter != null) {
- mOuter.onAnimationFinished();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (mOuter != null) {
+ mOuter.onAnimationFinished();
- // In case the client holds on to the finish callback, make sure we don't leak
- // RemoteAnimationController which in turn would leak the runner on the client.
- mOuter = null;
+ // In case the client holds on to the finish callback, make sure we don't leak
+ // RemoteAnimationController which in turn would leak the runner on the client.
+ mOuter = null;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
@@ -235,9 +265,11 @@
|| mCapturedLeash == null) {
return null;
}
+ final Rect insets = new Rect(mainWindow.mContentInsets);
+ InsetUtils.addInsets(insets, mAppWindowToken.getLetterboxInsets());
mTarget = new RemoteAnimationTarget(task.mTaskId, getMode(),
mCapturedLeash, !mAppWindowToken.fillsParent(),
- mainWindow.mWinAnimator.mLastClipRect, mainWindow.mContentInsets,
+ mainWindow.mWinAnimator.mLastClipRect, insets,
mAppWindowToken.getPrefixOrderIndex(), mPosition, mStackBounds,
task.getWindowConfiguration(), false /*isNotInRecents*/);
return mTarget;
diff --git a/services/core/java/com/android/server/wm/StrictModeFlash.java b/services/core/java/com/android/server/wm/StrictModeFlash.java
index f51a6a9..e97b366 100644
--- a/services/core/java/com/android/server/wm/StrictModeFlash.java
+++ b/services/core/java/com/android/server/wm/StrictModeFlash.java
@@ -79,17 +79,25 @@
}
// Top
- c.clipRect(new Rect(0, 0, dw, mThickness), Region.Op.REPLACE);
+ c.save();
+ c.clipRect(new Rect(0, 0, dw, mThickness));
c.drawColor(Color.RED);
+ c.restore();
// Left
- c.clipRect(new Rect(0, 0, mThickness, dh), Region.Op.REPLACE);
+ c.save();
+ c.clipRect(new Rect(0, 0, mThickness, dh));
c.drawColor(Color.RED);
+ c.restore();
// Right
- c.clipRect(new Rect(dw - mThickness, 0, dw, dh), Region.Op.REPLACE);
+ c.save();
+ c.clipRect(new Rect(dw - mThickness, 0, dw, dh));
c.drawColor(Color.RED);
+ c.restore();
// Bottom
- c.clipRect(new Rect(0, dh - mThickness, dw, dh), Region.Op.REPLACE);
+ c.save();
+ c.clipRect(new Rect(0, dh - mThickness, dw, dh));
c.drawColor(Color.RED);
+ c.restore();
mSurface.unlockCanvasAndPost(c);
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index e4722f9..e8d3210 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -645,6 +645,10 @@
return mCanAffectSystemUiFlags;
}
+ void dontAnimateDimExit() {
+ mDimmer.dontAnimateExit();
+ }
+
@Override
public String toString() {
return "{taskId=" + mTaskId + " appTokens=" + mChildren + " mdr=" + mDeferRemoval + "}";
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 970a8d7..5f9d679 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -27,7 +27,6 @@
import android.app.ActivityManager.TaskSnapshot;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
-import android.graphics.Color;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Environment;
@@ -45,6 +44,7 @@
import com.android.server.policy.WindowManagerPolicy.ScreenOffListener;
import com.android.server.policy.WindowManagerPolicy.StartingSurface;
import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter;
+import com.android.server.wm.utils.InsetUtils;
import com.google.android.collect.Sets;
@@ -273,7 +273,7 @@
return null;
}
return new TaskSnapshot(buffer, top.getConfiguration().orientation,
- getInsetsFromTaskBounds(mainWindow, task),
+ getInsets(mainWindow),
isLowRamDevice /* reduced */, scaleFraction /* scale */,
true /* isRealSnapshot */);
}
@@ -282,11 +282,11 @@
return mIsRunningOnWear || mIsRunningOnTv || mIsRunningOnIoT;
}
- private Rect getInsetsFromTaskBounds(WindowState state, Task task) {
+ private Rect getInsets(WindowState state) {
// XXX(b/72757033): These are insets relative to the window frame, but we're really
// interested in the insets relative to the task bounds.
- Rect insets = minRect(state.mContentInsets, state.mStableInsets);
- insets = maxRect(insets, state.mAppToken.getLetterboxInsets());
+ final Rect insets = minRect(state.mContentInsets, state.mStableInsets);
+ InsetUtils.addInsets(insets, state.mAppToken.getLetterboxInsets());
return insets;
}
@@ -297,13 +297,6 @@
Math.min(rect1.bottom, rect2.bottom));
}
- private Rect maxRect(Rect rect1, Rect rect2) {
- return new Rect(Math.max(rect1.left, rect2.left),
- Math.max(rect1.top, rect2.top),
- Math.max(rect1.right, rect2.right),
- Math.max(rect1.bottom, rect2.bottom));
- }
-
/**
* Retrieves all closing tasks based on the list of closing apps during an app transition.
*/
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 900e2df..62754ad 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -1387,6 +1387,7 @@
token.dump(pw, " ", dumpAll);
}
}
+ mAnimatingAppWindowTokenRegistry.dump(pw, "AnimatingApps:", prefix);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 28fdaae..60e7c0d 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -1125,12 +1125,15 @@
}
/**
+ * @param boosted If true, returns an animation layer that happens above all {@link TaskStack}s
+ * Otherwise, the layer will be positioned above all animating
+ * {@link TaskStack}s.
* @return The layer on which all app animations are happening.
*/
- SurfaceControl getAppAnimationLayer() {
+ SurfaceControl getAppAnimationLayer(boolean boosted) {
final WindowContainer parent = getParent();
if (parent != null) {
- return parent.getAppAnimationLayer();
+ return parent.getAppAnimationLayer(boosted);
}
return null;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 6bceda5..6686b80 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -419,4 +419,10 @@
* @see android.view.IWindowManager#lockNow
*/
public abstract void lockNow();
+
+ /**
+ * Return the user that owns the given window, {@link android.os.UserHandle#USER_NULL} if
+ * the window token is not found.
+ */
+ public abstract int getWindowOwnerUserId(IBinder windowToken);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 56b314f..f1cd46b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -25,12 +25,10 @@
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.StatusBarManager.DISABLE_MASK;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
-import static android.content.Intent.EXTRA_USER_HANDLE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.myPid;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
-import static android.os.UserHandle.USER_NULL;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.DOCKED_INVALID;
@@ -181,7 +179,6 @@
import android.util.MergedConfiguration;
import android.util.Pair;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.TimeUtils;
@@ -596,8 +593,6 @@
boolean mClientFreezingScreen = false;
int mAppsFreezingScreen = 0;
- int mLayoutSeq = 0;
-
// Last systemUiVisibility we received from status bar.
int mLastStatusBarVisibility = 0;
// Last systemUiVisibility we dispatched to windows.
@@ -2425,8 +2420,8 @@
final int oldRotation = defaultDisplayContent.getRotation();
final boolean oldAltOrientation = defaultDisplayContent.getAltOrientation();
- final int rotation = mPolicy.rotationForOrientationLw(lastOrientation,
- oldRotation);
+ final int rotation = mPolicy.rotationForOrientationLw(lastOrientation, oldRotation,
+ true /* defaultDisplay */);
boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
lastOrientation, rotation);
if (oldRotation == rotation && oldAltOrientation == altOrientation) {
@@ -2702,10 +2697,10 @@
}
}
- public void cleanupRecentsAnimation() {
+ public void cleanupRecentsAnimation(boolean moveHomeToTop) {
synchronized (mWindowMap) {
if (mRecentsAnimationController != null) {
- mRecentsAnimationController.cleanupAnimation();
+ mRecentsAnimationController.cleanupAnimation(moveHomeToTop);
mRecentsAnimationController = null;
mAppTransition.updateBooster();
}
@@ -2795,6 +2790,11 @@
mTaskSnapshotController.screenTurningOff(listener);
}
+ @Override
+ public void triggerAnimationFailsafe() {
+ mH.sendEmptyMessage(H.ANIMATION_FAILSAFE);
+ }
+
/**
* Starts deferring layout passes. Useful when doing multiple changes but to optimize
* performance, only one layout pass should be done. This can be called multiple times, and
@@ -4568,6 +4568,7 @@
public static final int NOTIFY_KEYGUARD_TRUSTED_CHANGED = 57;
public static final int SET_HAS_OVERLAY_UI = 58;
public static final int SET_RUNNING_REMOTE_ANIMATION = 59;
+ public static final int ANIMATION_FAILSAFE = 60;
/**
* Used to denote that an integer field in a message will not be used.
@@ -4986,6 +4987,14 @@
mAmInternal.setRunningRemoteAnimation(msg.arg1, msg.arg2 == 1);
}
break;
+ case ANIMATION_FAILSAFE: {
+ synchronized (mWindowMap) {
+ if (mRecentsAnimationController != null) {
+ mRecentsAnimationController.scheduleFailsafe();
+ }
+ }
+ }
+ break;
}
if (DEBUG_WINDOW_TRACE) {
Slog.v(TAG_WM, "handleMessage: exit");
@@ -6344,8 +6353,7 @@
if (mInputMethodTarget != null) {
pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget);
}
- pw.print(" mInTouchMode="); pw.print(mInTouchMode);
- pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
+ pw.print(" mInTouchMode="); pw.println(mInTouchMode);
pw.print(" mLastDisplayFreezeDuration=");
TimeUtils.formatDuration(mLastDisplayFreezeDuration, pw);
if ( mLastFinishedFreezeSource != null) {
@@ -7354,6 +7362,17 @@
public void lockNow() {
WindowManagerService.this.lockNow(null);
}
+
+ @Override
+ public int getWindowOwnerUserId(IBinder token) {
+ synchronized (mWindowMap) {
+ WindowState window = mWindowMap.get(token);
+ if (window != null) {
+ return UserHandle.getUserId(window.mOwnerUid);
+ }
+ return UserHandle.USER_NULL;
+ }
+ }
}
void registerAppFreezeListener(AppFreezeListener listener) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 993556f..54c2e9b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -897,7 +897,7 @@
}
final WindowState imeWin = mService.mInputMethodWindow;
// IME is up and obscuring this window. Adjust the window position so it is visible.
- if (imeWin != null && imeWin.isVisibleNow() && mService.mInputMethodTarget == this) {
+ if (imeWin != null && imeWin.isVisibleNow() && isInputMethodTarget()) {
if (inFreeformWindowingMode()
&& mContainingFrame.bottom > contentFrame.bottom) {
// In freeform we want to move the top up directly.
@@ -1236,7 +1236,7 @@
*/
void updateResizingWindowIfNeeded() {
final WindowStateAnimator winAnimator = mWinAnimator;
- if (!mHasSurface || mService.mLayoutSeq != mLayoutSeq || isGoneForLayoutLw()) {
+ if (!mHasSurface || getDisplayContent().mLayoutSeq != mLayoutSeq || isGoneForLayoutLw()) {
return;
}
@@ -1360,6 +1360,15 @@
return mToken.getDisplayContent();
}
+ @Override
+ void onDisplayChanged(DisplayContent dc) {
+ super.onDisplayChanged(dc);
+ // Window was not laid out for this display yet, so make sure mLayoutSeq does not match.
+ if (dc != null) {
+ mLayoutSeq = dc.mLayoutSeq - 1;
+ }
+ }
+
DisplayInfo getDisplayInfo() {
final DisplayContent displayContent = getDisplayContent();
return displayContent != null ? displayContent.getDisplayInfo() : null;
@@ -1682,13 +1691,6 @@
return changed;
}
- // Next up we will notify the client that it's visibility has changed.
- // We need to prevent it from destroying child surfaces until
- // the animation has finished.
- if (!visible && isVisibleNow()) {
- mWinAnimator.detachChildren();
- }
-
if (visible != isVisibleNow()) {
if (!runningAppAnimation) {
final AccessibilityController accessibilityController =
@@ -1876,7 +1878,7 @@
}
final DisplayContent dc = getDisplayContent();
- if (mService.mInputMethodTarget == this) {
+ if (isInputMethodTarget()) {
dc.computeImeTarget(true /* updateImeTarget */);
}
@@ -3940,7 +3942,7 @@
private boolean applyInOrderWithImeWindows(ToBooleanFunction<WindowState> callback,
boolean traverseTopToBottom) {
if (traverseTopToBottom) {
- if (mService.mInputMethodTarget == this) {
+ if (isInputMethodTarget()) {
// This window is the current IME target, so we need to process the IME windows
// directly above it.
if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -3954,7 +3956,7 @@
if (callback.apply(this)) {
return true;
}
- if (mService.mInputMethodTarget == this) {
+ if (isInputMethodTarget()) {
// This window is the current IME target, so we need to process the IME windows
// directly above it.
if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -4664,7 +4666,7 @@
void assignLayer(Transaction t, int layer) {
// See comment in assignRelativeLayerForImeTargetChild
if (!isChildWindow()
- || (mService.mInputMethodTarget != getParentWindow())
+ || (!getParentWindow().isInputMethodTarget())
|| !inSplitScreenWindowingMode()) {
super.assignLayer(t, layer);
return;
@@ -4732,6 +4734,11 @@
mTapExcludeRegionHolder.amendRegion(region, getBounds());
}
+ @Override
+ public boolean isInputMethodTarget() {
+ return mService.mInputMethodTarget == this;
+ }
+
private final class MoveAnimationSpec implements AnimationSpec {
private final long mDuration;
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 3256762..b85f4a4 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -16,12 +16,13 @@
package com.android.server.wm;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT;
import static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
import static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
@@ -42,6 +43,7 @@
import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN;
import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN;
import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
+import static com.android.server.wm.AppTransition.isTaskTransit;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
@@ -61,16 +63,15 @@
import android.view.Display;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationDefinition;
-import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.TransitionType;
import android.view.animation.Animation;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.function.Predicate;
/**
@@ -288,6 +289,7 @@
final boolean closingAppHasWallpaper = canBeWallpaperTarget(mService.mClosingApps)
&& hasWallpaperTarget;
+ transit = maybeUpdateTransitToTranslucentAnim(transit);
transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
closingAppHasWallpaper);
@@ -676,8 +678,9 @@
transit = TRANSIT_WALLPAPER_CLOSE;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
+ AppTransition.appTransitionToString(transit));
- } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() &&
- openingApps.contains(wallpaperTarget.mAppToken)) {
+ } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()
+ && openingApps.contains(wallpaperTarget.mAppToken)
+ && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE) {
// We are transitioning from an activity without
// a wallpaper to now showing the wallpaper
transit = TRANSIT_WALLPAPER_OPEN;
@@ -688,6 +691,50 @@
return transit;
}
+ /**
+ * There are cases where we open/close a new task/activity, but in reality only a translucent
+ * activity on top of existing activities is opening/closing. For that one, we have a different
+ * animation because non of the task/activity animations actually work well with translucent
+ * apps.
+ *
+ * @param transit The current transition type.
+ * @return The current transition type or
+ * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE}/
+ * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_OPEN} if appropriate for the
+ * situation.
+ */
+ @VisibleForTesting
+ int maybeUpdateTransitToTranslucentAnim(int transit) {
+ final boolean taskOrActivity = AppTransition.isTaskTransit(transit)
+ || AppTransition.isActivityTransit(transit);
+ boolean allOpeningVisible = true;
+ boolean allTranslucentOpeningApps = !mService.mOpeningApps.isEmpty();
+ for (int i = mService.mOpeningApps.size() - 1; i >= 0; i--) {
+ final AppWindowToken token = mService.mOpeningApps.valueAt(i);
+ if (!token.isVisible()) {
+ allOpeningVisible = false;
+ if (token.fillsParent()) {
+ allTranslucentOpeningApps = false;
+ }
+ }
+ }
+ boolean allTranslucentClosingApps = !mService.mClosingApps.isEmpty();
+ for (int i = mService.mClosingApps.size() - 1; i >= 0; i--) {
+ if (mService.mClosingApps.valueAt(i).fillsParent()) {
+ allTranslucentClosingApps = false;
+ break;
+ }
+ }
+
+ if (taskOrActivity && allTranslucentClosingApps && allOpeningVisible) {
+ return TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+ }
+ if (taskOrActivity && allTranslucentOpeningApps && mService.mClosingApps.isEmpty()) {
+ return TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
+ }
+ return transit;
+ }
+
private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
for (int i = apps.size() - 1; i >= 0; i--) {
if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
diff --git a/services/core/java/com/android/server/wm/utils/InsetUtils.java b/services/core/java/com/android/server/wm/utils/InsetUtils.java
new file mode 100644
index 0000000..b4a998a
--- /dev/null
+++ b/services/core/java/com/android/server/wm/utils/InsetUtils.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm.utils;
+
+import android.graphics.Rect;
+
+/**
+ * Utility methods to handle insets represented as rects.
+ */
+public class InsetUtils {
+
+ private InsetUtils() {
+ }
+
+ /**
+ * Adds {@code insetsToAdd} to {@code inOutInsets}.
+ */
+ public static void addInsets(Rect inOutInsets, Rect insetsToAdd) {
+ inOutInsets.left += insetsToAdd.left;
+ inOutInsets.top += insetsToAdd.top;
+ inOutInsets.right += insetsToAdd.right;
+ inOutInsets.bottom += insetsToAdd.bottom;
+ }
+}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 427b9d2..89efe12 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -86,6 +86,7 @@
"libhardware_legacy",
"libhidlbase",
"libkeystore_binder",
+ "libmtp",
"libnativehelper",
"libutils",
"libui",
diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
index ecf1a33..f7ca363 100644
--- a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
+++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
@@ -231,6 +231,13 @@
return nullptr;
}
bandConfigHal = module.bands[0];
+
+ /* Prefer FM to workaround possible program list fetching limitation
+ * (if tuner scans only configured band for programs). */
+ auto fmIt = std::find_if(module.bands.begin(), module.bands.end(),
+ [](const BandConfig & band) { return utils::isFm(band.type); });
+ if (fmIt != module.bands.end()) bandConfigHal = *fmIt;
+
if (bandConfigHal.spacings.size() > 1) {
bandConfigHal.spacings = hidl_vec<uint32_t>({ *std::min_element(
bandConfigHal.spacings.begin(), bandConfigHal.spacings.end()) });
diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp
index 847222a..61b48c2 100644
--- a/services/core/jni/BroadcastRadio/convert.cpp
+++ b/services/core/jni/BroadcastRadio/convert.cpp
@@ -380,6 +380,7 @@
auto jProduct = make_javastr(env, prop10.product);
auto jVersion = make_javastr(env, prop10.version);
auto jSerial = make_javastr(env, prop10.serial);
+ constexpr bool isInitializationRequired = true;
bool isBgScanSupported = prop11 ? prop11->supportsBackgroundScanning : false;
auto jVendorInfo = prop11 ? VendorInfoFromHal(env, prop11->vendorInfo) : nullptr;
@@ -394,9 +395,9 @@
return make_javaref(env, env->NewObject(gjni.ModuleProperties.clazz,
gjni.ModuleProperties.cstor, moduleId, jServiceName.get(), prop10.classId,
jImplementor.get(), jProduct.get(), jVersion.get(), jSerial.get(), prop10.numTuners,
- prop10.numAudioSources, prop10.supportsCapture, jBands.get(), isBgScanSupported,
- jSupportedProgramTypes.get(), jSupportedIdentifierTypes.get(), nullptr,
- jVendorInfo.get()));
+ prop10.numAudioSources, isInitializationRequired, prop10.supportsCapture, jBands.get(),
+ isBgScanSupported, jSupportedProgramTypes.get(), jSupportedIdentifierTypes.get(),
+ nullptr, jVendorInfo.get()));
}
JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties,
@@ -712,7 +713,7 @@
gjni.ModuleProperties.clazz = MakeGlobalRefOrDie(env, modulePropertiesClass);
gjni.ModuleProperties.cstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>",
"(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;"
- "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z"
+ "Ljava/lang/String;IIZZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z"
"[I[ILjava/util/Map;Ljava/util/Map;)V");
auto programInfoClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$ProgramInfo");
diff --git a/services/core/jni/com_android_server_UsbAlsaJackDetector.cpp b/services/core/jni/com_android_server_UsbAlsaJackDetector.cpp
index e9d4482..ccb4f59 100644
--- a/services/core/jni/com_android_server_UsbAlsaJackDetector.cpp
+++ b/services/core/jni/com_android_server_UsbAlsaJackDetector.cpp
@@ -19,6 +19,7 @@
#include "jni.h"
#include <nativehelper/JNIHelp.h>
+#include "android-base/strings.h"
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
@@ -33,24 +34,36 @@
#define DRIVER_NAME "/dev/usb_accessory"
-#define USB_IN_JACK_NAME "USB in Jack"
-#define USB_OUT_JACK_NAME "USB out Jack"
+#define USB_IN_JACK_SUFFIX "Input Jack"
+#define USB_OUT_JACK_SUFFIX "Output Jack"
namespace android
{
-static jboolean is_jack_connected(jint card, const char* control) {
+static struct mixer_ctl* find_mixer_with_suffix(struct mixer* card_mixer, const char* suffix) {
+ int id = 0;
+ struct mixer_ctl* ctl;
+ while ((ctl = mixer_get_ctl(card_mixer, id++)) != NULL) {
+ const char* name = mixer_ctl_get_name(ctl);
+ if (android::base::EndsWith(name, suffix)) {
+ return ctl;
+ }
+ }
+ return NULL;
+}
+
+static jboolean is_jack_connected(jint card, const char* suffix) {
struct mixer* card_mixer = mixer_open(card);
if (card_mixer == NULL) {
return true;
}
- struct mixer_ctl* ctl = mixer_get_ctl_by_name(card_mixer, control);
+ struct mixer_ctl* ctl = find_mixer_with_suffix(card_mixer, suffix);
if (!ctl) {
return true;
}
mixer_ctl_update(ctl);
int val = mixer_ctl_get_value(ctl, 0);
- ALOGI("JACK %s - value %d\n", control, val);
+ ALOGI("%s - value %d\n", mixer_ctl_get_name(ctl), val);
mixer_close(card_mixer);
return val != 0;
@@ -66,33 +79,31 @@
}
jboolean has_jack = false;
- if ((mixer_get_ctl_by_name(card_mixer, USB_IN_JACK_NAME) != NULL) ||
- (mixer_get_ctl_by_name(card_mixer, USB_OUT_JACK_NAME) != NULL)) {
+ if ((find_mixer_with_suffix(card_mixer, USB_IN_JACK_SUFFIX) != NULL) ||
+ (find_mixer_with_suffix(card_mixer, USB_OUT_JACK_SUFFIX) != NULL)) {
has_jack = true;
}
mixer_close(card_mixer);
return has_jack;
}
-
static jboolean android_server_UsbAlsaJackDetector_inputJackConnected(JNIEnv* /* env */,
jobject /* thiz */,
jint card)
{
- return is_jack_connected(card, USB_IN_JACK_NAME);
+ return is_jack_connected(card, USB_IN_JACK_SUFFIX);
}
-
static jboolean android_server_UsbAlsaJackDetector_outputJackConnected(JNIEnv* /* env */,
jobject /* thiz */,
jint card)
{
- return is_jack_connected(card, USB_OUT_JACK_NAME);
+ return is_jack_connected(card, USB_OUT_JACK_SUFFIX);
}
static void android_server_UsbAlsaJackDetector_jackDetect(JNIEnv* env,
- jobject thiz,
- jint card) {
+ jobject thiz,
+ jint card) {
jclass jdclass = env->GetObjectClass(thiz);
jmethodID method_jackDetectCallback = env->GetMethodID(jdclass, "jackDetectCallback", "()Z");
if (method_jackDetectCallback == NULL) {
diff --git a/services/core/jni/com_android_server_UsbDeviceManager.cpp b/services/core/jni/com_android_server_UsbDeviceManager.cpp
index f37f870..ff1ec04 100644
--- a/services/core/jni/com_android_server_UsbDeviceManager.cpp
+++ b/services/core/jni/com_android_server_UsbDeviceManager.cpp
@@ -21,6 +21,7 @@
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
+#include "MtpDescriptors.h"
#include <stdio.h>
#include <asm/byteorder.h>
@@ -118,6 +119,38 @@
return result;
}
+static jobject android_server_UsbDeviceManager_openControl(JNIEnv *env, jobject /* thiz */, jstring jFunction) {
+ const char *function = env->GetStringUTFChars(jFunction, NULL);
+ bool ptp = false;
+ int fd = -1;
+ if (!strcmp(function, "ptp")) {
+ ptp = true;
+ }
+ if (!strcmp(function, "mtp") || ptp) {
+ fd = TEMP_FAILURE_RETRY(open(ptp ? FFS_PTP_EP0 : FFS_MTP_EP0, O_RDWR));
+ if (fd < 0) {
+ ALOGE("could not open control for %s %s", function, strerror(errno));
+ goto error;
+ }
+ if (!writeDescriptors(fd, ptp)) {
+ goto error;
+ }
+ }
+
+ if (function != NULL) {
+ env->ReleaseStringUTFChars(jFunction, function);
+ }
+ return jniCreateFileDescriptor(env, fd);
+error:
+ if (fd != -1) {
+ close(fd);
+ }
+ if (function != NULL) {
+ env->ReleaseStringUTFChars(jFunction, function);
+ }
+ return NULL;
+}
+
static const JNINativeMethod method_table[] = {
{ "nativeGetAccessoryStrings", "()[Ljava/lang/String;",
(void*)android_server_UsbDeviceManager_getAccessoryStrings },
@@ -127,6 +160,8 @@
(void*)android_server_UsbDeviceManager_isStartRequested },
{ "nativeGetAudioMode", "()I",
(void*)android_server_UsbDeviceManager_getAudioMode },
+ { "nativeOpenControl", "(Ljava/lang/String;)Ljava/io/FileDescriptor;",
+ (void*)android_server_UsbDeviceManager_openControl },
};
int register_android_server_UsbDeviceManager(JNIEnv *env)
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index dcee151..21fea1c 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -1125,6 +1125,16 @@
}
static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
+ gnssHal_V1_1 = IGnss_V1_1::getService();
+ if (gnssHal_V1_1 == nullptr) {
+ ALOGD("gnssHal 1.1 was null, trying 1.0");
+ gnssHal = IGnss_V1_0::getService();
+ } else {
+ gnssHal = gnssHal_V1_1;
+ }
+}
+
+static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass clazz) {
method_reportLocation = env->GetMethodID(clazz, "reportLocation",
"(ZLandroid/location/Location;)V");
method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
@@ -1175,15 +1185,6 @@
LOG_ALWAYS_FATAL("Unable to get Java VM. Error: %d", jvmStatus);
}
- // TODO(b/31632518)
- gnssHal_V1_1 = IGnss_V1_1::getService();
- if (gnssHal_V1_1 == nullptr) {
- ALOGD("gnssHal 1.1 was null, trying 1.0");
- gnssHal = IGnss_V1_0::getService();
- } else {
- gnssHal = gnssHal_V1_1;
- }
-
if (gnssHal != nullptr) {
gnssHalDeathRecipient = new GnssDeathRecipient();
hardware::Return<bool> linked = gnssHal->linkToDeath(
@@ -2068,6 +2069,8 @@
{"native_is_gnss_configuration_supported", "()Z",
reinterpret_cast<void *>(
android_location_gpsLocationProvider_is_gnss_configuration_supported)},
+ {"native_init_once", "()V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_init_once)},
{"native_init", "()Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_init)},
{"native_cleanup", "()V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_cleanup)},
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
index 4020a52..1c9782f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
@@ -78,23 +78,6 @@
return false;
}
- @Override
- public boolean setPasswordBlacklist(ComponentName who, String name, List<String> blacklist,
- boolean parent) {
- return false;
- }
-
- @Override
- public String getPasswordBlacklistName(ComponentName who, @UserIdInt int userId,
- boolean parent) {
- return null;
- }
-
- @Override
- public boolean isPasswordBlacklisted(@UserIdInt int userId, String password) {
- return false;
- }
-
public boolean isUsingUnifiedPassword(ComponentName who) {
return true;
}
@@ -122,12 +105,12 @@
}
@Override
- public List<String> setMeteredDataDisabled(ComponentName admin, List<String> packageNames) {
+ public List<String> setMeteredDataDisabledPackages(ComponentName admin, List<String> packageNames) {
return packageNames;
}
@Override
- public List<String> getMeteredDataDisabled(ComponentName admin) {
+ public List<String> getMeteredDataDisabledPackages(ComponentName admin) {
return new ArrayList<>();
}
@@ -163,7 +146,7 @@
}
@Override
- public boolean isMeteredDataDisabledForUser(ComponentName admin,
+ public boolean isMeteredDataDisabledPackageForUser(ComponentName admin,
String packageName, int userId) {
return false;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2e07703..90e8a9c 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -51,6 +51,7 @@
import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL;
import static android.app.admin.DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED;
import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_HOME;
+import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS;
import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
@@ -566,9 +567,7 @@
}
public static class DevicePolicyData {
- @NonNull PasswordMetrics mActivePasswordMetrics = new PasswordMetrics();
int mFailedPasswordAttempts = 0;
- boolean mPasswordStateHasBeenSetSinceBoot = false;
boolean mPasswordValidAtLastCheckpoint = true;
int mUserHandle;
@@ -592,7 +591,8 @@
List<String> mLockTaskPackages = new ArrayList<>();
// Bitfield of feature flags to be enabled during LockTask mode.
- int mLockTaskFeatures = DevicePolicyManager.LOCK_TASK_FEATURE_NONE;
+ // We default on the power button menu, in order to be consistent with pre-P behaviour.
+ int mLockTaskFeatures = DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS;
boolean mStatusBarDisabled = false;
@@ -628,6 +628,8 @@
}
final SparseArray<DevicePolicyData> mUserData = new SparseArray<>();
+ @GuardedBy("DevicePolicyManagerService.this")
+ final SparseArray<PasswordMetrics> mUserPasswordMetrics = new SparseArray<>();
final Handler mHandler;
final Handler mBackgroundHandler;
@@ -818,7 +820,6 @@
private static final String TAG_PASSWORD_HISTORY_LENGTH = "password-history-length";
private static final String TAG_MIN_PASSWORD_LENGTH = "min-password-length";
private static final String ATTR_VALUE = "value";
- private static final String TAG_PASSWORD_BLACKLIST = "password-blacklist";
private static final String TAG_PASSWORD_QUALITY = "password-quality";
private static final String TAG_POLICIES = "policies";
private static final String TAG_CROSS_PROFILE_WIDGET_PROVIDERS =
@@ -959,9 +960,6 @@
// Default title of confirm credentials screen
String organizationName = null;
- // The blacklist data is stored in a file whose name is stored in the XML
- String passwordBlacklistFile = null;
-
// The component name of the backup transport which has to be used if backups are mandatory
// or null if backups are not mandatory.
ComponentName mandatoryBackupTransport = null;
@@ -1051,11 +1049,6 @@
out.endTag(null, TAG_MIN_PASSWORD_NONLETTER);
}
}
- if (passwordBlacklistFile != null) {
- out.startTag(null, TAG_PASSWORD_BLACKLIST);
- out.attribute(null, ATTR_VALUE, passwordBlacklistFile);
- out.endTag(null, TAG_PASSWORD_BLACKLIST);
- }
if (maximumTimeToUnlock != DEF_MAXIMUM_TIME_TO_UNLOCK) {
out.startTag(null, TAG_MAX_TIME_TO_UNLOCK);
out.attribute(null, ATTR_VALUE, Long.toString(maximumTimeToUnlock));
@@ -1311,8 +1304,6 @@
} else if (TAG_MIN_PASSWORD_NONLETTER.equals(tag)) {
minimumPasswordMetrics.nonLetter = Integer.parseInt(
parser.getAttributeValue(null, ATTR_VALUE));
- } else if (TAG_PASSWORD_BLACKLIST.equals(tag)) {
- passwordBlacklistFile = parser.getAttributeValue(null, ATTR_VALUE);
}else if (TAG_MAX_TIME_TO_UNLOCK.equals(tag)) {
maximumTimeToUnlock = Long.parseLong(
parser.getAttributeValue(null, ATTR_VALUE));
@@ -1587,8 +1578,6 @@
pw.println(minimumPasswordMetrics.symbols);
pw.print(prefix); pw.print("minimumPasswordNonLetter=");
pw.println(minimumPasswordMetrics.nonLetter);
- pw.print(prefix); pw.print("passwordBlacklist=");
- pw.println(passwordBlacklistFile != null);
pw.print(prefix); pw.print("maximumTimeToUnlock=");
pw.println(maximumTimeToUnlock);
pw.print(prefix); pw.print("strongAuthUnlockTimeout=");
@@ -1855,10 +1844,6 @@
return new LockPatternUtils(mContext);
}
- PasswordBlacklist newPasswordBlacklist(File file) {
- return new PasswordBlacklist(file);
- }
-
boolean storageManagerIsFileBasedEncryptionEnabled() {
return StorageManager.isFileEncryptedNativeOnly();
}
@@ -2026,8 +2011,9 @@
Settings.Global.putString(mContext.getContentResolver(), name, value);
}
- void settingsSystemPutString(String name, String value) {
- Settings.System.putString(mContext.getContentResolver(), name, value);
+ void settingsSystemPutStringForUser(String name, String value, int userId) {
+ Settings.System.putStringForUser(
+ mContext.getContentResolver(), name, value, userId);
}
void securityLogSetLoggingEnabledProperty(boolean enabled) {
@@ -2158,6 +2144,16 @@
}
/**
+ * Provides PasswordMetrics object corresponding to the given user.
+ * @param userHandle the user for whom to provide metrics.
+ * @return the user password metrics, or {@code null} if none have been associated with
+ * the user yet (for example, if the device has booted but not been unlocked).
+ */
+ PasswordMetrics getUserPasswordMetricsLocked(int userHandle) {
+ return mUserPasswordMetrics.get(userHandle);
+ }
+
+ /**
* Creates and loads the policy data from xml for data that is shared between
* various profiles of a user. In contrast to {@link #getUserData(int)}
* it allows access to data of users other than the calling user.
@@ -2191,6 +2187,10 @@
if (policy != null) {
mUserData.remove(userHandle);
}
+ if (mUserPasswordMetrics.get(userHandle) != null) {
+ mUserPasswordMetrics.remove(userHandle);
+ }
+
File policyFile = new File(mInjector.environmentGetUserSystemDirectory(userHandle),
DEVICE_POLICIES_XML);
policyFile.delete();
@@ -3907,9 +3907,15 @@
private void updatePasswordValidityCheckpointLocked(int userHandle, boolean parent) {
final int credentialOwner = getCredentialOwner(userHandle, parent);
DevicePolicyData policy = getUserData(credentialOwner);
+ PasswordMetrics metrics = getUserPasswordMetricsLocked(credentialOwner);
+ if (metrics == null) {
+ Slog.wtf(LOG_TAG, "Should have had a valid password metrics for updating checkpoint " +
+ "validity.");
+ metrics = new PasswordMetrics();
+ }
policy.mPasswordValidAtLastCheckpoint =
isPasswordSufficientForUserWithoutCheckpointLocked(
- policy.mActivePasswordMetrics, userHandle, parent);
+ metrics, userHandle, parent);
saveSettingsLocked(credentialOwner);
}
@@ -4390,136 +4396,6 @@
}
}
- /* @return the password blacklist set by the admin or {@code null} if none. */
- PasswordBlacklist getAdminPasswordBlacklistLocked(@NonNull ActiveAdmin admin) {
- final int userId = UserHandle.getUserId(admin.getUid());
- return admin.passwordBlacklistFile == null ? null : new PasswordBlacklist(
- new File(getPolicyFileDirectory(userId), admin.passwordBlacklistFile));
- }
-
- private static final String PASSWORD_BLACKLIST_FILE_PREFIX = "password-blacklist-";
- private static final String PASSWORD_BLACKLIST_FILE_SUFFIX = "";
-
- @Override
- public boolean setPasswordBlacklist(ComponentName who, String name, List<String> blacklist,
- boolean parent) {
- if (!mHasFeature) {
- return false;
- }
- Preconditions.checkNotNull(who, "who is null");
-
- synchronized (this) {
- final ActiveAdmin admin = getActiveAdminForCallerLocked(
- who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, parent);
- final int userId = mInjector.userHandleGetCallingUserId();
- PasswordBlacklist adminBlacklist = getAdminPasswordBlacklistLocked(admin);
-
- if (blacklist == null || blacklist.isEmpty()) {
- // Remove the adminBlacklist
- admin.passwordBlacklistFile = null;
- saveSettingsLocked(userId);
- if (adminBlacklist != null) {
- adminBlacklist.delete();
- }
- return true;
- }
-
- // Validate server side
- Preconditions.checkNotNull(name, "name is null");
- DevicePolicyManager.enforcePasswordBlacklistSize(blacklist);
-
- // Blacklist is case insensitive so normalize to lower case
- final int blacklistSize = blacklist.size();
- for (int i = 0; i < blacklistSize; ++i) {
- blacklist.set(i, blacklist.get(i).toLowerCase());
- }
-
- final boolean isNewBlacklist = adminBlacklist == null;
- if (isNewBlacklist) {
- // Create a new file for the blacklist. There could be multiple admins, each setting
- // different blacklists, to restrict a user's credential, for example a managed
- // profile can impose restrictions on its parent while the parent is already
- // restricted by its own admin. A deterministic naming scheme would be fragile if
- // new types of admin are introduced so we generate and save the file name instead.
- // This isn't a temporary file but it reuses the name generation logic
- final File file;
- try {
- file = File.createTempFile(PASSWORD_BLACKLIST_FILE_PREFIX,
- PASSWORD_BLACKLIST_FILE_SUFFIX, getPolicyFileDirectory(userId));
- } catch (IOException e) {
- Slog.e(LOG_TAG, "Failed to make a file for the blacklist", e);
- return false;
- }
- adminBlacklist = mInjector.newPasswordBlacklist(file);
- }
-
- if (adminBlacklist.savePasswordBlacklist(name, blacklist)) {
- if (isNewBlacklist) {
- // The blacklist was saved so point the admin to the file
- admin.passwordBlacklistFile = adminBlacklist.getFile().getName();
- saveSettingsLocked(userId);
- }
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public String getPasswordBlacklistName(ComponentName who, @UserIdInt int userId,
- boolean parent) {
- if (!mHasFeature) {
- return null;
- }
- Preconditions.checkNotNull(who, "who is null");
- enforceFullCrossUsersPermission(userId);
- synchronized (this) {
- final ActiveAdmin admin = getActiveAdminForCallerLocked(
- who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, parent);
- final PasswordBlacklist blacklist = getAdminPasswordBlacklistLocked(admin);
- if (blacklist == null) {
- return null;
- }
- return blacklist.getName();
- }
- }
-
- @Override
- public boolean isPasswordBlacklisted(@UserIdInt int userId, String password) {
- if (!mHasFeature) {
- return false;
- }
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.TEST_BLACKLISTED_PASSWORD, null);
- return isPasswordBlacklistedInternal(userId, password);
- }
-
- private boolean isPasswordBlacklistedInternal(@UserIdInt int userId, String password) {
- Preconditions.checkNotNull(password, "Password is null");
- enforceFullCrossUsersPermission(userId);
-
- // Normalize to lower case for case insensitive blacklist match
- final String lowerCasePassword = password.toLowerCase();
-
- synchronized (this) {
- final List<ActiveAdmin> admins =
- getActiveAdminsForLockscreenPoliciesLocked(userId, /* parent */ false);
- final int N = admins.size();
- for (int i = 0; i < N; i++) {
- final PasswordBlacklist blacklist
- = getAdminPasswordBlacklistLocked(admins.get(i));
- if (blacklist != null) {
- if (blacklist.isPasswordBlacklisted(lowerCasePassword)) {
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
@Override
public boolean isActivePasswordSufficient(int userHandle, boolean parent) {
if (!mHasFeature) {
@@ -4532,8 +4408,11 @@
// This API can only be called by an active device admin,
// so try to retrieve it to check that the caller is one.
getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
- DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, parent));
- return isActivePasswordSufficientForUserLocked(policy, userHandle, parent);
+ int credentialOwner = getCredentialOwner(userHandle, parent);
+ DevicePolicyData policy = getUserDataUnchecked(credentialOwner);
+ PasswordMetrics metrics = getUserPasswordMetricsLocked(credentialOwner);
+ return isActivePasswordSufficientForUserLocked(
+ policy.mPasswordValidAtLastCheckpoint, metrics, userHandle, parent);
}
}
@@ -4559,25 +4438,31 @@
synchronized (this) {
final int targetUser = getProfileParentId(userHandle);
enforceUserUnlocked(targetUser, false);
- DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, false));
- return isActivePasswordSufficientForUserLocked(policy, targetUser, false);
+ int credentialOwner = getCredentialOwner(userHandle, false);
+ DevicePolicyData policy = getUserDataUnchecked(credentialOwner);
+ PasswordMetrics metrics = getUserPasswordMetricsLocked(credentialOwner);
+ return isActivePasswordSufficientForUserLocked(
+ policy.mPasswordValidAtLastCheckpoint, metrics, targetUser, false);
}
}
private boolean isActivePasswordSufficientForUserLocked(
- DevicePolicyData policy, int userHandle, boolean parent) {
- if (!mInjector.storageManagerIsFileBasedEncryptionEnabled()
- && !policy.mPasswordStateHasBeenSetSinceBoot) {
+ boolean passwordValidAtLastCheckpoint, PasswordMetrics metrics, int userHandle,
+ boolean parent) {
+ if (!mInjector.storageManagerIsFileBasedEncryptionEnabled() && (metrics == null)) {
// Before user enters their password for the first time after a reboot, return the
// value of this flag, which tells us whether the password was valid the last time
// settings were saved. If DPC changes password requirements on boot so that the
// current password no longer meets the requirements, this value will be stale until
// the next time the password is entered.
- return policy.mPasswordValidAtLastCheckpoint;
+ return passwordValidAtLastCheckpoint;
}
- return isPasswordSufficientForUserWithoutCheckpointLocked(
- policy.mActivePasswordMetrics, userHandle, parent);
+ if (metrics == null) {
+ Slog.wtf(LOG_TAG, "FBE device, should have been unlocked and had valid metrics.");
+ metrics = new PasswordMetrics();
+ }
+ return isPasswordSufficientForUserWithoutCheckpointLocked(metrics, userHandle, parent);
}
/**
@@ -4906,11 +4791,6 @@
return false;
}
}
-
- if (isPasswordBlacklistedInternal(userHandle, password)) {
- Slog.w(LOG_TAG, "resetPassword: the password is blacklisted");
- return false;
- }
}
DevicePolicyData policy = getUserData(userHandle);
@@ -5502,10 +5382,11 @@
.setAttestationChallenge(null)
.build();
- final boolean generationResult = keyChain.generateKeyPair(algorithm,
+ final int generationResult = keyChain.generateKeyPair(algorithm,
new ParcelableKeyGenParameterSpec(noAttestationSpec));
- if (!generationResult) {
- Log.e(LOG_TAG, "KeyChain failed to generate a keypair.");
+ if (generationResult != KeyChain.KEY_GEN_SUCCESS) {
+ Log.e(LOG_TAG, String.format(
+ "KeyChain failed to generate a keypair, error %d.", generationResult));
return false;
}
@@ -5518,12 +5399,17 @@
final byte[] attestationChallenge = keySpec.getAttestationChallenge();
if (attestationChallenge != null) {
- final boolean attestationResult = keyChain.attestKey(
+ final int attestationResult = keyChain.attestKey(
alias, attestationChallenge, attestationUtilsFlags, attestationChain);
- if (!attestationResult) {
+ if (attestationResult != KeyChain.KEY_ATTESTATION_SUCCESS) {
Log.e(LOG_TAG, String.format(
- "Attestation for %s failed, deleting key.", alias));
+ "Attestation for %s failed (rc=%d), deleting key.",
+ alias, attestationResult));
keyChain.removeKeyPair(alias);
+ if (attestationResult == KeyChain.KEY_ATTESTATION_CANNOT_ATTEST_IDS) {
+ throw new UnsupportedOperationException(
+ "Device does not support Device ID attestation.");
+ }
return false;
}
}
@@ -6123,10 +6009,8 @@
}
validateQualityConstant(metrics.quality);
- DevicePolicyData policy = getUserData(userHandle);
synchronized (this) {
- policy.mActivePasswordMetrics = metrics;
- policy.mPasswordStateHasBeenSetSinceBoot = true;
+ mUserPasswordMetrics.put(userHandle, metrics);
}
}
@@ -7640,6 +7524,7 @@
if (!mHasFeature) {
return DevicePolicyManager.STATE_USER_UNMANAGED;
}
+ enforceManageUsers();
int userHandle = mInjector.userHandleGetCallingUserId();
return getUserProvisioningState(userHandle);
}
@@ -7833,8 +7718,7 @@
ApplicationInfo appInfo = userContext.getApplicationInfo();
CharSequence result = null;
if (appInfo != null) {
- PackageManager pm = userContext.getPackageManager();
- result = pm.getApplicationLabel(appInfo);
+ result = appInfo.loadUnsafeLabel(userContext.getPackageManager());
}
return result != null ? result.toString() : null;
} finally {
@@ -8711,6 +8595,7 @@
@Override
public List getPermittedInputMethodsForCurrentUser() {
+ enforceManageUsers();
UserInfo currentUser;
try {
currentUser = mInjector.getIActivityManager().getCurrentUser();
@@ -9882,6 +9767,9 @@
boolean hasOverview = (flags & LOCK_TASK_FEATURE_OVERVIEW) != 0;
Preconditions.checkArgument(hasHome || !hasOverview,
"Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME");
+ boolean hasNotification = (flags & LOCK_TASK_FEATURE_NOTIFICATIONS) != 0;
+ Preconditions.checkArgument(hasHome || !hasNotification,
+ "Cannot use LOCK_TASK_FEATURE_NOTIFICATIONS without LOCK_TASK_FEATURE_HOME");
final int userHandle = mInjector.userHandleGetCallingUserId();
synchronized (this) {
@@ -10010,15 +9898,17 @@
Preconditions.checkStringNotEmpty(setting, "String setting is null or empty");
synchronized (this) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+ getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
if (!SYSTEM_SETTINGS_WHITELIST.contains(setting)) {
throw new SecurityException(String.format(
"Permission denial: device owners cannot update %1$s", setting));
}
- mInjector.binderWithCleanCallingIdentity(() -> mInjector.settingsSystemPutString(
- setting, value));
+ final int callingUserId = mInjector.userHandleGetCallingUserId();
+
+ mInjector.binderWithCleanCallingIdentity(() ->
+ mInjector.settingsSystemPutStringForUser(setting, value, callingUserId));
}
}
@@ -11421,7 +11311,7 @@
}
@Override
- public List<String> setMeteredDataDisabled(ComponentName who, List<String> packageNames) {
+ public List<String> setMeteredDataDisabledPackages(ComponentName who, List<String> packageNames) {
Preconditions.checkNotNull(who);
Preconditions.checkNotNull(packageNames);
@@ -11471,7 +11361,7 @@
}
@Override
- public List<String> getMeteredDataDisabled(ComponentName who) {
+ public List<String> getMeteredDataDisabledPackages(ComponentName who) {
Preconditions.checkNotNull(who);
if (!mHasFeature) {
@@ -11486,7 +11376,7 @@
}
@Override
- public boolean isMeteredDataDisabledForUser(ComponentName who,
+ public boolean isMeteredDataDisabledPackageForUser(ComponentName who,
String packageName, int userId) {
Preconditions.checkNotNull(who);
@@ -11816,6 +11706,7 @@
@Override
public boolean isDeviceProvisioned() {
+ enforceManageUsers();
synchronized (this) {
return getUserDataUnchecked(UserHandle.USER_SYSTEM).mUserSetupComplete;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index 0268519..8366114 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -723,6 +723,11 @@
mSystemUpdatePolicy.saveToXml(out);
out.endTag(null, TAG_SYSTEM_UPDATE_POLICY);
}
+
+ if (mSystemUpdateInfo != null) {
+ mSystemUpdateInfo.writeToXml(out, TAG_PENDING_OTA_INFO);
+ }
+
if (mSystemUpdateFreezeStart != null || mSystemUpdateFreezeEnd != null) {
out.startTag(null, TAG_FREEZE_PERIOD_RECORD);
if (mSystemUpdateFreezeStart != null) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PasswordBlacklist.java b/services/devicepolicy/java/com/android/server/devicepolicy/PasswordBlacklist.java
deleted file mode 100644
index a17a107..0000000
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PasswordBlacklist.java
+++ /dev/null
@@ -1,165 +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.
- */
-
-package com.android.server.devicepolicy;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.util.AtomicFile;
-import android.util.Slog;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Manages the blacklisted passwords.
- *
- * This caller must ensure synchronized access.
- */
-public class PasswordBlacklist {
- private static final String TAG = "PasswordBlacklist";
-
- private final AtomicFile mFile;
-
- /**
- * Create an object to manage the password blacklist.
- *
- * This is a lightweight operation to prepare variables but not perform any IO.
- */
- public PasswordBlacklist(File file) {
- mFile = new AtomicFile(file, "device-policy");
- }
-
- /**
- * Atomically replace the blacklist.
- *
- * Pass {@code null} for an empty list.
- */
- public boolean savePasswordBlacklist(@NonNull String name, @NonNull List<String> blacklist) {
- FileOutputStream fos = null;
- try {
- fos = mFile.startWrite();
- final DataOutputStream out = buildStreamForWriting(fos);
- final Header header = new Header(Header.VERSION_1, name, blacklist.size());
- header.write(out);
- final int blacklistSize = blacklist.size();
- for (int i = 0; i < blacklistSize; ++i) {
- out.writeUTF(blacklist.get(i));
- }
- out.flush();
- mFile.finishWrite(fos);
- return true;
- } catch (IOException e) {
- mFile.failWrite(fos);
- return false;
- }
- }
-
- /** @return the name of the blacklist or {@code null} if none set. */
- public String getName() {
- try (DataInputStream in = openForReading()) {
- return Header.read(in).mName;
- } catch (IOException e) {
- Slog.wtf(TAG, "Failed to read blacklist file", e);
- }
- return null;
- }
-
- /** @return the number of blacklisted passwords. */
- public int getSize() {
- final int blacklistSize;
- try (DataInputStream in = openForReading()) {
- return Header.read(in).mSize;
- } catch (IOException e) {
- Slog.wtf(TAG, "Failed to read blacklist file", e);
- }
- return 0;
- }
-
- /** @return whether the password matches an blacklisted item. */
- public boolean isPasswordBlacklisted(@NonNull String password) {
- final int blacklistSize;
- try (DataInputStream in = openForReading()) {
- final Header header = Header.read(in);
- for (int i = 0; i < header.mSize; ++i) {
- if (in.readUTF().equals(password)) {
- return true;
- }
- }
- } catch (IOException e) {
- Slog.wtf(TAG, "Failed to read blacklist file", e);
- // Fail safe and block all passwords. Setting a new blacklist should resolve this
- // problem which can be identified by examining the log.
- return true;
- }
- return false;
- }
-
- /** Delete the blacklist completely from disk. */
- public void delete() {
- mFile.delete();
- }
-
- /** Get the file the blacklist is stored in. */
- public File getFile() {
- return mFile.getBaseFile();
- }
-
- private DataOutputStream buildStreamForWriting(FileOutputStream fos) {
- return new DataOutputStream(new BufferedOutputStream(fos));
- }
-
- private DataInputStream openForReading() throws IOException {
- return new DataInputStream(new BufferedInputStream(mFile.openRead()));
- }
-
- /**
- * Helper to read and write the header of the blacklist file.
- */
- private static class Header {
- static final int VERSION_1 = 1;
-
- final int mVersion; // File format version
- final String mName;
- final int mSize;
-
- Header(int version, String name, int size) {
- mVersion = version;
- mName = name;
- mSize = size;
- }
-
- void write(DataOutputStream out) throws IOException {
- out.writeInt(mVersion);
- out.writeUTF(mName);
- out.writeInt(mSize);
- }
-
- static Header read(DataInputStream in) throws IOException {
- final int version = in.readInt();
- final String name = in.readUTF();
- final int size = in.readInt();
- return new Header(version, name, size);
- }
- }
-}
diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java
index d190432..d5ff2dd 100644
--- a/services/net/java/android/net/apf/ApfFilter.java
+++ b/services/net/java/android/net/apf/ApfFilter.java
@@ -16,21 +16,21 @@
package android.net.apf;
+import static android.net.util.NetworkConstants.*;
import static android.system.OsConstants.*;
-
import static com.android.internal.util.BitUtils.bytesToBEInt;
import static com.android.internal.util.BitUtils.getUint16;
import static com.android.internal.util.BitUtils.getUint32;
import static com.android.internal.util.BitUtils.getUint8;
-import static com.android.internal.util.BitUtils.uint16;
import static com.android.internal.util.BitUtils.uint32;
-import static com.android.internal.util.BitUtils.uint8;
-import android.os.SystemClock;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
-import android.net.apf.ApfGenerator;
import android.net.apf.ApfGenerator.IllegalInstructionException;
import android.net.apf.ApfGenerator.Register;
import android.net.ip.IpClient;
@@ -39,31 +39,29 @@
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.RaEvent;
import android.net.util.InterfaceParams;
+import android.os.PowerManager;
+import android.os.SystemClock;
import android.system.ErrnoException;
import android.system.Os;
import android.system.PacketSocketAddress;
import android.text.format.DateUtils;
import android.util.Log;
import android.util.Pair;
-
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.HexDump;
import com.android.internal.util.IndentingPrintWriter;
-
import java.io.FileDescriptor;
import java.io.IOException;
-import java.lang.Thread;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
-
import libcore.io.IoBridge;
/**
@@ -215,10 +213,6 @@
{ (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN;
- private static final int ICMP6_ROUTER_SOLICITATION = 133;
- private static final int ICMP6_ROUTER_ADVERTISEMENT = 134;
- private static final int ICMP6_NEIGHBOR_SOLICITATION = 135;
- private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136;
// NOTE: this must be added to the IPv4 header length in IPV4_HEADER_SIZE_MEMORY_SLOT
private static final int UDP_DESTINATION_PORT_OFFSET = ETH_HEADER_LEN + 2;
@@ -258,9 +252,26 @@
private long mUniqueCounter;
@GuardedBy("this")
private boolean mMulticastFilter;
+ @GuardedBy("this")
+ private boolean mInDozeMode;
private final boolean mDrop802_3Frames;
private final int[] mEthTypeBlackList;
+ // Detects doze mode state transitions.
+ private final BroadcastReceiver mDeviceIdleReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)) {
+ PowerManager powerManager =
+ (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ final boolean deviceIdle = powerManager.isDeviceIdleMode();
+ setDozeMode(deviceIdle);
+ }
+ }
+ };
+ private final Context mContext;
+
// Our IPv4 address, if we have just one, otherwise null.
@GuardedBy("this")
private byte[] mIPv4Address;
@@ -269,13 +280,14 @@
private int mIPv4PrefixLength;
@VisibleForTesting
- ApfFilter(ApfConfiguration config, InterfaceParams ifParams,
+ ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
IpClient.Callback ipClientCallback, IpConnectivityLog log) {
mApfCapabilities = config.apfCapabilities;
mIpClientCallback = ipClientCallback;
mInterfaceParams = ifParams;
mMulticastFilter = config.multicastFilter;
mDrop802_3Frames = config.ieee802_3Filter;
+ mContext = context;
// Now fill the black list from the passed array
mEthTypeBlackList = filterEthTypeBlackList(config.ethTypeBlackList);
@@ -284,6 +296,10 @@
// TODO: ApfFilter should not generate programs until IpClient sends provisioning success.
maybeStartFilter();
+
+ // Listen for doze-mode transition changes to enable/disable the IPv6 multicast filter.
+ mContext.registerReceiver(mDeviceIdleReceiver,
+ new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED));
}
private void log(String s) {
@@ -522,7 +538,7 @@
// to our packet socket. b/29586253
if (getUint16(mPacket, ETH_ETHERTYPE_OFFSET) != ETH_P_IPV6 ||
getUint8(mPacket, IPV6_NEXT_HEADER_OFFSET) != IPPROTO_ICMPV6 ||
- getUint8(mPacket, ICMP6_TYPE_OFFSET) != ICMP6_ROUTER_ADVERTISEMENT) {
+ getUint8(mPacket, ICMP6_TYPE_OFFSET) != ICMPV6_ROUTER_ADVERTISEMENT) {
throw new InvalidRaException("Not an ICMP6 router advertisement");
}
@@ -889,10 +905,11 @@
private void generateIPv6FilterLocked(ApfGenerator gen) throws IllegalInstructionException {
// Here's a basic summary of what the IPv6 filter program does:
//
- // if it's not ICMPv6:
- // if it's multicast and we're dropping multicast:
- // drop
- // pass
+ // if we're dropping multicast
+ // if it's not IPCMv6 or it's ICMPv6 but we're in doze mode:
+ // if it's multicast:
+ // drop
+ // pass
// if it's ICMPv6 RS to any:
// drop
// if it's ICMPv6 NA to ff02::1:
@@ -902,28 +919,44 @@
// Drop multicast if the multicast filter is enabled.
if (mMulticastFilter) {
- // Don't touch ICMPv6 multicast here, we deal with it in more detail later.
- String skipIpv6MulticastFilterLabel = "skipIPv6MulticastFilter";
- gen.addJumpIfR0Equals(IPPROTO_ICMPV6, skipIpv6MulticastFilterLabel);
+ final String skipIPv6MulticastFilterLabel = "skipIPv6MulticastFilter";
+ final String dropAllIPv6MulticastsLabel = "dropAllIPv6Multicast";
- // Drop all other packets sent to ff00::/8.
+ // While in doze mode, drop ICMPv6 multicast pings, let the others pass.
+ // While awake, let all ICMPv6 multicasts through.
+ if (mInDozeMode) {
+ // Not ICMPv6? -> Proceed to multicast filtering
+ gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, dropAllIPv6MulticastsLabel);
+
+ // ICMPv6 but not ECHO? -> Skip the multicast filter.
+ // (ICMPv6 ECHO requests will go through the multicast filter below).
+ gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET);
+ gen.addJumpIfR0NotEquals(ICMPV6_ECHO_REQUEST_TYPE, skipIPv6MulticastFilterLabel);
+ } else {
+ gen.addJumpIfR0Equals(IPPROTO_ICMPV6, skipIPv6MulticastFilterLabel);
+ }
+
+ // Drop all other packets sent to ff00::/8 (multicast prefix).
+ gen.defineLabel(dropAllIPv6MulticastsLabel);
gen.addLoad8(Register.R0, IPV6_DEST_ADDR_OFFSET);
gen.addJumpIfR0Equals(0xff, gen.DROP_LABEL);
- // Not multicast and not ICMPv6. Pass.
+ // Not multicast. Pass.
gen.addJump(gen.PASS_LABEL);
- gen.defineLabel(skipIpv6MulticastFilterLabel);
+ gen.defineLabel(skipIPv6MulticastFilterLabel);
} else {
// If not ICMPv6, pass.
gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, gen.PASS_LABEL);
}
+ // If we got this far, the packet is ICMPv6. Drop some specific types.
+
// Add unsolicited multicast neighbor announcements filter
String skipUnsolicitedMulticastNALabel = "skipUnsolicitedMulticastNA";
gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET);
// Drop all router solicitations (b/32833400)
- gen.addJumpIfR0Equals(ICMP6_ROUTER_SOLICITATION, gen.DROP_LABEL);
+ gen.addJumpIfR0Equals(ICMPV6_ROUTER_SOLICITATION, gen.DROP_LABEL);
// If not neighbor announcements, skip filter.
- gen.addJumpIfR0NotEquals(ICMP6_NEIGHBOR_ANNOUNCEMENT, skipUnsolicitedMulticastNALabel);
+ gen.addJumpIfR0NotEquals(ICMPV6_NEIGHBOR_ADVERTISEMENT, skipUnsolicitedMulticastNALabel);
// If to ff02::1, drop.
// TODO: Drop only if they don't contain the address of on-link neighbours.
gen.addLoadImmediate(Register.R0, IPV6_DEST_ADDR_OFFSET);
@@ -1168,9 +1201,9 @@
* Create an {@link ApfFilter} if {@code apfCapabilities} indicates support for packet
* filtering using APF programs.
*/
- public static ApfFilter maybeCreate(ApfConfiguration config,
+ public static ApfFilter maybeCreate(Context context, ApfConfiguration config,
InterfaceParams ifParams, IpClient.Callback ipClientCallback) {
- if (config == null || ifParams == null) return null;
+ if (context == null || config == null || ifParams == null) return null;
ApfCapabilities apfCapabilities = config.apfCapabilities;
if (apfCapabilities == null) return null;
if (apfCapabilities.apfVersionSupported == 0) return null;
@@ -1187,7 +1220,8 @@
Log.e(TAG, "Unsupported APF version: " + apfCapabilities.apfVersionSupported);
return null;
}
- return new ApfFilter(config, ifParams, ipClientCallback, new IpConnectivityLog());
+
+ return new ApfFilter(context, config, ifParams, ipClientCallback, new IpConnectivityLog());
}
public synchronized void shutdown() {
@@ -1197,12 +1231,11 @@
mReceiveThread = null;
}
mRas.clear();
+ mContext.unregisterReceiver(mDeviceIdleReceiver);
}
public synchronized void setMulticastFilter(boolean isEnabled) {
- if (mMulticastFilter == isEnabled) {
- return;
- }
+ if (mMulticastFilter == isEnabled) return;
mMulticastFilter = isEnabled;
if (!isEnabled) {
mNumProgramUpdatesAllowingMulticast++;
@@ -1210,6 +1243,13 @@
installNewProgramLocked();
}
+ @VisibleForTesting
+ public synchronized void setDozeMode(boolean isEnabled) {
+ if (mInDozeMode == isEnabled) return;
+ mInDozeMode = isEnabled;
+ installNewProgramLocked();
+ }
+
/** Find the single IPv4 LinkAddress if there is one, otherwise return null. */
private static LinkAddress findIPv4LinkAddress(LinkProperties lp) {
LinkAddress ipv4Address = null;
diff --git a/services/net/java/android/net/apf/ApfGenerator.java b/services/net/java/android/net/apf/ApfGenerator.java
index d41fbce..ca8f727 100644
--- a/services/net/java/android/net/apf/ApfGenerator.java
+++ b/services/net/java/android/net/apf/ApfGenerator.java
@@ -367,7 +367,7 @@
*/
public boolean setApfVersion(int version) {
// This version number syncs up with APF_VERSION in hardware/google/apf/apf_interpreter.h
- return version == 2;
+ return version >= 2;
}
private void addInstruction(Instruction instruction) {
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 9863370..a184b22 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -1490,7 +1490,7 @@
mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames);
apfConfig.ethTypeBlackList =
mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList);
- mApfFilter = ApfFilter.maybeCreate(apfConfig, mInterfaceParams, mCallback);
+ mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback);
// TODO: investigate the effects of any multicast filtering racing/interfering with the
// rest of this IP configuration startup.
if (mApfFilter == null) {
diff --git a/services/net/java/android/net/util/InterfaceSet.java b/services/net/java/android/net/util/InterfaceSet.java
new file mode 100644
index 0000000..9f26fa1
--- /dev/null
+++ b/services/net/java/android/net/util/InterfaceSet.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.util;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringJoiner;
+
+
+/**
+ * @hide
+ */
+public class InterfaceSet {
+ public final Set<String> ifnames;
+
+ public InterfaceSet(String... names) {
+ final Set<String> nameSet = new HashSet<>();
+ for (String name : names) {
+ if (name != null) nameSet.add(name);
+ }
+ ifnames = Collections.unmodifiableSet(nameSet);
+ }
+
+ @Override
+ public String toString() {
+ final StringJoiner sj = new StringJoiner(",", "[", "]");
+ for (String ifname : ifnames) sj.add(ifname);
+ return sj.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj != null
+ && obj instanceof InterfaceSet
+ && ifnames.equals(((InterfaceSet)obj).ifnames);
+ }
+}
diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java
index 984c9f8..53fd01f 100644
--- a/services/net/java/android/net/util/NetworkConstants.java
+++ b/services/net/java/android/net/util/NetworkConstants.java
@@ -136,6 +136,8 @@
* - https://tools.ietf.org/html/rfc4861
*/
public static final int ICMPV6_HEADER_MIN_LEN = 4;
+ public static final int ICMPV6_ECHO_REQUEST_TYPE = 128;
+ public static final int ICMPV6_ECHO_REPLY_TYPE = 129;
public static final int ICMPV6_ROUTER_SOLICITATION = 133;
public static final int ICMPV6_ROUTER_ADVERTISEMENT = 134;
public static final int ICMPV6_NEIGHBOR_SOLICITATION = 135;
@@ -147,7 +149,6 @@
public static final int ICMPV6_ND_OPTION_TLLA = 2;
public static final int ICMPV6_ND_OPTION_MTU = 5;
- public static final int ICMPV6_ECHO_REQUEST_TYPE = 128;
/**
* UDP constants.
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index f603a09..fa41220 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -147,6 +147,15 @@
Looper backupLooper = startBackupThreadAndGetLooper();
mShadowBackupLooper = shadowOf(backupLooper);
+
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ BackupAgentTimeoutParameters agentTimeoutParameters =
+ new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
+ agentTimeoutParameters.start();
+
+ // We need to mock BMS timeout parameters before initializing the BackupHandler since
+ // the constructor of BackupHandler relies on the timeout parameters.
+ when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
mBackupHandler = new BackupHandler(mBackupManagerService, backupLooper);
mBackupManager = spy(FakeIBackupManager.class);
@@ -157,7 +166,8 @@
mTransportManager,
packageManager,
mBackupHandler,
- mWakeLock);
+ mWakeLock,
+ agentTimeoutParameters);
when(mBackupManagerService.getBaseStateDir()).thenReturn(mBaseStateDir);
when(mBackupManagerService.getDataDir()).thenReturn(dataDir);
when(mBackupManagerService.getBackupManagerBinder()).thenReturn(mBackupManager);
diff --git a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
index 03792b1..92d6bbd 100644
--- a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
+++ b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -41,12 +41,14 @@
import android.app.backup.RestoreSet;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import com.android.server.EventLogTags;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.TransportManager;
import com.android.server.backup.internal.BackupHandler;
@@ -115,6 +117,15 @@
Looper backupLooper = startBackupThreadAndGetLooper();
mShadowBackupLooper = shadowOf(backupLooper);
+
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ BackupAgentTimeoutParameters agentTimeoutParameters =
+ new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
+ agentTimeoutParameters.start();
+
+ // We need to mock BMS timeout parameters before initializing the BackupHandler since
+ // the constructor of BackupHandler relies on it.
+ when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper);
mWakeLock = createBackupWakeLock(application);
@@ -125,7 +136,8 @@
mTransportManager,
application.getPackageManager(),
backupHandler,
- mWakeLock);
+ mWakeLock,
+ agentTimeoutParameters);
when(mBackupManagerService.getPendingRestores()).thenReturn(new ArrayDeque<>());
}
diff --git a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
index c210fde..5a886e3 100644
--- a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
@@ -28,6 +28,7 @@
import android.os.PowerManager;
import android.util.SparseArray;
+import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.TransportManager;
import com.android.server.backup.internal.BackupHandler;
@@ -43,7 +44,8 @@
TransportManager transportManager,
PackageManager packageManager,
BackupHandler backupHandler,
- PowerManager.WakeLock wakeLock) {
+ PowerManager.WakeLock wakeLock,
+ BackupAgentTimeoutParameters agentTimeoutParameters) {
when(backupManagerService.getContext()).thenReturn(context);
when(backupManagerService.getTransportManager()).thenReturn(transportManager);
when(backupManagerService.getPackageManager()).thenReturn(packageManager);
@@ -53,6 +55,7 @@
when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
when(backupManagerService.getWakelock()).thenReturn(wakeLock);
+ when(backupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
}
public static PowerManager.WakeLock createBackupWakeLock(Application application) {
diff --git a/services/tests/servicestests/AndroidTest.xml b/services/tests/servicestests/AndroidTest.xml
index 082827c..0ec16b5 100644
--- a/services/tests/servicestests/AndroidTest.xml
+++ b/services/tests/servicestests/AndroidTest.xml
@@ -14,7 +14,9 @@
limitations under the License.
-->
<configuration description="Runs Frameworks Services Tests.">
- <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="FrameworksServicesTests.apk" />
<option name="test-file-name" value="JobTestApp.apk" />
@@ -22,7 +24,6 @@
<option name="test-file-name" value="SuspendTestApp.apk" />
</target_preparer>
- <option name="test-suite-tag" value="apct" />
<option name="test-tag" value="FrameworksServicesTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.frameworks.servicestests" />
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 0ffc61a..25d2875 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -258,7 +258,7 @@
uidRec.hasInternetPermission = true;
mAms.mActiveUids.put(uid, uidRec);
- final ProcessRecord appRec = new ProcessRecord(mBatteryStatsImpl,
+ final ProcessRecord appRec = new ProcessRecord(null, mBatteryStatsImpl,
new ApplicationInfo(), TAG, uid);
appRec.thread = Mockito.mock(IApplicationThread.class);
mAms.mLruProcesses.add(appRec);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index b452ea5..cda968a7 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -240,7 +240,7 @@
doReturn(displayShouldSleep).when(display).shouldSleep();
doReturn(displaySleeping).when(display).isSleeping();
- doReturn(keyguardShowing).when(keyguard).isKeyguardShowing(anyInt());
+ doReturn(keyguardShowing).when(keyguard).isKeyguardOrAodShowing(anyInt());
mSupervisor.mFocusedStack = isFocusedStack ? stack : null;
mSupervisor.applySleepTokensLocked(true);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
index a44f5c4..7948e4c 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
@@ -77,8 +77,8 @@
final int startFlags = random.nextInt();
final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final ProcessRecord process= new ProcessRecord(null, mService.mContext.getApplicationInfo(),
- "name", 12345);
+ final ProcessRecord process= new ProcessRecord(null, null,
+ mService.mContext.getApplicationInfo(), "name", 12345);
mController.addPendingActivityLaunch(
new PendingActivityLaunch(activity, source, startFlags, stack, process));
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index 8ff3e45..d012bba 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -195,7 +195,7 @@
// If no caller app, return {@code null} {@link ProcessRecord}.
final ProcessRecord record = containsConditions(preconditions, PRECONDITION_NO_CALLER_APP)
- ? null : new ProcessRecord(mock(BatteryStatsImpl.class),
+ ? null : new ProcessRecord(null, mock(BatteryStatsImpl.class),
mock(ApplicationInfo.class), null, 0);
doReturn(record).when(service).getRecordForAppLocked(anyObject());
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 6fb1b2e..a533447 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -187,8 +187,8 @@
mTaskRecord.addActivityToTop(activity);
}
- activity.setProcess(new ProcessRecord(null, mService.mContext.getApplicationInfo(),
- "name", 12345));
+ activity.setProcess(new ProcessRecord(null, null,
+ mService.mContext.getApplicationInfo(), "name", 12345));
activity.app.thread = mock(IApplicationThread.class);
return activity;
diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
index 243c1b3..3d11c4c 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
@@ -66,7 +66,7 @@
@UiThreadTest
public void testCreateWorks() throws Exception {
AppErrorDialog.Data data = new AppErrorDialog.Data();
- data.proc = new ProcessRecord(null, mContext.getApplicationInfo(), "name", 12345);
+ data.proc = new ProcessRecord(null, null, mContext.getApplicationInfo(), "name", 12345);
data.result = new AppErrorResult();
AppErrorDialog dialog = new AppErrorDialog(mContext, mService, data);
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index 6fdb029..3c10b03 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -389,6 +389,14 @@
sentIntents.add(intent);
return 0;
}
+
+ @Override
+ void reportGlobalUsageEventLocked(int event) {
+ }
+
+ @Override
+ void reportCurWakefulnessUsageEvent() {
+ }
}
private static class TestHandler extends Handler {
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
index 7c3ea4f..e37ed79 100644
--- a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
@@ -17,6 +17,7 @@
package com.android.server.content;
import android.accounts.Account;
+import android.content.ContentResolver;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.test.AndroidTestCase;
@@ -60,7 +61,7 @@
"authority1",
b1,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
// Same as op1 but different time infos
SyncOperation op2 = new SyncOperation(account1, 0,
@@ -69,7 +70,7 @@
"authority1",
b1,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
// Same as op1 but different authority
SyncOperation op3 = new SyncOperation(account1, 0,
@@ -78,7 +79,7 @@
"authority2",
b1,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
// Same as op1 but different account
SyncOperation op4 = new SyncOperation(account2, 0,
@@ -87,7 +88,7 @@
"authority1",
b1,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
// Same as op1 but different bundle
SyncOperation op5 = new SyncOperation(account1, 0,
@@ -96,7 +97,7 @@
"authority1",
b2,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
assertEquals(op1.key, op2.key);
assertNotSame(op1.key, op3.key);
@@ -117,7 +118,7 @@
"authority1",
b1,
false,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
PersistableBundle pb = op1.toJobInfoExtras();
SyncOperation op2 = SyncOperation.maybeCreateFromJobExtras(pb);
@@ -145,7 +146,7 @@
Bundle extras = new Bundle();
SyncOperation periodic = new SyncOperation(ep, 0, "package", 0, 0, extras, false, true,
SyncOperation.NO_JOB_ID, 60000, 10000,
- /*isAppStandbyExempted=*/ false);
+ ContentResolver.SYNC_EXEMPTION_NONE);
SyncOperation oneoff = periodic.createOneTimeSyncOperation();
assertFalse("Conversion to oneoff sync failed.", oneoff.isPeriodic);
assertEquals("Period not restored", periodic.periodMillis, oneoff.periodMillis);
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
deleted file mode 100644
index 7209c79..0000000
--- a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.content;
-
-import android.accounts.Account;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.test.AndroidTestCase;
-import android.test.RenamingDelegatingContext;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
-
-import com.android.internal.os.AtomicFile;
-
-import java.io.File;
-import java.io.FileOutputStream;
-
-/**
- * Test for SyncStorageEngine.
- *
- * bit FrameworksServicesTests:com.android.server.content.SyncStorageEngineTest
- *
- * TODO Broken. Fix it. b/62485315
- */
-@Suppress
-public class SyncStorageEngineTest extends AndroidTestCase {
-
- protected Account account1;
- protected Account account2;
- protected ComponentName syncService1;
- protected String authority1 = "testprovider";
- protected Bundle defaultBundle;
- protected final int DEFAULT_USER = 0;
-
- /* Some default poll frequencies. */
- final long dayPoll = (60 * 60 * 24);
- final long dayFuzz = 60;
- final long thousandSecs = 1000;
- final long thousandSecsFuzz = 100;
-
- MockContentResolver mockResolver;
- SyncStorageEngine engine;
-
- private File getSyncDir() {
- return new File(new File(getContext().getFilesDir(), "system"), "sync");
- }
-
- @Override
- public void setUp() {
- account1 = new Account("a@example.com", "example.type");
- account2 = new Account("b@example.com", "example.type");
- syncService1 = new ComponentName("com.example", "SyncService");
- // Default bundle.
- defaultBundle = new Bundle();
- defaultBundle.putInt("int_key", 0);
- defaultBundle.putString("string_key", "hello");
- // Set up storage engine.
- mockResolver = new MockContentResolver();
- engine = SyncStorageEngine.newTestInstance(
- new TestContext(mockResolver, getContext()));
- }
-
- /**
- * Test that we handle the case of a history row being old enough to purge before the
- * corresponding sync is finished. This can happen if the clock changes while we are syncing.
- *
- */
- // TODO: this test causes AidlTest to fail. Omit for now
- // @SmallTest
- public void testPurgeActiveSync() throws Exception {
- final Account account = new Account("a@example.com", "example.type");
- final String authority = "testprovider";
-
- MockContentResolver mockResolver = new MockContentResolver();
-
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
- new TestContext(mockResolver, getContext()));
- long time0 = 1000;
- SyncOperation op = new SyncOperation(account, 0, 0, "foo",
- SyncOperation.REASON_PERIODIC,
- SyncStorageEngine.SOURCE_LOCAL,
- authority,
- Bundle.EMPTY, true,
- /*isAppStandbyExempted=*/ false);
- long historyId = engine.insertStartSyncEvent(op, time0);
- long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2;
- engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0);
- }
-
- @LargeTest
- public void testAuthorityPersistence() throws Exception {
- final Account account1 = new Account("a@example.com", "example.type");
- final Account account2 = new Account("b@example.com", "example.type.2");
- final String authority1 = "testprovider1";
- final String authority2 = "testprovider2";
-
- engine.setMasterSyncAutomatically(false, 0);
-
- engine.setIsSyncable(account1, 0, authority1, 1);
- engine.setSyncAutomatically(account1, 0, authority1, true);
-
- engine.setIsSyncable(account2, 0, authority1, 1);
- engine.setSyncAutomatically(account2, 0, authority1, true);
-
- engine.setIsSyncable(account1, 0, authority2, 1);
- engine.setSyncAutomatically(account1, 0, authority2, false);
-
- engine.setIsSyncable(account2, 0, authority2, 0);
- engine.setSyncAutomatically(account2, 0, authority2, true);
-
- engine.writeAllState();
- engine.clearAndReadState();
-
- assertEquals(true, engine.getSyncAutomatically(account1, 0, authority1));
- assertEquals(true, engine.getSyncAutomatically(account2, 0, authority1));
- assertEquals(false, engine.getSyncAutomatically(account1, 0, authority2));
- assertEquals(true, engine.getSyncAutomatically(account2, 0, authority2));
-
- assertEquals(1, engine.getIsSyncable(account1, 0, authority1));
- assertEquals(1, engine.getIsSyncable(account2, 0, authority1));
- assertEquals(1, engine.getIsSyncable(account1, 0, authority2));
- assertEquals(0, engine.getIsSyncable(account2, 0, authority2));
- }
-
- @MediumTest
- public void testListenForTicklesParsing() throws Exception {
- byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
- + "<accounts>\n"
- + "<listenForTickles user=\"0\" enabled=\"false\" />"
- + "<listenForTickles user=\"1\" enabled=\"true\" />"
- + "<authority id=\"0\" user=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
- + "<authority id=\"1\" user=\"1\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
- + "</accounts>\n").getBytes();
-
- MockContentResolver mockResolver = new MockContentResolver();
- final TestContext testContext = new TestContext(mockResolver, getContext());
-
- File syncDir = getSyncDir();
- syncDir.mkdirs();
- AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
- FileOutputStream fos = accountInfoFile.startWrite();
- fos.write(accountsFileData);
- accountInfoFile.finishWrite(fos);
-
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
-
- assertEquals(false, engine.getMasterSyncAutomatically(0));
- assertEquals(true, engine.getMasterSyncAutomatically(1));
- assertEquals(true, engine.getMasterSyncAutomatically(2));
-
- }
-
- @MediumTest
- public void testAuthorityRenaming() throws Exception {
- final Account account1 = new Account("acc1", "type1");
- final Account account2 = new Account("acc2", "type2");
- final String authorityContacts = "contacts";
- final String authorityCalendar = "calendar";
- final String authorityOther = "other";
- final String authorityContactsNew = "com.android.contacts";
- final String authorityCalendarNew = "com.android.calendar";
-
- MockContentResolver mockResolver = new MockContentResolver();
-
- final TestContext testContext = new TestContext(mockResolver, getContext());
-
- byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
- + "<accounts>\n"
- + "<authority id=\"0\" account=\"acc1\" type=\"type1\" authority=\"contacts\" />\n"
- + "<authority id=\"1\" account=\"acc1\" type=\"type1\" authority=\"calendar\" />\n"
- + "<authority id=\"2\" account=\"acc1\" type=\"type1\" authority=\"other\" />\n"
- + "<authority id=\"3\" account=\"acc2\" type=\"type2\" authority=\"contacts\" />\n"
- + "<authority id=\"4\" account=\"acc2\" type=\"type2\" authority=\"calendar\" />\n"
- + "<authority id=\"5\" account=\"acc2\" type=\"type2\" authority=\"other\" />\n"
- + "<authority id=\"6\" account=\"acc2\" type=\"type2\" enabled=\"false\""
- + " authority=\"com.android.calendar\" />\n"
- + "<authority id=\"7\" account=\"acc2\" type=\"type2\" enabled=\"false\""
- + " authority=\"com.android.contacts\" />\n"
- + "</accounts>\n").getBytes();
-
- File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
- syncDir.mkdirs();
- AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
- FileOutputStream fos = accountInfoFile.startWrite();
- fos.write(accountsFileData);
- accountInfoFile.finishWrite(fos);
-
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
-
- assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityContacts));
- assertEquals(false, engine.getSyncAutomatically(account1, 0, authorityCalendar));
- assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityOther));
- assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityContactsNew));
- assertEquals(true, engine.getSyncAutomatically(account1, 0, authorityCalendarNew));
-
- assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContacts));
- assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendar));
- assertEquals(true, engine.getSyncAutomatically(account2, 0, authorityOther));
- assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityContactsNew));
- assertEquals(false, engine.getSyncAutomatically(account2, 0, authorityCalendarNew));
- }
-
- @SmallTest
- public void testSyncableMigration() throws Exception {
- final Account account = new Account("acc", "type");
-
- MockContentResolver mockResolver = new MockContentResolver();
-
- final TestContext testContext = new TestContext(mockResolver, getContext());
-
- byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
- + "<accounts>\n"
- + "<authority id=\"0\" account=\"acc\" authority=\"other1\" />\n"
- + "<authority id=\"1\" account=\"acc\" type=\"type\" authority=\"other2\" />\n"
- + "<authority id=\"2\" account=\"acc\" type=\"type\" syncable=\"false\""
- + " authority=\"other3\" />\n"
- + "<authority id=\"3\" account=\"acc\" type=\"type\" syncable=\"true\""
- + " authority=\"other4\" />\n"
- + "</accounts>\n").getBytes();
-
- File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
- syncDir.mkdirs();
- AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
- FileOutputStream fos = accountInfoFile.startWrite();
- fos.write(accountsFileData);
- accountInfoFile.finishWrite(fos);
-
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
-
- assertEquals(-1, engine.getIsSyncable(account, 0, "other1"));
- assertEquals(1, engine.getIsSyncable(account, 0, "other2"));
- assertEquals(0, engine.getIsSyncable(account, 0, "other3"));
- assertEquals(1, engine.getIsSyncable(account, 0, "other4"));
- }
-
- /**
- * Verify that the API cannot cause a run-time reboot by passing in the empty string as an
- * authority. The problem here is that
- * {@link SyncStorageEngine#getOrCreateAuthorityLocked(account, provider)} would register
- * an empty authority which causes a RTE in {@link SyncManager#scheduleReadyPeriodicSyncs()}.
- * This is not strictly a SSE test, but it does depend on the SSE data structures.
- */
- @SmallTest
- public void testExpectedIllegalArguments() throws Exception {
- try {
- ContentResolver.setSyncAutomatically(account1, "", true);
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.addPeriodicSync(account1, "", Bundle.EMPTY, 84000L);
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.removePeriodicSync(account1, "", Bundle.EMPTY);
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.cancelSync(account1, "");
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.setIsSyncable(account1, "", 0);
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.cancelSync(account1, "");
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.requestSync(account1, "", Bundle.EMPTY);
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- try {
- ContentResolver.getSyncStatus(account1, "");
- fail("empty provider string should throw IllegalArgumentException");
- } catch (IllegalArgumentException expected) {}
-
- // Make sure we aren't blocking null account/provider for those functions that use it
- // to specify ALL accounts/providers.
- ContentResolver.requestSync(null, null, Bundle.EMPTY);
- ContentResolver.cancelSync(null, null);
- }
-}
-
-class TestContext extends ContextWrapper {
-
- ContentResolver mResolver;
-
- private final Context mRealContext;
-
- public TestContext(ContentResolver resolver, Context realContext) {
- super(new RenamingDelegatingContext(new MockContext(), realContext, "test."));
- mRealContext = realContext;
- mResolver = resolver;
- }
-
- @Override
- public Resources getResources() {
- return mRealContext.getResources();
- }
-
- @Override
- public File getFilesDir() {
- return mRealContext.getFilesDir();
- }
-
- @Override
- public void enforceCallingOrSelfPermission(String permission, String message) {
- }
-
- @Override
- public void sendBroadcast(Intent intent) {
- }
-
- @Override
- public ContentResolver getContentResolver() {
- return mResolver;
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index ab0bfefb..cd39285 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -98,12 +98,6 @@
this.context = injector.context;
}
- @Override
- public boolean isPasswordBlacklisted(int userId, String password) {
- return false;
- }
-
-
public void notifyChangeToContentObserver(Uri uri, int userHandle) {
ContentObserver co = mMockInjector.mContentObservers.get(new Pair<>(uri, userHandle));
if (co != null) {
@@ -220,11 +214,6 @@
}
@Override
- PasswordBlacklist newPasswordBlacklist(File file) {
- return services.passwordBlacklist;
- }
-
- @Override
boolean storageManagerIsFileBasedEncryptionEnabled() {
return services.storageManager.isFileBasedEncryptionEnabled();
}
@@ -393,8 +382,8 @@
}
@Override
- void settingsSystemPutString(String name, String value) {
- services.settings.settingsSystemPutString(name, value);
+ void settingsSystemPutStringForUser(String name, String value, int userId) {
+ services.settings.settingsSystemPutStringForUser(name, value, userId);
}
@Override
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 43490d3..b76064b 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -2113,11 +2113,11 @@
}
}
- public void testSetGetMeteredDataDisabled() throws Exception {
+ public void testSetGetMeteredDataDisabledPackages() throws Exception {
setAsProfileOwner(admin1);
final ArrayList<String> emptyList = new ArrayList<>();
- assertEquals(emptyList, dpm.getMeteredDataDisabled(admin1));
+ assertEquals(emptyList, dpm.getMeteredDataDisabledPackages(admin1));
// Setup
final ArrayList<String> pkgsToRestrict = new ArrayList<>();
@@ -2127,40 +2127,40 @@
pkgsToRestrict.add(package2);
setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0);
setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0);
- List<String> excludedPkgs = dpm.setMeteredDataDisabled(admin1, pkgsToRestrict);
+ List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
// Verify
assertEquals(emptyList, excludedPkgs);
- assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabled(admin1));
+ assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
eq(DpmMockContext.CALLER_USER_HANDLE));
// Setup
pkgsToRestrict.remove(package1);
- excludedPkgs = dpm.setMeteredDataDisabled(admin1, pkgsToRestrict);
+ excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
// Verify
assertEquals(emptyList, excludedPkgs);
- assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabled(admin1));
+ assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
eq(DpmMockContext.CALLER_USER_HANDLE));
}
- public void testSetGetMeteredDataDisabled_deviceAdmin() {
+ public void testSetGetMeteredDataDisabledPackages_deviceAdmin() {
mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
dpm.setActiveAdmin(admin1, true);
assertTrue(dpm.isAdminActive(admin1));
mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
- () -> dpm.setMeteredDataDisabled(admin1, new ArrayList<>()));
+ () -> dpm.setMeteredDataDisabledPackages(admin1, new ArrayList<>()));
assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
- () -> dpm.getMeteredDataDisabled(admin1));
+ () -> dpm.getMeteredDataDisabledPackages(admin1));
}
- public void testGetMeteredDataDisabledForUser() throws Exception {
+ public void testIsMeteredDataDisabledForUserPackage() throws Exception {
setAsProfileOwner(admin1);
// Setup
@@ -2173,34 +2173,34 @@
pkgsToRestrict.add(package2);
setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0);
setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0);
- List<String> excludedPkgs = dpm.setMeteredDataDisabled(admin1, pkgsToRestrict);
+ List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
// Verify
assertEquals(emptyList, excludedPkgs);
mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
assertTrue(package1 + "should be restricted",
- dpm.isMeteredDataDisabledForUser(admin1, package1,
+ dpm.isMeteredDataDisabledPackageForUser(admin1, package1,
DpmMockContext.CALLER_USER_HANDLE));
assertTrue(package2 + "should be restricted",
- dpm.isMeteredDataDisabledForUser(admin1, package2,
+ dpm.isMeteredDataDisabledPackageForUser(admin1, package2,
DpmMockContext.CALLER_USER_HANDLE));
assertFalse(package3 + "should not be restricted",
- dpm.isMeteredDataDisabledForUser(admin1, package3,
+ dpm.isMeteredDataDisabledPackageForUser(admin1, package3,
DpmMockContext.CALLER_USER_HANDLE));
}
- public void testGetMeteredDataDisabledForUser_nonSystemUidCaller() throws Exception {
+ public void testIsMeteredDataDisabledForUserPackage_nonSystemUidCaller() throws Exception {
setAsProfileOwner(admin1);
assertExpectException(SecurityException.class,
/* messageRegex= */ "Only the system can query restricted pkgs",
- () -> dpm.isMeteredDataDisabledForUser(
+ () -> dpm.isMeteredDataDisabledPackageForUser(
admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE));
dpm.clearProfileOwner(admin1);
setDeviceOwner();
assertExpectException(SecurityException.class,
/* messageRegex= */ "Only the system can query restricted pkgs",
- () -> dpm.isMeteredDataDisabledForUser(
+ () -> dpm.isMeteredDataDisabledPackageForUser(
admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE));
clearDeviceOwner();
}
@@ -2387,12 +2387,12 @@
}
public void testGetUserProvisioningState_defaultResult() {
+ mContext.callerPermissions.add(permission.MANAGE_USERS);
assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
}
public void testSetUserProvisioningState_permission() throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
@@ -2407,6 +2407,7 @@
public void testSetUserProvisioningState_noManagement() {
mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
+ mContext.callerPermissions.add(permission.MANAGE_USERS);
assertExpectException(IllegalStateException.class,
/* messageRegex= */ "change provisioning state unless a .* owner is set",
() -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
@@ -2417,7 +2418,6 @@
public void testSetUserProvisioningState_deviceOwnerFromSetupWizard() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
@@ -2428,7 +2428,6 @@
throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE,
@@ -2438,7 +2437,6 @@
public void testSetUserProvisioningState_deviceOwnerWithoutSetupWizard() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
@@ -2447,7 +2445,6 @@
public void testSetUserProvisioningState_managedProfileFromSetupWizard_primaryUser()
throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
DevicePolicyManager.STATE_USER_PROFILE_COMPLETE,
@@ -2457,7 +2454,6 @@
public void testSetUserProvisioningState_managedProfileFromSetupWizard_managedProfile()
throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
@@ -2466,7 +2462,6 @@
public void testSetUserProvisioningState_managedProfileWithoutSetupWizard() throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
@@ -2474,7 +2469,6 @@
public void testSetUserProvisioningState_illegalTransitionOutOfFinalized1() throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
assertExpectException(IllegalStateException.class,
/* messageRegex= */ "Cannot move to user provisioning state",
@@ -2486,7 +2480,6 @@
public void testSetUserProvisioningState_illegalTransitionToAnotherInProgressState()
throws Exception {
setupProfileOwner();
- mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
assertExpectException(IllegalStateException.class,
/* messageRegex= */ "Cannot move to user provisioning state",
@@ -2496,6 +2489,9 @@
}
private void exerciseUserProvisioningTransitions(int userId, int... states) {
+ mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
+ mContext.callerPermissions.add(permission.MANAGE_USERS);
+
assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
for (int state : states) {
dpm.setUserProvisioningState(state, userId);
@@ -3458,18 +3454,19 @@
dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS_FOR_VR, "0"));
}
- public void testSetSystemSettingFailWithPO() throws Exception {
- setupProfileOwner();
- assertExpectException(SecurityException.class, null, () ->
- dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0"));
- }
-
- public void testSetSystemSetting() throws Exception {
+ public void testSetSystemSettingWithDO() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0");
- verify(getServices().settings).settingsSystemPutString(
- Settings.System.SCREEN_BRIGHTNESS, "0");
+ verify(getServices().settings).settingsSystemPutStringForUser(
+ Settings.System.SCREEN_BRIGHTNESS, "0", UserHandle.USER_SYSTEM);
+ }
+
+ public void testSetSystemSettingWithPO() throws Exception {
+ setupProfileOwner();
+ dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0");
+ verify(getServices().settings).settingsSystemPutStringForUser(
+ Settings.System.SCREEN_BRIGHTNESS, "0", DpmMockContext.CALLER_USER_HANDLE);
}
public void testSetTime() throws Exception {
@@ -3723,7 +3720,8 @@
}
private void verifyLockTaskState(int userId) throws Exception {
- verifyLockTaskState(userId, new String[0], DevicePolicyManager.LOCK_TASK_FEATURE_NONE);
+ verifyLockTaskState(userId, new String[0],
+ DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS);
}
private void verifyLockTaskState(int userId, String[] packages, int flags) throws Exception {
@@ -4194,36 +4192,6 @@
assertTrue(dpm.clearResetPasswordToken(admin1));
}
- public void testSetPasswordBlacklistCannotBeCalledByNonAdmin() throws Exception {
- assertExpectException(SecurityException.class, /* messageRegex= */ null,
- () -> dpm.setPasswordBlacklist(admin1, null, null));
- verifyZeroInteractions(getServices().passwordBlacklist);
- }
-
- public void testClearingPasswordBlacklistDoesNotCreateNewBlacklist() throws Exception {
- setupProfileOwner();
- dpm.setPasswordBlacklist(admin1, null, null);
- verifyZeroInteractions(getServices().passwordBlacklist);
- }
-
- public void testSetPasswordBlacklistCreatesNewBlacklist() throws Exception {
- final String name = "myblacklist";
- final List<String> explicit = Arrays.asList("password", "letmein");
- setupProfileOwner();
- dpm.setPasswordBlacklist(admin1, name, explicit);
- verify(getServices().passwordBlacklist).savePasswordBlacklist(name, explicit);
- }
-
- public void testSetPasswordBlacklistOnlyConvertsExplicitToLowerCase() throws Exception {
- final List<String> mixedCase = Arrays.asList("password", "LETMEIN", "FooTBAll");
- final List<String> lowerCase = Arrays.asList("password", "letmein", "football");
- mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
- setupDeviceOwner();
- final String name = "Name of the Blacklist";
- dpm.setPasswordBlacklist(admin1, name, mixedCase);
- verify(getServices().passwordBlacklist).savePasswordBlacklist(name, lowerCase);
- }
-
public void testIsActivePasswordSufficient() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
mContext.packageName = admin1.getPackageName();
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
index 34c69f5..e753df1 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
@@ -96,7 +96,6 @@
public final IBackupManager ibackupManager;
public final IAudioService iaudioService;
public final LockPatternUtils lockPatternUtils;
- public final PasswordBlacklist passwordBlacklist;
public final StorageManagerForMock storageManager;
public final WifiManager wifiManager;
public final SettingsForMock settings;
@@ -135,7 +134,6 @@
ibackupManager = mock(IBackupManager.class);
iaudioService = mock(IAudioService.class);
lockPatternUtils = mock(LockPatternUtils.class);
- passwordBlacklist = mock(PasswordBlacklist.class);
storageManager = mock(StorageManagerForMock.class);
wifiManager = mock(WifiManager.class);
settings = mock(SettingsForMock.class);
@@ -419,7 +417,7 @@
public void settingsGlobalPutString(String name, String value) {
}
- public void settingsSystemPutString(String name, String value) {
+ public void settingsSystemPutStringForUser(String name, String value, int callingUserId) {
}
public int settingsGlobalGetInt(String name, int value) {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/PasswordBlacklistTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/PasswordBlacklistTest.java
deleted file mode 100644
index 1b3fc2c..0000000
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/PasswordBlacklistTest.java
+++ /dev/null
@@ -1,110 +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.
- */
-package com.android.server.devicepolicy;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit tests for {@link PasswordBlacklist}.
- *
- * bit FrameworksServicesTests:com.android.server.devicepolicy.PasswordBlacklistTest
- * runtest -x frameworks/base/services/tests/servicestests/src/com/android/server/devicepolicy/PasswordBlacklistTest.java
- */
-@RunWith(AndroidJUnit4.class)
-public final class PasswordBlacklistTest {
- private File mBlacklistFile;
- private PasswordBlacklist mBlacklist;
-
- @Before
- public void setUp() throws IOException {
- mBlacklistFile = File.createTempFile("pwdbl", null);
- mBlacklist = new PasswordBlacklist(mBlacklistFile);
- }
-
- @After
- public void tearDown() {
- mBlacklist.delete();
- }
-
- @Test
- public void matchIsExact() {
- // Note: Case sensitivity is handled by the user of PasswordBlacklist by normalizing the
- // values stored in and tested against it.
- mBlacklist.savePasswordBlacklist("matchIsExact", Arrays.asList("password", "qWERty"));
- assertTrue(mBlacklist.isPasswordBlacklisted("password"));
- assertTrue(mBlacklist.isPasswordBlacklisted("qWERty"));
- assertFalse(mBlacklist.isPasswordBlacklisted("Password"));
- assertFalse(mBlacklist.isPasswordBlacklisted("qwert"));
- assertFalse(mBlacklist.isPasswordBlacklisted("letmein"));
- }
-
- @Test
- public void matchIsNotRegex() {
- mBlacklist.savePasswordBlacklist("matchIsNotRegex", Arrays.asList("a+b*"));
- assertTrue(mBlacklist.isPasswordBlacklisted("a+b*"));
- assertFalse(mBlacklist.isPasswordBlacklisted("aaaa"));
- assertFalse(mBlacklist.isPasswordBlacklisted("abbbb"));
- assertFalse(mBlacklist.isPasswordBlacklisted("aaaa"));
- }
-
- @Test
- public void matchFailsSafe() throws IOException {
- try (FileOutputStream fos = new FileOutputStream(mBlacklistFile)) {
- // Write a malformed blacklist file
- fos.write(17);
- }
- assertTrue(mBlacklist.isPasswordBlacklisted("anything"));
- assertTrue(mBlacklist.isPasswordBlacklisted("at"));
- assertTrue(mBlacklist.isPasswordBlacklisted("ALL"));
- }
-
- @Test
- public void blacklistCanBeNamed() {
- final String name = "identifier";
- mBlacklist.savePasswordBlacklist(name, Arrays.asList("one", "two", "three"));
- assertEquals(mBlacklist.getName(), name);
- }
-
- @Test
- public void reportsTheCorrectNumberOfEntries() {
- mBlacklist.savePasswordBlacklist("Count Entries", Arrays.asList("1", "2", "3", "4"));
- assertEquals(mBlacklist.getSize(), 4);
- }
-
- @Test
- public void reportsBlacklistFile() {
- assertEquals(mBlacklistFile, mBlacklist.getFile());
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 0ea2317..7ce5904 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -33,23 +33,28 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.os.FileUtils;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.RecoveryController;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage;
@@ -59,6 +64,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
import java.io.File;
import java.nio.charset.StandardCharsets;
@@ -72,8 +78,12 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class KeySyncTaskTest {
+
+ private static final String SNAPSHOT_TOP_LEVEL_DIRECTORY = "recoverablekeystore";
+
private static final String KEY_ALGORITHM = "AES";
private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore";
+ private static final String TEST_ROOT_CERT_ALIAS = "trusted_root";
private static final String WRAPPING_KEY_ALIAS = "KeySyncTaskTest/WrappingKey";
private static final String DATABASE_FILE_NAME = "recoverablekeystore.db";
private static final int TEST_USER_ID = 1000;
@@ -90,6 +100,7 @@
@Mock private PlatformKeyManager mPlatformKeyManager;
@Mock private RecoverySnapshotListenersStorage mSnapshotListenersStorage;
+ @Spy private TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
private RecoverySnapshotStorage mRecoverySnapshotStorage;
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
@@ -111,7 +122,12 @@
new int[] {TYPE_LOCKSCREEN});
mRecoverableKeyStoreDb.setRecoverySecretTypes(TEST_USER_ID, TEST_RECOVERY_AGENT_UID2,
new int[] {TYPE_LOCKSCREEN});
- mRecoverySnapshotStorage = new RecoverySnapshotStorage();
+
+ mRecoverableKeyStoreDb.setActiveRootOfTrust(TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+ TEST_ROOT_CERT_ALIAS);
+ mRecoverableKeyStoreDb.setActiveRootOfTrust(TEST_USER_ID, TEST_RECOVERY_AGENT_UID2,
+ TEST_ROOT_CERT_ALIAS);
+ mRecoverySnapshotStorage = new RecoverySnapshotStorage(context.getFilesDir());
mKeySyncTask = new KeySyncTask(
mRecoverableKeyStoreDb,
@@ -121,7 +137,8 @@
TEST_CREDENTIAL_TYPE,
TEST_CREDENTIAL,
/*credentialUpdated=*/ false,
- mPlatformKeyManager);
+ mPlatformKeyManager,
+ mTestOnlyInsecureCertificateHelper);
mWrappingKey = generateAndroidKeyStoreKey();
mEncryptKey = new PlatformEncryptionKey(TEST_GENERATION_ID, mWrappingKey);
@@ -133,6 +150,10 @@
public void tearDown() {
mRecoverableKeyStoreDb.close();
mDatabaseFile.delete();
+
+ File file = new File(InstrumentationRegistry.getTargetContext().getFilesDir(),
+ SNAPSHOT_TOP_LEVEL_DIRECTORY);
+ FileUtils.deleteContentsAndDir(file);
}
@Test
@@ -247,7 +268,7 @@
TEST_APP_KEY_ALIAS,
WrappedKey.fromSecretKey(mEncryptKey, applicationKey));
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
mKeySyncTask.run();
@@ -263,7 +284,7 @@
mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mKeySyncTask.run();
@@ -271,9 +292,103 @@
}
@Test
+ public void run_InTestModeWithWhitelistedCredentials() throws Exception {
+ mRecoverableKeyStoreDb.setServerParams(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+
+ // Enter test mode with whitelisted credentials
+ when(mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(any())).thenReturn(true);
+ when(mTestOnlyInsecureCertificateHelper.doesCredentialSupportInsecureMode(anyInt(), any()))
+ .thenReturn(true);
+ mKeySyncTask.run();
+
+ verify(mTestOnlyInsecureCertificateHelper)
+ .getDefaultCertificateAliasIfEmpty(eq(TEST_ROOT_CERT_ALIAS));
+
+ // run whitelist checks
+ verify(mTestOnlyInsecureCertificateHelper)
+ .doesCredentialSupportInsecureMode(anyInt(), any());
+ verify(mTestOnlyInsecureCertificateHelper)
+ .keepOnlyWhitelistedInsecureKeys(any());
+
+ KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+ assertNotNull(keyChainSnapshot); // created snapshot
+ List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
+ assertThat(applicationKeys).hasSize(0); // non whitelisted key is not included
+ }
+
+ @Test
+ public void run_InTestModeWithNonWhitelistedCredentials() throws Exception {
+ mRecoverableKeyStoreDb.setServerParams(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+
+ // Enter test mode with non whitelisted credentials
+ when(mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(any())).thenReturn(true);
+ when(mTestOnlyInsecureCertificateHelper.doesCredentialSupportInsecureMode(anyInt(), any()))
+ .thenReturn(false);
+ mKeySyncTask.run();
+
+ assertNull(mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID)); // not created
+ verify(mTestOnlyInsecureCertificateHelper)
+ .getDefaultCertificateAliasIfEmpty(eq(TEST_ROOT_CERT_ALIAS));
+ verify(mTestOnlyInsecureCertificateHelper)
+ .doesCredentialSupportInsecureMode(anyInt(), any());
+ }
+
+ @Test
+ public void run_doesNotFilterCredentialsAndAliasesInProd() throws Exception {
+ mRecoverableKeyStoreDb.setServerParams(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+
+ mKeySyncTask.run();
+ assertNotNull(mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID));
+
+ verify(mTestOnlyInsecureCertificateHelper)
+ .getDefaultCertificateAliasIfEmpty(eq(TEST_ROOT_CERT_ALIAS));
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .isTestOnlyCertificateAlias(eq(TEST_ROOT_CERT_ALIAS));
+
+ // no whitelists check
+ verify(mTestOnlyInsecureCertificateHelper, never())
+ .doesCredentialSupportInsecureMode(anyInt(), any());
+ verify(mTestOnlyInsecureCertificateHelper, never())
+ .keepOnlyWhitelistedInsecureKeys(any());
+ }
+
+ @Test
+ public void run_replacesNullActiveRootAliasWithDefaultValue() throws Exception {
+ mRecoverableKeyStoreDb.setServerParams(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+ addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setActiveRootOfTrust(TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+ /*alias=*/ null);
+
+ when(mTestOnlyInsecureCertificateHelper.getDefaultCertificateAliasIfEmpty(null))
+ .thenReturn(TEST_ROOT_CERT_ALIAS); // override default.
+ mKeySyncTask.run();
+
+ verify(mTestOnlyInsecureCertificateHelper).getDefaultCertificateAliasIfEmpty(null);
+ }
+
+ @Test
public void run_sendsEncryptedKeysIfAvailableToSync_withRawPublicKey() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setServerParams(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
@@ -320,7 +435,7 @@
@Test
public void run_sendsEncryptedKeysIfAvailableToSync_withCertPath() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setServerParams(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
@@ -339,7 +454,7 @@
@Test
public void run_setsCorrectSnapshotVersion() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -358,7 +473,7 @@
@Test
public void run_recreatesMissingSnapshot() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -385,10 +500,11 @@
CREDENTIAL_TYPE_PASSWORD,
"password",
/*credentialUpdated=*/ false,
- mPlatformKeyManager);
+ mPlatformKeyManager,
+ mTestOnlyInsecureCertificateHelper);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -411,10 +527,11 @@
CREDENTIAL_TYPE_PASSWORD,
/*credential=*/ "1234",
/*credentialUpdated=*/ false,
- mPlatformKeyManager);
+ mPlatformKeyManager,
+ mTestOnlyInsecureCertificateHelper);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -438,10 +555,11 @@
CREDENTIAL_TYPE_PATTERN,
"12345",
/*credentialUpdated=*/ false,
- mPlatformKeyManager);
+ mPlatformKeyManager,
+ mTestOnlyInsecureCertificateHelper);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -457,9 +575,9 @@
@Test
public void run_sendsEncryptedKeysWithTwoRegisteredAgents() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -479,9 +597,9 @@
new int[] {1000});
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -496,9 +614,9 @@
@Test
public void run_notifiesNonregisteredAgent() throws Exception {
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(false);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -519,7 +637,8 @@
/*credentialType=*/ 3,
"12345",
/*credentialUpdated=*/ false,
- mPlatformKeyManager);
+ mPlatformKeyManager,
+ mTestOnlyInsecureCertificateHelper);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index b7ce59d..f0d799f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -18,6 +18,8 @@
import static android.security.keystore.recovery.KeyChainProtectionParams.TYPE_LOCKSCREEN;
import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PASSWORD;
+import static android.security.keystore.recovery.RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT;
+import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertArrayEquals;
@@ -27,6 +29,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -44,9 +47,10 @@
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.RecoveryCertPath;
+import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.support.test.filters.SmallTest;
import android.support.test.InstrumentationRegistry;
@@ -66,6 +70,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
import java.io.File;
import java.nio.charset.StandardCharsets;
@@ -90,6 +95,10 @@
private static final String DATABASE_FILE_NAME = "recoverablekeystore.db";
private static final String ROOT_CERTIFICATE_ALIAS = "";
+ private static final String DEFAULT_ROOT_CERT_ALIAS =
+ TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS;
+ private static final String INSECURE_CERTIFICATE_ALIAS =
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS;
private static final String TEST_SESSION_ID = "karlin";
private static final byte[] TEST_PUBLIC_KEY = new byte[] {
(byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
@@ -143,7 +152,7 @@
private static final String KEY_ALGORITHM = "AES";
private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore";
private static final String WRAPPING_KEY_ALIAS = "RecoverableKeyStoreManagerTest/WrappingKey";
- private static final String TEST_ROOT_CERT_ALIAS = "";
+ private static final String TEST_DEFAULT_ROOT_CERT_ALIAS = "";
private static final KeyChainProtectionParams TEST_PROTECTION_PARAMS =
new KeyChainProtectionParams.Builder()
.setUserSecretType(TYPE_LOCKSCREEN)
@@ -157,6 +166,7 @@
@Mock private KeyguardManager mKeyguardManager;
@Mock private PlatformKeyManager mPlatformKeyManager;
@Mock private ApplicationKeyStorage mApplicationKeyStorage;
+ @Spy private TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
private File mDatabaseFile;
@@ -186,14 +196,14 @@
mRecoverableKeyStoreManager = new RecoverableKeyStoreManager(
mMockContext,
- KeyStore.getInstance(),
mRecoverableKeyStoreDb,
mRecoverySessionStorage,
Executors.newSingleThreadExecutor(),
mRecoverySnapshotStorage,
mMockListenersStorage,
mPlatformKeyManager,
- mApplicationKeyStorage);
+ mApplicationKeyStorage,
+ mTestOnlyInsecureCertificateHelper);
}
@After
@@ -203,24 +213,6 @@
}
@Test
- public void generateAndStoreKey_storesTheKey() throws Exception {
- int uid = Binder.getCallingUid();
- int userId = UserHandle.getCallingUserId();
-
- mRecoverableKeyStoreManager.generateAndStoreKey(TEST_ALIAS);
-
- assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
-
- assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
- }
-
- @Test
- public void generateAndStoreKey_returnsAKeyOfAppropriateSize() throws Exception {
- assertThat(mRecoverableKeyStoreManager.generateAndStoreKey(TEST_ALIAS))
- .hasLength(RECOVERABLE_KEY_SIZE_BYTES);
- }
-
- @Test
public void importKey_storesTheKey() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -257,7 +249,7 @@
@Test
public void removeKey_removesAKey() throws Exception {
int uid = Binder.getCallingUid();
- mRecoverableKeyStoreManager.generateAndStoreKey(TEST_ALIAS);
+ mRecoverableKeyStoreManager.generateKey(TEST_ALIAS);
mRecoverableKeyStoreManager.removeKey(TEST_ALIAS);
@@ -268,7 +260,7 @@
public void removeKey_updatesShouldCreateSnapshot() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
- mRecoverableKeyStoreManager.generateAndStoreKey(TEST_ALIAS);
+ mRecoverableKeyStoreManager.generateKey(TEST_ALIAS);
// Pretend that key was synced
mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
@@ -298,15 +290,79 @@
mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
TestData.getCertXmlWithSerial(certSerial));
- assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isEqualTo(
- TestData.CERT_PATH_1);
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid)).isEqualTo(
- certSerial);
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getDefaultCertificateAliasIfEmpty(ROOT_CERTIFICATE_ALIAS);
+
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(certSerial);
assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
}
@Test
+ public void initRecoveryService_triesToFilterRootAlias() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ long certSerial = 1000L;
+ mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
+
+ mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+ TestData.getCertXmlWithSerial(certSerial));
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getDefaultCertificateAliasIfEmpty(eq(ROOT_CERTIFICATE_ALIAS));
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getRootCertificate(eq(DEFAULT_ROOT_CERT_ALIAS));
+
+ String activeRootAlias = mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid);
+ assertThat(activeRootAlias).isEqualTo(DEFAULT_ROOT_CERT_ALIAS);
+
+ }
+
+ @Test
+ public void initRecoveryService_usesProdCertificateForEmptyRootAlias() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ long certSerial = 1000L;
+ mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
+
+ mRecoverableKeyStoreManager.initRecoveryService(/*rootCertificateAlias=*/ "",
+ TestData.getCertXmlWithSerial(certSerial));
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getDefaultCertificateAliasIfEmpty(eq(""));
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getRootCertificate(eq(DEFAULT_ROOT_CERT_ALIAS));
+
+ String activeRootAlias = mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid);
+ assertThat(activeRootAlias).isEqualTo(DEFAULT_ROOT_CERT_ALIAS);
+ }
+
+ @Test
+ public void initRecoveryService_usesProdCertificateForNullRootAlias() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ long certSerial = 1000L;
+ mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
+
+ mRecoverableKeyStoreManager.initRecoveryService(/*rootCertificateAlias=*/ null,
+ TestData.getCertXmlWithSerial(certSerial));
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getDefaultCertificateAliasIfEmpty(null);
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getRootCertificate(eq(DEFAULT_ROOT_CERT_ALIAS));
+
+ String activeRootAlias = mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid);
+ assertThat(activeRootAlias).isEqualTo(DEFAULT_ROOT_CERT_ALIAS);
+ }
+
+ @Test
public void initRecoveryService_regeneratesCounterId() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -328,10 +384,11 @@
byte[] modifiedCertXml = TestData.getCertXml();
modifiedCertXml[modifiedCertXml.length - 50] ^= 1; // Flip a bit in the certificate
try {
- mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS, modifiedCertXml);
+ mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+ modifiedCertXml);
fail("should have thrown");
} catch (ServiceSpecificException e) {
- assertThat(e.getMessage()).contains("validate cert");
+ assertThat(e.errorCode).isEqualTo(ERROR_INVALID_CERTIFICATE);
}
}
@@ -346,8 +403,9 @@
mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
TestData.getCertXmlWithSerial(certSerial + 1));
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid))
- .isEqualTo(certSerial + 1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(certSerial + 1);
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
}
@Test
@@ -361,8 +419,55 @@
mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
TestData.getCertXmlWithSerial(certSerial - 1));
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid))
- .isEqualTo(certSerial);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(certSerial);
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ }
+
+ @Test
+ public void initRecoveryService_alwaysUpdatesCertsWhenTestRootCertIsUsed() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ int certSerial = 3333;
+
+ String testRootCertAlias = TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS;
+
+ mRecoverableKeyStoreManager.initRecoveryService(testRootCertAlias,
+ TestData.getInsecureCertXmlBytesWithEndpoint1(certSerial));
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ testRootCertAlias)).isEqualTo(certSerial);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ testRootCertAlias)).isEqualTo(TestData.getInsecureCertPathForEndpoint1());
+
+ mRecoverableKeyStoreManager.initRecoveryService(testRootCertAlias,
+ TestData.getInsecureCertXmlBytesWithEndpoint2(certSerial - 1));
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ testRootCertAlias)).isEqualTo(certSerial - 1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ testRootCertAlias)).isEqualTo(TestData.getInsecureCertPathForEndpoint2());
+ }
+
+ @Test
+ public void initRecoveryService_updatesCertsIndependentlyForDifferentRoots() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+
+ mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+ TestData.getCertXmlWithSerial(1111L));
+ mRecoverableKeyStoreManager.initRecoveryService(
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS,
+ TestData.getInsecureCertXmlBytesWithEndpoint1(2222));
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ ROOT_CERTIFICATE_ALIAS)).isEqualTo(1111L);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS)).isEqualTo(2222L);
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ ROOT_CERTIFICATE_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS)).isEqualTo(
+ TestData.getInsecureCertPathForEndpoint1());
}
@Test
@@ -373,7 +478,6 @@
mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
TestData.getCertXmlWithSerial(certSerial));
- mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
TestData.getCertXmlWithSerial(certSerial));
@@ -382,17 +486,36 @@
}
@Test
- public void initRecoveryService_succeedsWithRawPublicKey() throws Exception {
+ public void initRecoveryService_throwsIfRawPublicKey() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
- mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS, TEST_PUBLIC_KEY);
+ try {
+ mRecoverableKeyStoreManager
+ .initRecoveryService(ROOT_CERTIFICATE_ALIAS, TEST_PUBLIC_KEY);
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.errorCode).isEqualTo(ERROR_BAD_CERTIFICATE_FORMAT);
+ }
- assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isNull();
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid)).isNull();
- assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNotNull();
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isNull();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isNull();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
+ }
+
+ @Test
+ public void initRecoveryService_throwsIfUnknownRootCertAlias() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.initRecoveryService(
+ "unknown-root-cert-alias", TestData.getCertXml());
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.errorCode).isEqualTo(ERROR_INVALID_CERTIFICATE);
+ }
}
@Test
@@ -404,13 +527,31 @@
mRecoverableKeyStoreManager.initRecoveryServiceWithSigFile(
ROOT_CERTIFICATE_ALIAS, TestData.getCertXml(), TestData.getSigXml());
- assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isEqualTo(
- TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
assertThat(mRecoverableKeyStoreDb.getRecoveryServicePublicKey(userId, uid)).isNull();
}
@Test
+ public void initRecoveryServiceWithSigFile_usesProdCertificateForNullRootAlias()
+ throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ long certSerial = 1000L;
+ mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
+
+ mRecoverableKeyStoreManager.initRecoveryServiceWithSigFile(
+ /*rootCertificateAlias=*/null, TestData.getCertXml(), TestData.getSigXml());
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getDefaultCertificateAliasIfEmpty(null);
+
+ verify(mTestOnlyInsecureCertificateHelper, atLeast(1))
+ .getRootCertificate(eq(DEFAULT_ROOT_CERT_ALIAS));
+ }
+
+ @Test
public void initRecoveryServiceWithSigFile_throwsIfNullCertFile() throws Exception {
try {
mRecoverableKeyStoreManager.initRecoveryServiceWithSigFile(
@@ -442,7 +583,19 @@
getUtf8Bytes("wrong-sig-file-format"));
fail("should have thrown");
} catch (ServiceSpecificException e) {
- assertThat(e.getMessage()).contains("parse the sig file");
+ assertThat(e.errorCode).isEqualTo(ERROR_BAD_CERTIFICATE_FORMAT);
+ }
+ }
+
+ @Test
+ public void initRecoveryServiceWithSigFile_throwsIfTestAliasUsedWithProdCert()
+ throws Exception {
+ try {
+ mRecoverableKeyStoreManager.initRecoveryServiceWithSigFile(
+ INSECURE_CERTIFICATE_ALIAS, TestData.getCertXml(), TestData.getSigXml());
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.errorCode).isEqualTo(ERROR_INVALID_CERTIFICATE);
}
}
@@ -473,13 +626,11 @@
eq(Manifest.permission.RECOVER_KEYSTORE), any());
}
- // TODO: Add tests for non-existing cert alias
-
@Test
public void startRecoverySessionWithCertPath_storesTheSessionInfo() throws Exception {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -496,7 +647,7 @@
public void startRecoverySessionWithCertPath_checksPermissionFirst() throws Exception {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -600,7 +751,7 @@
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -619,7 +770,7 @@
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
vaultParams,
TEST_VAULT_CHALLENGE,
@@ -637,7 +788,7 @@
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(emptyCertPath),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -657,7 +808,7 @@
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
- TEST_ROOT_CERT_ALIAS,
+ TEST_DEFAULT_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(shortCertPath),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -706,7 +857,8 @@
}
@Test
- public void recoverKeyChainSnapshot_throwsIfFailedToDecryptAllApplicationKeys() throws Exception {
+ public void recoverKeyChainSnapshot_throwsIfFailedToDecryptAllApplicationKeys()
+ throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -786,7 +938,8 @@
}
@Test
- public void recoverKeyChainSnapshot_worksOnOtherApplicationKeysIfOneDecryptionFails() throws Exception {
+ public void recoverKeyChainSnapshot_worksOnOtherApplicationKeysIfOneDecryptionFails()
+ throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -879,7 +1032,7 @@
}
@Test
- public void setRecoverySecretTypes() throws Exception {
+ public void setRecoverySecretTypes_updatesSecretTypes() throws Exception {
int[] types1 = new int[]{11, 2000};
int[] types2 = new int[]{1, 2, 3};
int[] types3 = new int[]{};
@@ -898,6 +1051,41 @@
}
@Test
+ public void setRecoverySecretTypes_doesNotSetSnapshotPendingIfIniting() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ int[] secretTypes = new int[] { 101 };
+
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(secretTypes);
+
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ }
+
+ @Test
+ public void setRecoverySecretTypes_doesNotSetSnapshotPendingIfSettingSameValue()
+ throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ int[] secretTypes = new int[] { 101 };
+
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(secretTypes);
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(secretTypes);
+
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+ }
+
+ @Test
+ public void setRecoverySecretTypes_setsSnapshotPendingIfUpdatingValue() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(new int[] { 101 });
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(new int[] { 102 });
+
+ assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ }
+
+ @Test
public void setRecoverySecretTypes_throwsIfNullTypes() throws Exception {
try {
mRecoverableKeyStoreManager.setRecoverySecretTypes(/*types=*/ null);
@@ -911,12 +1099,12 @@
public void setRecoverySecretTypes_updatesShouldCreateSnapshot() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
- int[] types = new int[]{1, 2, 3};
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(new int[] { 1 });
- mRecoverableKeyStoreManager.generateAndStoreKey(TEST_ALIAS);
+ mRecoverableKeyStoreManager.generateKey(TEST_ALIAS);
// Pretend that key was synced
mRecoverableKeyStoreDb.setShouldCreateSnapshot(userId, uid, false);
- mRecoverableKeyStoreManager.setRecoverySecretTypes(types);
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(new int[] { 2 });
assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
index 4b059c6..64eb49b 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.android.server.locksettings.recoverablekeystore;
import static com.google.common.truth.Truth.assertThat;
@@ -13,9 +29,14 @@
import java.security.cert.CertificateFactory;
import java.security.cert.CertPath;
import java.security.spec.ECPrivateKeySpec;
+import java.util.Base64;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
public final class TestData {
+ private static final String KEY_ALGORITHM = "AES";
private static final long DEFAULT_SERIAL = 1000;
private static final String CERT_PATH_ENCODING = "PkiPath";
@@ -308,4 +329,283 @@
KeyFactory keyFactory = KeyFactory.getInstance("EC");
return keyFactory.generatePrivate(new ECPrivateKeySpec(priv, SecureBox.EC_PARAM_SPEC));
}
+
+ public static SecretKey generateKey() throws Exception {
+ KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
+ keyGenerator.init(/*keySize=*/ 256);
+ return keyGenerator.generateKey();
+ }
+
+ private static final String INSECURE_CERT_XML_HEADER = ""
+ + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ + "<certificates>\n"
+ + " <metadata>\n"
+ + " <serial>\n";
+ private static final String INSECURE_CERT_XML_BODY = ""
+ + " </serial>\n"
+ + " <creation-time>\n"
+ + " 1515697631\n"
+ + " </creation-time>\n"
+ + " <refresh-interval>\n"
+ + " 2592000\n"
+ + " </refresh-interval>\n"
+ + " <previous>\n"
+ + " <serial>\n"
+ + " 0\n"
+ + " </serial>\n"
+ + " <hash>\n"
+ + " 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\n"
+ + " </hash>\n"
+ + " </previous>\n"
+ + " </metadata>\n"
+ + " <intermediates>\n"
+ + " <cert>\n"
+ + " MIIEQjCCAiqgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwLTErMCkGA1UEAwwiVGVz\n"
+ + " dCBPbmx5IFVuc2VjdXJlIEludGVybWVkaWF0ZSBDQTAeFw0xODAzMjgwNTA1MjNa\n"
+ + " Fw0yMzAzMDIwNTA1MjNaMDMxMTAvBgNVBAMMKFRlc3QgT25seSBVbnNlY3VyZSBJ\n"
+ + " bnRlci1JbnRlcm1lZGlhdGUgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n"
+ + " AoIBAQDF3CyLIFWaNspHUwEr5hHDr6nmP5Iog73E6G7kBB1Xytt955AagHffmHze\n"
+ + " WZ/mAWBYHe6kJMsTLTfmb+kZLK8/s58AjUu/byrgPPIL92v7HgIa1148OePYmohX\n"
+ + " z0uNZQK5sYeb4kT2cyprKSWPBceyCcZDelTYpbleXd2yJSY/37XoiacmR8z6fEds\n"
+ + " ezqNLBpVApiVsVehizdIioYUCAtZlS2DnShacVGOq/FE/RCOC3wfKVcOV4HqaVBM\n"
+ + " JwwMOSL6YUIq34fi6VSNAunReeF7tckESUFu0pz52UmRyMhDZ/FCrjE5EIslxomD\n"
+ + " NJJttZyAmZDUB087SA6vNWhJOwynAgMBAAGjZjBkMB0GA1UdDgQWBBRcOlrOWbGw\n"
+ + " +UIwB8/P1ZRHsgEyvzAfBgNVHSMEGDAWgBQhLxSvWzSypPWVIcPdbtgiAphaNDAS\n"
+ + " BgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF\n"
+ + " AAOCAgEAkI+gomTRa34s3lea8Amg+W9WeyitdVw2MxBF/jYLAELq9pIfgsI8EYRt\n"
+ + " rUGT05xzrcis+cqdwxDTAQNNcvOxHj3F/VkGiAHvCFapw7quxeq6+aHU9m2nnZ1O\n"
+ + " Ss9qz7Low32yWhf5jJSQRA5HPO139H+CquVFDYOx1oiny0JsBivBoVkhb35HJmBu\n"
+ + " dkabfKIVdKAesd0At7KHZM9Voitp4LQsYctsi63EzELNvmFZ/NujVyoLmXz1wmQg\n"
+ + " avdc2FdWHMD3CdJzDyYmfqvn7FPds8wdWEnBnfZ4A5izwFD2BJjMvMfVs4pPv/8z\n"
+ + " GFYPkjhgN43Rh8kakJ+QgSbZpoEY0Vb7WbjMNRbdTBUJCk5waAMSNvWK26wcAzok\n"
+ + " OWZ+j6SHj2cku6sAcDbWLrlaREy6KTLpvhMqsiLzivmfu/FGWCZMb/zX1rllzzGP\n"
+ + " v6tIF29ewYNOic+RT3E4H9I7YO+mSbEs2szoRl6HRoC24DIcgUxpQ24Z3WriuIdB\n"
+ + " XwdHXgDGeoD9NsI3Lt7KRoXePDAyzKTnxTUwo+G9au5+ldtLs645ijDKKcX7CmyJ\n"
+ + " zCnIMeTeU9j88ht5s4Yo50s1WBeQv/Tq+euzprXrdUzFaih4aOFDytuyoZIwAi02\n"
+ + " dr2Dw+CkExaY755XQtEAV3KNi8+oy9Qy6pkBE50KGD40exzOru8=\n"
+ + " </cert>\n"
+ + " <cert>\n"
+ + " MIIFNDCCAxygAwIBAgICEAAwDQYJKoZIhvcNAQENBQAwJTEjMCEGA1UEAwwaVGVz\n"
+ + " dCBPbmx5IFVuc2VjdXJlIFJvb3QgQ0EwHhcNMTgwMzI4MDAzNzE4WhcNMjgwMzI1\n"
+ + " MDAzNzE4WjAtMSswKQYDVQQDDCJUZXN0IE9ubHkgVW5zZWN1cmUgSW50ZXJtZWRp\n"
+ + " YXRlIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1dwb6jH2QBwA\n"
+ + " kj6W8lrprOvJRCJQhx/sAAnMqcvFMDIb5cY2PIwWglMENmZvtigzOiE6Je+QxHsh\n"
+ + " EYYm7D8XU9vRjOUBW7NQW3Lb/tsEX4FUDmsGWbm7pYRoXQheAy1PTyPRNCRBciUd\n"
+ + " z2mQq7oL03jNGkOIIRKAluo/QzZbXVnVep8nUJRikt3lYxUl8hwiM3Epzqs3+No8\n"
+ + " HGCwf5ohQYXvYcJF/KxnTUKyFHPDpHSME2IViYnmY8bfzRDBkNlHsAcSSXir3AEe\n"
+ + " BDI9/uaY7PlwoQwrG1qQ5MKqPM5eLm+uOFVs1kKwSLRLmPk7X4mu56o88CE2InTc\n"
+ + " zIz5PUcBWW1RvGhAA/FX9fChgXrDC8megGbAzQCE22pxcqR+RUIphXxe2PkhkvUH\n"
+ + " PI6JM4ijFVGhCum6leMkOeRmwtlAZ8mmTBJbGVdHUSaKVxYy6LcFR8Rt1stjQxTN\n"
+ + " BJKXfZsI/qvKf9pTkevvMtaUoMwwYAd8rTMhwuAml+uhrf39UtLRS6SAH/POaD6d\n"
+ + " 8Dnl9KeAGLb6P5pixd+TYDUfj/ZebuzDkuK/BfJbDB+qYiXWbD7EhYtyHFIoc9pF\n"
+ + " IXmE0sb+n0/WGtBpXipZWInJqnzV0LDRKoFPfhO1YtsUNtSTCtiPSJGouwn4PlCC\n"
+ + " 2rIm8cnA9Mo1qtBfLRLVcHWWM69c7W0CAwEAAaNmMGQwHQYDVR0OBBYEFCEvFK9b\n"
+ + " NLKk9ZUhw91u2CICmFo0MB8GA1UdIwQYMBaAFMMnjaWILF12L4fc9P5Ra42u7Ffr\n"
+ + " MBIGA1UdEwEB/wQIMAYBAf8CAQIwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\n"
+ + " DQUAA4ICAQAj08SwC3OWKq3rmDOxdGeODLYwPJl/lfiOdFFQMOhzSKKQ4oBlwRAR\n"
+ + " F4T32KU95/0QhwjgYB2nFo/frDKwk2j3F7gZvZuc4ekuP6Vc1qSSgv99kqIIrk74\n"
+ + " UNUK2BmOIqrCunpW7WF99VQgS4FHS0TJbJdsecV7KNznT4l3dac/QOOXeid5HSeE\n"
+ + " QHGyqMUd0noDS0UjqNfhdbd1sWpsZYjWsIq+gsZ3ADDSTCESwjElHZOMVKz3uyIx\n"
+ + " 7i4HY1pzWV4Ob0NedLfYvaauAxnQSsktQMk56mGWqLaiBQA3FjNGh5J28oSws93Z\n"
+ + " e/OBUtUT92vlbVqbqsQCq6GiNgh7RGnsMFqV7+hrJsHjI1SUG5YlgCWIw9sPNdpW\n"
+ + " q4jR0pOR+WVBW8HY8C7HTOlTOh3K6Isdwx813XeU6xGxLhQuN/zEQolQRSD8wBto\n"
+ + " 2gmZF9MWTzS3YE68b7LwxR6ByghaLxxN7ULRR2cxoRAuJEbgeFRzaI4xiRqLOoS2\n"
+ + " dwsPp30sVx6meXqfhYUT9CebexrI31+sbryaTAktExoP4Gsnx1uCjLr8UUsde7Jq\n"
+ + " Ln0gg4Sv9tHz7GWm0TE5iwMHk59KCKyMFc+x8MHY9Cdhd+p7drrba3X+FC80DRoK\n"
+ + " uRQ0rcOVWaGNoK3KLAr22axFSgWJX2wrNPMNqRfz9/6/t83HO/5xiw==\n"
+ + " </cert>\n"
+ + " </intermediates>\n"
+ + " <endpoints>\n";
+ private static final String INSECURE_CERT_XML_ENDPOINT1_CERT = ""
+ + " <cert>\n"
+ + " MIIDlDCCAXygAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwLTErMCkGA1UEAwwiVGVz\n"
+ + " dCBPbmx5IFVuc2VjdXJlIEludGVybWVkaWF0ZSBDQTAeFw0xODAzMjgwNTIzMTZa\n"
+ + " Fw0yMjA1MDYwNTIzMTZaMCgxJjAkBgNVBAMMHVRlc3QgT25seSBVbnNlY3VyZSBF\n"
+ + " bmRwb2ludCAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt0uibX2wsl5S0gPl\n"
+ + " mR8JNEa9oXYyV8RniS57AG1ZBEpqBi/cBtkLctiJ6RUPYxRSR7xkfGu90TEFapjc\n"
+ + " cELxYaOBjTCBijAJBgNVHRMEAjAAMB0GA1UdDgQWBBTE4A58EAivi5Lf/fgO4tjh\n"
+ + " NgVFJjBOBgNVHSMERzBFgBQhLxSvWzSypPWVIcPdbtgiAphaNKEppCcwJTEjMCEG\n"
+ + " A1UEAwwaVGVzdCBPbmx5IFVuc2VjdXJlIFJvb3QgQ0GCAhAAMA4GA1UdDwEB/wQE\n"
+ + " AwIDCDANBgkqhkiG9w0BAQsFAAOCAgEAOCwjSvJ/6+gjTEgX3uFV3OiGb5C1UIlR\n"
+ + " StZq9h+65m5Rj4rAM/1RYkjYrIy25VZyGk85cJhcv+ZIFKz4gKwgTxhDUjtOtNFS\n"
+ + " rsY50IFwXOwFC+NaP/Z9d75Om5FSbbmXCnoMpb8ErtNvUaJs7CezOg0m19JD3/eq\n"
+ + " 9DsroSDY9+3HQluURv92YlfsIhZaByTgQU5X2e56RKR2pcij+AoQGTzmAHou1k3+\n"
+ + " aNkdvZz8YRS7UoVPMyrii1rNFYaYOBYwZHzP/zM8CLGZ3O6nC0Rq+5f6Twi5tiIR\n"
+ + " WNz5gWawOdvPicVfv66EfEBQRfu45HsOLqnPjnAwbLVLUOn2mw/PH+jffgswD8Jl\n"
+ + " AKHIhuS6zE7+ArXz0/Uz88wYSJMj2TU2g9S+KxHCElltf2gLX3aak6lNeOnfbVP3\n"
+ + " Ld+S9t43Vu058Ao7a4htNbT9/kTvaB2gWqL2GIXAtZ/lEcgmOedVIX0AEv5doB9Z\n"
+ + " Ygue5SlJy/uXKcYmSaY5BrjiDBSiXi0tM1fxJHyVTtzfawv6SFszFEqBRFRRZdqL\n"
+ + " aWrNV3jplyOa/8D8HU7e6PGJsnjLKM8yA1zgSfDnNUj0Z3Ovj+AlMiFMU/Schdjb\n"
+ + " YD0cjgViI/4bkUgF4YDzOT1xOxIc1C4pi+PvlKbGYXFluLUEf0qoBe9ZEJN5Cwv6\n"
+ + " puOfIKtVqtA=\n"
+ + " </cert>\n";
+ private static final String INSECURE_CERT_XML_ENDPOINT2_CERT = ""
+ + " <cert>\n"
+ + " MIICojCCAYqgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwMzExMC8GA1UEAwwoVGVz\n"
+ + " dCBPbmx5IFVuc2VjdXJlIEludGVyLUludGVybWVkaWF0ZSBDQTAeFw0xODAzMjgw\n"
+ + " NTI0NDJaFw0yMjA1MDYwNTI0NDJaMCgxJjAkBgNVBAMMHVRlc3QgT25seSBVbnNl\n"
+ + " Y3VyZSBFbmRwb2ludCAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJFCmWFoj\n"
+ + " Y2neIsYdpWo/eeA2g+EsQayB7gYkt00eAS7bM+1bas0OqYUPeW4iHYF67jEbNg4b\n"
+ + " lzLWa76fzt/8AKOBlTCBkjAJBgNVHRMEAjAAMB0GA1UdDgQWBBS19DdRW13M4VHr\n"
+ + " UUagViNg9AxyujBWBgNVHSMETzBNgBRcOlrOWbGw+UIwB8/P1ZRHsgEyv6ExpC8w\n"
+ + " LTErMCkGA1UEAwwiVGVzdCBPbmx5IFVuc2VjdXJlIEludGVybWVkaWF0ZSBDQYIC\n"
+ + " EAAwDgYDVR0PAQH/BAQDAgMIMA0GCSqGSIb3DQEBCwUAA4IBAQB+0cAYzhkxfn5d\n"
+ + " XoyF6q0pxTNAREsJ6WtHa2wvtx4UnFIT9nxy3TuliGs2x6lR7knJxGmXC6XMYMwG\n"
+ + " suafjEhF3svAscGXXh7pwNZb3Q99/HFuxyCPKAOCwsoaZEm/xeuzvZqBVnVtNTVo\n"
+ + " PbqkTjsaYZNPd3X/hqLafHKA5Aq19vQQ9O9VgwSu9asDr2uv7A8xJY9629wMYRny\n"
+ + " FYWveJG124TEL2xGqdXkOG9lE5BJlC1D4lrqDwF6FQL2A8IRL3cQ5BRg+lFAR4PU\n"
+ + " IT7UgpPK4f4CnKcgpKPn5TXH44TdRlhNPMRyT9MnFOb5K/gV8K+nB2YMAxOMRld+\n"
+ + " 4VH7v7k6\n"
+ + " </cert>\n";
+ private static final String INSECURE_CERT_XML_FOOTER = ""
+ + " </endpoints>\n"
+ + "</certificates>\n";
+
+ private static final String INSECURE_CERT_PATH_FOR_ENDPOINT1_BASE64 = ""
+ + "MIII0DCCBTQwggMcoAMCAQICAhAAMA0GCSqGSIb3DQEBDQUAMCUxIzAhBgNVBAMM"
+ + "GlRlc3QgT25seSBVbnNlY3VyZSBSb290IENBMB4XDTE4MDMyODAwMzcxOFoXDTI4"
+ + "MDMyNTAwMzcxOFowLTErMCkGA1UEAwwiVGVzdCBPbmx5IFVuc2VjdXJlIEludGVy"
+ + "bWVkaWF0ZSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANXcG+ox"
+ + "9kAcAJI+lvJa6azryUQiUIcf7AAJzKnLxTAyG+XGNjyMFoJTBDZmb7YoMzohOiXv"
+ + "kMR7IRGGJuw/F1Pb0YzlAVuzUFty2/7bBF+BVA5rBlm5u6WEaF0IXgMtT08j0TQk"
+ + "QXIlHc9pkKu6C9N4zRpDiCESgJbqP0M2W11Z1XqfJ1CUYpLd5WMVJfIcIjNxKc6r"
+ + "N/jaPBxgsH+aIUGF72HCRfysZ01CshRzw6R0jBNiFYmJ5mPG380QwZDZR7AHEkl4"
+ + "q9wBHgQyPf7mmOz5cKEMKxtakOTCqjzOXi5vrjhVbNZCsEi0S5j5O1+JrueqPPAh"
+ + "NiJ03MyM+T1HAVltUbxoQAPxV/XwoYF6wwvJnoBmwM0AhNtqcXKkfkVCKYV8Xtj5"
+ + "IZL1BzyOiTOIoxVRoQrpupXjJDnkZsLZQGfJpkwSWxlXR1EmilcWMui3BUfEbdbL"
+ + "Y0MUzQSSl32bCP6ryn/aU5Hr7zLWlKDMMGAHfK0zIcLgJpfroa39/VLS0UukgB/z"
+ + "zmg+nfA55fSngBi2+j+aYsXfk2A1H4/2Xm7sw5LivwXyWwwfqmIl1mw+xIWLchxS"
+ + "KHPaRSF5hNLG/p9P1hrQaV4qWViJyap81dCw0SqBT34TtWLbFDbUkwrYj0iRqLsJ"
+ + "+D5QgtqyJvHJwPTKNarQXy0S1XB1ljOvXO1tAgMBAAGjZjBkMB0GA1UdDgQWBBQh"
+ + "LxSvWzSypPWVIcPdbtgiAphaNDAfBgNVHSMEGDAWgBTDJ42liCxddi+H3PT+UWuN"
+ + "ruxX6zASBgNVHRMBAf8ECDAGAQH/AgECMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG"
+ + "9w0BAQ0FAAOCAgEAI9PEsAtzliqt65gzsXRnjgy2MDyZf5X4jnRRUDDoc0iikOKA"
+ + "ZcEQEReE99ilPef9EIcI4GAdpxaP36wysJNo9xe4Gb2bnOHpLj+lXNakkoL/fZKi"
+ + "CK5O+FDVCtgZjiKqwrp6Vu1hffVUIEuBR0tEyWyXbHnFeyjc50+Jd3WnP0Djl3on"
+ + "eR0nhEBxsqjFHdJ6A0tFI6jX4XW3dbFqbGWI1rCKvoLGdwAw0kwhEsIxJR2TjFSs"
+ + "97siMe4uB2Nac1leDm9DXnS32L2mrgMZ0ErJLUDJOephlqi2ogUANxYzRoeSdvKE"
+ + "sLPd2XvzgVLVE/dr5W1am6rEAquhojYIe0Rp7DBale/oaybB4yNUlBuWJYAliMPb"
+ + "DzXaVquI0dKTkfllQVvB2PAux0zpUzodyuiLHcMfNd13lOsRsS4ULjf8xEKJUEUg"
+ + "/MAbaNoJmRfTFk80t2BOvG+y8MUegcoIWi8cTe1C0UdnMaEQLiRG4HhUc2iOMYka"
+ + "izqEtncLD6d9LFcepnl6n4WFE/Qnm3sayN9frG68mkwJLRMaD+BrJ8dbgoy6/FFL"
+ + "HXuyai59IIOEr/bR8+xlptExOYsDB5OfSgisjBXPsfDB2PQnYXfqe3a622t1/hQv"
+ + "NA0aCrkUNK3DlVmhjaCtyiwK9tmsRUoFiV9sKzTzDakX8/f+v7fNxzv+cYswggOU"
+ + "MIIBfKADAgECAgIQAjANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDDCJUZXN0IE9u"
+ + "bHkgVW5zZWN1cmUgSW50ZXJtZWRpYXRlIENBMB4XDTE4MDMyODA1MjMxNloXDTIy"
+ + "MDUwNjA1MjMxNlowKDEmMCQGA1UEAwwdVGVzdCBPbmx5IFVuc2VjdXJlIEVuZHBv"
+ + "aW50IDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS3S6JtfbCyXlLSA+WZHwk0"
+ + "Rr2hdjJXxGeJLnsAbVkESmoGL9wG2Qty2InpFQ9jFFJHvGR8a73RMQVqmNxwQvFh"
+ + "o4GNMIGKMAkGA1UdEwQCMAAwHQYDVR0OBBYEFMTgDnwQCK+Lkt/9+A7i2OE2BUUm"
+ + "ME4GA1UdIwRHMEWAFCEvFK9bNLKk9ZUhw91u2CICmFo0oSmkJzAlMSMwIQYDVQQD"
+ + "DBpUZXN0IE9ubHkgVW5zZWN1cmUgUm9vdCBDQYICEAAwDgYDVR0PAQH/BAQDAgMI"
+ + "MA0GCSqGSIb3DQEBCwUAA4ICAQA4LCNK8n/r6CNMSBfe4VXc6IZvkLVQiVFK1mr2"
+ + "H7rmblGPisAz/VFiSNisjLblVnIaTzlwmFy/5kgUrPiArCBPGENSO0600VKuxjnQ"
+ + "gXBc7AUL41o/9n13vk6bkVJtuZcKegylvwSu029RomzsJ7M6DSbX0kPf96r0Oyuh"
+ + "INj37cdCW5RG/3ZiV+wiFloHJOBBTlfZ7npEpHalyKP4ChAZPOYAei7WTf5o2R29"
+ + "nPxhFLtShU8zKuKLWs0Vhpg4FjBkfM//MzwIsZnc7qcLRGr7l/pPCLm2IhFY3PmB"
+ + "ZrA528+JxV+/roR8QFBF+7jkew4uqc+OcDBstUtQ6fabD88f6N9+CzAPwmUAociG"
+ + "5LrMTv4CtfPT9TPzzBhIkyPZNTaD1L4rEcISWW1/aAtfdpqTqU146d9tU/ct35L2"
+ + "3jdW7TnwCjtriG01tP3+RO9oHaBaovYYhcC1n+URyCY551UhfQAS/l2gH1liC57l"
+ + "KUnL+5cpxiZJpjkGuOIMFKJeLS0zV/EkfJVO3N9rC/pIWzMUSoFEVFFl2otpas1X"
+ + "eOmXI5r/wPwdTt7o8YmyeMsozzIDXOBJ8Oc1SPRnc6+P4CUyIUxT9JyF2NtgPRyO"
+ + "BWIj/huRSAXhgPM5PXE7EhzULimL4++UpsZhcWW4tQR/SqgF71kQk3kLC/qm458g"
+ + "q1Wq0A==";
+ private static final String INSECURE_CERT_PATH_FOR_ENDPOINT2_BASE64 = ""
+ + "MIIMJDCCBTQwggMcoAMCAQICAhAAMA0GCSqGSIb3DQEBDQUAMCUxIzAhBgNVBAMM"
+ + "GlRlc3QgT25seSBVbnNlY3VyZSBSb290IENBMB4XDTE4MDMyODAwMzcxOFoXDTI4"
+ + "MDMyNTAwMzcxOFowLTErMCkGA1UEAwwiVGVzdCBPbmx5IFVuc2VjdXJlIEludGVy"
+ + "bWVkaWF0ZSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANXcG+ox"
+ + "9kAcAJI+lvJa6azryUQiUIcf7AAJzKnLxTAyG+XGNjyMFoJTBDZmb7YoMzohOiXv"
+ + "kMR7IRGGJuw/F1Pb0YzlAVuzUFty2/7bBF+BVA5rBlm5u6WEaF0IXgMtT08j0TQk"
+ + "QXIlHc9pkKu6C9N4zRpDiCESgJbqP0M2W11Z1XqfJ1CUYpLd5WMVJfIcIjNxKc6r"
+ + "N/jaPBxgsH+aIUGF72HCRfysZ01CshRzw6R0jBNiFYmJ5mPG380QwZDZR7AHEkl4"
+ + "q9wBHgQyPf7mmOz5cKEMKxtakOTCqjzOXi5vrjhVbNZCsEi0S5j5O1+JrueqPPAh"
+ + "NiJ03MyM+T1HAVltUbxoQAPxV/XwoYF6wwvJnoBmwM0AhNtqcXKkfkVCKYV8Xtj5"
+ + "IZL1BzyOiTOIoxVRoQrpupXjJDnkZsLZQGfJpkwSWxlXR1EmilcWMui3BUfEbdbL"
+ + "Y0MUzQSSl32bCP6ryn/aU5Hr7zLWlKDMMGAHfK0zIcLgJpfroa39/VLS0UukgB/z"
+ + "zmg+nfA55fSngBi2+j+aYsXfk2A1H4/2Xm7sw5LivwXyWwwfqmIl1mw+xIWLchxS"
+ + "KHPaRSF5hNLG/p9P1hrQaV4qWViJyap81dCw0SqBT34TtWLbFDbUkwrYj0iRqLsJ"
+ + "+D5QgtqyJvHJwPTKNarQXy0S1XB1ljOvXO1tAgMBAAGjZjBkMB0GA1UdDgQWBBQh"
+ + "LxSvWzSypPWVIcPdbtgiAphaNDAfBgNVHSMEGDAWgBTDJ42liCxddi+H3PT+UWuN"
+ + "ruxX6zASBgNVHRMBAf8ECDAGAQH/AgECMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG"
+ + "9w0BAQ0FAAOCAgEAI9PEsAtzliqt65gzsXRnjgy2MDyZf5X4jnRRUDDoc0iikOKA"
+ + "ZcEQEReE99ilPef9EIcI4GAdpxaP36wysJNo9xe4Gb2bnOHpLj+lXNakkoL/fZKi"
+ + "CK5O+FDVCtgZjiKqwrp6Vu1hffVUIEuBR0tEyWyXbHnFeyjc50+Jd3WnP0Djl3on"
+ + "eR0nhEBxsqjFHdJ6A0tFI6jX4XW3dbFqbGWI1rCKvoLGdwAw0kwhEsIxJR2TjFSs"
+ + "97siMe4uB2Nac1leDm9DXnS32L2mrgMZ0ErJLUDJOephlqi2ogUANxYzRoeSdvKE"
+ + "sLPd2XvzgVLVE/dr5W1am6rEAquhojYIe0Rp7DBale/oaybB4yNUlBuWJYAliMPb"
+ + "DzXaVquI0dKTkfllQVvB2PAux0zpUzodyuiLHcMfNd13lOsRsS4ULjf8xEKJUEUg"
+ + "/MAbaNoJmRfTFk80t2BOvG+y8MUegcoIWi8cTe1C0UdnMaEQLiRG4HhUc2iOMYka"
+ + "izqEtncLD6d9LFcepnl6n4WFE/Qnm3sayN9frG68mkwJLRMaD+BrJ8dbgoy6/FFL"
+ + "HXuyai59IIOEr/bR8+xlptExOYsDB5OfSgisjBXPsfDB2PQnYXfqe3a622t1/hQv"
+ + "NA0aCrkUNK3DlVmhjaCtyiwK9tmsRUoFiV9sKzTzDakX8/f+v7fNxzv+cYswggRC"
+ + "MIICKqADAgECAgIQADANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDDCJUZXN0IE9u"
+ + "bHkgVW5zZWN1cmUgSW50ZXJtZWRpYXRlIENBMB4XDTE4MDMyODA1MDUyM1oXDTIz"
+ + "MDMwMjA1MDUyM1owMzExMC8GA1UEAwwoVGVzdCBPbmx5IFVuc2VjdXJlIEludGVy"
+ + "LUludGVybWVkaWF0ZSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
+ + "AMXcLIsgVZo2ykdTASvmEcOvqeY/kiiDvcTobuQEHVfK233nkBqAd9+YfN5Zn+YB"
+ + "YFgd7qQkyxMtN+Zv6Rksrz+znwCNS79vKuA88gv3a/seAhrXXjw549iaiFfPS41l"
+ + "Armxh5viRPZzKmspJY8Fx7IJxkN6VNiluV5d3bIlJj/fteiJpyZHzPp8R2x7Oo0s"
+ + "GlUCmJWxV6GLN0iKhhQIC1mVLYOdKFpxUY6r8UT9EI4LfB8pVw5XgeppUEwnDAw5"
+ + "IvphQirfh+LpVI0C6dF54Xu1yQRJQW7SnPnZSZHIyENn8UKuMTkQiyXGiYM0km21"
+ + "nICZkNQHTztIDq81aEk7DKcCAwEAAaNmMGQwHQYDVR0OBBYEFFw6Ws5ZsbD5QjAH"
+ + "z8/VlEeyATK/MB8GA1UdIwQYMBaAFCEvFK9bNLKk9ZUhw91u2CICmFo0MBIGA1Ud"
+ + "EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IC"
+ + "AQCQj6CiZNFrfizeV5rwCaD5b1Z7KK11XDYzEEX+NgsAQur2kh+CwjwRhG2tQZPT"
+ + "nHOtyKz5yp3DENMBA01y87EePcX9WQaIAe8IVqnDuq7F6rr5odT2baednU5Kz2rP"
+ + "sujDfbJaF/mMlJBEDkc87Xf0f4Kq5UUNg7HWiKfLQmwGK8GhWSFvfkcmYG52Rpt8"
+ + "ohV0oB6x3QC3sodkz1WiK2ngtCxhy2yLrcTMQs2+YVn826NXKguZfPXCZCBq91zY"
+ + "V1YcwPcJ0nMPJiZ+q+fsU92zzB1YScGd9ngDmLPAUPYEmMy8x9Wzik+//zMYVg+S"
+ + "OGA3jdGHyRqQn5CBJtmmgRjRVvtZuMw1Ft1MFQkKTnBoAxI29YrbrBwDOiQ5Zn6P"
+ + "pIePZyS7qwBwNtYuuVpETLopMum+EyqyIvOK+Z+78UZYJkxv/NfWuWXPMY+/q0gX"
+ + "b17Bg06Jz5FPcTgf0jtg76ZJsSzazOhGXodGgLbgMhyBTGlDbhndauK4h0FfB0de"
+ + "AMZ6gP02wjcu3spGhd48MDLMpOfFNTCj4b1q7n6V20uzrjmKMMopxfsKbInMKcgx"
+ + "5N5T2PzyG3mzhijnSzVYF5C/9Or567Omtet1TMVqKHho4UPK27KhkjACLTZ2vYPD"
+ + "4KQTFpjvnldC0QBXco2Lz6jL1DLqmQETnQoYPjR7HM6u7zCCAqIwggGKoAMCAQIC"
+ + "AhAAMA0GCSqGSIb3DQEBCwUAMDMxMTAvBgNVBAMMKFRlc3QgT25seSBVbnNlY3Vy"
+ + "ZSBJbnRlci1JbnRlcm1lZGlhdGUgQ0EwHhcNMTgwMzI4MDUyNDQyWhcNMjIwNTA2"
+ + "MDUyNDQyWjAoMSYwJAYDVQQDDB1UZXN0IE9ubHkgVW5zZWN1cmUgRW5kcG9pbnQg"
+ + "MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCRQplhaI2Np3iLGHaVqP3ngNoPh"
+ + "LEGsge4GJLdNHgEu2zPtW2rNDqmFD3luIh2Beu4xGzYOG5cy1mu+n87f/ACjgZUw"
+ + "gZIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUtfQ3UVtdzOFR61FGoFYjYPQMcrowVgYD"
+ + "VR0jBE8wTYAUXDpazlmxsPlCMAfPz9WUR7IBMr+hMaQvMC0xKzApBgNVBAMMIlRl"
+ + "c3QgT25seSBVbnNlY3VyZSBJbnRlcm1lZGlhdGUgQ0GCAhAAMA4GA1UdDwEB/wQE"
+ + "AwIDCDANBgkqhkiG9w0BAQsFAAOCAQEAftHAGM4ZMX5+XV6MheqtKcUzQERLCelr"
+ + "R2tsL7ceFJxSE/Z8ct07pYhrNsepUe5JycRplwulzGDMBrLmn4xIRd7LwLHBl14e"
+ + "6cDWW90PffxxbscgjygDgsLKGmRJv8Xrs72agVZ1bTU1aD26pE47GmGTT3d1/4ai"
+ + "2nxygOQKtfb0EPTvVYMErvWrA69rr+wPMSWPetvcDGEZ8hWFr3iRtduExC9sRqnV"
+ + "5DhvZROQSZQtQ+Ja6g8BehUC9gPCES93EOQUYPpRQEeD1CE+1IKTyuH+ApynIKSj"
+ + "5+U1x+OE3UZYTTzEck/TJxTm+Sv4FfCvpwdmDAMTjEZXfuFR+7+5Og==";
+
+ public static byte[] getInsecureCertXmlBytesWithEndpoint1(int serial) {
+ String str = INSECURE_CERT_XML_HEADER;
+ str += serial;
+ str += INSECURE_CERT_XML_BODY;
+ str += INSECURE_CERT_XML_ENDPOINT1_CERT;
+ str += INSECURE_CERT_XML_FOOTER;
+ return str.getBytes(StandardCharsets.UTF_8);
+ }
+
+ public static byte[] getInsecureCertXmlBytesWithEndpoint2(int serial) {
+ String str = INSECURE_CERT_XML_HEADER;
+ str += serial;
+ str += INSECURE_CERT_XML_BODY;
+ str += INSECURE_CERT_XML_ENDPOINT2_CERT;
+ str += INSECURE_CERT_XML_FOOTER;
+ return str.getBytes(StandardCharsets.UTF_8);
+ }
+
+ public static CertPath getInsecureCertPathForEndpoint1() throws Exception {
+ return decodeCertPath(INSECURE_CERT_PATH_FOR_ENDPOINT1_BASE64);
+ }
+
+ public static CertPath getInsecureCertPathForEndpoint2() throws Exception {
+ return decodeCertPath(INSECURE_CERT_PATH_FOR_ENDPOINT2_BASE64);
+ }
+
+ private static CertPath decodeCertPath(String base64CertPath) throws Exception {
+ byte[] certPathBytes = Base64.getDecoder().decode(base64CertPath);
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ return certFactory.generateCertPath(new ByteArrayInputStream(certPathBytes), "PkiPath");
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
new file mode 100644
index 0000000..67436cc
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
@@ -0,0 +1,151 @@
+package com.android.server.locksettings.recoverablekeystore;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.security.keystore.recovery.TrustedRootCertificates;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.crypto.SecretKey;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TestOnlyInsecureCertificateHelperTest {
+ private final TestOnlyInsecureCertificateHelper mHelper
+ = new TestOnlyInsecureCertificateHelper();
+
+ @Test
+ public void testDoesCredentailSupportInsecureMode_forNonWhitelistedPassword() throws Exception {
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, "secret12345")).isFalse();
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, "1234")).isFalse();
+ }
+
+ @Test
+ public void testDoesCredentailSupportInsecureMode_forWhitelistedPassword() throws Exception {
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
+ TrustedRootCertificates.INSECURE_PASSWORD_PREFIX)).isTrue();
+
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
+ TrustedRootCertificates.INSECURE_PASSWORD_PREFIX + "12")).isTrue();
+ }
+
+ @Test
+ public void testDoesCredentailSupportInsecureMode_Pattern() throws Exception {
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_PATTERN,
+ TrustedRootCertificates.INSECURE_PASSWORD_PREFIX)).isFalse();
+ assertThat(mHelper.doesCredentialSupportInsecureMode(
+ LockPatternUtils.CREDENTIAL_TYPE_NONE,
+ TrustedRootCertificates.INSECURE_PASSWORD_PREFIX)).isFalse();
+ }
+
+ @Test
+ public void testIsTestOnlyCertificate() throws Exception {
+ assertThat(mHelper.isTestOnlyCertificateAlias(
+ TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS)).isFalse();
+ assertThat(mHelper.isTestOnlyCertificateAlias(
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS)).isTrue();
+ assertThat(mHelper.isTestOnlyCertificateAlias(
+ "UNKNOWN_ALIAS")).isFalse();
+ }
+
+ @Test
+ public void testKeepOnlyWhitelistedInsecureKeys_emptyKeysList() throws Exception {
+ Map<String, SecretKey> rawKeys = new HashMap<>();
+ Map<String, SecretKey> expectedResult = new HashMap<>();
+
+ Map<String, SecretKey> filteredKeys =
+ mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
+ assertThat(filteredKeys.entrySet()).containsAllIn(rawKeys.entrySet());
+ }
+
+ @Test
+ public void testKeepOnlyWhitelistedInsecureKeys_singleNonWhitelistedKey() throws Exception {
+ Map<String, SecretKey> rawKeys = new HashMap<>();
+ Map<String, SecretKey> expectedResult = new HashMap<>();
+
+ String alias = "secureAlias";
+ rawKeys.put(alias, TestData.generateKey());
+
+ Map<String, SecretKey> filteredKeys =
+ mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
+ assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
+ }
+
+ @Test
+ public void testKeepOnlyWhitelistedInsecureKeys_singleWhitelistedKey() throws Exception {
+ Map<String, SecretKey> rawKeys = new HashMap<>();
+ Map<String, SecretKey> expectedResult = new HashMap<>();
+
+ String alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX;
+ rawKeys.put(alias, TestData.generateKey());
+ expectedResult.put(alias, rawKeys.get(alias));
+
+ Map<String, SecretKey> filteredKeys =
+ mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
+ assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
+ }
+
+ @Test
+ public void testKeepOnlyWhitelistedInsecureKeys() throws Exception {
+ Map<String, SecretKey> rawKeys = new HashMap<>();
+ Map<String, SecretKey> expectedResult = new HashMap<>();
+
+ String alias = "SECURE_ALIAS" + TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX;
+ rawKeys.put(alias, TestData.generateKey());
+
+ alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "1";
+ rawKeys.put(alias, TestData.generateKey());
+ expectedResult.put(alias, rawKeys.get(alias));
+
+ alias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "2";
+ rawKeys.put(alias, TestData.generateKey());
+ expectedResult.put(alias, rawKeys.get(alias));
+
+ Map<String, SecretKey> filteredKeys =
+ mHelper.keepOnlyWhitelistedInsecureKeys(rawKeys);
+ assertThat(filteredKeys.entrySet()).containsExactlyElementsIn(expectedResult.entrySet());
+ assertThat(rawKeys.entrySet()).containsAllIn(filteredKeys.entrySet());
+ }
+
+ @Test
+ public void testIsValidRootCertificateAlias_googleCertAlias() {
+ assertThat(mHelper.isValidRootCertificateAlias(
+ TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS)).isTrue();
+ }
+
+ @Test
+ public void testIsValidRootCertificateAlias_testOnlyCertAlias() {
+ assertThat(mHelper.isValidRootCertificateAlias(
+ TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS)).isTrue();
+ }
+
+ @Test
+ public void testIsValidRootCertificateAlias_emptyCertAlias() {
+ assertThat(mHelper.isValidRootCertificateAlias("")).isFalse();
+ }
+
+ @Test
+ public void testIsValidRootCertificateAlias_nullCertAlias() {
+ assertThat(mHelper.isValidRootCertificateAlias(null)).isFalse();
+ }
+
+ @Test
+ public void testIsValidRootCertificateAlias_unknownCertAlias() {
+ assertThat(mHelper.isValidRootCertificateAlias("unknown-root-certifiate-alias")).isFalse();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
new file mode 100644
index 0000000..2f4da86
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locksettings.recoverablekeystore.serialization;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
+import android.security.keystore.recovery.WrappedApplicationKey;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.server.locksettings.recoverablekeystore.TestData;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.security.cert.CertPath;
+import java.util.ArrayList;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class KeyChainSnapshotSerializerTest {
+ private static final int COUNTER_ID = 2134;
+ private static final int SNAPSHOT_VERSION = 125;
+ private static final int MAX_ATTEMPTS = 21;
+ private static final byte[] SERVER_PARAMS = new byte[] { 8, 2, 4 };
+ private static final byte[] KEY_BLOB = new byte[] { 124, 53, 53, 53 };
+ private static final byte[] PUBLIC_KEY_BLOB = new byte[] { 6, 6, 6, 6, 6, 6, 7 };
+ private static final CertPath CERT_PATH = TestData.CERT_PATH_1;
+ private static final int SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN;
+ private static final int LOCK_SCREEN_UI = KeyChainProtectionParams.UI_FORMAT_PASSWORD;
+ private static final byte[] SALT = new byte[] { 5, 4, 3, 2, 1 };
+ private static final int MEMORY_DIFFICULTY = 45;
+ private static final int ALGORITHM = KeyDerivationParams.ALGORITHM_SCRYPT;
+ private static final byte[] SECRET = new byte[] { 1, 2, 3, 4 };
+
+ private static final String TEST_KEY_1_ALIAS = "key1";
+ private static final byte[] TEST_KEY_1_BYTES = new byte[] { 66, 77, 88 };
+
+ private static final String TEST_KEY_2_ALIAS = "key2";
+ private static final byte[] TEST_KEY_2_BYTES = new byte[] { 99, 33, 11 };
+
+ private static final String TEST_KEY_3_ALIAS = "key3";
+ private static final byte[] TEST_KEY_3_BYTES = new byte[] { 2, 8, 100 };
+
+ @Test
+ public void roundTrip_persistsCounterId() throws Exception {
+ assertThat(roundTrip().getCounterId()).isEqualTo(COUNTER_ID);
+ }
+
+ @Test
+ public void roundTrip_persistsSnapshotVersion() throws Exception {
+ assertThat(roundTrip().getSnapshotVersion()).isEqualTo(SNAPSHOT_VERSION);
+ }
+
+ @Test
+ public void roundTrip_persistsMaxAttempts() throws Exception {
+ assertThat(roundTrip().getMaxAttempts()).isEqualTo(MAX_ATTEMPTS);
+ }
+
+ @Test
+ public void roundTrip_persistsRecoveryKey() throws Exception {
+ assertThat(roundTrip().getEncryptedRecoveryKeyBlob()).isEqualTo(KEY_BLOB);
+ }
+
+ @Test
+ public void roundTrip_persistsServerParams() throws Exception {
+ assertThat(roundTrip().getServerParams()).isEqualTo(SERVER_PARAMS);
+ }
+
+ @Test
+ public void roundTrip_persistsCertPath() throws Exception {
+ assertThat(roundTrip().getTrustedHardwareCertPath()).isEqualTo(CERT_PATH);
+ }
+
+ @Test
+ public void roundTrip_persistsBackendPublicKey() throws Exception {
+ assertThat(roundTrip().getTrustedHardwarePublicKey()).isEqualTo(PUBLIC_KEY_BLOB);
+ }
+
+ @Test
+ public void roundTrip_persistsParamsList() throws Exception {
+ assertThat(roundTrip().getKeyChainProtectionParams()).hasSize(1);
+ }
+
+ @Test
+ public void roundTripParams_persistsUserSecretType() throws Exception {
+ assertThat(roundTripParams().getUserSecretType()).isEqualTo(SECRET_TYPE);
+ }
+
+ @Test
+ public void roundTripParams_persistsLockScreenUi() throws Exception {
+ assertThat(roundTripParams().getLockScreenUiFormat()).isEqualTo(LOCK_SCREEN_UI);
+ }
+
+ @Test
+ public void roundTripParams_persistsSalt() throws Exception {
+ assertThat(roundTripParams().getKeyDerivationParams().getSalt()).isEqualTo(SALT);
+ }
+
+ @Test
+ public void roundTripParams_persistsAlgorithm() throws Exception {
+ assertThat(roundTripParams().getKeyDerivationParams().getAlgorithm()).isEqualTo(ALGORITHM);
+ }
+
+ @Test
+ public void roundTripParams_persistsMemoryDifficulty() throws Exception {
+ assertThat(roundTripParams().getKeyDerivationParams().getMemoryDifficulty())
+ .isEqualTo(MEMORY_DIFFICULTY);
+ }
+
+ @Test
+ public void roundTripParams_doesNotPersistSecret() throws Exception {
+ assertThat(roundTripParams().getSecret()).isEmpty();
+ }
+
+ @Test
+ public void roundTripKeys_hasCorrectLength() throws Exception {
+ assertThat(roundTripKeys()).hasSize(3);
+ }
+
+ @Test
+ public void roundTripKeys_0_persistsAlias() throws Exception {
+ assertThat(roundTripKeys().get(0).getAlias()).isEqualTo(TEST_KEY_1_ALIAS);
+ }
+
+ @Test
+ public void roundTripKeys_0_persistsKeyBytes() throws Exception {
+ assertThat(roundTripKeys().get(0).getEncryptedKeyMaterial()).isEqualTo(TEST_KEY_1_BYTES);
+ }
+
+ @Test
+ public void roundTripKeys_1_persistsAlias() throws Exception {
+ assertThat(roundTripKeys().get(1).getAlias()).isEqualTo(TEST_KEY_2_ALIAS);
+ }
+
+ @Test
+ public void roundTripKeys_1_persistsKeyBytes() throws Exception {
+ assertThat(roundTripKeys().get(1).getEncryptedKeyMaterial()).isEqualTo(TEST_KEY_2_BYTES);
+ }
+
+ @Test
+ public void roundTripKeys_2_persistsAlias() throws Exception {
+ assertThat(roundTripKeys().get(2).getAlias()).isEqualTo(TEST_KEY_3_ALIAS);
+ }
+
+ @Test
+ public void roundTripKeys_2_persistsKeyBytes() throws Exception {
+ assertThat(roundTripKeys().get(2).getEncryptedKeyMaterial()).isEqualTo(TEST_KEY_3_BYTES);
+ }
+
+ @Test
+ public void serialize_doesNotThrowForNullPublicKey() throws Exception {
+ KeyChainSnapshotSerializer.serialize(
+ createTestKeyChainSnapshotNoPublicKey(), new ByteArrayOutputStream());
+ }
+
+ private static List<WrappedApplicationKey> roundTripKeys() throws Exception {
+ return roundTrip().getWrappedApplicationKeys();
+ }
+
+ private static KeyChainProtectionParams roundTripParams() throws Exception {
+ return roundTrip().getKeyChainProtectionParams().get(0);
+ }
+
+ public static KeyChainSnapshot roundTrip() throws Exception {
+ KeyChainSnapshot snapshot = createTestKeyChainSnapshot();
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ KeyChainSnapshotSerializer.serialize(snapshot, byteArrayOutputStream);
+ return KeyChainSnapshotDeserializer.deserialize(
+ new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+ }
+
+ private static KeyChainSnapshot createTestKeyChainSnapshot() throws Exception {
+ return new KeyChainSnapshot.Builder()
+ .setCounterId(COUNTER_ID)
+ .setSnapshotVersion(SNAPSHOT_VERSION)
+ .setServerParams(SERVER_PARAMS)
+ .setMaxAttempts(MAX_ATTEMPTS)
+ .setEncryptedRecoveryKeyBlob(KEY_BLOB)
+ .setKeyChainProtectionParams(createKeyChainProtectionParamsList())
+ .setWrappedApplicationKeys(createKeys())
+ .setTrustedHardwareCertPath(CERT_PATH)
+ .setTrustedHardwarePublicKey(PUBLIC_KEY_BLOB)
+ .build();
+ }
+
+ private static KeyChainSnapshot createTestKeyChainSnapshotNoPublicKey() throws Exception {
+ return new KeyChainSnapshot.Builder()
+ .setCounterId(COUNTER_ID)
+ .setSnapshotVersion(SNAPSHOT_VERSION)
+ .setServerParams(SERVER_PARAMS)
+ .setMaxAttempts(MAX_ATTEMPTS)
+ .setEncryptedRecoveryKeyBlob(KEY_BLOB)
+ .setKeyChainProtectionParams(createKeyChainProtectionParamsList())
+ .setWrappedApplicationKeys(createKeys())
+ .setTrustedHardwareCertPath(CERT_PATH)
+ .build();
+ }
+
+ private static List<WrappedApplicationKey> createKeys() {
+ ArrayList<WrappedApplicationKey> keyList = new ArrayList<>();
+ keyList.add(createKey(TEST_KEY_1_ALIAS, TEST_KEY_1_BYTES));
+ keyList.add(createKey(TEST_KEY_2_ALIAS, TEST_KEY_2_BYTES));
+ keyList.add(createKey(TEST_KEY_3_ALIAS, TEST_KEY_3_BYTES));
+ return keyList;
+ }
+
+ private static List<KeyChainProtectionParams> createKeyChainProtectionParamsList() {
+ KeyDerivationParams keyDerivationParams =
+ KeyDerivationParams.createScryptParams(SALT, MEMORY_DIFFICULTY);
+ KeyChainProtectionParams keyChainProtectionParams = new KeyChainProtectionParams.Builder()
+ .setKeyDerivationParams(keyDerivationParams)
+ .setUserSecretType(SECRET_TYPE)
+ .setLockScreenUiFormat(LOCK_SCREEN_UI)
+ .setSecret(SECRET)
+ .build();
+ ArrayList<KeyChainProtectionParams> keyChainProtectionParamsList =
+ new ArrayList<>(1);
+ keyChainProtectionParamsList.add(keyChainProtectionParams);
+ return keyChainProtectionParamsList;
+ }
+
+ private static WrappedApplicationKey createKey(String alias, byte[] bytes) {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(alias)
+ .setEncryptedKeyMaterial(bytes)
+ .build();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
index 37482a3..9b09dd1a 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
@@ -34,6 +34,7 @@
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.KeysEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RecoveryServiceMetadataEntry;
+import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RootOfTrustEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.UserMetadataEntry;
@SmallTest
@@ -55,6 +56,7 @@
private static final String TEST_SECRET_TYPES = "test-secret-types";
private static final long TEST_COUNTER_ID = -3981205205038476415L;
private static final byte[] TEST_SERVER_PARAMS = "test-server-params".getBytes(UTF_8);
+ private static final String TEST_ROOT_ALIAS = "root_cert_alias";
private static final byte[] TEST_CERT_PATH = "test-cert-path".getBytes(UTF_8);
private static final long TEST_CERT_SERIAL = 1000L;
@@ -135,6 +137,32 @@
checkAllColumns();
}
+ @Test
+ public void onUpgrade_v2_to_v3_to_v4() throws Exception {
+ createV2Tables();
+
+ assertThat(isRootOfTrustTableAvailable()).isFalse(); // V2 doesn't have the table;
+
+ mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 2, /*newVersion=*/ 3);
+
+ assertThat(isRootOfTrustTableAvailable()).isFalse(); // V3 doesn't have the table;
+
+ mDatabaseHelper.onUpgrade(mDatabase, /*oldVersion=*/ 3,
+ RecoverableKeyStoreDbHelper.DATABASE_VERSION);
+ checkAllColumns();
+ }
+
+ private boolean isRootOfTrustTableAvailable() {
+ ContentValues values = new ContentValues();
+ values.put(RootOfTrustEntry.COLUMN_NAME_USER_ID, TEST_USER_ID);
+ values.put(RootOfTrustEntry.COLUMN_NAME_UID, TEST_UID);
+ values.put(RootOfTrustEntry.COLUMN_NAME_ROOT_ALIAS, TEST_ROOT_ALIAS);
+ values.put(RootOfTrustEntry.COLUMN_NAME_CERT_PATH, TEST_CERT_PATH);
+ values.put(RootOfTrustEntry.COLUMN_NAME_CERT_SERIAL, TEST_CERT_SERIAL);
+ return mDatabase.insert(RootOfTrustEntry.TABLE_NAME, /*nullColumnHack=*/ null, values)
+ > -1;
+ }
+
private void checkAllColumns() throws Exception {
// Check the table containing encrypted application keys
ContentValues values = new ContentValues();
@@ -165,6 +193,7 @@
TEST_SNAPSHOT_VERSION);
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_SHOULD_CREATE_SNAPSHOT,
TEST_SHOULD_CREATE_SNAPSHOT);
+ values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST, TEST_ROOT_ALIAS);
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_PUBLIC_KEY, TEST_PUBLIC_KEY);
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_SECRET_TYPES, TEST_SECRET_TYPES);
values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_COUNTER_ID, TEST_COUNTER_ID);
@@ -175,5 +204,8 @@
mDatabase.insert(RecoveryServiceMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null,
values))
.isGreaterThan(-1L);
+
+ // Check the table about recovery service and root of trust data introduced in V4
+ assertThat(isRootOfTrustTableAvailable()).isTrue();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
index 8b01d97..940745e 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
@@ -49,6 +49,9 @@
public class RecoverableKeyStoreDbTest {
private static final String DATABASE_FILE_NAME = "recoverablekeystore.db";
+ private static final String TEST_ROOT_CERT_ALIAS = "trusted_root";
+ private static final String TEST_ROOT_CERT_ALIAS2 = "another_trusted_root";
+
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
private File mDatabaseFile;
@@ -284,7 +287,8 @@
Map<String, Integer> statuses = mRecoverableKeyStoreDb.getStatusForAllKeys(uid);
assertThat(statuses).hasSize(3);
- assertThat(statuses).containsEntry(alias, RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
+ assertThat(statuses).containsEntry(alias,
+ RecoveryController.RECOVERY_STATUS_SYNC_IN_PROGRESS);
assertThat(statuses).containsEntry(alias2, status);
assertThat(statuses).containsEntry(alias3, status);
@@ -401,26 +405,53 @@
public void setRecoveryServiceCertPath_replaceOldValue() throws Exception {
int userId = 12;
int uid = 10009;
- mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TestData.CERT_PATH_1);
- mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TestData.CERT_PATH_2);
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isEqualTo(
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
+ TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
TestData.CERT_PATH_2);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_2);
+ }
+
+ @Test
+ public void setRecoveryServiceCertPath_updateValuesForCorrectRootCert() throws Exception {
+ int userId = 12;
+ int uid = 10009;
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
+ TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
+ TestData.CERT_PATH_1);
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_1);
+
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS2,
+ TestData.CERT_PATH_2);
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS2)).isEqualTo(TestData.CERT_PATH_2);
}
@Test
public void getRecoveryServiceCertPath_returnsNullIfNoValue() throws Exception {
int userId = 12;
int uid = 10009;
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isNull();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isNull();
}
@Test
public void getRecoveryServiceCertPath_returnsInsertedValue() throws Exception {
int userId = 12;
int uid = 10009;
- mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TestData.CERT_PATH_1);
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid)).isEqualTo(
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(userId, uid, TEST_ROOT_CERT_ALIAS,
TestData.CERT_PATH_1);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertPath(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(TestData.CERT_PATH_1);
}
@Test
@@ -428,25 +459,50 @@
int userId = 12;
int uid = 10009;
- mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, 1L);
- mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, 3L);
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid)).isEqualTo(3L);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 3L);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(3L);
+ }
+
+ @Test
+ public void setRecoveryServiceCertSerial_updateValuesForCorrectRootCert() throws Exception {
+ int userId = 12;
+ int uid = 10009;
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS, 1L);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 1L);
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS2)).isEqualTo(1L);
+
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, TEST_ROOT_CERT_ALIAS2, 3L);
+
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(1L);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS2)).isEqualTo(3L);
}
@Test
public void getRecoveryServiceCertSerial_returnsNullIfNoValue() throws Exception {
int userId = 12;
int uid = 10009;
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid)).isNull();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isNull();
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS2)).isNull();
}
@Test
public void getRecoveryServiceCertSerial_returnsInsertedValue() throws Exception {
int userId = 12;
int uid = 10009;
- mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid, 1234L);
- assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid)).isEqualTo(
- 1234L);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS, 1234L);
+ assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
+ TEST_ROOT_CERT_ALIAS)).isEqualTo(1234L);
}
@Test
@@ -480,6 +536,24 @@
}
@Test
+ public void setActiveRootOfTrust_emptyDefaultValue() throws Exception {
+ int userId = 12;
+ int uid = 10009;
+ assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo(null);
+ }
+
+ @Test
+ public void setActiveRootOfTrust_updateValue() throws Exception {
+ int userId = 12;
+ int uid = 10009;
+ mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root");
+ assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root");
+
+ mRecoverableKeyStoreDb.setActiveRootOfTrust(userId, uid, "root2");
+ assertThat(mRecoverableKeyStoreDb.getActiveRootOfTrust(userId, uid)).isEqualTo("root2");
+ }
+
+ @Test
public void setRecoverySecretTypes_emptyDefaultValue() throws Exception {
int userId = 12;
int uid = 10009;
@@ -495,11 +569,9 @@
int[] types2 = new int[]{2};
mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types1);
- assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
- types1);
+ assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types1);
mRecoverableKeyStoreDb.setRecoverySecretTypes(userId, uid, types2);
- assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(
- types2);
+ assertThat(mRecoverableKeyStoreDb.getRecoverySecretTypes(userId, uid)).isEqualTo(types2);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
index ead817a..ad14c3a 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
@@ -1,31 +1,82 @@
package com.android.server.locksettings.recoverablekeystore.storage;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import android.content.Context;
+import android.os.FileUtils;
+import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.KeyDerivationParams;
+import android.security.keystore.recovery.WrappedApplicationKey;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.server.locksettings.recoverablekeystore.TestData;
+
+import com.google.common.io.Files;
+
+import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.CertPath;
+import java.security.cert.CertificateException;
import java.util.ArrayList;
+import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RecoverySnapshotStorageTest {
- private static final KeyChainSnapshot MINIMAL_KEYCHAIN_SNAPSHOT = new KeyChainSnapshot.Builder()
- .setCounterId(1)
- .setSnapshotVersion(1)
- .setServerParams(new byte[0])
- .setMaxAttempts(10)
- .setEncryptedRecoveryKeyBlob(new byte[0])
- .setKeyChainProtectionParams(new ArrayList<>())
- .setWrappedApplicationKeys(new ArrayList<>())
- .build();
+ private static final int COUNTER_ID = 432546;
+ private static final int MAX_ATTEMPTS = 10;
+ private static final byte[] SERVER_PARAMS = new byte[] { 12, 8, 2, 4, 15, 64 };
+ private static final byte[] KEY_BLOB = new byte[] { 124, 56, 53, 99, 0, 0, 1 };
+ private static final CertPath CERT_PATH = TestData.CERT_PATH_2;
+ private static final int SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN;
+ private static final int LOCK_SCREEN_UI = KeyChainProtectionParams.UI_FORMAT_PATTERN;
+ private static final byte[] SALT = new byte[] { 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 };
+ private static final int MEMORY_DIFFICULTY = 12;
+ private static final byte[] SECRET = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 };
- private final RecoverySnapshotStorage mRecoverySnapshotStorage = new RecoverySnapshotStorage();
+ private static final String TEST_KEY_1_ALIAS = "alias1";
+ private static final byte[] TEST_KEY_1_BYTES = new byte[] { 100, 32, 43, 66, 77, 88 };
+
+ private static final String TEST_KEY_2_ALIAS = "alias11";
+ private static final byte[] TEST_KEY_2_BYTES = new byte[] { 100, 0, 0, 99, 33, 11 };
+
+ private static final String TEST_KEY_3_ALIAS = "alias111";
+ private static final byte[] TEST_KEY_3_BYTES = new byte[] { 1, 1, 1, 0, 2, 8, 100 };
+
+ private static final int TEST_UID = 1000;
+ private static final String SNAPSHOT_DIRECTORY = "recoverablekeystore/snapshots";
+ private static final String SNAPSHOT_FILE_PATH = "1000.xml";
+ private static final String SNAPSHOT_TOP_LEVEL_DIRECTORY = "recoverablekeystore";
+
+ private static final KeyChainSnapshot MINIMAL_KEYCHAIN_SNAPSHOT =
+ createTestKeyChainSnapshot(1);
+
+ private Context mContext;
+ private RecoverySnapshotStorage mRecoverySnapshotStorage;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mRecoverySnapshotStorage = new RecoverySnapshotStorage(mContext.getFilesDir());
+ }
+
+ @After
+ public void tearDown() {
+ File file = new File(mContext.getFilesDir(), SNAPSHOT_TOP_LEVEL_DIRECTORY);
+ FileUtils.deleteContentsAndDir(file);
+ }
@Test
public void get_isNullForNonExistentSnapshot() {
@@ -34,20 +85,153 @@
@Test
public void get_returnsSetSnapshot() {
- int userId = 1000;
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
- mRecoverySnapshotStorage.put(userId, MINIMAL_KEYCHAIN_SNAPSHOT);
-
- assertEquals(MINIMAL_KEYCHAIN_SNAPSHOT, mRecoverySnapshotStorage.get(userId));
+ assertEquals(MINIMAL_KEYCHAIN_SNAPSHOT, mRecoverySnapshotStorage.get(TEST_UID));
}
@Test
- public void remove_removesSnapshots() {
- int userId = 1000;
+ public void get_readsFromDiskIfNoneInMemory() {
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
+ RecoverySnapshotStorage storage = new RecoverySnapshotStorage(mContext.getFilesDir());
- mRecoverySnapshotStorage.put(userId, MINIMAL_KEYCHAIN_SNAPSHOT);
- mRecoverySnapshotStorage.remove(userId);
+ assertKeyChainSnapshotsAreEqual(MINIMAL_KEYCHAIN_SNAPSHOT, storage.get(TEST_UID));
+ }
- assertNull(mRecoverySnapshotStorage.get(1000));
+ @Test
+ public void get_deletesFileIfItIsInvalidSnapshot() throws Exception {
+ File folder = new File(mContext.getFilesDir(), SNAPSHOT_DIRECTORY);
+ folder.mkdirs();
+ File file = new File(folder, SNAPSHOT_FILE_PATH);
+ byte[] fileContents = "<keyChainSnapshot></keyChainSnapshot>".getBytes(
+ StandardCharsets.UTF_8);
+ Files.write(fileContents, file);
+ assertTrue(file.exists());
+
+ assertNull(mRecoverySnapshotStorage.get(TEST_UID));
+
+ assertFalse(file.exists());
+ }
+
+ @Test
+ public void put_overwritesOldFiles() {
+ int snapshotVersion = 2;
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
+
+ mRecoverySnapshotStorage.put(TEST_UID, createTestKeyChainSnapshot(snapshotVersion));
+
+ KeyChainSnapshot snapshot = new RecoverySnapshotStorage(mContext.getFilesDir())
+ .get(TEST_UID);
+ assertEquals(snapshotVersion, snapshot.getSnapshotVersion());
+ }
+
+ @Test
+ public void put_doesNotThrowIfCannotCreateFiles() throws Exception {
+ File evilFile = new File(mContext.getFilesDir(), "recoverablekeystore");
+ Files.write(new byte[] { 1 }, evilFile);
+
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
+
+ assertNull(new RecoverySnapshotStorage(mContext.getFilesDir()).get(TEST_UID));
+ }
+
+ @Test
+ public void remove_removesSnapshotsFromMemory() {
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
+ mRecoverySnapshotStorage.remove(TEST_UID);
+
+ assertNull(mRecoverySnapshotStorage.get(TEST_UID));
+ }
+
+ @Test
+ public void remove_removesSnapshotsFromDisk() {
+ mRecoverySnapshotStorage.put(TEST_UID, MINIMAL_KEYCHAIN_SNAPSHOT);
+
+ new RecoverySnapshotStorage(mContext.getFilesDir()).remove(TEST_UID);
+
+ assertNull(new RecoverySnapshotStorage(mContext.getFilesDir()).get(TEST_UID));
+ }
+
+ private void assertKeyChainSnapshotsAreEqual(KeyChainSnapshot a, KeyChainSnapshot b) {
+ assertEquals(b.getCounterId(), a.getCounterId());
+ assertEquals(b.getSnapshotVersion(), a.getSnapshotVersion());
+ assertArrayEquals(b.getServerParams(), a.getServerParams());
+ assertEquals(b.getMaxAttempts(), a.getMaxAttempts());
+ assertArrayEquals(b.getEncryptedRecoveryKeyBlob(), a.getEncryptedRecoveryKeyBlob());
+ assertEquals(b.getTrustedHardwareCertPath(), a.getTrustedHardwareCertPath());
+
+ List<WrappedApplicationKey> aKeys = a.getWrappedApplicationKeys();
+ List<WrappedApplicationKey> bKeys = b.getWrappedApplicationKeys();
+ assertEquals(bKeys.size(), aKeys.size());
+ for (int i = 0; i < aKeys.size(); i++) {
+ assertWrappedApplicationKeysAreEqual(aKeys.get(i), bKeys.get(i));
+ }
+
+ List<KeyChainProtectionParams> aParams = a.getKeyChainProtectionParams();
+ List<KeyChainProtectionParams> bParams = b.getKeyChainProtectionParams();
+ assertEquals(bParams.size(), aParams.size());
+ for (int i = 0; i < aParams.size(); i++) {
+ assertKeyChainProtectionParamsAreEqual(aParams.get(i), bParams.get(i));
+ }
+ }
+
+ private void assertWrappedApplicationKeysAreEqual(
+ WrappedApplicationKey a, WrappedApplicationKey b) {
+ assertEquals(b.getAlias(), a.getAlias());
+ assertArrayEquals(b.getEncryptedKeyMaterial(), a.getEncryptedKeyMaterial());
+ }
+
+ private void assertKeyChainProtectionParamsAreEqual(
+ KeyChainProtectionParams a, KeyChainProtectionParams b) {
+ assertEquals(b.getUserSecretType(), a.getUserSecretType());
+ assertEquals(b.getLockScreenUiFormat(), a.getLockScreenUiFormat());
+ assertKeyDerivationParamsAreEqual(a.getKeyDerivationParams(), b.getKeyDerivationParams());
+ }
+
+ private void assertKeyDerivationParamsAreEqual(KeyDerivationParams a, KeyDerivationParams b) {
+ assertEquals(b.getAlgorithm(), a.getAlgorithm());
+ assertEquals(b.getMemoryDifficulty(), a.getMemoryDifficulty());
+ assertArrayEquals(b.getSalt(), a.getSalt());
+ }
+
+ private static KeyChainSnapshot createTestKeyChainSnapshot(int snapshotVersion) {
+ KeyDerivationParams keyDerivationParams =
+ KeyDerivationParams.createScryptParams(SALT, MEMORY_DIFFICULTY);
+ KeyChainProtectionParams keyChainProtectionParams = new KeyChainProtectionParams.Builder()
+ .setKeyDerivationParams(keyDerivationParams)
+ .setUserSecretType(SECRET_TYPE)
+ .setLockScreenUiFormat(LOCK_SCREEN_UI)
+ .setSecret(SECRET)
+ .build();
+ ArrayList<KeyChainProtectionParams> keyChainProtectionParamsList =
+ new ArrayList<>(1);
+ keyChainProtectionParamsList.add(keyChainProtectionParams);
+
+ ArrayList<WrappedApplicationKey> keyList = new ArrayList<>();
+ keyList.add(createKey(TEST_KEY_1_ALIAS, TEST_KEY_1_BYTES));
+ keyList.add(createKey(TEST_KEY_2_ALIAS, TEST_KEY_2_BYTES));
+ keyList.add(createKey(TEST_KEY_3_ALIAS, TEST_KEY_3_BYTES));
+
+ try {
+ return new KeyChainSnapshot.Builder()
+ .setCounterId(COUNTER_ID)
+ .setSnapshotVersion(snapshotVersion)
+ .setServerParams(SERVER_PARAMS)
+ .setMaxAttempts(MAX_ATTEMPTS)
+ .setEncryptedRecoveryKeyBlob(KEY_BLOB)
+ .setKeyChainProtectionParams(keyChainProtectionParamsList)
+ .setWrappedApplicationKeys(keyList)
+ .setTrustedHardwareCertPath(CERT_PATH)
+ .build();
+ } catch (CertificateException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static WrappedApplicationKey createKey(String alias, byte[] bytes) {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(alias)
+ .setEncryptedKeyMaterial(bytes)
+ .build();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
index 654acc2..678f018 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNull;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
@@ -114,13 +115,19 @@
}
@Test
- public void testWatchlistConfig_getWatchlistConfigHash() throws Exception {
+ public void testWatchlistConfig_getWatchlistConfigHash_hasConfig() throws Exception {
copyWatchlistConfigXml(mContext, TEST_XML_1, mTestXmlFile);
WatchlistConfig config = new WatchlistConfig(mTestXmlFile);
assertEquals(TEST_XML_1_HASH, HexDump.toHexString(config.getWatchlistConfigHash()));
}
@Test
+ public void testWatchlistConfig_getWatchlistConfigHash_withoutConfig() throws Exception {
+ WatchlistConfig config = new WatchlistConfig(mTestXmlFile);
+ assertNull(config.getWatchlistConfigHash());
+ }
+
+ @Test
public void testWatchlistConfig_testDumpDoesNotCrash() throws Exception {
WatchlistConfig config = new WatchlistConfig(new File("/not_exist_path.xml"));
ByteArrayOutputStream bs = new ByteArrayOutputStream(2048);
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
index d702318..43a439b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -16,55 +16,138 @@
package com.android.server.pm;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.app.AppGlobals;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.IPackageManager;
+import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.os.BaseBundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.os.UserHandle;
import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
+import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
import com.android.servicestests.apps.suspendtestapp.SuspendTestReceiver;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
@RunWith(AndroidJUnit4.class)
-@MediumTest
+@LargeTest
public class SuspendPackagesTest {
+ private static final String TAG = SuspendPackagesTest.class.getSimpleName();
private static final String TEST_APP_PACKAGE_NAME = SuspendTestReceiver.PACKAGE_NAME;
private static final String[] PACKAGES_TO_SUSPEND = new String[]{TEST_APP_PACKAGE_NAME};
+ public static final String INSTRUMENTATION_PACKAGE = "com.android.frameworks.servicestests";
+ public static final String ACTION_REPORT_MY_PACKAGE_SUSPENDED =
+ INSTRUMENTATION_PACKAGE + ".action.REPORT_MY_PACKAGE_SUSPENDED";
+ public static final String ACTION_REPORT_MY_PACKAGE_UNSUSPENDED =
+ INSTRUMENTATION_PACKAGE + ".action.REPORT_MY_PACKAGE_UNSUSPENDED";
+
private Context mContext;
private PackageManager mPackageManager;
+ private LauncherApps mLauncherApps;
private Handler mReceiverHandler;
private ComponentName mTestReceiverComponent;
+ private AppCommunicationReceiver mAppCommsReceiver;
+ private StubbedCallback mTestCallback;
+
+ private static final class AppCommunicationReceiver extends BroadcastReceiver {
+ private Context context;
+ private boolean registered;
+ private SynchronousQueue<Intent> intentQueue = new SynchronousQueue<>();
+
+ AppCommunicationReceiver(Context context) {
+ this.context = context;
+ }
+
+ void register(Handler handler) {
+ registered = true;
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(ACTION_REPORT_MY_PACKAGE_SUSPENDED);
+ intentFilter.addAction(ACTION_REPORT_MY_PACKAGE_UNSUSPENDED);
+ context.registerReceiver(this, intentFilter, null, handler);
+ }
+
+ void unregister() {
+ if (registered) {
+ context.unregisterReceiver(this);
+ }
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "AppCommunicationReceiver#onReceive: " + intent.getAction());
+ try {
+ intentQueue.offer(intent, 5, TimeUnit.SECONDS);
+ } catch (InterruptedException ie) {
+ throw new RuntimeException("Receiver thread interrupted", ie);
+ }
+ }
+
+ Intent receiveIntentFromApp() {
+ if (!registered) {
+ throw new IllegalStateException("Receiver not registered");
+ }
+ final Intent intent;
+ try {
+ intent = intentQueue.poll(5, TimeUnit.SECONDS);
+ } catch (InterruptedException ie) {
+ throw new RuntimeException("Interrupted while waiting for app broadcast", ie);
+ }
+ assertNotNull("No intent received from app within 5 seconds", intent);
+ return intent;
+ }
+ }
@Before
public void setUp() {
mContext = InstrumentationRegistry.getTargetContext();
mPackageManager = mContext.getPackageManager();
- mPackageManager.setPackagesSuspended(PACKAGES_TO_SUSPEND, false, null, null, null);
+ mLauncherApps = (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE);
mReceiverHandler = new Handler(Looper.getMainLooper());
mTestReceiverComponent = new ComponentName(TEST_APP_PACKAGE_NAME,
SuspendTestReceiver.class.getCanonicalName());
+ IPackageManager ipm = AppGlobals.getPackageManager();
+ try {
+ // Otherwise implicit broadcasts will not be delivered.
+ ipm.setPackageStoppedState(TEST_APP_PACKAGE_NAME, false, mContext.getUserId());
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ unsuspendTestPackage();
+ mAppCommsReceiver = new AppCommunicationReceiver(mContext);
}
+ /**
+ * Care should be taken when used with {@link #mAppCommsReceiver} in the same test as both use
+ * the same handler.
+ */
private Bundle requestAppAction(String action) throws InterruptedException {
final AtomicReference<Bundle> result = new AtomicReference<>();
final CountDownLatch receiverLatch = new CountDownLatch(1);
@@ -98,6 +181,28 @@
assertTrue("setPackagesSuspended returned non-empty list", unchangedPackages.length == 0);
}
+ private void unsuspendTestPackage() {
+ final String[] unchangedPackages = mPackageManager.setPackagesSuspended(
+ PACKAGES_TO_SUSPEND, false, null, null, null);
+ assertTrue("setPackagesSuspended returned non-empty list", unchangedPackages.length == 0);
+ }
+
+
+ private static boolean areSameExtras(BaseBundle expected, BaseBundle received) {
+ if (expected != null) {
+ expected.get(""); // hack to unparcel the bundles.
+ }
+ if (received != null) {
+ received.get("");
+ }
+ return BaseBundle.kindofEquals(expected, received);
+ }
+
+ private static void assertSameExtras(String message, BaseBundle expected, BaseBundle received) {
+ assertTrue(message + ": [expected: " + expected + "; received: " + received + "]",
+ areSameExtras(expected, received));
+ }
+
@Test
public void testIsPackageSuspended() {
suspendTestPackage(null, null);
@@ -109,19 +214,202 @@
public void testSuspendedStateFromApp() throws Exception {
Bundle resultFromApp = requestAppAction(SuspendTestReceiver.ACTION_GET_SUSPENDED_STATE);
assertFalse(resultFromApp.getBoolean(SuspendTestReceiver.EXTRA_SUSPENDED, true));
- assertNull(resultFromApp.getParcelable(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
+ assertNull(resultFromApp.getBundle(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
- final PersistableBundle appExtras = getExtras("appExtras", 20, "20", 0.2);
+ final PersistableBundle appExtras = getExtras("testSuspendedStateFromApp", 20, "20", 0.2);
suspendTestPackage(appExtras, null);
resultFromApp = requestAppAction(SuspendTestReceiver.ACTION_GET_SUSPENDED_STATE);
assertTrue("resultFromApp:suspended is false",
resultFromApp.getBoolean(SuspendTestReceiver.EXTRA_SUSPENDED));
- final PersistableBundle receivedAppExtras =
- resultFromApp.getParcelable(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS);
- receivedAppExtras.get(""); // hack to unparcel the bundles
- appExtras.get("");
- assertTrue("Received app extras " + receivedAppExtras + " different to the ones supplied",
- BaseBundle.kindofEquals(appExtras, receivedAppExtras));
+ final Bundle receivedAppExtras =
+ resultFromApp.getBundle(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS);
+ assertSameExtras("Received app extras different to the ones supplied",
+ appExtras, receivedAppExtras);
+ }
+
+ @Test
+ public void testMyPackageSuspendedUnsuspended() {
+ mAppCommsReceiver.register(mReceiverHandler);
+ final PersistableBundle appExtras = getExtras("testMyPackageSuspendBroadcasts", 1, "1", .1);
+ suspendTestPackage(appExtras, null);
+ Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+ assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
+ ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+ assertSameExtras("Received app extras different to the ones supplied", appExtras,
+ intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
+ unsuspendTestPackage();
+ intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+ assertTrue("MY_PACKAGE_UNSUSPENDED delivery not reported",
+ ACTION_REPORT_MY_PACKAGE_UNSUSPENDED.equals(intentFromApp.getAction()));
+ }
+
+ @Test
+ public void testUpdatingAppExtras() {
+ mAppCommsReceiver.register(mReceiverHandler);
+ final PersistableBundle extras1 = getExtras("testMyPackageSuspendedOnChangingExtras", 1,
+ "1", 0.1);
+ suspendTestPackage(extras1, null);
+ Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+ assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
+ ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+ assertSameExtras("Received app extras different to the ones supplied", extras1,
+ intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
+ final PersistableBundle extras2 = getExtras("testMyPackageSuspendedOnChangingExtras", 2,
+ "2", 0.2);
+ mPackageManager.setSuspendedPackageAppExtras(TEST_APP_PACKAGE_NAME, extras2);
+ intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+ assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
+ ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+ assertSameExtras("Received app extras different to the updated extras", extras2,
+ intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
+ }
+
+ @Test
+ public void testCannotSuspendSelf() {
+ final String[] unchangedPkgs = mPackageManager.setPackagesSuspended(
+ new String[]{mContext.getOpPackageName()}, true, null, null, null);
+ assertTrue(unchangedPkgs.length == 1);
+ assertEquals(mContext.getOpPackageName(), unchangedPkgs[0]);
+ }
+
+ @Test
+ public void testGetLauncherExtrasNonNull() {
+ final Bundle extrasWhenUnsuspended = mLauncherApps.getSuspendedPackageLauncherExtras(
+ TEST_APP_PACKAGE_NAME, mContext.getUser());
+ assertNull("Non null extras when package unsuspended:", extrasWhenUnsuspended);
+ final PersistableBundle launcherExtras = getExtras("testGetLauncherExtras", 1, "1", 0.1);
+ suspendTestPackage(null, launcherExtras);
+ final Bundle receivedExtras = mLauncherApps.getSuspendedPackageLauncherExtras(
+ TEST_APP_PACKAGE_NAME, mContext.getUser());
+ assertSameExtras("Received launcher extras different to the ones supplied", launcherExtras,
+ receivedExtras);
+ }
+
+ @Test
+ public void testGetLauncherExtrasNull() {
+ suspendTestPackage(null, null);
+ final Bundle extrasWhenNoneGiven = mLauncherApps.getSuspendedPackageLauncherExtras(
+ TEST_APP_PACKAGE_NAME, mContext.getUser());
+ assertNull("Non null extras when null extras provided:", extrasWhenNoneGiven);
+ }
+
+ @Test
+ public void testGetLauncherExtrasInvalidPackage() {
+ final Bundle extrasForInvalidPackage = mLauncherApps.getSuspendedPackageLauncherExtras(
+ "test.nonexistent.packagename", mContext.getUser());
+ assertNull("Non null extras for an invalid package:", extrasForInvalidPackage);
+ }
+
+ @Test
+ public void testOnPackagesSuspendedNewAndOld() throws InterruptedException {
+ final PersistableBundle suppliedExtras = getExtras(
+ "testOnPackagesSuspendedNewAndOld", 2, "2", 0.2);
+ final AtomicReference<String> overridingBothCallbackResult = new AtomicReference<>("");
+ final CountDownLatch twoCallbackLatch = new CountDownLatch(2);
+ mTestCallback = new StubbedCallback() {
+ @Override
+ public void onPackagesSuspended(String[] packageNames, UserHandle user) {
+ overridingBothCallbackResult.set(overridingBothCallbackResult.get()
+ + "Old callback called even when the new one is overriden. ");
+ twoCallbackLatch.countDown();
+ }
+
+ @Override
+ public void onPackagesSuspended(String[] packageNames, Bundle launcherExtras,
+ UserHandle user) {
+ final StringBuilder errorString = new StringBuilder();
+ if (!Arrays.equals(packageNames, PACKAGES_TO_SUSPEND)) {
+ errorString.append("Received unexpected packageNames in onPackagesSuspended:");
+ for (String packageName : packageNames) {
+ errorString.append(" " + packageName);
+ }
+ errorString.append(". ");
+ }
+ if (user.getIdentifier() != mContext.getUserId()) {
+ errorString.append("Received wrong user " + user.getIdentifier() + ". ");
+ }
+ if (!areSameExtras(launcherExtras, suppliedExtras)) {
+ errorString.append("Unexpected launcherExtras, supplied: " + suppliedExtras
+ + ", received: " + launcherExtras + ". ");
+ }
+ overridingBothCallbackResult.set(overridingBothCallbackResult.get()
+ + errorString.toString());
+ twoCallbackLatch.countDown();
+ }
+ };
+ mLauncherApps.registerCallback(mTestCallback, mReceiverHandler);
+ suspendTestPackage(null, suppliedExtras);
+ assertFalse("Both callbacks were invoked", twoCallbackLatch.await(5, TimeUnit.SECONDS));
+ twoCallbackLatch.countDown();
+ assertTrue("No callback was invoked", twoCallbackLatch.await(2, TimeUnit.SECONDS));
+ final String result = overridingBothCallbackResult.get();
+ assertTrue("Callbacks did not complete as expected: " + result, result.isEmpty());
+ }
+
+ @Test
+ public void testOnPackagesSuspendedOld() throws InterruptedException {
+ final PersistableBundle suppliedExtras = getExtras(
+ "testOnPackagesSuspendedOld", 2, "2", 0.2);
+ final AtomicReference<String> overridingOneCallbackResult = new AtomicReference<>("");
+ final CountDownLatch oneCallbackLatch = new CountDownLatch(1);
+ mTestCallback = new StubbedCallback() {
+ @Override
+ public void onPackagesSuspended(String[] packageNames, UserHandle user) {
+ final StringBuilder errorString = new StringBuilder();
+ if (!Arrays.equals(packageNames, PACKAGES_TO_SUSPEND)) {
+ errorString.append("Received unexpected packageNames in onPackagesSuspended:");
+ for (String packageName : packageNames) {
+ errorString.append(" " + packageName);
+ }
+ errorString.append(". ");
+ }
+ if (user.getIdentifier() != mContext.getUserId()) {
+ errorString.append("Received wrong user " + user.getIdentifier() + ". ");
+ }
+ overridingOneCallbackResult.set(overridingOneCallbackResult.get()
+ + errorString.toString());
+ oneCallbackLatch.countDown();
+ }
+ };
+ mLauncherApps.registerCallback(mTestCallback, mReceiverHandler);
+ suspendTestPackage(null, suppliedExtras);
+ assertTrue("Callback not invoked", oneCallbackLatch.await(5, TimeUnit.SECONDS));
+ final String result = overridingOneCallbackResult.get();
+ assertTrue("Callback did not complete as expected: " + result, result.isEmpty());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mAppCommsReceiver.unregister();
+ if (mTestCallback != null) {
+ mLauncherApps.unregisterCallback(mTestCallback);
+ }
+ Thread.sleep(250); // To prevent any race with the next registerReceiver
+ }
+
+ private static abstract class StubbedCallback extends LauncherApps.Callback {
+
+ @Override
+ public void onPackageRemoved(String packageName, UserHandle user) {
+ }
+
+ @Override
+ public void onPackageAdded(String packageName, UserHandle user) {
+ }
+
+ @Override
+ public void onPackageChanged(String packageName, UserHandle user) {
+ }
+
+ @Override
+ public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) {
+
+ }
+
+ @Override
+ public void onPackagesUnavailable(String[] packageNames, UserHandle user,
+ boolean replacing) {
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
index 56ba047..7487d44 100644
--- a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
+++ b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
@@ -258,4 +258,9 @@
public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId){
throw new UnsupportedOperationException("not implemented");
}
+
+ @Override
+ public boolean isInputMethodTarget() {
+ return false;
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
index ab640d6..1367f58 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
@@ -139,6 +139,11 @@
protected int getGlobalSetting(String key, int defValue) {
return mDevice.getGlobalSetting(key, defValue);
}
+
+ @Override
+ void runOnBgThread(Runnable r) {
+ r.run();
+ }
}
@Before
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 601999d..c2a0ccf 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -281,6 +281,7 @@
MyContextWrapper myContext = new MyContextWrapper(InstrumentationRegistry.getContext());
mInjector = new MyInjector(myContext, Looper.getMainLooper());
mController = setupController();
+ setChargingState(mController, false);
}
@Test
@@ -381,8 +382,6 @@
@Test
public void testForcedIdle() throws Exception {
- setChargingState(mController, false);
-
mController.forceIdleState(PACKAGE_1, USER_ID, true);
assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0));
@@ -395,8 +394,6 @@
@Test
public void testNotificationEvent() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
mInjector.mElapsedRealtime = 1;
@@ -410,8 +407,6 @@
@Test
public void testSlicePinnedEvent() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
mInjector.mElapsedRealtime = 1;
@@ -425,8 +420,6 @@
@Test
public void testSlicePinnedPrivEvent() throws Exception {
- setChargingState(mController, false);
-
mController.forceIdleState(PACKAGE_1, USER_ID, true);
reportEvent(mController, SLICE_PINNED_PRIV, mInjector.mElapsedRealtime);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
@@ -434,14 +427,13 @@
@Test
public void testPredictionTimedout() throws Exception {
- setChargingState(mController, false);
// Set it to timeout or usage, so that prediction can override it
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE,
- REASON_MAIN_TIMEOUT, 1 * HOUR_MS);
+ REASON_MAIN_TIMEOUT, HOUR_MS);
assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
- REASON_MAIN_PREDICTED, 1 * HOUR_MS);
+ REASON_MAIN_PREDICTED, HOUR_MS);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
// Fast forward 12 hours
@@ -464,7 +456,6 @@
@Test
public void testOverrides() throws Exception {
- setChargingState(mController, false);
// Can force to NEVER
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
REASON_MAIN_FORCED, 1 * HOUR_MS);
@@ -494,8 +485,6 @@
@Test
public void testTimeout() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertBucket(STANDBY_BUCKET_ACTIVE);
@@ -505,19 +494,19 @@
assertBucket(STANDBY_BUCKET_ACTIVE);
// bucketing works after timeout
- mInjector.mElapsedRealtime = FREQUENT_THRESHOLD - 100;
+ mInjector.mElapsedRealtime = mController.mPredictionTimeoutMillis - 100;
mController.checkIdleStates(USER_ID);
- assertBucket(STANDBY_BUCKET_WORKING_SET);
-
- mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
+ // Use recent prediction
assertBucket(STANDBY_BUCKET_FREQUENT);
+
+ // Way past prediction timeout, use system thresholds
+ mInjector.mElapsedRealtime = RARE_THRESHOLD * 4;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_RARE);
}
@Test
public void testCascadingTimeouts() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertBucket(STANDBY_BUCKET_ACTIVE);
@@ -539,8 +528,6 @@
@Test
public void testOverlappingTimeouts() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertBucket(STANDBY_BUCKET_ACTIVE);
@@ -596,8 +583,6 @@
@Test
public void testPredictionNotOverridden() throws Exception {
- setChargingState(mController, false);
-
reportEvent(mController, USER_INTERACTION, 0);
assertBucket(STANDBY_BUCKET_ACTIVE);
@@ -623,6 +608,31 @@
}
@Test
+ public void testPredictionStrikesBack() throws Exception {
+ reportEvent(mController, USER_INTERACTION, 0);
+ assertBucket(STANDBY_BUCKET_ACTIVE);
+
+ // Predict to FREQUENT
+ mInjector.mElapsedRealtime = RARE_THRESHOLD;
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
+ assertBucket(STANDBY_BUCKET_FREQUENT);
+
+ // Add a short timeout event
+ mInjector.mElapsedRealtime += 1000;
+ reportEvent(mController, SYSTEM_INTERACTION, mInjector.mElapsedRealtime);
+ assertBucket(STANDBY_BUCKET_ACTIVE);
+ mInjector.mElapsedRealtime += 1000;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_ACTIVE);
+
+ // Verify it reverted to predicted
+ mInjector.mElapsedRealtime += WORKING_SET_THRESHOLD / 2;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_FREQUENT);
+ }
+
+ @Test
public void testAddActiveDeviceAdmin() {
assertActiveAdmins(USER_ID, (String[]) null);
assertActiveAdmins(USER_ID2, (String[]) null);
diff --git a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
index 57dd808..6769e40 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
@@ -18,8 +18,12 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -99,16 +103,23 @@
private MockSurfaceBuildingContainer mHost;
private Dimmer mDimmer;
private SurfaceControl.Transaction mTransaction;
+ private Dimmer.SurfaceAnimatorStarter mSurfaceAnimatorStarter;
+
+ private static class SurfaceAnimatorStarterImpl implements Dimmer.SurfaceAnimatorStarter {
+ @Override
+ public void startAnimation(SurfaceAnimator surfaceAnimator, SurfaceControl.Transaction t,
+ AnimationAdapter anim, boolean hidden) {
+ surfaceAnimator.mAnimationFinishedCallback.run();
+ }
+ }
@Before
public void setUp() throws Exception {
super.setUp();
mHost = new MockSurfaceBuildingContainer();
-
+ mSurfaceAnimatorStarter = spy(new SurfaceAnimatorStarterImpl());
mTransaction = mock(SurfaceControl.Transaction.class);
- mDimmer = new Dimmer(mHost,
- (surfaceAnimator, t, anim, hidden) -> surfaceAnimator.mAnimationFinishedCallback
- .run());
+ mDimmer = new Dimmer(mHost, mSurfaceAnimatorStarter);
}
@Test
@@ -202,6 +213,8 @@
mDimmer.resetDimStates();
mDimmer.updateDims(mTransaction, new Rect());
+ verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
+ SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
verify(dimLayer).destroy();
}
@@ -243,6 +256,25 @@
verify(mTransaction).setPosition(dimLayer, 10, 10);
}
+ @Test
+ public void testRemoveDimImmediately() throws Exception {
+ TestWindowContainer child = new TestWindowContainer();
+ mHost.addChild(child, 0);
+
+ mDimmer.dimAbove(mTransaction, child, 1);
+ SurfaceControl dimLayer = getDimLayer();
+ mDimmer.updateDims(mTransaction, new Rect());
+ verify(mTransaction, times(1)).show(dimLayer);
+
+ reset(mSurfaceAnimatorStarter);
+ mDimmer.dontAnimateExit();
+ mDimmer.resetDimStates();
+ mDimmer.updateDims(mTransaction, new Rect());
+ verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
+ SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
+ verify(mTransaction).destroy(dimLayer);
+ }
+
private SurfaceControl getDimLayer() {
return mDimmer.mDimState.mDimLayer;
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index b645700..7f1bcac 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -30,8 +30,10 @@
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -436,6 +438,20 @@
}
@Test
+ public void testLayoutSeq_assignedDuringLayout() throws Exception {
+ synchronized (sWm.getWindowManagerLock()) {
+
+ final DisplayContent dc = createNewDisplay();
+ final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w");
+
+ dc.setLayoutNeeded();
+ dc.performLayout(true /* initial */, false /* updateImeWindows */);
+
+ assertThat(win.mLayoutSeq, is(dc.mLayoutSeq));
+ }
+ }
+
+ @Test
@SuppressLint("InlinedApi")
public void testOrientationDefinedByKeyguard() {
final DisplayContent dc = createNewDisplay();
diff --git a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 64501e4..95361f0 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -17,14 +17,20 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.Binder;
+import android.os.IInterface;
+import android.platform.test.annotations.Presubmit;
import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -50,7 +56,7 @@
* atest FrameworksServicesTests:com.android.server.wm.RemoteAnimationControllerTest
*/
@SmallTest
-@FlakyTest(detail = "Promote to presubmit if non-flakyness is established")
+@Presubmit
@RunWith(AndroidJUnit4.class)
public class RemoteAnimationControllerTest extends WindowTestsBase {
@@ -67,6 +73,7 @@
public void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
+ when(mMockRunner.asBinder()).thenReturn(new Binder());
mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50);
mAdapter.setCallingPid(123);
sWm.mH.runWithScissors(() -> {
@@ -166,7 +173,7 @@
@Test
public void testZeroAnimations() throws Exception {
mController.goodToGo();
- verifyZeroInteractions(mMockRunner);
+ verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
}
@Test
@@ -175,7 +182,7 @@
mController.createAnimationAdapter(win.mAppToken,
new Point(50, 100), new Rect(50, 100, 150, 150));
mController.goodToGo();
- verifyZeroInteractions(mMockRunner);
+ verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
}
@Test
@@ -197,4 +204,21 @@
assertEquals(1, appsCaptor.getValue().length);
assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
}
+
+ @Test
+ public void testRemovedBeforeStarted() throws Exception {
+ final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
+ final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
+ new Point(50, 100), new Rect(50, 100, 150, 150));
+ adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
+ win.mAppToken.removeImmediately();
+ mController.goodToGo();
+ verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
+ verify(mFinishedCallback).onAnimationFinished(eq(adapter));
+ }
+
+ private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) {
+ verify(binder, atLeast(0)).asBinder();
+ verifyNoMoreInteractions(binder);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 6d9167f..1af344b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -445,8 +445,7 @@
}
@Override
- public int rotationForOrientationLw(int orientation,
- int lastRotation) {
+ public int rotationForOrientationLw(int orientation, int lastRotation, boolean defaultDisplay) {
return rotationToReport;
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 56b7d9f..1248eae 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -40,9 +40,12 @@
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -312,6 +315,17 @@
assertTrue(child2.isSelfOrAncestorWindowAnimatingExit());
}
+ @Test
+ public void testLayoutSeqResetOnReparent() throws Exception {
+ final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+ app.mLayoutSeq = 1;
+ mDisplayContent.mLayoutSeq = 1;
+
+ app.onDisplayChanged(mDisplayContent);
+
+ assertThat(app.mLayoutSeq, not(is(mDisplayContent.mLayoutSeq)));
+ }
+
private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) {
reset(mPowerManagerWrapper);
final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
new file mode 100644
index 0000000..e173b7d
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.WindowManager.TRANSIT_TASK_CLOSE;
+import static android.view.WindowManager.TRANSIT_TASK_OPEN;
+import static junit.framework.Assert.assertEquals;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.WindowManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class WindowSurfacePlacerTest extends WindowTestsBase {
+
+ private WindowSurfacePlacer mWindowSurfacePlacer;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ mWindowSurfacePlacer = new WindowSurfacePlacer(sWm);
+ }
+
+ @Test
+ public void testTranslucentOpen() throws Exception {
+ synchronized (sWm.mWindowMap) {
+ final AppWindowToken behind = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final AppWindowToken translucentOpening = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ translucentOpening.setFillsParent(false);
+ translucentOpening.setHidden(true);
+ sWm.mOpeningApps.add(behind);
+ sWm.mOpeningApps.add(translucentOpening);
+ assertEquals(WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN,
+ mWindowSurfacePlacer.maybeUpdateTransitToTranslucentAnim(TRANSIT_TASK_OPEN));
+ }
+ }
+
+ @Test
+ public void testTranslucentClose() throws Exception {
+ synchronized (sWm.mWindowMap) {
+ final AppWindowToken behind = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final AppWindowToken translucentClosing = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ translucentClosing.setFillsParent(false);
+ sWm.mClosingApps.add(translucentClosing);
+ assertEquals(WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE,
+ mWindowSurfacePlacer.maybeUpdateTransitToTranslucentAnim(TRANSIT_TASK_CLOSE));
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 6fa2740..d2eee68 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -173,6 +173,8 @@
mDisplayContent.removeImmediately();
sWm.mInputMethodTarget = null;
+ sWm.mClosingApps.clear();
+ sWm.mOpeningApps.clear();
}
// Wait until everything is really cleaned up.
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
new file mode 100644
index 0000000..d0f0fe3
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm.utils;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Pair;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public class InsetUtilsTest {
+
+ @Test
+ public void testAdd() throws Exception {
+ final Rect rect1 = new Rect(10, 20, 30, 40);
+ final Rect rect2 = new Rect(50, 60, 70, 80);
+ InsetUtils.addInsets(rect1, rect2);
+ assertEquals(new Rect(60, 80, 100, 120), rect1);
+ }
+}
+
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
index 40a34b9..afdde72 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
@@ -17,14 +17,18 @@
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := current
LOCAL_COMPATIBILITY_SUITE := device-tests
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+
LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_SRC_FILES += ../../src/com/android/server/pm/SuspendPackagesTest.java
LOCAL_PACKAGE_NAME := SuspendTestApp
LOCAL_DEX_PREOPT := false
LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
index 70a1fd0..ce6a27a 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
@@ -21,7 +21,12 @@
<activity android:name=".SuspendTestActivity"
android:exported="true" />
<receiver android:name=".SuspendTestReceiver"
- android:exported="true" />
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
+ <action android:name="android.intent.action.MY_PACKAGE_UNSUSPENDED" />
+ </intent-filter>
+ </receiver>
</application>
</manifest>
\ No newline at end of file
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java
index 6f353a0..90a9f01 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java
@@ -16,12 +16,15 @@
package com.android.servicestests.apps.suspendtestapp;
+import static com.android.server.pm.SuspendPackagesTest.ACTION_REPORT_MY_PACKAGE_SUSPENDED;
+import static com.android.server.pm.SuspendPackagesTest.ACTION_REPORT_MY_PACKAGE_UNSUSPENDED;
+import static com.android.server.pm.SuspendPackagesTest.INSTRUMENTATION_PACKAGE;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.os.PersistableBundle;
import android.util.Log;
public class SuspendTestReceiver extends BroadcastReceiver {
@@ -34,21 +37,33 @@
public static final String EXTRA_SUSPENDED_APP_EXTRAS =
PACKAGE_NAME + ".extra.SUSPENDED_APP_EXTRAS";
- private PackageManager mPm;
-
@Override
public void onReceive(Context context, Intent intent) {
- mPm = context.getPackageManager();
- Log.d(TAG, "Received request action " + intent.getAction());
+ final PackageManager packageManager = context.getPackageManager();
+ Log.d(TAG, "Received action " + intent.getAction());
+ final Bundle appExtras;
switch (intent.getAction()) {
case ACTION_GET_SUSPENDED_STATE:
final Bundle result = new Bundle();
- final boolean suspended = mPm.isPackageSuspended();
- final PersistableBundle appExtras = mPm.getSuspendedPackageAppExtras();
+ final boolean suspended = packageManager.isPackageSuspended();
+ appExtras = packageManager.getSuspendedPackageAppExtras();
result.putBoolean(EXTRA_SUSPENDED, suspended);
- result.putParcelable(EXTRA_SUSPENDED_APP_EXTRAS, appExtras);
+ result.putBundle(EXTRA_SUSPENDED_APP_EXTRAS, appExtras);
setResult(0, null, result);
break;
+ case Intent.ACTION_MY_PACKAGE_SUSPENDED:
+ appExtras = intent.getBundleExtra(Intent.EXTRA_SUSPENDED_PACKAGE_EXTRAS);
+ final Intent reportSuspendIntent = new Intent(ACTION_REPORT_MY_PACKAGE_SUSPENDED)
+ .putExtra(EXTRA_SUSPENDED_APP_EXTRAS, appExtras)
+ .setPackage(INSTRUMENTATION_PACKAGE);
+ context.sendBroadcast(reportSuspendIntent);
+ break;
+ case Intent.ACTION_MY_PACKAGE_UNSUSPENDED:
+ final Intent reportUnsuspendIntent =
+ new Intent(ACTION_REPORT_MY_PACKAGE_UNSUSPENDED)
+ .setPackage(INSTRUMENTATION_PACKAGE);
+ context.sendBroadcast(reportUnsuspendIntent);
+ break;
default:
Log.e(TAG, "Unknown action: " + intent.getAction());
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 09d88fd..0815876 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -367,8 +367,8 @@
mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, false);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
mHelper.setShowBadge(PKG, UID, true);
@@ -427,10 +427,10 @@
mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, false);
- mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, false, false);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
mHelper.setShowBadge(PKG, UID, true);
@@ -481,7 +481,7 @@
NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_LOW);
channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
@@ -507,7 +507,7 @@
NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_LOW);
channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
loadStreamXml(baos, true);
@@ -528,7 +528,7 @@
NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_LOW);
channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
loadStreamXml(baos, true);
@@ -569,7 +569,7 @@
NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_LOW);
channel.setSound(null, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
loadStreamXml(baos, true);
@@ -593,9 +593,9 @@
mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
mHelper.deleteNotificationChannel(PKG, UID, channel1.getId());
mHelper.deleteNotificationChannelGroup(PKG, UID, ncg.getId());
@@ -701,7 +701,7 @@
@Test
public void testDeletesDefaultChannelAfterChannelIsCreated() throws Exception {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
@@ -721,7 +721,7 @@
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
loadStreamXml(baos, false);
@@ -734,36 +734,39 @@
mHelper.setImportance(PKG, UID, IMPORTANCE_NONE);
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
}
@Test
public void testCreateChannel_badImportance() throws Exception {
try {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1),
+ true, false);
fail("Was allowed to create a channel with invalid importance");
} catch (IllegalArgumentException e) {
// yay
}
try {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED),
+ true, false);
fail("Was allowed to create a channel with invalid importance");
} catch (IllegalArgumentException e) {
// yay
}
try {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1),
+ true, false);
fail("Was allowed to create a channel with invalid importance");
} catch (IllegalArgumentException e) {
// yay
}
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true, false);
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true);
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true, false);
}
@@ -777,7 +780,7 @@
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- mHelper.createNotificationChannel(PKG, UID, channel, false);
+ mHelper.createNotificationChannel(PKG, UID, channel, false, false);
// same id, try to update all fields
final NotificationChannel channel2 =
@@ -824,7 +827,7 @@
public void testUpdate_postUpgrade_noUpdateAppFields() throws Exception {
final NotificationChannel channel = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, UID, channel, false);
+ mHelper.createNotificationChannel(PKG, UID, channel, false, false);
assertTrue(mHelper.canShowBadge(PKG, UID));
assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
@@ -865,7 +868,7 @@
}
channel.lockFields(lockMask);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
NotificationChannel savedChannel =
mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
@@ -894,7 +897,7 @@
}
channel.lockFields(lockMask);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
NotificationChannel savedChannel =
mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
@@ -920,7 +923,7 @@
@Test
public void testLockFields_soundAndVibration() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
final NotificationChannel update1 = getChannel();
update1.setSound(new Uri.Builder().scheme("test").build(),
@@ -944,7 +947,7 @@
@Test
public void testLockFields_vibrationAndLights() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
final NotificationChannel update1 = getChannel();
update1.setVibrationPattern(new long[]{7945, 46 ,246});
@@ -964,7 +967,7 @@
@Test
public void testLockFields_lightsAndImportance() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
final NotificationChannel update1 = getChannel();
update1.setLightColor(Color.GREEN);
@@ -984,7 +987,7 @@
@Test
public void testLockFields_visibilityAndDndAndBadge() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
assertEquals(0,
mHelper.getNotificationChannel(PKG, UID, getChannel().getId(), false)
.getUserLockedFields());
@@ -1029,7 +1032,7 @@
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 67, 145, 156});
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
// Does not return deleted channel
@@ -1058,8 +1061,8 @@
NotificationChannel channel2 =
new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
channelMap.put(channel2.getId(), channel2);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
@@ -1091,9 +1094,9 @@
new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
NotificationChannel channel3 =
new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, true);
- mHelper.createNotificationChannel(PKG, UID, channel3, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
@@ -1109,14 +1112,14 @@
new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel.setVibrationPattern(vibration);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
NotificationChannel newChannel = new NotificationChannel(
channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
newChannel.setVibrationPattern(new long[]{100});
- mHelper.createNotificationChannel(PKG, UID, newChannel, true);
+ mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
// No long deleted, using old settings
compareChannels(channel,
@@ -1128,7 +1131,7 @@
assertTrue(mHelper.onlyHasDefaultChannel(PKG, UID));
assertFalse(mHelper.onlyHasDefaultChannel(UPDATED_PKG, UID2));
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true);
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
assertFalse(mHelper.onlyHasDefaultChannel(PKG, UID));
}
@@ -1136,7 +1139,7 @@
public void testCreateChannel_defaultChannelId() throws Exception {
try {
mHelper.createNotificationChannel(PKG, UID, new NotificationChannel(
- NotificationChannel.DEFAULT_CHANNEL_ID, "ha", IMPORTANCE_HIGH), true);
+ NotificationChannel.DEFAULT_CHANNEL_ID, "ha", IMPORTANCE_HIGH), true, false);
fail("Allowed to create default channel");
} catch (IllegalArgumentException e) {
// pass
@@ -1150,13 +1153,13 @@
new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel.setVibrationPattern(vibration);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
NotificationChannel newChannel = new NotificationChannel(
channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
newChannel.setVibrationPattern(new long[]{100});
- mHelper.createNotificationChannel(PKG, UID, newChannel, true);
+ mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
// Old settings not overridden
compareChannels(channel,
@@ -1169,7 +1172,7 @@
final NotificationChannel channel = new NotificationChannel("id2", "name2",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setSound(sound, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
assertEquals(sound, mHelper.getNotificationChannel(
PKG, UID, channel.getId(), false).getSound());
}
@@ -1181,8 +1184,8 @@
NotificationChannel channel2 =
new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
- mHelper.createNotificationChannel(PKG, UID, channel2, false);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
mHelper.permanentlyDeleteNotificationChannels(PKG, UID);
@@ -1205,9 +1208,9 @@
mHelper.createNotificationChannelGroup(PKG, UID, notDeleted, true);
mHelper.createNotificationChannelGroup(PKG, UID, deleted, true);
- mHelper.createNotificationChannel(PKG, UID, nonGroupedNonDeletedChannel, true);
- mHelper.createNotificationChannel(PKG, UID, groupedAndDeleted, true);
- mHelper.createNotificationChannel(PKG, UID, groupedButNotDeleted, true);
+ mHelper.createNotificationChannel(PKG, UID, nonGroupedNonDeletedChannel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, groupedAndDeleted, true, false);
+ mHelper.createNotificationChannel(PKG, UID, groupedButNotDeleted, true, false);
mHelper.deleteNotificationChannelGroup(PKG, UID, deleted.getId());
@@ -1264,14 +1267,14 @@
// Deleted
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
assertEquals(0, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
// Not deleted
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
mHelper.onPackagesChanged(false, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
assertEquals(2, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
@@ -1302,7 +1305,7 @@
@Test
public void testOnPackageChange_downgradeTargetSdk() throws Exception {
// create channel as api 26
- mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
// install new app version targeting 25
final ApplicationInfo legacy = new ApplicationInfo();
@@ -1338,7 +1341,7 @@
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
channel1.setGroup("garbage");
try {
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
fail("Created a channel with a bad group");
} catch (IllegalArgumentException e) {
}
@@ -1351,7 +1354,7 @@
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
assertEquals(ncg.getId(),
mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false).getGroup());
@@ -1369,20 +1372,20 @@
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
NotificationChannel channel1a =
new NotificationChannel("id1a", "name1", NotificationManager.IMPORTANCE_HIGH);
channel1a.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1a, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1a, true, false);
NotificationChannel channel2 =
new NotificationChannel("id2", "name1", NotificationManager.IMPORTANCE_HIGH);
channel2.setGroup(ncg2.getId());
- mHelper.createNotificationChannel(PKG, UID, channel2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
NotificationChannel channel3 =
new NotificationChannel("id3", "name1", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel3, true);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
List<NotificationChannelGroup> actual =
mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
@@ -1416,7 +1419,7 @@
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
channel1.setImportance(IMPORTANCE_LOW);
@@ -1436,12 +1439,12 @@
@Test
public void testCreateChannel_updateName() throws Exception {
NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
- mHelper.createNotificationChannel(PKG, UID, nc, true);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
assertEquals("hello", actual.getName());
nc = new NotificationChannel("id", "goodbye", IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, nc, true);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
assertEquals("goodbye", actual.getName());
@@ -1455,13 +1458,13 @@
NotificationChannelGroup group = new NotificationChannelGroup("group", "");
mHelper.createNotificationChannelGroup(PKG, UID, group, true);
NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
- mHelper.createNotificationChannel(PKG, UID, nc, true);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
assertNull(actual.getGroup());
nc = new NotificationChannel("id", "hello", IMPORTANCE_HIGH);
nc.setGroup(group.getId());
- mHelper.createNotificationChannel(PKG, UID, nc, true);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
assertNotNull(actual.getGroup());
@@ -1486,7 +1489,7 @@
int numChannels = ThreadLocalRandom.current().nextInt(1, 10);
for (int j = 0; j < numChannels; j++) {
mHelper.createNotificationChannel(pkgName, UID,
- new NotificationChannel("" + j, "a", IMPORTANCE_HIGH), true);
+ new NotificationChannel("" + j, "a", IMPORTANCE_HIGH), true, false);
}
expectedChannels.put(pkgName, numChannels);
}
@@ -1621,10 +1624,10 @@
c.setGroup(group.getId());
NotificationChannel d = new NotificationChannel("d", "d", IMPORTANCE_DEFAULT);
- mHelper.createNotificationChannel(PKG, UID, a, true);
- mHelper.createNotificationChannel(PKG, UID, b, true);
- mHelper.createNotificationChannel(PKG, UID, c, true);
- mHelper.createNotificationChannel(PKG, UID, d, true);
+ mHelper.createNotificationChannel(PKG, UID, a, true, false);
+ mHelper.createNotificationChannel(PKG, UID, b, true, false);
+ mHelper.createNotificationChannel(PKG, UID, c, true, false);
+ mHelper.createNotificationChannel(PKG, UID, d, true, false);
mHelper.deleteNotificationChannel(PKG, UID, c.getId());
NotificationChannelGroup retrieved = mHelper.getNotificationChannelGroupWithChannels(
@@ -1641,22 +1644,31 @@
@Test
public void testAndroidPkgCanBypassDnd_creation() {
-
NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
test.setBypassDnd(true);
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true);
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
assertTrue(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
.canBypassDnd());
}
@Test
+ public void testDndPkgCanBypassDnd_creation() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ test.setBypassDnd(true);
+
+ mHelper.createNotificationChannel(PKG, UID, test, true, true);
+
+ assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
+ }
+
+ @Test
public void testNormalPkgCannotBypassDnd_creation() {
NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
test.setBypassDnd(true);
- mHelper.createNotificationChannel(PKG, 1000, test, true);
+ mHelper.createNotificationChannel(PKG, 1000, test, true, false);
assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
}
@@ -1664,11 +1676,11 @@
@Test
public void testAndroidPkgCanBypassDnd_update() throws Exception {
NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true);
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
update.setBypassDnd(true);
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, update, true);
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, update, true, false);
assertTrue(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
.canBypassDnd());
@@ -1678,12 +1690,24 @@
}
@Test
- public void testNormalPkgCannotBypassDnd_update() {
+ public void testDndPkgCanBypassDnd_update() throws Exception {
NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, 1000, test, true);
+ mHelper.createNotificationChannel(PKG, UID, test, true, true);
+
NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
update.setBypassDnd(true);
- mHelper.createNotificationChannel(PKG, 1000, update, true);
+ mHelper.createNotificationChannel(PKG, UID, update, true, true);
+
+ assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
+ }
+
+ @Test
+ public void testNormalPkgCannotBypassDnd_update() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG, 1000, test, true, false);
+ NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ update.setBypassDnd(true);
+ mHelper.createNotificationChannel(PKG, 1000, update, true, false);
assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index 36136a8..ce74457 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -206,6 +206,31 @@
}
@Test
+ public void testShouldExitForAlarm_oldAlarm() {
+ // Cal: today 2:15pm
+ Calendar cal = new GregorianCalendar();
+ cal.set(Calendar.HOUR_OF_DAY, 14);
+ cal.set(Calendar.MINUTE, 15);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+
+ // ScheduleInfo: today 12:16pm - today 3:15pm
+ mScheduleInfo.days = new int[] {getTodayDay()};
+ mScheduleInfo.startHour = 12;
+ mScheduleInfo.endHour = 3;
+ mScheduleInfo.startMinute = 16;
+ mScheduleInfo.endMinute = 15;
+ mScheduleInfo.exitAtAlarm = true;
+ mScheduleInfo.nextAlarm = 1000; // very old alarm
+
+ mScheduleCalendar.setSchedule(mScheduleInfo);
+ assertTrue(mScheduleCalendar.isInSchedule(cal.getTimeInMillis()));
+
+ // don't exit for an alarm if it's an old alarm
+ assertFalse(mScheduleCalendar.shouldExitForAlarm(1000));
+ }
+
+ @Test
public void testMaybeSetNextAlarm_settingOff() {
mScheduleInfo.exitAtAlarm = false;
mScheduleInfo.nextAlarm = 0;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 381e04c..3acc277 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -329,12 +329,12 @@
mZenModeHelperSpy.mConfig.allowEvents = false;
mZenModeHelperSpy.mConfig.allowRepeatCallers= false;
- // 2. apply priority only zen - verify ringer is set to silent
+ // 2. apply priority only zen - verify ringer is unchanged
mZenModeHelperSpy.applyZenToRingerMode();
- verify(mAudioManager, atLeastOnce()).setRingerModeInternal(AudioManager.RINGER_MODE_SILENT,
+ verify(mAudioManager, never()).setRingerModeInternal(AudioManager.RINGER_MODE_SILENT,
mZenModeHelperSpy.TAG);
- // 3. apply zen off - verify zen is set to prevoius ringer (normal)
+ // 3. apply zen off - verify zen is set to previous ringer (normal)
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
mZenModeHelperSpy.applyZenToRingerMode();
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
index 1073a80..5e2a364 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -15,8 +15,10 @@
package com.android.server.slice;
import static android.content.ContentProvider.maybeAddUserId;
+import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
@@ -35,9 +37,11 @@
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
+import android.os.Process;
import android.os.RemoteException;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import android.testing.TestableContext;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -63,6 +67,7 @@
private SliceManagerService mService;
private PinnedSliceState mCreatedSliceState;
private IBinder mToken = new Binder();
+ private TestableContext mContextSpy;
@Before
public void setup() {
@@ -72,7 +77,8 @@
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
mContext.getTestablePermissions().setPermission(TEST_URI, PERMISSION_GRANTED);
- mService = spy(new SliceManagerService(mContext, TestableLooper.get(this).getLooper()));
+ mContextSpy = spy(mContext);
+ mService = spy(new SliceManagerService(mContextSpy, TestableLooper.get(this).getLooper()));
mCreatedSliceState = mock(PinnedSliceState.class);
doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI), anyString());
}
@@ -103,4 +109,23 @@
verify(mCreatedSliceState, never()).destroy();
}
+ @Test
+ public void testCheckAutoGrantPermissions() throws RemoteException {
+ String[] testPerms = new String[] {
+ "perm1",
+ "perm2",
+ };
+ when(mContextSpy.checkUriPermission(any(), anyInt(), anyInt(), anyInt()))
+ .thenReturn(PERMISSION_DENIED);
+ when(mContextSpy.checkPermission("perm1", Process.myPid(), Process.myUid()))
+ .thenReturn(PERMISSION_DENIED);
+ when(mContextSpy.checkPermission("perm2", Process.myPid(), Process.myUid()))
+ .thenReturn(PERMISSION_GRANTED);
+ mService.checkSlicePermission(TEST_URI, mContext.getPackageName(), Process.myPid(),
+ Process.myUid(), testPerms);
+
+ verify(mContextSpy).checkPermission(eq("perm1"), eq(Process.myPid()), eq(Process.myUid()));
+ verify(mContextSpy).checkPermission(eq("perm2"), eq(Process.myPid()), eq(Process.myUid()));
+ }
+
}
\ No newline at end of file
diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java
index fd28b65..271f813 100644
--- a/services/usage/java/com/android/server/usage/AppIdleHistory.java
+++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java
@@ -70,6 +70,8 @@
private SparseArray<ArrayMap<String,AppUsageHistory>> mIdleHistory = new SparseArray<>();
private static final long ONE_MINUTE = 60 * 1000;
+ private static final int STANDBY_BUCKET_UNKNOWN = -1;
+
@VisibleForTesting
static final String APP_IDLE_FILENAME = "app_idle_stats.xml";
private static final String TAG_PACKAGES = "packages";
@@ -111,6 +113,9 @@
long lastUsedScreenTime;
// Last predicted time using elapsed timebase
long lastPredictedTime;
+ // Last predicted bucket
+ @UsageStatsManager.StandbyBuckets
+ int lastPredictedBucket = STANDBY_BUCKET_UNKNOWN;
// Standby bucket
@UsageStatsManager.StandbyBuckets
int currentBucket;
@@ -342,6 +347,7 @@
appUsageHistory.bucketingReason = reason;
if ((reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED) {
appUsageHistory.lastPredictedTime = getElapsedTime(elapsedRealtime);
+ appUsageHistory.lastPredictedBucket = bucket;
}
if (DEBUG) {
Slog.d(TAG, "Moved " + packageName + " to bucket=" + appUsageHistory.currentBucket
@@ -350,6 +356,17 @@
}
/**
+ * Update the prediction for the app but don't change the actual bucket
+ * @param app The app for which the prediction was made
+ * @param elapsedTimeAdjusted The elapsed time in the elapsed duration timebase
+ * @param bucket The predicted bucket
+ */
+ public void updateLastPrediction(AppUsageHistory app, long elapsedTimeAdjusted, int bucket) {
+ app.lastPredictedTime = elapsedTimeAdjusted;
+ app.lastPredictedBucket = bucket;
+ }
+
+ /**
* Marks the last time a job was run, with the given elapsedRealtime. The time stored is
* based on the elapsed timebase.
* @param packageName
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index 9139a4c..5f01518 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -22,7 +22,9 @@
import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED;
import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT;
import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_PREDICTED_RESTORED;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_ACTIVE_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_EXEMPTED_SYNC_START;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_BACKGROUND;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_FOREGROUND;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_NOTIFICATION_SEEN;
@@ -30,13 +32,14 @@
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_INTERACTION;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_UPDATE;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SLICE_PINNED;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SLICE_PINNED_PRIV;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
-
import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
@@ -184,6 +187,7 @@
static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10;
/** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */
static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11;
+ static final int MSG_REPORT_EXEMPTED_SYNC_START = 12;
long mCheckIdleIntervalMillis;
long mAppIdleParoleIntervalMillis;
@@ -200,6 +204,8 @@
long mPredictionTimeoutMillis;
/** Maximum time a sync adapter associated with a CP should keep the buckets elevated. */
long mSyncAdapterTimeoutMillis;
+ /** Maximum time an exempted sync should keep the buckets elevated. */
+ long mExemptedSyncAdapterTimeoutMillis;
/** Maximum time a system interaction should keep the buckets elevated. */
long mSystemInteractionTimeoutMillis;
@@ -373,6 +379,21 @@
}
}
+ void reportExemptedSyncStart(String packageName, int userId) {
+ if (!mAppIdleEnabled) return;
+
+ final long elapsedRealtime = mInjector.elapsedRealtime();
+
+ synchronized (mAppIdleLock) {
+ AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
+ STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_EXEMPTED_SYNC_START,
+ 0,
+ elapsedRealtime + mExemptedSyncAdapterTimeoutMillis);
+ maybeInformListeners(packageName, userId, elapsedRealtime,
+ appUsage.currentBucket, appUsage.bucketingReason, false);
+ }
+ }
+
void setChargingState(boolean charging) {
synchronized (mAppIdleLock) {
if (mCharging != charging) {
@@ -538,19 +559,30 @@
}
final int oldBucket = app.currentBucket;
int newBucket = Math.max(oldBucket, STANDBY_BUCKET_ACTIVE); // Undo EXEMPTED
- boolean predictionLate = false;
+ boolean predictionLate = predictionTimedOut(app, elapsedRealtime);
// Compute age-based bucket
if (oldMainReason == REASON_MAIN_DEFAULT
|| oldMainReason == REASON_MAIN_USAGE
|| oldMainReason == REASON_MAIN_TIMEOUT
- || (predictionLate = predictionTimedOut(app, elapsedRealtime))) {
- newBucket = getBucketForLocked(packageName, userId,
- elapsedRealtime);
- if (DEBUG) {
- Slog.d(TAG, "Evaluated AOSP newBucket = " + newBucket);
+ || predictionLate) {
+
+ if (!predictionLate && app.lastPredictedBucket >= STANDBY_BUCKET_ACTIVE
+ && app.lastPredictedBucket <= STANDBY_BUCKET_RARE) {
+ newBucket = app.lastPredictedBucket;
+ reason = REASON_MAIN_PREDICTED | REASON_SUB_PREDICTED_RESTORED;
+ if (DEBUG) {
+ Slog.d(TAG, "Restored predicted newBucket = " + newBucket);
+ }
+ } else {
+ newBucket = getBucketForLocked(packageName, userId,
+ elapsedRealtime);
+ if (DEBUG) {
+ Slog.d(TAG, "Evaluated AOSP newBucket = " + newBucket);
+ }
+ reason = REASON_MAIN_TIMEOUT;
}
- reason = REASON_MAIN_TIMEOUT;
}
+
// Check if the app is within one of the timeouts for forced bucket elevation
final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime);
if (newBucket >= STANDBY_BUCKET_ACTIVE
@@ -587,8 +619,7 @@
/** Returns true if there hasn't been a prediction for the app in a while. */
private boolean predictionTimedOut(AppIdleHistory.AppUsageHistory app, long elapsedRealtime) {
- return (app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED
- && app.lastPredictedTime > 0
+ return app.lastPredictedTime > 0
&& mAppIdleHistory.getElapsedTime(elapsedRealtime)
- app.lastPredictedTime > mPredictionTimeoutMillis;
}
@@ -747,6 +778,8 @@
case UsageEvents.Event.SYSTEM_INTERACTION: return REASON_SUB_USAGE_SYSTEM_INTERACTION;
case UsageEvents.Event.USER_INTERACTION: return REASON_SUB_USAGE_USER_INTERACTION;
case UsageEvents.Event.NOTIFICATION_SEEN: return REASON_SUB_USAGE_NOTIFICATION_SEEN;
+ case UsageEvents.Event.SLICE_PINNED: return REASON_SUB_USAGE_SLICE_PINNED;
+ case UsageEvents.Event.SLICE_PINNED_PRIV: return REASON_SUB_USAGE_SLICE_PINNED_PRIV;
default: return 0;
}
}
@@ -1032,6 +1065,10 @@
if (predicted) {
// Check if the app is within one of the timeouts for forced bucket elevation
final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime);
+ // In case of not using the prediction, just keep track of it for applying after
+ // ACTIVE or WORKING_SET timeout.
+ mAppIdleHistory.updateLastPrediction(app, elapsedTimeAdjusted, newBucket);
+
if (newBucket > STANDBY_BUCKET_ACTIVE
&& app.bucketActiveTimeoutTime > elapsedTimeAdjusted) {
newBucket = STANDBY_BUCKET_ACTIVE;
@@ -1256,6 +1293,11 @@
.sendToTarget();
}
+ void postReportExemptedSyncStart(String packageName, int userId) {
+ mHandler.obtainMessage(MSG_REPORT_EXEMPTED_SYNC_START, userId, 0, packageName)
+ .sendToTarget();
+ }
+
void dumpUser(IndentingPrintWriter idpw, int userId, String pkg) {
synchronized (mAppIdleLock) {
mAppIdleHistory.dump(idpw, userId, pkg);
@@ -1470,6 +1512,11 @@
checkAndUpdateStandbyState((String) msg.obj, msg.arg1, msg.arg2,
mInjector.elapsedRealtime());
break;
+
+ case MSG_REPORT_EXEMPTED_SYNC_START:
+ reportExemptedSyncStart((String) msg.obj, msg.arg1);
+ break;
+
default:
super.handleMessage(msg);
break;
@@ -1532,6 +1579,7 @@
"system_update_usage_duration";
private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout";
private static final String KEY_SYNC_ADAPTER_HOLD_DURATION = "sync_adapter_duration";
+ private static final String KEY_EXEMPTED_SYNC_HOLD_DURATION = "exempted_sync_duration";
private static final String KEY_SYSTEM_INTERACTION_HOLD_DURATION =
"system_interaction_duration";
public static final long DEFAULT_STRONG_USAGE_TIMEOUT = 1 * ONE_HOUR;
@@ -1539,6 +1587,7 @@
public static final long DEFAULT_SYSTEM_UPDATE_TIMEOUT = 2 * ONE_HOUR;
public static final long DEFAULT_SYSTEM_INTERACTION_TIMEOUT = 10 * ONE_MINUTE;
public static final long DEFAULT_SYNC_ADAPTER_TIMEOUT = 10 * ONE_MINUTE;
+ public static final long DEFAULT_EXEMPTED_SYNC_TIMEOUT = 10 * ONE_MINUTE;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -1614,6 +1663,9 @@
mSyncAdapterTimeoutMillis = mParser.getDurationMillis
(KEY_SYNC_ADAPTER_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYNC_ADAPTER_TIMEOUT);
+ mExemptedSyncAdapterTimeoutMillis = mParser.getDurationMillis
+ (KEY_EXEMPTED_SYNC_HOLD_DURATION,
+ COMPRESS_TIME ? ONE_MINUTE : DEFAULT_EXEMPTED_SYNC_TIMEOUT);
mSystemInteractionTimeoutMillis = mParser.getDurationMillis
(KEY_SYSTEM_INTERACTION_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYSTEM_INTERACTION_TIMEOUT);
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 00826e0..c914689 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -16,6 +16,7 @@
package com.android.server.usage;
import android.app.usage.ConfigurationStats;
+import android.app.usage.EventStats;
import android.app.usage.TimeSparseArray;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStats;
@@ -23,10 +24,16 @@
import android.util.ArrayMap;
import android.util.ArraySet;
+import java.util.List;
+
class IntervalStats {
public long beginTime;
public long endTime;
public long lastTimeSaved;
+ public final EventTracker interactiveTracker = new EventTracker();
+ public final EventTracker nonInteractiveTracker = new EventTracker();
+ public final EventTracker keyguardShownTracker = new EventTracker();
+ public final EventTracker keyguardHiddenTracker = new EventTracker();
public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>();
public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>();
public Configuration activeConfiguration;
@@ -38,6 +45,44 @@
// strings that had identical copies in the cache.
private final ArraySet<String> mStringCache = new ArraySet<>();
+ public static final class EventTracker {
+ public long curStartTime;
+ public long lastEventTime;
+ public long duration;
+ public int count;
+
+ public void commitTime(long timeStamp) {
+ if (curStartTime != 0) {
+ duration += timeStamp - duration;
+ curStartTime = 0;
+ }
+ }
+
+ public void update(long timeStamp) {
+ if (curStartTime == 0) {
+ // If we aren't already running, time to bump the count.
+ count++;
+ }
+ commitTime(timeStamp);
+ curStartTime = timeStamp;
+ lastEventTime = timeStamp;
+ }
+
+ void addToEventStats(List<EventStats> out, int event, long beginTime, long endTime) {
+ if (count != 0 || duration != 0) {
+ EventStats ev = new EventStats();
+ ev.mEventType = event;
+ ev.mCount = count;
+ ev.mTotalTime = duration;
+ ev.mLastEventTime = lastEventTime;
+ ev.mBeginTimeStamp = beginTime;
+ ev.mEndTimeStamp = endTime;
+ out.add(ev);
+ }
+ }
+
+ }
+
/**
* Gets the UsageStats object for the given package, or creates one and adds it internally.
*/
@@ -171,6 +216,44 @@
usageStats.mAppLaunchCount += 1;
}
+ void commitTime(long timeStamp) {
+ interactiveTracker.commitTime(timeStamp);
+ nonInteractiveTracker.commitTime(timeStamp);
+ keyguardShownTracker.commitTime(timeStamp);
+ keyguardHiddenTracker.commitTime(timeStamp);
+ }
+
+ void updateScreenInteractive(long timeStamp) {
+ interactiveTracker.update(timeStamp);
+ nonInteractiveTracker.commitTime(timeStamp);
+ }
+
+ void updateScreenNonInteractive(long timeStamp) {
+ nonInteractiveTracker.update(timeStamp);
+ interactiveTracker.commitTime(timeStamp);
+ }
+
+ void updateKeyguardShown(long timeStamp) {
+ keyguardShownTracker.update(timeStamp);
+ keyguardHiddenTracker.commitTime(timeStamp);
+ }
+
+ void updateKeyguardHidden(long timeStamp) {
+ keyguardHiddenTracker.update(timeStamp);
+ keyguardShownTracker.commitTime(timeStamp);
+ }
+
+ void addEventStatsTo(List<EventStats> out) {
+ interactiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_INTERACTIVE,
+ beginTime, endTime);
+ nonInteractiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_NON_INTERACTIVE,
+ beginTime, endTime);
+ keyguardShownTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_SHOWN,
+ beginTime, endTime);
+ keyguardHiddenTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_HIDDEN,
+ beginTime, endTime);
+ }
+
private String getCachedStringRef(String str) {
final int index = mStringCache.indexOf(str);
if (index < 0) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index b8317b4..1fbc27b 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -25,6 +25,7 @@
import android.app.admin.DevicePolicyManagerInternal;
import android.app.usage.AppStandbyInfo;
import android.app.usage.ConfigurationStats;
+import android.app.usage.EventStats;
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManager;
@@ -486,6 +487,23 @@
/**
* Called by the Binder stub.
*/
+ List<EventStats> queryEventStats(int userId, int bucketType, long beginTime,
+ long endTime) {
+ synchronized (mLock) {
+ final long timeNow = checkAndGetTimeLocked();
+ if (!validRange(timeNow, beginTime, endTime)) {
+ return null;
+ }
+
+ final UserUsageStatsService service =
+ getUserDataAndInitializeIfNeededLocked(userId, timeNow);
+ return service.queryEventStats(bucketType, beginTime, endTime);
+ }
+ }
+
+ /**
+ * Called by the Binder stub.
+ */
UsageEvents queryEvents(int userId, long beginTime, long endTime,
boolean shouldObfuscateInstantApps) {
synchronized (mLock) {
@@ -713,6 +731,28 @@
}
@Override
+ public ParceledListSlice<EventStats> queryEventStats(int bucketType,
+ long beginTime, long endTime, String callingPackage) throws RemoteException {
+ if (!hasPermission(callingPackage)) {
+ return null;
+ }
+
+ final int userId = UserHandle.getCallingUserId();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ final List<EventStats> results =
+ UsageStatsService.this.queryEventStats(userId, bucketType,
+ beginTime, endTime);
+ if (results != null) {
+ return new ParceledListSlice<>(results);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return null;
+ }
+
+ @Override
public UsageEvents queryEvents(long beginTime, long endTime, String callingPackage) {
if (!hasPermission(callingPackage)) {
return null;
@@ -1239,5 +1279,10 @@
public void onAdminDataAvailable() {
mAppStandby.onAdminDataAvailable();
}
+
+ @Override
+ public void reportExemptedSyncStart(String packageName, int userId) {
+ mAppStandby.postReportExemptedSyncStart(packageName, userId);
+ }
}
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index bcfc421..fe3a884 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -27,6 +27,7 @@
import android.app.usage.UsageStats;
import android.content.res.Configuration;
import android.util.ArrayMap;
+import android.util.Pair;
import java.io.IOException;
import java.net.ProtocolException;
@@ -37,6 +38,11 @@
final class UsageStatsXmlV1 {
private static final String TAG = "UsageStatsXmlV1";
+ private static final String INTERACTIVE_TAG = "interactive";
+ private static final String NON_INTERACTIVE_TAG = "non-interactive";
+ private static final String KEYGUARD_SHOWN_TAG = "keyguard-shown";
+ private static final String KEYGUARD_HIDDEN_TAG = "keyguard-hidden";
+
private static final String PACKAGES_TAG = "packages";
private static final String PACKAGE_TAG = "package";
@@ -99,6 +105,14 @@
}
}
+ private static void loadCountAndTime(XmlPullParser parser,
+ IntervalStats.EventTracker tracker)
+ throws IOException, XmlPullParserException {
+ tracker.count = XmlUtils.readIntAttribute(parser, COUNT_ATTR, 0);
+ tracker.duration = XmlUtils.readLongAttribute(parser, TIME_ATTR, 0);
+ XmlUtils.skipCurrentTag(parser);
+ }
+
private static void loadChooserCounts(
XmlPullParser parser, UsageStats usageStats, String action)
throws XmlPullParserException, IOException {
@@ -202,6 +216,14 @@
xml.endTag(null, PACKAGE_TAG);
}
+ private static void writeCountAndTime(XmlSerializer xml, String tag, int count, long time)
+ throws IOException {
+ xml.startTag(null, tag);
+ XmlUtils.writeIntAttribute(xml, COUNT_ATTR, count);
+ XmlUtils.writeLongAttribute(xml, TIME_ATTR, time);
+ xml.endTag(null, tag);
+ }
+
private static void writeChooserCounts(XmlSerializer xml, final UsageStats usageStats)
throws IOException {
if (usageStats == null || usageStats.mChooserCounts == null ||
@@ -320,6 +342,22 @@
final String tag = parser.getName();
switch (tag) {
+ case INTERACTIVE_TAG:
+ loadCountAndTime(parser, statsOut.interactiveTracker);
+ break;
+
+ case NON_INTERACTIVE_TAG:
+ loadCountAndTime(parser, statsOut.nonInteractiveTracker);
+ break;
+
+ case KEYGUARD_SHOWN_TAG:
+ loadCountAndTime(parser, statsOut.keyguardShownTracker);
+ break;
+
+ case KEYGUARD_HIDDEN_TAG:
+ loadCountAndTime(parser, statsOut.keyguardHiddenTracker);
+ break;
+
case PACKAGE_TAG:
loadUsageStats(parser, statsOut);
break;
@@ -346,6 +384,15 @@
public static void write(XmlSerializer xml, IntervalStats stats) throws IOException {
XmlUtils.writeLongAttribute(xml, END_TIME_ATTR, stats.endTime - stats.beginTime);
+ writeCountAndTime(xml, INTERACTIVE_TAG, stats.interactiveTracker.count,
+ stats.interactiveTracker.duration);
+ writeCountAndTime(xml, NON_INTERACTIVE_TAG, stats.nonInteractiveTracker.count,
+ stats.nonInteractiveTracker.duration);
+ writeCountAndTime(xml, KEYGUARD_SHOWN_TAG, stats.keyguardShownTracker.count,
+ stats.keyguardShownTracker.duration);
+ writeCountAndTime(xml, KEYGUARD_HIDDEN_TAG, stats.keyguardHiddenTracker.count,
+ stats.keyguardHiddenTracker.duration);
+
xml.startTag(null, PACKAGES_TAG);
final int statsCount = stats.packageStats.size();
for (int i = 0; i < statsCount; i++) {
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index afc3d59..d9fc066 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -17,6 +17,7 @@
package com.android.server.usage;
import android.app.usage.ConfigurationStats;
+import android.app.usage.EventStats;
import android.app.usage.TimeSparseArray;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStats;
@@ -191,21 +192,37 @@
}
for (IntervalStats stats : mCurrentStats) {
- if (event.mEventType == UsageEvents.Event.CONFIGURATION_CHANGE) {
- stats.updateConfigurationStats(newFullConfig, event.mTimeStamp);
- } else if (event.mEventType == UsageEvents.Event.CHOOSER_ACTION) {
- stats.updateChooserCounts(event.mPackage, event.mContentType, event.mAction);
- String[] annotations = event.mContentAnnotations;
- if (annotations != null) {
- for (String annotation : annotations) {
- stats.updateChooserCounts(event.mPackage, annotation, event.mAction);
+ switch (event.mEventType) {
+ case UsageEvents.Event.CONFIGURATION_CHANGE: {
+ stats.updateConfigurationStats(newFullConfig, event.mTimeStamp);
+ } break;
+ case UsageEvents.Event.CHOOSER_ACTION: {
+ stats.updateChooserCounts(event.mPackage, event.mContentType, event.mAction);
+ String[] annotations = event.mContentAnnotations;
+ if (annotations != null) {
+ for (String annotation : annotations) {
+ stats.updateChooserCounts(event.mPackage, annotation, event.mAction);
+ }
}
- }
- } else {
- stats.update(event.mPackage, event.mTimeStamp, event.mEventType);
- if (incrementAppLaunch) {
- stats.incrementAppLaunchCount(event.mPackage);
- }
+ } break;
+ case UsageEvents.Event.SCREEN_INTERACTIVE: {
+ stats.updateScreenInteractive(event.mTimeStamp);
+ } break;
+ case UsageEvents.Event.SCREEN_NON_INTERACTIVE: {
+ stats.updateScreenNonInteractive(event.mTimeStamp);
+ } break;
+ case UsageEvents.Event.KEYGUARD_SHOWN: {
+ stats.updateKeyguardShown(event.mTimeStamp);
+ } break;
+ case UsageEvents.Event.KEYGUARD_HIDDEN: {
+ stats.updateKeyguardHidden(event.mTimeStamp);
+ } break;
+ default: {
+ stats.update(event.mPackage, event.mTimeStamp, event.mEventType);
+ if (incrementAppLaunch) {
+ stats.incrementAppLaunchCount(event.mPackage);
+ }
+ } break;
}
}
@@ -246,6 +263,15 @@
}
};
+ private static final StatCombiner<EventStats> sEventStatsCombiner =
+ new StatCombiner<EventStats>() {
+ @Override
+ public void combine(IntervalStats stats, boolean mutable,
+ List<EventStats> accResult) {
+ stats.addEventStatsTo(accResult);
+ }
+ };
+
/**
* Generic query method that selects the appropriate IntervalStats for the specified time range
* and bucket, then calls the {@link com.android.server.usage.UsageStatsDatabase.StatCombiner}
@@ -325,6 +351,10 @@
return queryStats(bucketType, beginTime, endTime, sConfigStatsCombiner);
}
+ List<EventStats> queryEventStats(int bucketType, long beginTime, long endTime) {
+ return queryStats(bucketType, beginTime, endTime, sEventStatsCombiner);
+ }
+
UsageEvents queryEvents(final long beginTime, final long endTime,
boolean obfuscateInstantApps) {
final ArraySet<String> names = new ArraySet<>();
@@ -448,6 +478,7 @@
}
stat.updateConfigurationStats(null, mDailyExpiryDate.getTimeInMillis() - 1);
+ stat.commitTime(mDailyExpiryDate.getTimeInMillis() - 1);
}
persistActiveStats();
@@ -640,6 +671,23 @@
}
}
+ void printEventAggregation(IndentingPrintWriter pw, String label,
+ IntervalStats.EventTracker tracker, boolean prettyDates) {
+ if (tracker.count != 0 || tracker.duration != 0) {
+ pw.print(label);
+ pw.print(": ");
+ pw.print(tracker.count);
+ pw.print("x for ");
+ pw.print(formatElapsedTime(tracker.duration, prettyDates));
+ if (tracker.curStartTime != 0) {
+ pw.print(" (now running, started at ");
+ formatDateTime(tracker.curStartTime, prettyDates);
+ pw.print(")");
+ }
+ pw.println();
+ }
+ }
+
void printIntervalStats(IndentingPrintWriter pw, IntervalStats stats,
boolean prettyDates, boolean skipEvents, String pkg) {
if (prettyDates) {
@@ -713,6 +761,17 @@
pw.println();
}
pw.decreaseIndent();
+ pw.println("event aggregations");
+ pw.increaseIndent();
+ printEventAggregation(pw, "screen-interactive", stats.interactiveTracker,
+ prettyDates);
+ printEventAggregation(pw, "screen-non-interactive", stats.nonInteractiveTracker,
+ prettyDates);
+ printEventAggregation(pw, "keyguard-shown", stats.keyguardShownTracker,
+ prettyDates);
+ printEventAggregation(pw, "keyguard-hidden", stats.keyguardHiddenTracker,
+ prettyDates);
+ pw.decreaseIndent();
}
// The last 24 hours of events is already printed in the non checkin dump
@@ -781,6 +840,10 @@
return "SLICE_PINNED";
case UsageEvents.Event.SLICE_PINNED_PRIV:
return "SLICE_PINNED_PRIV";
+ case UsageEvents.Event.SCREEN_INTERACTIVE:
+ return "SCREEN_INTERACTIVE";
+ case UsageEvents.Event.SCREEN_NON_INTERACTIVE:
+ return "SCREEN_NON_INTERACTIVE";
default:
return "UNKNOWN";
}
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index ef0780a..9f8042c 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -83,6 +83,7 @@
import com.android.server.LocalServices;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
@@ -181,6 +182,7 @@
private final UEventObserver mUEventObserver;
private static Set<Integer> sBlackListedInterfaces;
+ private HashMap<Long, FileDescriptor> mControlFds;
static {
sBlackListedInterfaces = new HashSet<>();
@@ -270,6 +272,18 @@
Slog.i(TAG, "USB GADGET HAL not present in the device", e);
}
+ mControlFds = new HashMap<>();
+ FileDescriptor mtpFd = nativeOpenControl(UsbManager.USB_FUNCTION_MTP);
+ if (mtpFd == null) {
+ Slog.e(TAG, "Failed to open control for mtp");
+ }
+ mControlFds.put(UsbManager.FUNCTION_MTP, mtpFd);
+ FileDescriptor ptpFd = nativeOpenControl(UsbManager.USB_FUNCTION_PTP);
+ if (mtpFd == null) {
+ Slog.e(TAG, "Failed to open control for mtp");
+ }
+ mControlFds.put(UsbManager.FUNCTION_PTP, ptpFd);
+
boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
if (secureAdbEnabled && !dataEncrypted) {
@@ -704,8 +718,7 @@
return false;
}
- protected void updateUsbStateBroadcastIfNeeded(long functions,
- boolean configChanged) {
+ protected void updateUsbStateBroadcastIfNeeded(long functions) {
// send a sticky broadcast containing current USB state
Intent intent = new Intent(UsbManager.ACTION_USB_STATE);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
@@ -716,7 +729,6 @@
intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured);
intent.putExtra(UsbManager.USB_DATA_UNLOCKED,
isUsbTransferAllowed() && isUsbDataTransferActive(mCurrentFunctions));
- intent.putExtra(UsbManager.USB_CONFIG_CHANGED, configChanged);
long remainingFunctions = functions;
while (remainingFunctions != 0) {
@@ -726,7 +738,7 @@
}
// send broadcast intent only if the USB state has changed
- if (!isUsbStateChanged(intent) && !configChanged) {
+ if (!isUsbStateChanged(intent)) {
if (DEBUG) {
Slog.d(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras());
}
@@ -798,8 +810,7 @@
updateUsbNotification(false);
updateAdbNotification(false);
if (mBootCompleted) {
- updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions),
- false);
+ updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));
}
if ((mCurrentFunctions & UsbManager.FUNCTION_ACCESSORY) != 0) {
updateCurrentAccessory();
@@ -812,7 +823,7 @@
&& mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {
setScreenUnlockedFunctions();
} else {
- setEnabledFunctions(UsbManager.FUNCTION_NONE, !mAdbEnabled);
+ setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
}
}
updateUsbFunctions();
@@ -847,8 +858,7 @@
updateUsbNotification(false);
if (mBootCompleted) {
if (mHostConnected || prevHostConnected) {
- updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions),
- false);
+ updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));
}
} else {
mPendingBootBroadcast = true;
@@ -994,7 +1004,7 @@
protected void finishBoot() {
if (mBootCompleted && mCurrentUsbFunctionsReceived && mSystemReady) {
if (mPendingBootBroadcast) {
- updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions), false);
+ updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));
mPendingBootBroadcast = false;
}
if (!mScreenLocked
@@ -1597,7 +1607,7 @@
/**
* Start up dependent services.
*/
- updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions), true);
+ updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));
}
if (!waitForState(oemFunctions)) {
@@ -1943,7 +1953,7 @@
if (mBootCompleted && isUsbDataTransferActive(functions)) {
// Start up dependent services.
- updateUsbStateBroadcastIfNeeded(functions, true);
+ updateUsbStateBroadcastIfNeeded(functions);
}
}
}
@@ -1979,6 +1989,22 @@
return mHandler.getEnabledFunctions();
}
+ /**
+ * Returns a dup of the control file descriptor for the given function.
+ */
+ public ParcelFileDescriptor getControlFd(long usbFunction) {
+ FileDescriptor fd = mControlFds.get(usbFunction);
+ if (fd == null) {
+ return null;
+ }
+ try {
+ return ParcelFileDescriptor.dup(fd);
+ } catch (IOException e) {
+ Slog.e(TAG, "Could not dup fd for " + usbFunction);
+ return null;
+ }
+ }
+
public long getScreenUnlockedFunctions() {
return mHandler.getScreenUnlockedFunctions();
}
@@ -2063,6 +2089,8 @@
private native ParcelFileDescriptor nativeOpenAccessory();
+ private native FileDescriptor nativeOpenControl(String usbFunction);
+
private native boolean nativeIsStartRequested();
private native int nativeGetAudioMode();
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index c1a7591..e92bd74 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -304,6 +304,13 @@
return null;
}
+ /* Returns a dup of the control file descriptor for the given function. */
+ @Override
+ public ParcelFileDescriptor getControlFd(long function) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_MTP, null);
+ return mDeviceManager.getControlFd(function);
+ }
+
@Override
public void setDevicePackage(UsbDevice device, String packageName, int userId) {
device = Preconditions.checkNotNull(device);
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 36333e4..3bf951d 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -2600,7 +2600,6 @@
}
/**
- *
* Request audio routing to a specific bluetooth device. Calling this method may result in
* the device routing audio to a different bluetooth device than the one specified if the
* bluetooth stack is unable to route audio to the requested device.
@@ -2611,13 +2610,13 @@
* Used by self-managed {@link ConnectionService}s which wish to use bluetooth audio for a
* self-managed {@link Connection} (see {@link PhoneAccount#CAPABILITY_SELF_MANAGED}.)
* <p>
- * See also {@link InCallService#requestBluetoothAudio(String)}
- * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
- * {@link BluetoothDevice#getAddress()}.
+ * See also {@link InCallService#requestBluetoothAudio(BluetoothDevice)}
+ * @param bluetoothDevice The bluetooth device to connect to.
*/
- public void requestBluetoothAudio(@NonNull String bluetoothAddress) {
+ public void requestBluetoothAudio(@NonNull BluetoothDevice bluetoothDevice) {
for (Listener l : mListeners) {
- l.onAudioRouteChanged(this, CallAudioState.ROUTE_BLUETOOTH, bluetoothAddress);
+ l.onAudioRouteChanged(this, CallAudioState.ROUTE_BLUETOOTH,
+ bluetoothDevice.getAddress());
}
}
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index af65c65..bd25ab2 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -428,12 +428,11 @@
* A list of available devices can be obtained via
* {@link CallAudioState#getSupportedBluetoothDevices()}
*
- * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
- * {@link BluetoothDevice#getAddress()}.
+ * @param bluetoothDevice The bluetooth device to connect to.
*/
- public final void requestBluetoothAudio(@NonNull String bluetoothAddress) {
+ public final void requestBluetoothAudio(@NonNull BluetoothDevice bluetoothDevice) {
if (mPhone != null) {
- mPhone.requestBluetoothAudio(bluetoothAddress);
+ mPhone.requestBluetoothAudio(bluetoothDevice.getAddress());
}
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index c79eec0..4683161 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -397,6 +397,15 @@
public static final String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
/**
+ * Where there is no preloaded voicemail number on a SIM card, specifies the carrier's default
+ * voicemail number for roaming network.
+ * When empty string, no default voicemail number is specified for roaming network.
+ * @hide
+ */
+ public static final String KEY_DEFAULT_VM_NUMBER_ROAMING_STRING =
+ "default_vm_number_roaming_string";
+
+ /**
* Flag that specifies to use the user's own phone number as the voicemail number when there is
* no pre-loaded voicemail number on the SIM card.
* <p>
@@ -951,6 +960,8 @@
* If user has explicitly disabled some packages in the list, won't re-enable.
* Other carrier specific apps which are not in this list may be disabled for current carrier,
* and only be re-enabled when this config for another carrier includes it.
+ *
+ * @hide
*/
public static final String KEY_ENABLE_APPS_STRING_ARRAY = "enable_apps_string_array";
@@ -1929,6 +1940,7 @@
sDefaults.putBoolean(KEY_NOTIFY_HANDOVER_VIDEO_FROM_LTE_TO_WIFI_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_DOWNGRADE_VT_TO_AUDIO_BOOL, true);
sDefaults.putString(KEY_DEFAULT_VM_NUMBER_STRING, "");
+ sDefaults.putString(KEY_DEFAULT_VM_NUMBER_ROAMING_STRING, "");
sDefaults.putBoolean(KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL, false);
sDefaults.putBoolean(KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS, true);
sDefaults.putBoolean(KEY_VILTE_DATA_IS_METERED_BOOL, true);
diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java
index 08f8bb6..890a6ea 100644
--- a/telephony/java/android/telephony/CellIdentity.java
+++ b/telephony/java/android/telephony/CellIdentity.java
@@ -18,11 +18,14 @@
import android.annotation.CallSuper;
import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
/**
* CellIdentity represents the identity of a unique cell. This is the base class for
@@ -84,8 +87,16 @@
/** @hide */
protected final String mMncStr;
+ // long alpha Operator Name String or Enhanced Operator Name String
/** @hide */
- protected CellIdentity(String tag, int type, String mcc, String mnc) {
+ protected final String mAlphaLong;
+ // short alpha Operator Name String or Enhanced Operator Name String
+ /** @hide */
+ protected final String mAlphaShort;
+
+ /** @hide */
+ protected CellIdentity(String tag, int type, String mcc, String mnc, String alphal,
+ String alphas) {
mTag = tag;
mType = type;
@@ -113,6 +124,8 @@
mMncStr = null;
log("invalid MNC format: " + mnc);
}
+ mAlphaLong = alphal;
+ mAlphaShort = alphas;
}
/** Implement the Parcelable interface */
@@ -138,6 +151,40 @@
}
/**
+ * @return The long alpha tag associated with the current scan result (may be the operator
+ * name string or extended operator name string). May be null if unknown.
+ */
+ @Nullable
+ public CharSequence getOperatorAlphaLong() {
+ return mAlphaLong;
+ }
+
+ /**
+ * @return The short alpha tag associated with the current scan result (may be the operator
+ * name string or extended operator name string). May be null if unknown.
+ */
+ @Nullable
+ public CharSequence getOperatorAlphaShort() {
+ return mAlphaShort;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof CellIdentity)) {
+ return false;
+ }
+
+ CellIdentity o = (CellIdentity) other;
+ return TextUtils.equals(mAlphaLong, o.mAlphaLong)
+ && TextUtils.equals(mAlphaShort, o.mAlphaShort);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mAlphaLong, mAlphaShort, mMccStr, mMncStr, mType);
+ }
+
+ /**
* Used by child classes for parceling.
*
* @hide
@@ -147,6 +194,8 @@
dest.writeInt(type);
dest.writeString(mMccStr);
dest.writeString(mMncStr);
+ dest.writeString(mAlphaLong);
+ dest.writeString(mAlphaShort);
}
/**
@@ -154,7 +203,8 @@
* @hide
*/
protected CellIdentity(String tag, int type, Parcel source) {
- this(tag, type, source.readString(), source.readString());
+ this(tag, type, source.readString(), source.readString(),
+ source.readString(), source.readString());
}
/** Implement the Parcelable interface */
diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java
index 713ac00..58a2c45 100644
--- a/telephony/java/android/telephony/CellIdentityCdma.java
+++ b/telephony/java/android/telephony/CellIdentityCdma.java
@@ -49,23 +49,17 @@
* to +90 degrees).
*/
private final int mLatitude;
- // long alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaLong;
- // short alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaShort;
/**
* @hide
*/
public CellIdentityCdma() {
- super(TAG, TYPE_CDMA, null, null);
+ super(TAG, TYPE_CDMA, null, null, null, null);
mNetworkId = Integer.MAX_VALUE;
mSystemId = Integer.MAX_VALUE;
mBasestationId = Integer.MAX_VALUE;
mLongitude = Integer.MAX_VALUE;
mLatitude = Integer.MAX_VALUE;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
@@ -100,7 +94,7 @@
*/
public CellIdentityCdma(int nid, int sid, int bid, int lon, int lat, String alphal,
String alphas) {
- super(TAG, TYPE_CDMA, null, null);
+ super(TAG, TYPE_CDMA, null, null, alphal, alphas);
mNetworkId = nid;
mSystemId = sid;
mBasestationId = bid;
@@ -110,8 +104,6 @@
} else {
mLongitude = mLatitude = Integer.MAX_VALUE;
}
- mAlphaLong = alphal;
- mAlphaShort = alphas;
}
private CellIdentityCdma(CellIdentityCdma cid) {
@@ -178,28 +170,10 @@
return mLatitude;
}
- /**
- * @return The long alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaLong() {
- return mAlphaLong;
- }
-
- /**
- * @return The short alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaShort() {
- return mAlphaShort;
- }
-
@Override
public int hashCode() {
return Objects.hash(mNetworkId, mSystemId, mBasestationId, mLatitude, mLongitude,
- mAlphaLong, mAlphaShort);
+ super.hashCode());
}
@Override
@@ -219,8 +193,7 @@
&& mBasestationId == o.mBasestationId
&& mLatitude == o.mLatitude
&& mLongitude == o.mLongitude
- && TextUtils.equals(mAlphaLong, o.mAlphaLong)
- && TextUtils.equals(mAlphaShort, o.mAlphaShort);
+ && super.equals(other);
}
@Override
@@ -246,8 +219,6 @@
dest.writeInt(mBasestationId);
dest.writeInt(mLongitude);
dest.writeInt(mLatitude);
- dest.writeString(mAlphaLong);
- dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -258,8 +229,6 @@
mBasestationId = in.readInt();
mLongitude = in.readInt();
mLatitude = in.readInt();
- mAlphaLong = in.readString();
- mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java
index aae7929..c697880 100644
--- a/telephony/java/android/telephony/CellIdentityGsm.java
+++ b/telephony/java/android/telephony/CellIdentityGsm.java
@@ -37,22 +37,16 @@
private final int mArfcn;
// 6-bit Base Station Identity Code
private final int mBsic;
- // long alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaLong;
- // short alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaShort;
/**
* @hide
*/
public CellIdentityGsm() {
- super(TAG, TYPE_GSM, null, null);
+ super(TAG, TYPE_GSM, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mArfcn = Integer.MAX_VALUE;
mBsic = Integer.MAX_VALUE;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
* public constructor
@@ -98,16 +92,13 @@
*/
public CellIdentityGsm(int lac, int cid, int arfcn, int bsic, String mccStr,
String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_GSM, mccStr, mncStr);
+ super(TAG, TYPE_GSM, mccStr, mncStr, alphal, alphas);
mLac = lac;
mCid = cid;
mArfcn = arfcn;
// In RIL BSIC is a UINT8, so 0xFF is the 'INVALID' designator
// for inbound parcels
mBsic = (bsic == 0xFF) ? Integer.MAX_VALUE : bsic;
-
- mAlphaLong = alphal;
- mAlphaShort = alphas;
}
private CellIdentityGsm(CellIdentityGsm cid) {
@@ -188,24 +179,6 @@
return mMncStr;
}
- /**
- * @return The long alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaLong() {
- return mAlphaLong;
- }
-
- /**
- * @return The short alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaShort() {
- return mAlphaShort;
- }
-
/** @hide */
@Override
public int getChannelNumber() {
@@ -223,7 +196,7 @@
@Override
public int hashCode() {
- return Objects.hash(mMccStr, mMncStr, mLac, mCid, mAlphaLong, mAlphaShort);
+ return Objects.hash(mLac, mCid, super.hashCode());
}
@Override
@@ -243,8 +216,7 @@
&& mBsic == o.mBsic
&& TextUtils.equals(mMccStr, o.mMccStr)
&& TextUtils.equals(mMncStr, o.mMncStr)
- && TextUtils.equals(mAlphaLong, o.mAlphaLong)
- && TextUtils.equals(mAlphaShort, o.mAlphaShort);
+ && super.equals(other);
}
@Override
@@ -270,8 +242,6 @@
dest.writeInt(mCid);
dest.writeInt(mArfcn);
dest.writeInt(mBsic);
- dest.writeString(mAlphaLong);
- dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -281,8 +251,6 @@
mCid = in.readInt();
mArfcn = in.readInt();
mBsic = in.readInt();
- mAlphaLong = in.readString();
- mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java
index 9b3ef56..177fced 100644
--- a/telephony/java/android/telephony/CellIdentityLte.java
+++ b/telephony/java/android/telephony/CellIdentityLte.java
@@ -37,10 +37,6 @@
private final int mTac;
// 18-bit Absolute RF Channel Number
private final int mEarfcn;
- // long alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaLong;
- // short alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaShort;
// cell bandwidth, in kHz
private final int mBandwidth;
@@ -48,14 +44,12 @@
* @hide
*/
public CellIdentityLte() {
- super(TAG, TYPE_LTE, null, null);
+ super(TAG, TYPE_LTE, null, null, null, null);
mCi = Integer.MAX_VALUE;
mPci = Integer.MAX_VALUE;
mTac = Integer.MAX_VALUE;
mEarfcn = Integer.MAX_VALUE;
mBandwidth = Integer.MAX_VALUE;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
@@ -105,14 +99,12 @@
*/
public CellIdentityLte(int ci, int pci, int tac, int earfcn, int bandwidth, String mccStr,
String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_LTE, mccStr, mncStr);
+ super(TAG, TYPE_LTE, mccStr, mncStr, alphal, alphas);
mCi = ci;
mPci = pci;
mTac = tac;
mEarfcn = earfcn;
mBandwidth = bandwidth;
- mAlphaLong = alphal;
- mAlphaShort = alphas;
}
private CellIdentityLte(CellIdentityLte cid) {
@@ -198,24 +190,6 @@
return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
}
- /**
- * @return The long alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaLong() {
- return mAlphaLong;
- }
-
- /**
- * @return The short alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaShort() {
- return mAlphaShort;
- }
-
/** @hide */
@Override
public int getChannelNumber() {
@@ -224,7 +198,7 @@
@Override
public int hashCode() {
- return Objects.hash(mMccStr, mMncStr, mCi, mPci, mTac, mAlphaLong, mAlphaShort);
+ return Objects.hash(mCi, mPci, mTac, super.hashCode());
}
@Override
@@ -245,8 +219,7 @@
&& mBandwidth == o.mBandwidth
&& TextUtils.equals(mMccStr, o.mMccStr)
&& TextUtils.equals(mMncStr, o.mMncStr)
- && TextUtils.equals(mAlphaLong, o.mAlphaLong)
- && TextUtils.equals(mAlphaShort, o.mAlphaShort);
+ && super.equals(other);
}
@Override
@@ -274,8 +247,6 @@
dest.writeInt(mTac);
dest.writeInt(mEarfcn);
dest.writeInt(mBandwidth);
- dest.writeString(mAlphaLong);
- dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -286,8 +257,6 @@
mTac = in.readInt();
mEarfcn = in.readInt();
mBandwidth = in.readInt();
- mAlphaLong = in.readString();
- mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java
index 7475c74..18ab6d4 100644
--- a/telephony/java/android/telephony/CellIdentityTdscdma.java
+++ b/telephony/java/android/telephony/CellIdentityTdscdma.java
@@ -35,21 +35,15 @@
private final int mCid;
// 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown.
private final int mCpid;
- // long alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaLong;
- // short alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaShort;
/**
* @hide
*/
public CellIdentityTdscdma() {
- super(TAG, TYPE_TDSCDMA, null, null);
+ super(TAG, TYPE_TDSCDMA, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mCpid = Integer.MAX_VALUE;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
@@ -76,12 +70,10 @@
* @hide
*/
public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid) {
- super(TAG, TYPE_TDSCDMA, mcc, mnc);
+ super(TAG, TYPE_TDSCDMA, mcc, mnc, null, null);
mLac = lac;
mCid = cid;
mCpid = cpid;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
@@ -97,12 +89,10 @@
*/
public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid,
String alphal, String alphas) {
- super(TAG, TYPE_TDSCDMA, mcc, mnc);
+ super(TAG, TYPE_TDSCDMA, mcc, mnc, alphal, alphas);
mLac = lac;
mCid = cid;
mCpid = cpid;
- mAlphaLong = alphal;
- mAlphaShort = alphas;
}
private CellIdentityTdscdma(CellIdentityTdscdma cid) {
@@ -151,31 +141,9 @@
return mCpid;
}
- /**
- * @return The long alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- *
- * @hide
- */
- @Nullable
- public CharSequence getOperatorAlphaLong() {
- return mAlphaLong;
- }
-
- /**
- * @return The short alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- *
- * @hide
- */
- @Nullable
- public CharSequence getOperatorAlphaShort() {
- return mAlphaShort;
- }
-
@Override
public int hashCode() {
- return Objects.hash(mMccStr, mMncStr, mLac, mCid, mCpid, mAlphaLong, mAlphaShort);
+ return Objects.hash(mLac, mCid, mCpid, super.hashCode());
}
@Override
@@ -194,8 +162,7 @@
&& mLac == o.mLac
&& mCid == o.mCid
&& mCpid == o.mCpid
- && mAlphaLong == o.mAlphaLong
- && mAlphaShort == o.mAlphaShort;
+ && super.equals(other);
}
@Override
@@ -219,8 +186,6 @@
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mCpid);
- dest.writeString(mAlphaLong);
- dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -229,8 +194,6 @@
mLac = in.readInt();
mCid = in.readInt();
mCpid = in.readInt();
- mAlphaLong = in.readString();
- mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java
index 52fa54f..984483e 100644
--- a/telephony/java/android/telephony/CellIdentityWcdma.java
+++ b/telephony/java/android/telephony/CellIdentityWcdma.java
@@ -37,22 +37,16 @@
private final int mPsc;
// 16-bit UMTS Absolute RF Channel Number
private final int mUarfcn;
- // long alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaLong;
- // short alpha Operator Name String or Enhanced Operator Name String
- private final String mAlphaShort;
/**
* @hide
*/
public CellIdentityWcdma() {
- super(TAG, TYPE_TDSCDMA, null, null);
+ super(TAG, TYPE_TDSCDMA, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mPsc = Integer.MAX_VALUE;
mUarfcn = Integer.MAX_VALUE;
- mAlphaLong = null;
- mAlphaShort = null;
}
/**
* public constructor
@@ -99,13 +93,11 @@
*/
public CellIdentityWcdma (int lac, int cid, int psc, int uarfcn,
String mccStr, String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_WCDMA, mccStr, mncStr);
+ super(TAG, TYPE_WCDMA, mccStr, mncStr, alphal, alphas);
mLac = lac;
mCid = cid;
mPsc = psc;
mUarfcn = uarfcn;
- mAlphaLong = alphal;
- mAlphaShort = alphas;
}
private CellIdentityWcdma(CellIdentityWcdma cid) {
@@ -179,27 +171,9 @@
return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
}
- /**
- * @return The long alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaLong() {
- return mAlphaLong;
- }
-
- /**
- * @return The short alpha tag associated with the current scan result (may be the operator
- * name string or extended operator name string). May be null if unknown.
- */
- @Nullable
- public CharSequence getOperatorAlphaShort() {
- return mAlphaShort;
- }
-
@Override
public int hashCode() {
- return Objects.hash(mMccStr, mMncStr, mLac, mCid, mPsc, mAlphaLong, mAlphaShort);
+ return Objects.hash(mLac, mCid, mPsc, super.hashCode());
}
/**
@@ -232,8 +206,7 @@
&& mUarfcn == o.mUarfcn
&& TextUtils.equals(mMccStr, o.mMccStr)
&& TextUtils.equals(mMncStr, o.mMncStr)
- && TextUtils.equals(mAlphaLong, o.mAlphaLong)
- && TextUtils.equals(mAlphaShort, o.mAlphaShort);
+ && super.equals(other);
}
@Override
@@ -259,8 +232,6 @@
dest.writeInt(mCid);
dest.writeInt(mPsc);
dest.writeInt(mUarfcn);
- dest.writeString(mAlphaLong);
- dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -270,8 +241,6 @@
mCid = in.readInt();
mPsc = in.readInt();
mUarfcn = in.readInt();
- mAlphaLong = in.readString();
- mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java
index 6480aab..6db8e82 100644
--- a/telephony/java/android/telephony/LocationAccessPolicy.java
+++ b/telephony/java/android/telephony/LocationAccessPolicy.java
@@ -40,17 +40,19 @@
*/
public final class LocationAccessPolicy {
private static final String LOG_TAG = LocationAccessPolicy.class.getSimpleName();
+
/**
* API to determine if the caller has permissions to get cell location.
*
* @param pkgName Package name of the application requesting access
* @param uid The uid of the package
* @param pid The pid of the package
+ * @param throwOnDeniedPermission Whether to throw if the location permission is denied.
* @return boolean true or false if permissions is granted
*/
public static boolean canAccessCellLocation(@NonNull Context context, @NonNull String pkgName,
- int uid, int pid) throws SecurityException {
- Trace.beginSection("TelephonyLocationCheck");
+ int uid, int pid, boolean throwOnDeniedPermission) throws SecurityException {
+ Trace.beginSection("TelephonyLohcationCheck");
try {
// Always allow the phone process to access location. This avoid breaking legacy code
// that rely on public-facing APIs to access cell location, and it doesn't create a
@@ -65,9 +67,11 @@
// where a legacy app the user is not using tracks their location.
// Granting ACCESS_FINE_LOCATION to an app automatically grants it
// ACCESS_COARSE_LOCATION.
-
- if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, pid, uid) ==
- PackageManager.PERMISSION_DENIED) {
+ if (throwOnDeniedPermission) {
+ context.enforcePermission(Manifest.permission.ACCESS_COARSE_LOCATION,
+ pid, uid, "canAccessCellLocation");
+ } else if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION,
+ pid, uid) == PackageManager.PERMISSION_DENIED) {
return false;
}
final int opCode = AppOpsManager.permissionToOpCode(
diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java
index 9dc07c1..38a6593 100644
--- a/telephony/java/android/telephony/MbmsDownloadSession.java
+++ b/telephony/java/android/telephony/MbmsDownloadSession.java
@@ -16,6 +16,8 @@
package android.telephony;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -32,14 +34,14 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.mbms.DownloadProgressListener;
+import android.telephony.mbms.DownloadRequest;
import android.telephony.mbms.DownloadStatusListener;
import android.telephony.mbms.FileInfo;
-import android.telephony.mbms.DownloadRequest;
import android.telephony.mbms.InternalDownloadProgressListener;
import android.telephony.mbms.InternalDownloadSessionCallback;
import android.telephony.mbms.InternalDownloadStatusListener;
-import android.telephony.mbms.MbmsDownloadSessionCallback;
import android.telephony.mbms.MbmsDownloadReceiver;
+import android.telephony.mbms.MbmsDownloadSessionCallback;
import android.telephony.mbms.MbmsErrors;
import android.telephony.mbms.MbmsTempFileProvider;
import android.telephony.mbms.MbmsUtils;
@@ -58,8 +60,6 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
/**
* This class provides functionality for file download over MBMS.
*/
@@ -337,6 +337,12 @@
sIsInitialized.set(false);
return;
}
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an"
+ + " unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
@@ -388,6 +394,11 @@
}
try {
int returnCode = downloadService.requestUpdateFileServices(mSubscriptionId, classList);
+ if (returnCode == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (returnCode != MbmsErrors.SUCCESS) {
sendErrorToApp(returnCode, null);
}
@@ -443,6 +454,11 @@
try {
int result = downloadService.setTempFileRootDirectory(mSubscriptionId, filePath);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, null);
return;
@@ -514,11 +530,13 @@
*
* Asynchronous errors through the callback may include any error not specific to the
* streaming use-case.
+ *
+ * If no error is delivered via the callback after calling this method, that means that the
+ * middleware has successfully started the download or scheduled the download, if the download
+ * is at a future time.
* @param request The request that specifies what should be downloaded.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int download(@NonNull DownloadRequest request) {
+ public void download(@NonNull DownloadRequest request) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
throw new IllegalStateException("Middleware not yet bound");
@@ -540,12 +558,19 @@
int result = downloadService.download(request);
if (result == MbmsErrors.SUCCESS) {
writeDownloadRequestToken(request);
+ } else {
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown"
+ + " error code");
+ }
+ sendErrorToApp(result, null);
}
- return result;
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
}
}
@@ -581,14 +606,15 @@
* If the middleware is not aware of the specified download request,
* this method will throw an {@link IllegalArgumentException}.
*
+ * If the operation encountered an error, the error code will be delivered via
+ * {@link MbmsDownloadSessionCallback#onError}.
+ *
* @param request The {@link DownloadRequest} that you want updates on.
* @param executor The {@link Executor} on which calls to {@code listener } should be executed.
* @param listener The listener that should be called when the middleware has information to
* share on the status download.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int addStatusListener(@NonNull DownloadRequest request,
+ public void addStatusListener(@NonNull DownloadRequest request,
@NonNull Executor executor, @NonNull DownloadStatusListener listener) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
@@ -600,20 +626,25 @@
try {
int result = downloadService.addStatusListener(request, internalListener);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
}
- return result;
+ sendErrorToApp(result, null);
+ return;
}
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
}
mInternalDownloadStatusListeners.put(listener, internalListener);
- return MbmsErrors.SUCCESS;
-
}
/**
@@ -625,12 +656,13 @@
* If the middleware is not aware of the specified download request,
* this method will throw an {@link IllegalArgumentException}.
*
+ * If the operation encountered an error, the error code will be delivered via
+ * {@link MbmsDownloadSessionCallback#onError}.
+ *
* @param request The {@link DownloadRequest} provided during registration
* @param listener The listener provided during registration.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int removeStatusListener(@NonNull DownloadRequest request,
+ public void removeStatusListener(@NonNull DownloadRequest request,
@NonNull DownloadStatusListener listener) {
try {
IMbmsDownloadService downloadService = mService.get();
@@ -646,16 +678,24 @@
try {
int result = downloadService.removeStatusListener(request, internalListener);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an"
+ + " unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
}
- return result;
+ sendErrorToApp(result, null);
+ return;
}
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
}
} finally {
InternalDownloadStatusListener internalCallback =
@@ -664,7 +704,6 @@
internalCallback.stop();
}
}
- return MbmsErrors.SUCCESS;
}
/**
@@ -676,14 +715,15 @@
* If the middleware is not aware of the specified download request,
* this method will throw an {@link IllegalArgumentException}.
*
+ * If the operation encountered an error, the error code will be delivered via
+ * {@link MbmsDownloadSessionCallback#onError}.
+ *
* @param request The {@link DownloadRequest} that you want updates on.
* @param executor The {@link Executor} on which calls to {@code listener} should be executed.
* @param listener The listener that should be called when the middleware has information to
* share on the progress of the download.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int addProgressListener(@NonNull DownloadRequest request,
+ public void addProgressListener(@NonNull DownloadRequest request,
@NonNull Executor executor, @NonNull DownloadProgressListener listener) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
@@ -695,19 +735,25 @@
try {
int result = downloadService.addProgressListener(request, internalListener);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
}
- return result;
+ sendErrorToApp(result, null);
+ return;
}
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
}
mInternalDownloadProgressListeners.put(listener, internalListener);
- return MbmsErrors.SUCCESS;
}
/**
@@ -719,12 +765,13 @@
* If the middleware is not aware of the specified download request,
* this method will throw an {@link IllegalArgumentException}.
*
+ * If the operation encountered an error, the error code will be delivered via
+ * {@link MbmsDownloadSessionCallback#onError}.
+ *
* @param request The {@link DownloadRequest} provided during registration
* @param listener The listener provided during registration.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int removeProgressListener(@NonNull DownloadRequest request,
+ public void removeProgressListener(@NonNull DownloadRequest request,
@NonNull DownloadProgressListener listener) {
try {
IMbmsDownloadService downloadService = mService.get();
@@ -740,16 +787,24 @@
try {
int result = downloadService.removeProgressListener(request, internalListener);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not"
+ + " return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
}
- return result;
+ sendErrorToApp(result, null);
+ return;
}
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
+ return;
}
} finally {
InternalDownloadProgressListener internalCallback =
@@ -758,20 +813,17 @@
internalCallback.stop();
}
}
- return MbmsErrors.SUCCESS;
}
/**
* Attempts to cancel the specified {@link DownloadRequest}.
*
- * If the middleware is not aware of the specified download request,
- * this method will throw an {@link IllegalArgumentException}.
+ * If the operation encountered an error, the error code will be delivered via
+ * {@link MbmsDownloadSessionCallback#onError}.
*
* @param downloadRequest The download request that you wish to cancel.
- * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
- * and some other error code otherwise.
*/
- public int cancelDownload(@NonNull DownloadRequest downloadRequest) {
+ public void cancelDownload(@NonNull DownloadRequest downloadRequest) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
throw new IllegalStateException("Middleware not yet bound");
@@ -779,18 +831,20 @@
try {
int result = downloadService.cancelDownload(downloadRequest);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
- if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
- throw new IllegalArgumentException("Unknown download request.");
- }
+ sendErrorToApp(result, null);
} else {
deleteDownloadRequestToken(downloadRequest);
}
- return result;
} catch (RemoteException e) {
mService.set(null);
sIsInitialized.set(false);
- return MbmsErrors.ERROR_MIDDLEWARE_LOST;
+ sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null);
}
}
@@ -818,6 +872,11 @@
try {
int result = downloadService.requestDownloadState(downloadRequest, fileInfo);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
@@ -862,6 +921,11 @@
try {
int result = downloadService.resetDownloadKnowledge(downloadRequest);
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");
@@ -920,11 +984,11 @@
try {
if (!token.createNewFile()) {
throw new RuntimeException("Failed to create download token for request "
- + request);
+ + request + ". Token location is " + token.getPath());
}
} catch (IOException e) {
throw new RuntimeException("Failed to create download token for request " + request
- + " due to IOException " + e);
+ + " due to IOException " + e + ". Attempted to write to " + token.getPath());
}
}
@@ -978,10 +1042,6 @@
}
private void sendErrorToApp(int errorCode, String message) {
- try {
- mInternalCallback.onError(errorCode, message);
- } catch (RemoteException e) {
- // Ignore, should not happen locally.
- }
+ mInternalCallback.onError(errorCode, message);
}
}
diff --git a/telephony/java/android/telephony/MbmsStreamingSession.java b/telephony/java/android/telephony/MbmsStreamingSession.java
index 42c760d4..cd465d2 100644
--- a/telephony/java/android/telephony/MbmsStreamingSession.java
+++ b/telephony/java/android/telephony/MbmsStreamingSession.java
@@ -16,6 +16,8 @@
package android.telephony;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
@@ -26,8 +28,8 @@
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
-import android.telephony.mbms.InternalStreamingSessionCallback;
import android.telephony.mbms.InternalStreamingServiceCallback;
+import android.telephony.mbms.InternalStreamingSessionCallback;
import android.telephony.mbms.MbmsErrors;
import android.telephony.mbms.MbmsStreamingSessionCallback;
import android.telephony.mbms.MbmsUtils;
@@ -44,8 +46,6 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
/**
* This class provides functionality for streaming media over MBMS.
*/
@@ -208,6 +208,11 @@
try {
int returnCode = streamingService.requestUpdateStreamingServices(
mSubscriptionId, serviceClassList);
+ if (returnCode == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (returnCode != MbmsErrors.SUCCESS) {
sendErrorToApp(returnCode, null);
}
@@ -255,6 +260,11 @@
try {
int returnCode = streamingService.startStreaming(
mSubscriptionId, serviceInfo.getServiceId(), serviceCallback);
+ if (returnCode == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return an unknown error code");
+ }
if (returnCode != MbmsErrors.SUCCESS) {
sendErrorToApp(returnCode, null);
return null;
@@ -301,6 +311,12 @@
sIsInitialized.set(false);
return;
}
+ if (result == MbmsErrors.UNKNOWN) {
+ // Unbind and throw an obvious error
+ close();
+ throw new IllegalStateException("Middleware must not return"
+ + " an unknown error code");
+ }
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
diff --git a/telephony/java/android/telephony/NetworkServiceCallback.java b/telephony/java/android/telephony/NetworkServiceCallback.java
index 92ebf36..dbad02f 100644
--- a/telephony/java/android/telephony/NetworkServiceCallback.java
+++ b/telephony/java/android/telephony/NetworkServiceCallback.java
@@ -83,6 +83,8 @@
} catch (RemoteException e) {
Rlog.e(mTag, "Failed to onGetNetworkRegistrationStateComplete on the remote");
}
+ } else {
+ Rlog.e(mTag, "Weak reference of callback is null.");
}
}
}
\ No newline at end of file
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 77413d9c..936505c 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -335,7 +335,7 @@
return this.mCountryIso;
}
- /** @return whether the subscription is an embedded one. */
+ /** @return whether the subscription is an eUICC one. */
public boolean isEmbedded() {
return this.mIsEmbedded;
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 472a6fb..754fe68 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -505,7 +505,7 @@
public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
private final Context mContext;
- private INetworkPolicyManager mNetworkPolicy;
+ private volatile INetworkPolicyManager mNetworkPolicy;
/**
* A listener class for monitoring changes to {@link SubscriptionInfo} records.
@@ -1794,7 +1794,7 @@
@DurationMillisLong long timeoutMillis) {
try {
final int overrideValue = overrideUnmetered ? OVERRIDE_UNMETERED : 0;
- mNetworkPolicy.setSubscriptionOverride(subId, OVERRIDE_UNMETERED, overrideValue,
+ getNetworkPolicy().setSubscriptionOverride(subId, OVERRIDE_UNMETERED, overrideValue,
timeoutMillis, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1828,7 +1828,7 @@
@DurationMillisLong long timeoutMillis) {
try {
final int overrideValue = overrideCongested ? OVERRIDE_CONGESTED : 0;
- mNetworkPolicy.setSubscriptionOverride(subId, OVERRIDE_CONGESTED, overrideValue,
+ getNetworkPolicy().setSubscriptionOverride(subId, OVERRIDE_CONGESTED, overrideValue,
timeoutMillis, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1925,26 +1925,28 @@
*
* @param info The subscription to check.
* @return whether the app is authorized to manage this subscription per its metadata.
- * @throws UnsupportedOperationException if this subscription is not embedded.
+ * @throws IllegalArgumentException if this subscription is not embedded.
*/
public boolean canManageSubscription(SubscriptionInfo info) {
return canManageSubscription(info, mContext.getPackageName());
}
/**
- * Checks whether the given app is authorized to manage the given subscription according to its
- * metadata. Only supported for embedded subscriptions (if {@code SubscriptionInfo#isEmbedded}
+ * Checks whether the given app is authorized to manage the given subscription. An app can only
+ * be authorized if it is included in the {@link android.telephony.UiccAccessRule} of the
+ * {@link android.telephony.SubscriptionInfo} with the access status.
+ * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded}
* returns true).
*
* @param info The subscription to check.
* @param packageName Package name of the app to check.
- * @return whether the app is authorized to manage this subscription per its metadata.
- * @throws UnsupportedOperationException if this subscription is not embedded.
+ * @return whether the app is authorized to manage this subscription per its access rules.
+ * @throws IllegalArgumentException if this subscription is not embedded.
* @hide
*/
public boolean canManageSubscription(SubscriptionInfo info, String packageName) {
if (!info.isEmbedded()) {
- throw new UnsupportedOperationException("Not an embedded subscription");
+ throw new IllegalArgumentException("Not an embedded subscription");
}
if (info.getAccessRules() == null) {
return false;
diff --git a/telephony/java/android/telephony/SubscriptionPlan.java b/telephony/java/android/telephony/SubscriptionPlan.java
index 9411652..4ffb70b 100644
--- a/telephony/java/android/telephony/SubscriptionPlan.java
+++ b/telephony/java/android/telephony/SubscriptionPlan.java
@@ -34,6 +34,7 @@
import java.time.Period;
import java.time.ZonedDateTime;
import java.util.Iterator;
+import java.util.Objects;
/**
* Description of a billing relationship plan between a carrier and a specific
@@ -124,6 +125,27 @@
.append("}").toString();
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(cycleRule, title, summary, dataLimitBytes, dataLimitBehavior,
+ dataUsageBytes, dataUsageTime);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof SubscriptionPlan) {
+ final SubscriptionPlan other = (SubscriptionPlan) obj;
+ return Objects.equals(cycleRule, other.cycleRule)
+ && Objects.equals(title, other.title)
+ && Objects.equals(summary, other.summary)
+ && dataLimitBytes == other.dataLimitBytes
+ && dataLimitBehavior == other.dataLimitBehavior
+ && dataUsageBytes == other.dataUsageBytes
+ && dataUsageTime == other.dataUsageTime;
+ }
+ return false;
+ }
+
public static final Parcelable.Creator<SubscriptionPlan> CREATOR = new Parcelable.Creator<SubscriptionPlan>() {
@Override
public SubscriptionPlan createFromParcel(Parcel source) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a12a7a0..e15d35b 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -27,6 +27,7 @@
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.WorkerThread;
import android.app.ActivityThread;
import android.app.PendingIntent;
@@ -1067,6 +1068,13 @@
public static final int UNKNOWN_CARRIER_ID = -1;
/**
+ * An unknown carrier id list version.
+ * @hide
+ */
+ @TestApi
+ public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1;
+
+ /**
* Broadcast Action: The subscription carrier identity has changed.
* This intent could be sent on the following events:
* <ul>
@@ -6349,34 +6357,39 @@
*
* @param enable Whether to enable mobile data.
*
- * @deprecated use {@link #setUserMobileDataEnabled(boolean)} instead.
*/
- @Deprecated
@SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void setDataEnabled(boolean enable) {
- setUserMobileDataEnabled(enable);
+ setDataEnabled(getSubId(SubscriptionManager.getDefaultDataSubscriptionId()), enable);
}
/**
* @hide
- * @deprecated use {@link #setUserMobileDataEnabled(boolean)} instead.
+ * @deprecated use {@link #setDataEnabled(boolean)} instead.
*/
@SystemApi
@Deprecated
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void setDataEnabled(int subId, boolean enable) {
- setUserMobileDataEnabled(subId, enable);
+ try {
+ Log.d(TAG, "setDataEnabled: enabled=" + enable);
+ ITelephony telephony = getITelephony();
+ if (telephony != null)
+ telephony.setUserDataEnabled(subId, enable);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#setUserDataEnabled", e);
+ }
}
/**
- * @deprecated use {@link #isUserMobileDataEnabled()} instead.
+ * @deprecated use {@link #isDataEnabled()} instead.
* @hide
*/
@SystemApi
@Deprecated
public boolean getDataEnabled() {
- return isUserMobileDataEnabled();
+ return isDataEnabled();
}
/**
@@ -6396,22 +6409,28 @@
* {@link ConnectivityManager#getRestrictBackgroundStatus}.
*
* @return true if mobile data is enabled.
- *
- * @deprecated use {@link #isUserMobileDataEnabled()} instead.
*/
- @Deprecated
public boolean isDataEnabled() {
- return isUserMobileDataEnabled();
+ return getDataEnabled(getSubId(SubscriptionManager.getDefaultDataSubscriptionId()));
}
/**
- * @deprecated use {@link #isUserMobileDataEnabled()} instead.
+ * @deprecated use {@link #isDataEnabled()} instead.
* @hide
*/
@Deprecated
@SystemApi
public boolean getDataEnabled(int subId) {
- return isUserMobileDataEnabled(subId);
+ boolean retVal = false;
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null)
+ retVal = telephony.isUserDataEnabled(subId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#isUserDataEnabled", e);
+ } catch (NullPointerException e) {
+ }
+ return retVal;
}
/** @hide */
@@ -7684,56 +7703,12 @@
}
/**
- * Turns mobile data on or off.
- * If the {@link TelephonyManager} object has been created with
- * {@link #createForSubscriptionId}, this API applies to the given subId.
- * Otherwise, it applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
- * app has carrier privileges (see {@link #hasCarrierPrivileges}.
- *
- * @param enable Whether to enable mobile data.
- */
- @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public void setUserMobileDataEnabled(boolean enable) {
- setUserMobileDataEnabled(
- getSubId(SubscriptionManager.getDefaultDataSubscriptionId()), enable);
- }
-
- /**
- * Returns whether mobile data is enabled or not per user setting. There are other factors
- * that could disable mobile data, but they are not considered here.
- *
- * If this object has been created with {@link #createForSubscriptionId}, applies to the given
- * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
- *
- * <p>Requires one of the following permissions:
- * {@link android.Manifest.permission#ACCESS_NETWORK_STATE ACCESS_NETWORK_STATE},
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}, or that the
- * calling app has carrier privileges (see {@link #hasCarrierPrivileges}.
- *
- * <p>Note that this does not take into account any data restrictions that may be present on the
- * calling app. Such restrictions may be inspected with
- * {@link ConnectivityManager#getRestrictBackgroundStatus}.
- *
- * @return true if mobile data is enabled.
- */
- @RequiresPermission(anyOf = {
- android.Manifest.permission.ACCESS_NETWORK_STATE,
- android.Manifest.permission.MODIFY_PHONE_STATE
- })
- public boolean isUserMobileDataEnabled() {
- return isUserMobileDataEnabled(
- getSubId(SubscriptionManager.getDefaultDataSubscriptionId()));
- }
-
- /**
* @hide
- * Unlike isUserMobileDataEnabled, this API also evaluates carrierDataEnabled,
- * policyDataEnabled etc to give a final decision.
+ * It's similar to isDataEnabled, but unlike isDataEnabled, this API also evaluates
+ * carrierDataEnabled, policyDataEnabled etc to give a final decision of whether mobile data is
+ * capable of using.
*/
- public boolean isMobileDataEnabled() {
+ public boolean isDataCapable() {
boolean retVal = false;
try {
int subId = getSubId(SubscriptionManager.getDefaultDataSubscriptionId());
@@ -7748,35 +7723,6 @@
}
/**
- * Utility class of {@link #isUserMobileDataEnabled()};
- */
- private boolean isUserMobileDataEnabled(int subId) {
- boolean retVal = false;
- try {
- ITelephony telephony = getITelephony();
- if (telephony != null)
- retVal = telephony.isUserDataEnabled(subId);
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling ITelephony#isUserDataEnabled", e);
- } catch (NullPointerException e) {
- }
- return retVal;
- }
-
- /** Utility method of {@link #setUserMobileDataEnabled(boolean)} */
- @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- private void setUserMobileDataEnabled(int subId, boolean enable) {
- try {
- Log.d(TAG, "setUserMobileDataEnabled: enabled=" + enable);
- ITelephony telephony = getITelephony();
- if (telephony != null)
- telephony.setUserDataEnabled(subId, enable);
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling ITelephony#setUserDataEnabled", e);
- }
- }
-
- /**
* In this mode, modem will not send specified indications when screen is off.
* @hide
*/
@@ -7814,11 +7760,25 @@
*/
public static final int INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED = 0x4;
+ /**
+ * The indication for link capacity estimate update.
+ * @hide
+ */
+ public static final int INDICATION_FILTER_LINK_CAPACITY_ESTIMATE = 0x8;
+
+ /**
+ * The indication for physical channel config update.
+ * @hide
+ */
+ public static final int INDICATION_FILTER_PHYSICAL_CHANNEL_CONFIG = 0x10;
+
/** @hide */
@IntDef(flag = true, prefix = { "INDICATION_FILTER_" }, value = {
INDICATION_FILTER_SIGNAL_STRENGTH,
INDICATION_FILTER_FULL_NETWORK_STATE,
- INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED
+ INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED,
+ INDICATION_FILTER_LINK_CAPACITY_ESTIMATE,
+ INDICATION_FILTER_PHYSICAL_CHANNEL_CONFIG
})
@Retention(RetentionPolicy.SOURCE)
public @interface IndicationFilters{}
@@ -7856,4 +7816,49 @@
}
}
}
+
+ /**
+ * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2,
+ * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config
+ * (also any country or carrier overlays) to be loaded when using a test SIM with a call box.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ *
+ * @hide
+ */
+ @TestApi
+ public void setCarrierTestOverride(String mccmnc, String imsi, String iccid, String gid1,
+ String gid2, String plmn, String spn) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ telephony.setCarrierTestOverride(
+ getSubId(), mccmnc, imsi, iccid, gid1, gid2, plmn, spn);
+ }
+ } catch (RemoteException ex) {
+ // This could happen if binder process crashes.
+ }
+ }
+
+ /**
+ * A test API to return installed carrier id list version
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
+ *
+ * @hide
+ */
+ @TestApi
+ public int getCarrierIdListVersion() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getCarrierIdListVersion(getSubId());
+ }
+ } catch (RemoteException ex) {
+ // This could happen if binder process crashes.
+ }
+ return UNKNOWN_CARRIER_ID_LIST_VERSION;
+ }
}
diff --git a/telephony/java/android/telephony/euicc/DownloadableSubscription.java b/telephony/java/android/telephony/euicc/DownloadableSubscription.java
index 88db22b..edf3b08 100644
--- a/telephony/java/android/telephony/euicc/DownloadableSubscription.java
+++ b/telephony/java/android/telephony/euicc/DownloadableSubscription.java
@@ -17,6 +17,7 @@
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.app.PendingIntent;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.UiccAccessRule;
@@ -26,7 +27,14 @@
import com.android.internal.util.Preconditions;
-/** Information about a subscription which is available for download. */
+/**
+ * Information about a subscription which is downloadable to an eUICC using
+ * {@link EuiccManager#downloadSubscription(DownloadableSubscription, boolean, PendingIntent).
+ *
+ * <p>For example, a DownloadableSubscription can be created through an activation code parsed from
+ * a QR code. A server address can be parsed from the activation code to download more information
+ * about the profile, such as carrier name, access rules, etc.
+ */
public final class DownloadableSubscription implements Parcelable {
public static final Creator<DownloadableSubscription> CREATOR =
@@ -136,7 +144,15 @@
/**
* Create a DownloadableSubscription for the given activation code.
*
- * @param encodedActivationCode the activation code to use. Must not be null.
+ * <p>This fills the encodedActivationCode field. Other fields like confirmationCode,
+ * carrierName and accessRules may be filled in the implementation of
+ * {@code android.service.euicc.EuiccService} if exists.
+ *
+ * @param encodedActivationCode the activation code to use. An activation code can be parsed
+ * from a user scanned QR code. The format of activation code is defined in SGP.22. For
+ * example, "1$SMDP.GSMA.COM$04386-AGYFT-A74Y8-3F815$1.3.6.1.4.1.31746". For detail, see
+ * {@code com.android.euicc.data.ActivationCode}. Must not be null.
+ *
* @return the {@link DownloadableSubscription} which may be passed to
* {@link EuiccManager#downloadSubscription}.
*/
@@ -157,6 +173,9 @@
/**
* Returns the confirmation code.
+ *
+ * <p>As an example, the confirmation code can be input by the user through a carrier app or the
+ * UI component of the eUICC local profile assistant (LPA) application.
*/
@Nullable
public String getConfirmationCode() {
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index dff1c6f..b732d4d 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -142,11 +142,9 @@
"android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DETAILED_CODE";
/**
- * Key for an extra set on {@link #getDownloadableSubscriptionMetadata} PendingIntent result
+ * Key for an extra set on {@code #getDownloadableSubscriptionMetadata} PendingIntent result
* callbacks providing the downloadable subscription metadata.
- * @hide
*/
- @SystemApi
public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION =
"android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION";
diff --git a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java
index 6d72181..2831127 100644
--- a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java
+++ b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java
@@ -29,27 +29,47 @@
public final class ImsCallForwardInfo implements Parcelable {
// Refer to ImsUtInterface#CDIV_CF_XXX
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public int mCondition;
// 0: disabled, 1: enabled
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public int mStatus;
// 0x91: International, 0x81: Unknown
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public int mToA;
// Service class
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public int mServiceClass;
// Number (it will not include the "sip" or "tel" URI scheme)
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public String mNumber;
// No reply timer for CF
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter.
public int mTimeSeconds;
/** @hide */
+ // TODO: Will be removed in the future, use public constructor instead.
public ImsCallForwardInfo() {
}
+ /**
+ * IMS Call Forward Information.
+ */
+ public ImsCallForwardInfo(int condition, int status, int toA, int serviceClass, String number,
+ int replyTimerSec) {
+ mCondition = condition;
+ mStatus = status;
+ mToA = toA;
+ mServiceClass = serviceClass;
+ mNumber = number;
+ mTimeSeconds = replyTimerSec;
+ }
+
/** @hide */
public ImsCallForwardInfo(Parcel in) {
readFromParcel(in);
diff --git a/telephony/java/android/telephony/ims/ImsSsData.java b/telephony/java/android/telephony/ims/ImsSsData.java
index 1ddf199..49ead77 100644
--- a/telephony/java/android/telephony/ims/ImsSsData.java
+++ b/telephony/java/android/telephony/ims/ImsSsData.java
@@ -15,19 +15,24 @@
*/
package android.telephony.ims;
+import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
- * Provided STK Call Control Suplementary Service information
+ * Provides STK Call Control Supplementary Service information.
*
* {@hide}
*/
@SystemApi
public final class ImsSsData implements Parcelable {
- //ServiceType
+ // Supplementary Service Type
+ // Call Forwarding
public static final int SS_CFU = 0;
public static final int SS_CF_BUSY = 1;
public static final int SS_CF_NO_REPLY = 2;
@@ -35,12 +40,16 @@
public static final int SS_CF_ALL = 4;
public static final int SS_CF_ALL_CONDITIONAL = 5;
public static final int SS_CFUT = 6;
+ // Called Line Presentation
public static final int SS_CLIP = 7;
public static final int SS_CLIR = 8;
public static final int SS_COLP = 9;
public static final int SS_COLR = 10;
+ // Calling Name Presentation
public static final int SS_CNAP = 11;
+ // Call Waiting
public static final int SS_WAIT = 12;
+ // Call Barring
public static final int SS_BAOC = 13;
public static final int SS_BAOIC = 14;
public static final int SS_BAOIC_EXC_HOME = 15;
@@ -52,14 +61,14 @@
public static final int SS_INCOMING_BARRING_DN = 21;
public static final int SS_INCOMING_BARRING_ANONYMOUS = 22;
- //SSRequestType
+ //Supplementary Service Request Types
public static final int SS_ACTIVATION = 0;
public static final int SS_DEACTIVATION = 1;
public static final int SS_INTERROGATION = 2;
public static final int SS_REGISTRATION = 3;
public static final int SS_ERASURE = 4;
- //TeleserviceType
+ // Supplementary Service Teleservice Type
public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0;
public static final int SS_ALL_TELESEVICES = 1;
public static final int SS_TELEPHONY = 2;
@@ -67,40 +76,226 @@
public static final int SS_SMS_SERVICES = 4;
public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5;
- // Refer to ServiceType
+ // Service Class of Supplementary Service
+ // See 27.007 +CCFC or +CLCK
/** @hide */
+ public static final int SERVICE_CLASS_NONE = 0; // no user input
+ /** @hide */
+ public static final int SERVICE_CLASS_VOICE = 1;
+ /** @hide */
+ public static final int SERVICE_CLASS_DATA = (1 << 1);
+ /** @hide */
+ public static final int SERVICE_CLASS_FAX = (1 << 2);
+ /** @hide */
+ public static final int SERVICE_CLASS_SMS = (1 << 3);
+ /** @hide */
+ public static final int SERVICE_CLASS_DATA_SYNC = (1 << 4);
+ /** @hide */
+ public static final int SERVICE_CLASS_DATA_ASYNC = (1 << 5);
+ /** @hide */
+ public static final int SERVICE_CLASS_PACKET = (1 << 6);
+ /** @hide */
+ public static final int SERVICE_CLASS_PAD = (1 << 7);
+
+ /**
+ * Result code used if the operation was successful. See {@link #result}.
+ * @hide
+ */
+ public static final int RESULT_SUCCESS = 0;
+
+ /** @hide */
+ @IntDef(flag = true, prefix = { "SS_" }, value = {
+ SS_CFU,
+ SS_CF_BUSY,
+ SS_CF_NO_REPLY,
+ SS_CF_NOT_REACHABLE,
+ SS_CF_ALL,
+ SS_CF_ALL_CONDITIONAL,
+ SS_CFUT,
+ SS_CLIP,
+ SS_CLIR,
+ SS_COLP,
+ SS_COLR,
+ SS_CNAP,
+ SS_WAIT,
+ SS_BAOC,
+ SS_BAOIC,
+ SS_BAOIC_EXC_HOME,
+ SS_BAIC,
+ SS_BAIC_ROAMING,
+ SS_ALL_BARRING,
+ SS_OUTGOING_BARRING,
+ SS_INCOMING_BARRING,
+ SS_INCOMING_BARRING_DN,
+ SS_INCOMING_BARRING_ANONYMOUS
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ServiceType{}
+
+ /** @hide */
+ @IntDef(flag = true, prefix = { "SERVICE_CLASS" }, value = {
+ SERVICE_CLASS_NONE,
+ SERVICE_CLASS_VOICE,
+ SERVICE_CLASS_DATA,
+ SERVICE_CLASS_FAX,
+ SERVICE_CLASS_SMS,
+ SERVICE_CLASS_DATA_SYNC,
+ SERVICE_CLASS_DATA_ASYNC,
+ SERVICE_CLASS_PACKET,
+ SERVICE_CLASS_PAD
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ServiceClass{}
+
+ /**
+ * The Service type of this Supplementary service. Valid values include:
+ * SS_CFU,
+ * SS_CF_BUSY,
+ * SS_CF_NO_REPLY,
+ * SS_CF_NOT_REACHABLE,
+ * SS_CF_ALL,
+ * SS_CF_ALL_CONDITIONAL,
+ * SS_CFUT,
+ * SS_CLIP,
+ * SS_CLIR,
+ * SS_COLP,
+ * SS_COLR,
+ * SS_CNAP,
+ * SS_WAIT,
+ * SS_BAOC,
+ * SS_BAOIC,
+ * SS_BAOIC_EXC_HOME,
+ * SS_BAIC,
+ * SS_BAIC_ROAMING,
+ * SS_ALL_BARRING,
+ * SS_OUTGOING_BARRING,
+ * SS_INCOMING_BARRING,
+ * SS_INCOMING_BARRING_DN,
+ * SS_INCOMING_BARRING_ANONYMOUS
+ *
+ * @hide
+ */
+ // TODO: Make final, do not modify this field directly!
public int serviceType;
- // Refere to SSRequestType
- /** @hide */
+
+ /**
+ * Supplementary Service request Type. Valid values are:
+ * SS_ACTIVATION,
+ * SS_DEACTIVATION,
+ * SS_INTERROGATION,
+ * SS_REGISTRATION,
+ * SS_ERASURE
+ *
+ * @hide
+ */
+ // TODO: Make final, do not modify this field directly!
public int requestType;
- // Refer to TeleserviceType
- /** @hide */
+
+ /**
+ * Supplementary Service teleservice type:
+ * SS_TELESERVICE_ALL_TELE_AND_BEARER,
+ * SS_TELESERVICE_ALL_TELESEVICES,
+ * SS_TELESERVICE_TELEPHONY,
+ * SS_TELESERVICE_ALL_DATA,
+ * SS_TELESERVICE_SMS,
+ * SS_TELESERVICE_ALL_TELESERVICES_EXCEPT_SMS
+ *
+ * @hide
+ */
+ // TODO: Make this param final! Do not try to modify this param directly.
public int teleserviceType;
- // Service Class
- /** @hide */
+
+ /**
+ * Supplementary Service service class. Valid values are:
+ * SERVICE_CLASS_NONE,
+ * SERVICE_CLASS_VOICE,
+ * SERVICE_CLASS_DATA,
+ * SERVICE_CLASS_FAX,
+ * SERVICE_CLASS_SMS,
+ * SERVICE_CLASS_DATA_SYNC,
+ * SERVICE_CLASS_DATA_ASYNC,
+ * SERVICE_CLASS_PACKET,
+ * SERVICE_CLASS_PAD
+ *
+ * @hide
+ */
+ // TODO: Make this param final! Do not try to modify this param directly.
public int serviceClass;
- // Error information
- /** @hide */
- public int result;
- /** @hide */
- public int[] ssInfo; /* Valid for all supplementary services.
- This field will be empty for RequestType SS_INTERROGATION
- and ServiceType SS_CF_*, SS_INCOMING_BARRING_DN,
- SS_INCOMING_BARRING_ANONYMOUS.*/
+ /**
+ * Result of Supplementary Service operation. Valid values are:
+ * RESULT_SUCCESS if the result is success, or
+ * ImsReasonInfo code if the result is a failure.
+ *
+ * @hide
+ */
+ // TODO: Make this param final! Do not try to modify this param directly.
+ public final int result;
- /** @hide */
- public ImsCallForwardInfo[] cfInfo; /* Valid only for supplementary services
- ServiceType SS_CF_* and RequestType SS_INTERROGATION */
+ private int[] mSsInfo;
+ private ImsCallForwardInfo[] mCfInfo;
+ private ImsSsInfo[] mImsSsInfo;
- /** @hide */
- public ImsSsInfo[] imsSsInfo; /* Valid only for ServiceType SS_INCOMING_BARRING_DN and
- ServiceType SS_INCOMING_BARRING_ANONYMOUS */
-
- public ImsSsData() {}
+ /**
+ * Generate IMS Supplementary Service information.
+ * @param serviceType The Supplementary Service type. Valid entries:
+ * SS_CFU,
+ * SS_CF_BUSY,
+ * SS_CF_NO_REPLY,
+ * SS_CF_NOT_REACHABLE,
+ * SS_CF_ALL,
+ * SS_CF_ALL_CONDITIONAL,
+ * SS_CFUT,
+ * SS_CLIP,
+ * SS_CLIR,
+ * SS_COLP,
+ * SS_COLR,
+ * SS_CNAP,
+ * SS_WAIT,
+ * SS_BAOC,
+ * SS_BAOIC,
+ * SS_BAOIC_EXC_HOME,
+ * SS_BAIC,
+ * SS_BAIC_ROAMING,
+ * SS_ALL_BARRING,
+ * SS_OUTGOING_BARRING,
+ * SS_INCOMING_BARRING,
+ * SS_INCOMING_BARRING_DN,
+ * SS_INCOMING_BARRING_ANONYMOUS
+ * @param requestType Supplementary Service request Type. Valid values are:
+ * SS_ACTIVATION,
+ * SS_DEACTIVATION,
+ * SS_INTERROGATION,
+ * SS_REGISTRATION,
+ * SS_ERASURE
+ * @param teleserviceType Supplementary Service teleservice type:
+ * SS_TELESERVICE_ALL_TELE_AND_BEARER,
+ * SS_TELESERVICE_ALL_TELESEVICES,
+ * SS_TELESERVICE_TELEPHONY,
+ * SS_TELESERVICE_ALL_DATA,
+ * SS_TELESERVICE_SMS,
+ * SS_TELESERVICE_ALL_TELESERVICES_EXCEPT_SMS
+ * @param serviceClass Supplementary Service service class. See See 27.007 +CCFC or +CLCK.
+ * @param result Result of Supplementary Service operation. Valid values are 0 if the result is
+ * success, or ImsReasonInfo code if the result is a failure.
+ */
+ public ImsSsData(@ServiceType int serviceType, int requestType, int teleserviceType,
+ @ServiceClass int serviceClass, int result) {
+ this.serviceType = serviceType;
+ this.requestType = requestType;
+ this.teleserviceType = teleserviceType;
+ this.serviceClass = serviceClass;
+ this.result = result;
+ }
private ImsSsData(Parcel in) {
- readFromParcel(in);
+ serviceType = in.readInt();
+ requestType = in.readInt();
+ teleserviceType = in.readInt();
+ serviceClass = in.readInt();
+ result = in.readInt();
+ mSsInfo = in.createIntArray();
+ mCfInfo = (ImsCallForwardInfo[])in.readParcelableArray(this.getClass().getClassLoader());
}
public static final Creator<ImsSsData> CREATOR = new Creator<ImsSsData>() {
@@ -122,18 +317,8 @@
out.writeInt(teleserviceType);
out.writeInt(serviceClass);
out.writeInt(result);
- out.writeIntArray(ssInfo);
- out.writeParcelableArray(cfInfo, 0);
- }
-
- private void readFromParcel(Parcel in) {
- serviceType = in.readInt();
- requestType = in.readInt();
- teleserviceType = in.readInt();
- serviceClass = in.readInt();
- result = in.readInt();
- ssInfo = in.createIntArray();
- cfInfo = (ImsCallForwardInfo[])in.readParcelableArray(this.getClass().getClassLoader());
+ out.writeIntArray(mSsInfo);
+ out.writeParcelableArray(mCfInfo, 0);
}
@Override
@@ -200,7 +385,55 @@
}
public boolean isTypeInterrogation() {
- return (requestType == SS_INTERROGATION);
+ return (serviceType == SS_INTERROGATION);
+ }
+
+ /** @hide */
+ public void setSuppServiceInfo(int[] ssInfo) {
+ mSsInfo = ssInfo;
+ }
+
+ /** @hide */
+ public void setImsSpecificSuppServiceInfo(ImsSsInfo[] imsSsInfo) {
+ mImsSsInfo = imsSsInfo;
+ }
+
+ /** @hide */
+ public void setCallForwardingInfo(ImsCallForwardInfo[] cfInfo) {
+ mCfInfo = cfInfo;
+ }
+
+ /**
+ * This field will be null for RequestType SS_INTERROGATION
+ * and ServiceType SS_CF_*, SS_INCOMING_BARRING_DN,
+ * SS_INCOMING_BARRING_ANONYMOUS.
+ *
+ * @hide
+ */
+ public int[] getSuppServiceInfo() {
+ return mSsInfo;
+ }
+
+ /**
+ * Valid only for ServiceTypes
+ * - SS_INCOMING_BARRING_DN and
+ * - ServiceType SS_INCOMING_BARRING_ANONYMOUS.
+ * Will be null otherwise.
+ * @hide
+ */
+ public ImsSsInfo[] getImsSpecificSuppServiceInfo() {
+ return mImsSsInfo;
+ }
+
+ /**
+ * Valid only for supplementary services
+ * - ServiceType SS_CF_* and
+ * - RequestType SS_INTERROGATION.
+ * Will be null otherwise.
+ * @hide
+ **/
+ public ImsCallForwardInfo[] getCallForwardInfo() {
+ return mCfInfo;
}
public String toString() {
diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java
index 1d1292f..c6f8622 100644
--- a/telephony/java/android/telephony/ims/ImsSsInfo.java
+++ b/telephony/java/android/telephony/ims/ImsSsInfo.java
@@ -36,13 +36,31 @@
// 0: disabled, 1: enabled
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter!
public int mStatus;
/** @hide */
+ // TODO: Make private, do not modify this field directly, use getter!
public String mIcbNum;
+ /**@hide*/
+ // TODO: Remove! Do not use this constructor, instead use public version.
public ImsSsInfo() {
}
+ /**
+ *
+ * @param status The status of the service registration of activation/deactiviation. Valid
+ * entries include:
+ * {@link #NOT_REGISTERED},
+ * {@link #DISABLED},
+ * {@link #ENABLED}
+ * @param icbNum The Incoming barring number.
+ */
+ public ImsSsInfo(int status, String icbNum) {
+ mStatus = status;
+ mIcbNum = icbNum;
+ }
+
private ImsSsInfo(Parcel in) {
readFromParcel(in);
}
@@ -81,6 +99,12 @@
}
};
+ /**
+ * @return Supplementary Service Configuration status. Valid Values are:
+ * {@link #NOT_REGISTERED},
+ * {@link #DISABLED},
+ * {@link #ENABLED}
+ */
public int getStatus() {
return mStatus;
}
diff --git a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
index c2a79d8..2916f81 100644
--- a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
@@ -17,7 +17,6 @@
package android.telephony.mbms;
import android.os.Binder;
-import android.os.RemoteException;
import java.util.List;
import java.util.concurrent.Executor;
@@ -36,7 +35,7 @@
}
@Override
- public void onError(final int errorCode, final String message) throws RemoteException {
+ public void onError(final int errorCode, final String message) {
if (mIsStopped) {
return;
}
@@ -55,7 +54,7 @@
}
@Override
- public void onFileServicesUpdated(final List<FileServiceInfo> services) throws RemoteException {
+ public void onFileServicesUpdated(final List<FileServiceInfo> services) {
if (mIsStopped) {
return;
}
@@ -74,7 +73,7 @@
}
@Override
- public void onMiddlewareReady() throws RemoteException {
+ public void onMiddlewareReady() {
if (mIsStopped) {
return;
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
index b0c00c6..dd1061f 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
@@ -31,6 +31,8 @@
import android.telephony.mbms.vendor.VendorUtils;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
@@ -268,7 +270,10 @@
Uri finalLocation;
try {
- finalLocation = moveToFinalLocation(finalTempFile, appSpecifiedDestination);
+ String relativeLocation = getFileRelativePath(request.getSourceUri().getPath(),
+ completedFileInfo.getUri().getPath());
+ finalLocation = moveToFinalLocation(finalTempFile, appSpecifiedDestination,
+ relativeLocation);
} catch (IOException e) {
Log.w(LOG_TAG, "Failed to move temp file to final destination");
setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
@@ -297,7 +302,9 @@
for (Uri tempFileUri : tempFiles) {
if (verifyTempFilePath(context, request.getFileServiceId(), tempFileUri)) {
File tempFile = new File(tempFileUri.getSchemeSpecificPart());
- tempFile.delete();
+ if (!tempFile.delete()) {
+ Log.w(LOG_TAG, "Failed to delete temp file at " + tempFile.getPath());
+ }
}
}
}
@@ -440,7 +447,8 @@
/*
* Moves a tempfile located at fromPath to its final home where the app wants it
*/
- private static Uri moveToFinalLocation(Uri fromPath, Path appSpecifiedPath) throws IOException {
+ private static Uri moveToFinalLocation(Uri fromPath, Path appSpecifiedPath,
+ String relativeLocation) throws IOException {
if (!ContentResolver.SCHEME_FILE.equals(fromPath.getScheme())) {
Log.w(LOG_TAG, "Downloaded file location uri " + fromPath +
" does not have a file scheme");
@@ -448,16 +456,46 @@
}
Path fromFile = FileSystems.getDefault().getPath(fromPath.getPath());
- if (!Files.isDirectory(appSpecifiedPath)) {
- Files.createDirectory(appSpecifiedPath);
+ Path toFile = appSpecifiedPath.resolve(relativeLocation);
+
+ if (!Files.isDirectory(toFile.getParent())) {
+ Files.createDirectories(toFile.getParent());
}
- // TODO: do we want to support directory trees within the download directory?
- Path result = Files.move(fromFile, appSpecifiedPath.resolve(fromFile.getFileName()),
+ Path result = Files.move(fromFile, toFile,
StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
return Uri.fromFile(result.toFile());
}
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public static String getFileRelativePath(String sourceUriPath, String fileInfoPath) {
+ if (sourceUriPath.endsWith("*")) {
+ // This is a wildcard path. Strip the last path component and use that as the root of
+ // the relative path.
+ int lastSlash = sourceUriPath.lastIndexOf('/');
+ sourceUriPath = sourceUriPath.substring(0, lastSlash);
+ }
+ if (!fileInfoPath.startsWith(sourceUriPath)) {
+ Log.e(LOG_TAG, "File location specified in FileInfo does not match the source URI."
+ + " source: " + sourceUriPath + " fileinfo path: " + fileInfoPath);
+ return null;
+ }
+ if (fileInfoPath.length() == sourceUriPath.length()) {
+ // This is the single-file download case. Return the name of the file so that the
+ // receiver puts the file directly into the dest directory.
+ return sourceUriPath.substring(sourceUriPath.lastIndexOf('/') + 1);
+ }
+
+ String prefixOmittedPath = fileInfoPath.substring(sourceUriPath.length());
+ if (prefixOmittedPath.startsWith("/")) {
+ prefixOmittedPath = prefixOmittedPath.substring(1);
+ }
+ return prefixOmittedPath;
+ }
+
private static boolean verifyTempFilePath(Context context, String serviceId,
Uri filePath) {
if (!ContentResolver.SCHEME_FILE.equals(filePath.getScheme())) {
@@ -474,6 +512,8 @@
if (!MbmsUtils.isContainedIn(
MbmsUtils.getEmbmsTempFileDirForService(context, serviceId), tempFile)) {
+ Log.w(LOG_TAG, "File at " + path + " is not contained in the temp file root," +
+ " which is " + MbmsUtils.getEmbmsTempFileDirForService(context, serviceId));
return false;
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java
index 77dea6f..5003b57 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadSessionCallback.java
@@ -16,8 +16,11 @@
package android.telephony.mbms;
+import android.annotation.IntDef;
import android.telephony.MbmsDownloadSession;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
@@ -25,6 +28,26 @@
* cell-broadcast.
*/
public class MbmsDownloadSessionCallback {
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {
+ MbmsErrors.ERROR_NO_UNIQUE_MIDDLEWARE,
+ MbmsErrors.ERROR_MIDDLEWARE_LOST,
+ MbmsErrors.ERROR_MIDDLEWARE_NOT_BOUND,
+ MbmsErrors.InitializationErrors.ERROR_APP_PERMISSIONS_NOT_GRANTED,
+ MbmsErrors.InitializationErrors.ERROR_DUPLICATE_INITIALIZE,
+ MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_NOT_YET_READY,
+ MbmsErrors.GeneralErrors.ERROR_OUT_OF_MEMORY,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE,
+ MbmsErrors.GeneralErrors.ERROR_IN_E911,
+ MbmsErrors.GeneralErrors.ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE,
+ MbmsErrors.GeneralErrors.ERROR_UNABLE_TO_READ_SIM,
+ MbmsErrors.GeneralErrors.ERROR_CARRIER_CHANGE_NOT_ALLOWED,
+ MbmsErrors.DownloadErrors.ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT,
+ MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST,
+ MbmsErrors.DownloadErrors.ERROR_UNKNOWN_FILE_INFO}, prefix = { "ERROR_" })
+ private @interface DownloadError{}
/**
* Indicates that the middleware has encountered an asynchronous error.
@@ -32,7 +55,7 @@
* @param message A message, intended for debugging purposes, describing the error in further
* detail.
*/
- public void onError(int errorCode, String message) {
+ public void onError(@DownloadError int errorCode, String message) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/mbms/MbmsErrors.java b/telephony/java/android/telephony/mbms/MbmsErrors.java
index b5fec44..7c4321b 100644
--- a/telephony/java/android/telephony/mbms/MbmsErrors.java
+++ b/telephony/java/android/telephony/mbms/MbmsErrors.java
@@ -19,6 +19,13 @@
import android.telephony.MbmsStreamingSession;
public class MbmsErrors {
+ /**
+ * Indicates that the middleware has sent an error code that is not defined in the version of
+ * the SDK targeted by your app. This is an illegal value for the middleware to return -- it
+ * should only ever be generated by the framework.
+ */
+ public static final int UNKNOWN = -1;
+
/** Indicates that the operation was successful. */
public static final int SUCCESS = 0;
diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
index 6e03957..1bdb20bf 100644
--- a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
@@ -16,11 +16,13 @@
package android.telephony.mbms;
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.content.Context;
-import android.os.Handler;
import android.telephony.MbmsStreamingSession;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.concurrent.Executor;
@@ -30,13 +32,34 @@
* {@link MbmsStreamingSession#create(Context, Executor, int, MbmsStreamingSessionCallback)}.
*/
public class MbmsStreamingSessionCallback {
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {
+ MbmsErrors.ERROR_NO_UNIQUE_MIDDLEWARE,
+ MbmsErrors.ERROR_MIDDLEWARE_LOST,
+ MbmsErrors.ERROR_MIDDLEWARE_NOT_BOUND,
+ MbmsErrors.InitializationErrors.ERROR_APP_PERMISSIONS_NOT_GRANTED,
+ MbmsErrors.InitializationErrors.ERROR_DUPLICATE_INITIALIZE,
+ MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_NOT_YET_READY,
+ MbmsErrors.GeneralErrors.ERROR_OUT_OF_MEMORY,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE,
+ MbmsErrors.GeneralErrors.ERROR_IN_E911,
+ MbmsErrors.GeneralErrors.ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE,
+ MbmsErrors.GeneralErrors.ERROR_UNABLE_TO_READ_SIM,
+ MbmsErrors.GeneralErrors.ERROR_CARRIER_CHANGE_NOT_ALLOWED,
+ MbmsErrors.StreamingErrors.ERROR_CONCURRENT_SERVICE_LIMIT_REACHED,
+ MbmsErrors.StreamingErrors.ERROR_UNABLE_TO_START_SERVICE,
+ MbmsErrors.StreamingErrors.ERROR_DUPLICATE_START_STREAM}, prefix = { "ERROR_" })
+ private @interface StreamingError{}
+
/**
* Called by the middleware when it has detected an error condition. The possible error codes
* are listed in {@link MbmsErrors}.
* @param errorCode The error code.
* @param message A human-readable message generated by the middleware for debugging purposes.
*/
- public void onError(int errorCode, @Nullable String message) {
+ public void onError(@StreamingError int errorCode, @Nullable String message) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java
index ef317ee..06b2120 100644
--- a/telephony/java/android/telephony/mbms/MbmsUtils.java
+++ b/telephony/java/android/telephony/mbms/MbmsUtils.java
@@ -130,8 +130,12 @@
* Returns a File linked to the directory used to store temp files for this file service
*/
public static File getEmbmsTempFileDirForService(Context context, String serviceId) {
+ // Replace all non-alphanumerics/underscores with an underscore. Some filesystems don't
+ // like special characters.
+ String sanitizedServiceId = serviceId.replaceAll("[^a-zA-Z0-9_]", "_");
+
File embmsTempFileDir = MbmsTempFileProvider.getEmbmsTempFileDir(context);
- return new File(embmsTempFileDir, serviceId);
+ return new File(embmsTempFileDir, sanitizedServiceId);
}
}
diff --git a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
index 0903824..c265db6 100644
--- a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
@@ -16,13 +16,34 @@
package android.telephony.mbms;
+import android.annotation.IntDef;
import android.annotation.Nullable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A callback class for use when the application is actively streaming content. The middleware
* will provide updates on the status of the stream via this callback.
*/
public class StreamingServiceCallback {
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {
+ MbmsErrors.ERROR_NO_UNIQUE_MIDDLEWARE,
+ MbmsErrors.ERROR_MIDDLEWARE_LOST,
+ MbmsErrors.ERROR_MIDDLEWARE_NOT_BOUND,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_NOT_YET_READY,
+ MbmsErrors.GeneralErrors.ERROR_OUT_OF_MEMORY,
+ MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE,
+ MbmsErrors.GeneralErrors.ERROR_IN_E911,
+ MbmsErrors.GeneralErrors.ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE,
+ MbmsErrors.GeneralErrors.ERROR_UNABLE_TO_READ_SIM,
+ MbmsErrors.GeneralErrors.ERROR_CARRIER_CHANGE_NOT_ALLOWED,
+ MbmsErrors.StreamingErrors.ERROR_CONCURRENT_SERVICE_LIMIT_REACHED,
+ MbmsErrors.StreamingErrors.ERROR_UNABLE_TO_START_SERVICE,
+ MbmsErrors.StreamingErrors.ERROR_DUPLICATE_START_STREAM}, prefix = { "ERROR_" })
+ private @interface StreamingServiceError{}
/**
* Indicates broadcast signal strength is not available for this service.
@@ -39,7 +60,7 @@
* @param errorCode The error code.
* @param message A human-readable message generated by the middleware for debugging purposes.
*/
- public void onError(int errorCode, @Nullable String message) {
+ public void onError(@StreamingServiceError int errorCode, @Nullable String message) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
index f9d7161..a9f10b1 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
@@ -130,6 +130,10 @@
@Override
public void onError(int errorCode, String message) {
try {
+ if (errorCode == MbmsErrors.UNKNOWN) {
+ throw new IllegalArgumentException(
+ "Middleware cannot send an unknown error.");
+ }
callback.onError(errorCode, message);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
index db177c0..5ce612d 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
@@ -77,6 +77,10 @@
@Override
public void onError(final int errorCode, final String message) {
try {
+ if (errorCode == MbmsErrors.UNKNOWN) {
+ throw new IllegalArgumentException(
+ "Middleware cannot send an unknown error.");
+ }
callback.onError(errorCode, message);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
@@ -173,6 +177,10 @@
@Override
public void onError(final int errorCode, final String message) {
try {
+ if (errorCode == MbmsErrors.UNKNOWN) {
+ throw new IllegalArgumentException(
+ "Middleware cannot send an unknown error.");
+ }
callback.onError(errorCode, message);
} catch (RemoteException e) {
onAppCallbackDied(uid, subscriptionId);
diff --git a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
index 8b81b0d..bcad554 100644
--- a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
@@ -26,6 +26,7 @@
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -49,10 +50,11 @@
/**
* Handle preinstalled carrier apps which should be disabled until a matching SIM is inserted.
*
- * Evaluates the list of applications in config_disabledUntilUsedPreinstalledCarrierApps. We
- * want to disable each such application which is present on the system image until the user
- * inserts a SIM which causes that application to gain carrier privilege (indicating a "match"),
- * without interfering with the user if they opt to enable/disable the app explicitly.
+ * Evaluates the list of applications in
+ * {@link SystemConfig#getDisabledUntilUsedPreinstalledCarrierApps()}. We want to disable each
+ * such application which is present on the system image until the user inserts a SIM which
+ * causes that application to gain carrier privilege (indicating a "match"), without interfering
+ * with the user if they opt to enable/disable the app explicitly.
*
* So, for each such app, we either disable until used IFF the app is not carrier privileged AND
* in the default state (e.g. not explicitly DISABLED/DISABLED_BY_USER/ENABLED), or we enable if
@@ -76,8 +78,8 @@
Slog.d(TAG, "disableCarrierAppsUntilPrivileged");
}
SystemConfig config = SystemConfig.getInstance();
- String[] systemCarrierAppsDisabledUntilUsed = Resources.getSystem().getStringArray(
- com.android.internal.R.array.config_disabledUntilUsedPreinstalledCarrierApps);
+ ArraySet<String> systemCarrierAppsDisabledUntilUsed =
+ config.getDisabledUntilUsedPreinstalledCarrierApps();
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
disableCarrierAppsUntilPrivileged(callingPackage, packageManager, telephonyManager,
@@ -102,8 +104,10 @@
Slog.d(TAG, "disableCarrierAppsUntilPrivileged");
}
SystemConfig config = SystemConfig.getInstance();
- String[] systemCarrierAppsDisabledUntilUsed = Resources.getSystem().getStringArray(
- com.android.internal.R.array.config_disabledUntilUsedPreinstalledCarrierApps);
+ ArraySet<String> systemCarrierAppsDisabledUntilUsed =
+ config.getDisabledUntilUsedPreinstalledCarrierApps();
+
+
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
disableCarrierAppsUntilPrivileged(callingPackage, packageManager,
@@ -116,7 +120,7 @@
public static void disableCarrierAppsUntilPrivileged(String callingPackage,
IPackageManager packageManager, @Nullable TelephonyManager telephonyManager,
ContentResolver contentResolver, int userId,
- String[] systemCarrierAppsDisabledUntilUsed,
+ ArraySet<String> systemCarrierAppsDisabledUntilUsed,
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed) {
List<ApplicationInfo> candidates = getDefaultCarrierAppCandidatesHelper(packageManager,
userId, systemCarrierAppsDisabledUntilUsed);
@@ -286,8 +290,8 @@
*/
public static List<ApplicationInfo> getDefaultCarrierAppCandidates(
IPackageManager packageManager, int userId) {
- String[] systemCarrierAppsDisabledUntilUsed = Resources.getSystem().getStringArray(
- com.android.internal.R.array.config_disabledUntilUsedPreinstalledCarrierApps);
+ ArraySet<String> systemCarrierAppsDisabledUntilUsed =
+ SystemConfig.getInstance().getDisabledUntilUsedPreinstalledCarrierApps();
return getDefaultCarrierAppCandidatesHelper(packageManager, userId,
systemCarrierAppsDisabledUntilUsed);
}
@@ -295,14 +299,19 @@
private static List<ApplicationInfo> getDefaultCarrierAppCandidatesHelper(
IPackageManager packageManager,
int userId,
- String[] systemCarrierAppsDisabledUntilUsed) {
- if (systemCarrierAppsDisabledUntilUsed == null
- || systemCarrierAppsDisabledUntilUsed.length == 0) {
+ ArraySet<String> systemCarrierAppsDisabledUntilUsed) {
+ if (systemCarrierAppsDisabledUntilUsed == null) {
return null;
}
- List<ApplicationInfo> apps = new ArrayList<>(systemCarrierAppsDisabledUntilUsed.length);
- for (int i = 0; i < systemCarrierAppsDisabledUntilUsed.length; i++) {
- String packageName = systemCarrierAppsDisabledUntilUsed[i];
+
+ int size = systemCarrierAppsDisabledUntilUsed.size();
+ if (size == 0) {
+ return null;
+ }
+
+ List<ApplicationInfo> apps = new ArrayList<>(size);
+ for (int i = 0; i < size; i++) {
+ String packageName = systemCarrierAppsDisabledUntilUsed.valueAt(i);
ApplicationInfo ai =
getApplicationInfoIfSystemApp(packageManager, userId, packageName);
if (ai != null) {
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index fbb69ad..03fc84d 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1486,4 +1486,17 @@
* screen is off) we want to turn on those indications even when the screen is off.
*/
void setRadioIndicationUpdateMode(int subId, int filters, int mode);
+
+ /**
+ * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2,
+ * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config
+ * (also any country or carrier overlays) to be loaded when using a test SIM with a call box.
+ */
+ void setCarrierTestOverride(int subId, String mccmnc, String imsi, String iccid, String gid1,
+ String gid2, String plmn, String spn);
+
+ /**
+ * A test API to return installed carrier id list version.
+ */
+ int getCarrierIdListVersion(int subId);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index ee7084a..d25fd3f 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -419,6 +419,8 @@
int RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING = 145;
int RIL_REQUEST_START_KEEPALIVE = 146;
int RIL_REQUEST_STOP_KEEPALIVE = 147;
+ int RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA = 148;
+ int RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA = 149;
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
index 3734412..e247951 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
+++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
@@ -173,7 +173,7 @@
private static String getCompilerFilter(String pkg) throws IOException {
String cmd = String.format("dumpsys package %s", pkg);
String[] lines = runShellCommandSplitLines(cmd);
- final String substr = "compilation_filter=";
+ final String substr = "[status=";
for (String line : lines) {
int startIndex = line.indexOf(substr);
if (startIndex < 0) {
diff --git a/tests/net/java/android/app/usage/NetworkStatsManagerTest.java b/tests/net/java/android/app/usage/NetworkStatsManagerTest.java
new file mode 100644
index 0000000..25e1474
--- /dev/null
+++ b/tests/net/java/android/app/usage/NetworkStatsManagerTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.usage;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.net.ConnectivityManager;
+import android.net.INetworkStatsService;
+import android.net.INetworkStatsSession;
+import android.net.NetworkStats.Entry;
+import android.net.NetworkStatsHistory;
+import android.net.NetworkTemplate;
+import android.os.RemoteException;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class NetworkStatsManagerTest {
+
+ private @Mock INetworkStatsService mService;
+ private @Mock INetworkStatsSession mStatsSession;
+
+ private NetworkStatsManager mManager;
+
+ // TODO: change to NetworkTemplate.MATCH_MOBILE once internal constant rename is merged to aosp.
+ private static final int MATCH_MOBILE_ALL = 1;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mManager = new NetworkStatsManager(InstrumentationRegistry.getContext(), mService);
+ }
+
+ @Test
+ public void testQueryDetails() throws RemoteException {
+ final String subscriberId = "subid";
+ final long startTime = 1;
+ final long endTime = 100;
+ final int uid1 = 10001;
+ final int uid2 = 10002;
+ final int uid3 = 10003;
+
+ Entry uid1Entry1 = new Entry("if1", uid1,
+ android.net.NetworkStats.SET_DEFAULT, android.net.NetworkStats.TAG_NONE,
+ 100, 10, 200, 20, 0);
+
+ Entry uid1Entry2 = new Entry(
+ "if2", uid1,
+ android.net.NetworkStats.SET_DEFAULT, android.net.NetworkStats.TAG_NONE,
+ 100, 10, 200, 20, 0);
+
+ Entry uid2Entry1 = new Entry("if1", uid2,
+ android.net.NetworkStats.SET_DEFAULT, android.net.NetworkStats.TAG_NONE,
+ 150, 10, 250, 20, 0);
+
+ Entry uid2Entry2 = new Entry(
+ "if2", uid2,
+ android.net.NetworkStats.SET_DEFAULT, android.net.NetworkStats.TAG_NONE,
+ 150, 10, 250, 20, 0);
+
+ NetworkStatsHistory history1 = new NetworkStatsHistory(10, 2);
+ history1.recordData(10, 20, uid1Entry1);
+ history1.recordData(20, 30, uid1Entry2);
+
+ NetworkStatsHistory history2 = new NetworkStatsHistory(10, 2);
+ history1.recordData(30, 40, uid2Entry1);
+ history1.recordData(35, 45, uid2Entry2);
+
+
+ when(mService.openSessionForUsageStats(anyInt(), anyString())).thenReturn(mStatsSession);
+ when(mStatsSession.getRelevantUids()).thenReturn(new int[] { uid1, uid2, uid3 });
+
+ when(mStatsSession.getHistoryIntervalForUid(any(NetworkTemplate.class),
+ eq(uid1), eq(android.net.NetworkStats.SET_ALL),
+ eq(android.net.NetworkStats.TAG_NONE),
+ eq(NetworkStatsHistory.FIELD_ALL), eq(startTime), eq(endTime)))
+ .then((InvocationOnMock inv) -> {
+ NetworkTemplate template = inv.getArgument(0);
+ assertEquals(MATCH_MOBILE_ALL, template.getMatchRule());
+ assertEquals(subscriberId, template.getSubscriberId());
+ return history1;
+ });
+
+ when(mStatsSession.getHistoryIntervalForUid(any(NetworkTemplate.class),
+ eq(uid2), eq(android.net.NetworkStats.SET_ALL),
+ eq(android.net.NetworkStats.TAG_NONE),
+ eq(NetworkStatsHistory.FIELD_ALL), eq(startTime), eq(endTime)))
+ .then((InvocationOnMock inv) -> {
+ NetworkTemplate template = inv.getArgument(0);
+ assertEquals(MATCH_MOBILE_ALL, template.getMatchRule());
+ assertEquals(subscriberId, template.getSubscriberId());
+ return history2;
+ });
+
+
+ NetworkStats stats = mManager.queryDetails(
+ ConnectivityManager.TYPE_MOBILE, subscriberId, startTime, endTime);
+
+ NetworkStats.Bucket bucket = new NetworkStats.Bucket();
+
+ // First 2 buckets exactly match entry timings
+ assertTrue(stats.getNextBucket(bucket));
+ assertEquals(10, bucket.getStartTimeStamp());
+ assertEquals(20, bucket.getEndTimeStamp());
+ assertBucketMatches(uid1Entry1, bucket);
+
+ assertTrue(stats.getNextBucket(bucket));
+ assertEquals(20, bucket.getStartTimeStamp());
+ assertEquals(30, bucket.getEndTimeStamp());
+ assertBucketMatches(uid1Entry2, bucket);
+
+ // 30 -> 40: contains uid2Entry1 and half of uid2Entry2
+ assertTrue(stats.getNextBucket(bucket));
+ assertEquals(30, bucket.getStartTimeStamp());
+ assertEquals(40, bucket.getEndTimeStamp());
+ assertEquals(225, bucket.getRxBytes());
+ assertEquals(15, bucket.getRxPackets());
+ assertEquals(375, bucket.getTxBytes());
+ assertEquals(30, bucket.getTxPackets());
+
+ // 40 -> 50: contains half of uid2Entry2
+ assertTrue(stats.getNextBucket(bucket));
+ assertEquals(40, bucket.getStartTimeStamp());
+ assertEquals(50, bucket.getEndTimeStamp());
+ assertEquals(75, bucket.getRxBytes());
+ assertEquals(5, bucket.getRxPackets());
+ assertEquals(125, bucket.getTxBytes());
+ assertEquals(10, bucket.getTxPackets());
+
+ assertFalse(stats.hasNextBucket());
+ }
+
+ @Test
+ public void testQueryDetails_NoSubscriberId() throws RemoteException {
+ final long startTime = 1;
+ final long endTime = 100;
+ final int uid1 = 10001;
+ final int uid2 = 10002;
+
+ when(mService.openSessionForUsageStats(anyInt(), anyString())).thenReturn(mStatsSession);
+ when(mStatsSession.getRelevantUids()).thenReturn(new int[] { uid1, uid2 });
+
+ NetworkStats stats = mManager.queryDetails(
+ ConnectivityManager.TYPE_MOBILE, null, startTime, endTime);
+
+ when(mStatsSession.getHistoryIntervalForUid(any(NetworkTemplate.class),
+ anyInt(), anyInt(), anyInt(), anyInt(), anyLong(), anyLong()))
+ .thenReturn(new NetworkStatsHistory(10, 0));
+
+ verify(mStatsSession, times(1)).getHistoryIntervalForUid(
+ argThat((NetworkTemplate t) ->
+ // No subscriberId: MATCH_MOBILE_WILDCARD template
+ t.getMatchRule() == NetworkTemplate.MATCH_MOBILE_WILDCARD),
+ eq(uid1), eq(android.net.NetworkStats.SET_ALL),
+ eq(android.net.NetworkStats.TAG_NONE),
+ eq(NetworkStatsHistory.FIELD_ALL), eq(startTime), eq(endTime));
+
+ verify(mStatsSession, times(1)).getHistoryIntervalForUid(
+ argThat((NetworkTemplate t) ->
+ // No subscriberId: MATCH_MOBILE_WILDCARD template
+ t.getMatchRule() == NetworkTemplate.MATCH_MOBILE_WILDCARD),
+ eq(uid2), eq(android.net.NetworkStats.SET_ALL),
+ eq(android.net.NetworkStats.TAG_NONE),
+ eq(NetworkStatsHistory.FIELD_ALL), eq(startTime), eq(endTime));
+
+ assertFalse(stats.hasNextBucket());
+ }
+
+ private void assertBucketMatches(Entry expected,
+ NetworkStats.Bucket actual) {
+ assertEquals(expected.uid, actual.getUid());
+ assertEquals(expected.rxBytes, actual.getRxBytes());
+ assertEquals(expected.rxPackets, actual.getRxPackets());
+ assertEquals(expected.txBytes, actual.getTxBytes());
+ assertEquals(expected.txPackets, actual.getTxPackets());
+ }
+}
diff --git a/tests/net/java/android/net/IpSecAlgorithmTest.java b/tests/net/java/android/net/IpSecAlgorithmTest.java
index 6bdfdc6..85e8361 100644
--- a/tests/net/java/android/net/IpSecAlgorithmTest.java
+++ b/tests/net/java/android/net/IpSecAlgorithmTest.java
@@ -22,8 +22,12 @@
import android.os.Parcel;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+
+import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
+import java.util.Map.Entry;
import java.util.Random;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,19 +44,29 @@
};
@Test
- public void testDefaultTruncLen() throws Exception {
- IpSecAlgorithm explicit =
+ public void testNoTruncLen() throws Exception {
+ Entry<String, Integer>[] authAndAeadList =
+ new Entry[] {
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_HMAC_MD5, 128),
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_HMAC_SHA1, 160),
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_HMAC_SHA256, 256),
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_HMAC_SHA384, 384),
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_HMAC_SHA512, 512),
+ new SimpleEntry<>(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, 224)
+ };
+
+ // Expect auth and aead algorithms to throw errors if trunclen is omitted.
+ for (Entry<String, Integer> algData : authAndAeadList) {
+ try {
new IpSecAlgorithm(
- IpSecAlgorithm.AUTH_HMAC_SHA256, Arrays.copyOf(KEY_MATERIAL, 256 / 8), 256);
- IpSecAlgorithm implicit =
- new IpSecAlgorithm(
- IpSecAlgorithm.AUTH_HMAC_SHA256, Arrays.copyOf(KEY_MATERIAL, 256 / 8));
- assertTrue(
- "Default Truncation Length Incorrect, Explicit: "
- + explicit
- + "implicit: "
- + implicit,
- IpSecAlgorithm.equals(explicit, implicit));
+ algData.getKey(), Arrays.copyOf(KEY_MATERIAL, algData.getValue() / 8));
+ fail("Expected exception on unprovided auth trunclen");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ // Ensure crypt works with no truncation length supplied.
+ new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, Arrays.copyOf(KEY_MATERIAL, 256 / 8));
}
@Test
diff --git a/tests/net/java/android/net/IpSecConfigTest.java b/tests/net/java/android/net/IpSecConfigTest.java
index f186ee5..771faaf 100644
--- a/tests/net/java/android/net/IpSecConfigTest.java
+++ b/tests/net/java/android/net/IpSecConfigTest.java
@@ -62,7 +62,8 @@
c.setAuthentication(
new IpSecAlgorithm(
IpSecAlgorithm.AUTH_HMAC_MD5,
- new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0}));
+ new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0},
+ 128));
c.setAuthenticatedEncryption(
new IpSecAlgorithm(
IpSecAlgorithm.AUTH_CRYPT_AES_GCM,
diff --git a/tests/net/java/android/net/IpSecManagerTest.java b/tests/net/java/android/net/IpSecManagerTest.java
index 0ca20de..a946e50 100644
--- a/tests/net/java/android/net/IpSecManagerTest.java
+++ b/tests/net/java/android/net/IpSecManagerTest.java
@@ -30,6 +30,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.test.mock.MockContext;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.system.Os;
@@ -69,11 +70,17 @@
private IpSecService mMockIpSecService;
private IpSecManager mIpSecManager;
+ private MockContext mMockContext = new MockContext() {
+ @Override
+ public String getOpPackageName() {
+ return "fooPackage";
+ }
+ };
@Before
public void setUp() throws Exception {
mMockIpSecService = mock(IpSecService.class);
- mIpSecManager = new IpSecManager(mMockIpSecService);
+ mIpSecManager = new IpSecManager(mMockContext, mMockIpSecService);
}
/*
@@ -179,7 +186,7 @@
IpSecManager.UdpEncapsulationSocket encapSocket =
mIpSecManager.openUdpEncapsulationSocket(TEST_UDP_ENCAP_PORT);
- assertNotNull(encapSocket.getSocket());
+ assertNotNull(encapSocket.getFileDescriptor());
assertEquals(TEST_UDP_ENCAP_PORT, encapSocket.getPort());
encapSocket.close();
@@ -202,7 +209,7 @@
IpSecManager.UdpEncapsulationSocket encapSocket =
mIpSecManager.openUdpEncapsulationSocket();
- assertNotNull(encapSocket.getSocket());
+ assertNotNull(encapSocket.getFileDescriptor());
assertEquals(TEST_UDP_ENCAP_PORT, encapSocket.getPort());
encapSocket.close();
@@ -227,7 +234,7 @@
new IpSecTunnelInterfaceResponse(IpSecManager.Status.OK, resourceId, intfName);
when(mMockIpSecService.createTunnelInterface(
eq(VTI_LOCAL_ADDRESS.getHostAddress()), eq(GOOGLE_DNS_4.getHostAddress()),
- anyObject(), anyObject()))
+ anyObject(), anyObject(), anyString()))
.thenReturn(dummyResponse);
IpSecManager.IpSecTunnelInterface tunnelIntf = mIpSecManager.createIpSecTunnelInterface(
@@ -245,7 +252,7 @@
assertEquals(VTI_INTF_NAME, tunnelIntf.getInterfaceName());
tunnelIntf.close();
- verify(mMockIpSecService).deleteTunnelInterface(eq(DUMMY_RESOURCE_ID));
+ verify(mMockIpSecService).deleteTunnelInterface(eq(DUMMY_RESOURCE_ID), anyString());
}
@Test
@@ -255,10 +262,12 @@
tunnelIntf.addAddress(VTI_INNER_ADDRESS);
verify(mMockIpSecService)
- .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+ .addAddressToTunnelInterface(
+ eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS), anyString());
tunnelIntf.removeAddress(VTI_INNER_ADDRESS);
verify(mMockIpSecService)
- .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+ .addAddressToTunnelInterface(
+ eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS), anyString());
}
-}
\ No newline at end of file
+}
diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java
index c866371..941c94d 100644
--- a/tests/net/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java
@@ -315,28 +315,26 @@
@Test
public void testEqualsNetCapabilities() {
- int CAPABILITY = NET_CAPABILITY_MMS; // An arbitrary not mutable capability.
-
NetworkCapabilities nc1 = new NetworkCapabilities();
NetworkCapabilities nc2 = new NetworkCapabilities();
assertTrue(nc1.equalsNetCapabilities(nc2));
assertEquals(nc1, nc2);
- nc1.addCapability(CAPABILITY);
+ nc1.addCapability(NET_CAPABILITY_MMS);
assertFalse(nc1.equalsNetCapabilities(nc2));
assertNotEquals(nc1, nc2);
- nc2.addCapability(CAPABILITY);
+ nc2.addCapability(NET_CAPABILITY_MMS);
assertTrue(nc1.equalsNetCapabilities(nc2));
assertEquals(nc1, nc2);
- nc1.addUnwantedCapability(CAPABILITY);
+ nc1.addUnwantedCapability(NET_CAPABILITY_INTERNET);
assertFalse(nc1.equalsNetCapabilities(nc2));
- nc2.addUnwantedCapability(CAPABILITY);
+ nc2.addUnwantedCapability(NET_CAPABILITY_INTERNET);
assertTrue(nc1.equalsNetCapabilities(nc2));
- nc1.removeCapability(CAPABILITY);
+ nc1.removeCapability(NET_CAPABILITY_INTERNET);
assertFalse(nc1.equalsNetCapabilities(nc2));
- nc2.removeCapability(CAPABILITY);
+ nc2.removeCapability(NET_CAPABILITY_INTERNET);
assertTrue(nc1.equalsNetCapabilities(nc2));
}
diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java
index 035a4cd7..8f18d07 100644
--- a/tests/net/java/android/net/NetworkStatsTest.java
+++ b/tests/net/java/android/net/NetworkStatsTest.java
@@ -19,6 +19,7 @@
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
+import static android.net.NetworkStats.INTERFACES_ALL;
import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_NO;
import static android.net.NetworkStats.METERED_YES;
@@ -31,14 +32,17 @@
import static android.net.NetworkStats.SET_DBG_VPN_OUT;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.IFACE_ALL;
+import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.os.Process;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.filters.SmallTest;
+import android.util.ArrayMap;
import com.google.android.collect.Sets;
@@ -641,6 +645,218 @@
ROAMING_ALL, DEFAULT_NETWORK_ALL, 50500L, 27L, 100200L, 55, 0);
}
+ @Test
+ public void testFilter_NoFilter() {
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry3 = new NetworkStats.Entry(
+ "test2", 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 3)
+ .addValues(entry1)
+ .addValues(entry2)
+ .addValues(entry3);
+
+ stats.filter(UID_ALL, INTERFACES_ALL, TAG_ALL);
+ assertEquals(3, stats.size());
+ assertEquals(entry1, stats.getValues(0, null));
+ assertEquals(entry2, stats.getValues(1, null));
+ assertEquals(entry3, stats.getValues(2, null));
+ }
+
+ @Test
+ public void testFilter_UidFilter() {
+ final int testUid = 10101;
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ "test2", testUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry3 = new NetworkStats.Entry(
+ "test2", testUid, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 3)
+ .addValues(entry1)
+ .addValues(entry2)
+ .addValues(entry3);
+
+ stats.filter(testUid, INTERFACES_ALL, TAG_ALL);
+ assertEquals(2, stats.size());
+ assertEquals(entry2, stats.getValues(0, null));
+ assertEquals(entry3, stats.getValues(1, null));
+ }
+
+ @Test
+ public void testFilter_InterfaceFilter() {
+ final String testIf1 = "testif1";
+ final String testIf2 = "testif2";
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ testIf1, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ "otherif", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry3 = new NetworkStats.Entry(
+ testIf1, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry4 = new NetworkStats.Entry(
+ testIf2, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 4)
+ .addValues(entry1)
+ .addValues(entry2)
+ .addValues(entry3)
+ .addValues(entry4);
+
+ stats.filter(UID_ALL, new String[] { testIf1, testIf2 }, TAG_ALL);
+ assertEquals(3, stats.size());
+ assertEquals(entry1, stats.getValues(0, null));
+ assertEquals(entry3, stats.getValues(1, null));
+ assertEquals(entry4, stats.getValues(2, null));
+ }
+
+ @Test
+ public void testFilter_EmptyInterfaceFilter() {
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ "if1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ "if2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 3)
+ .addValues(entry1)
+ .addValues(entry2);
+
+ stats.filter(UID_ALL, new String[] { }, TAG_ALL);
+ assertEquals(0, stats.size());
+ }
+
+ @Test
+ public void testFilter_TagFilter() {
+ final int testTag = 123;
+ final int otherTag = 456;
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ "test1", 10100, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ "test2", 10101, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats.Entry entry3 = new NetworkStats.Entry(
+ "test2", 10101, SET_DEFAULT, otherTag, METERED_NO, ROAMING_NO,
+ DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 3)
+ .addValues(entry1)
+ .addValues(entry2)
+ .addValues(entry3);
+
+ stats.filter(UID_ALL, INTERFACES_ALL, testTag);
+ assertEquals(2, stats.size());
+ assertEquals(entry1, stats.getValues(0, null));
+ assertEquals(entry2, stats.getValues(1, null));
+ }
+
+ @Test
+ public void testApply464xlatAdjustments() {
+ final String v4Iface = "v4-wlan0";
+ final String baseIface = "wlan0";
+ final String otherIface = "other";
+ final int appUid = 10001;
+ final int rootUid = Process.ROOT_UID;
+ ArrayMap<String, String> stackedIface = new ArrayMap<>();
+ stackedIface.put(v4Iface, baseIface);
+
+ NetworkStats.Entry otherEntry = new NetworkStats.Entry(
+ otherIface, appUid, SET_DEFAULT, TAG_NONE,
+ 2600 /* rxBytes */,
+ 2 /* rxPackets */,
+ 3800 /* txBytes */,
+ 3 /* txPackets */,
+ 0 /* operations */);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 3)
+ .addValues(v4Iface, appUid, SET_DEFAULT, TAG_NONE,
+ 30501490 /* rxBytes */,
+ 22401 /* rxPackets */,
+ 876235 /* txBytes */,
+ 13805 /* txPackets */,
+ 0 /* operations */)
+ .addValues(baseIface, rootUid, SET_DEFAULT, TAG_NONE,
+ 31113087,
+ 22588,
+ 1169942,
+ 13902,
+ 0)
+ .addValues(otherEntry);
+
+ stats.apply464xlatAdjustments(stackedIface);
+
+ assertEquals(3, stats.size());
+ assertValues(stats, 0, v4Iface, appUid, SET_DEFAULT, TAG_NONE,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+ 30949510,
+ 22401,
+ 1152335,
+ 13805,
+ 0);
+ assertValues(stats, 1, baseIface, 0, SET_DEFAULT, TAG_NONE,
+ METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+ 163577,
+ 187,
+ 17607,
+ 97,
+ 0);
+ assertEquals(otherEntry, stats.getValues(2, null));
+ }
+
+ @Test
+ public void testApply464xlatAdjustments_noStackedIface() {
+ NetworkStats.Entry firstEntry = new NetworkStats.Entry(
+ "if1", 10002, SET_DEFAULT, TAG_NONE,
+ 2600 /* rxBytes */,
+ 2 /* rxPackets */,
+ 3800 /* txBytes */,
+ 3 /* txPackets */,
+ 0 /* operations */);
+ NetworkStats.Entry secondEntry = new NetworkStats.Entry(
+ "if2", 10002, SET_DEFAULT, TAG_NONE,
+ 5000 /* rxBytes */,
+ 3 /* rxPackets */,
+ 6000 /* txBytes */,
+ 4 /* txPackets */,
+ 0 /* operations */);
+
+ NetworkStats stats = new NetworkStats(TEST_START, 2)
+ .addValues(firstEntry)
+ .addValues(secondEntry);
+
+ // Empty map: no adjustment
+ stats.apply464xlatAdjustments(new ArrayMap<>());
+
+ assertEquals(2, stats.size());
+ assertEquals(firstEntry, stats.getValues(0, null));
+ assertEquals(secondEntry, stats.getValues(1, null));
+ }
+
private static void assertContains(NetworkStats stats, String iface, int uid, int set,
int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
long txBytes, long txPackets, long operations) {
diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java
index 9b75a50..fef702e 100644
--- a/tests/net/java/android/net/apf/ApfTest.java
+++ b/tests/net/java/android/net/apf/ApfTest.java
@@ -16,6 +16,7 @@
package android.net.apf;
+import static android.net.util.NetworkConstants.*;
import static android.system.OsConstants.*;
import static com.android.internal.util.BitUtils.bytesToBEInt;
import static com.android.internal.util.BitUtils.put;
@@ -26,6 +27,7 @@
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
+import android.content.Context;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
@@ -82,6 +84,7 @@
private static final int TIMEOUT_MS = 500;
@Mock IpConnectivityLog mLog;
+ @Mock Context mContext;
@Before
public void setUp() throws Exception {
@@ -633,9 +636,9 @@
private FileDescriptor mWriteSocket;
private final long mFixedTimeMs = SystemClock.elapsedRealtime();
- public TestApfFilter(ApfConfiguration config, IpManager.Callback ipManagerCallback,
- IpConnectivityLog log) throws Exception {
- super(config, InterfaceParams.getByName("lo"), ipManagerCallback, log);
+ public TestApfFilter(Context context, ApfConfiguration config,
+ IpManager.Callback ipManagerCallback, IpConnectivityLog log) throws Exception {
+ super(context, config, InterfaceParams.getByName("lo"), ipManagerCallback, log);
}
// Pretend an RA packet has been received and show it to ApfFilter.
@@ -757,6 +760,17 @@
private static final byte[] ANOTHER_IPV4_ADDR = {10, 0, 0, 2};
private static final byte[] IPV4_ANY_HOST_ADDR = {0, 0, 0, 0};
+ // Helper to initialize a default apfFilter.
+ private ApfFilter setupApfFilter(IpManager.Callback ipManagerCallback, ApfConfiguration config)
+ throws Exception {
+ LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
+ LinkProperties lp = new LinkProperties();
+ lp.addLinkAddress(link);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
+ apfFilter.setLinkProperties(lp);
+ return apfFilter;
+ }
+
@Test
public void testApfFilterIPv4() throws Exception {
MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
@@ -766,7 +780,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
apfFilter.setLinkProperties(lp);
byte[] program = ipManagerCallback.getApfProgram();
@@ -818,7 +832,7 @@
public void testApfFilterIPv6() throws Exception {
MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
ApfConfiguration config = getDefaultConfig();
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
byte[] program = ipManagerCallback.getApfProgram();
// Verify empty IPv6 packet is passed
@@ -861,7 +875,7 @@
ApfConfiguration config = getDefaultConfig();
config.ieee802_3Filter = DROP_802_3_FRAMES;
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
apfFilter.setLinkProperties(lp);
byte[] program = ipManagerCallback.getApfProgram();
@@ -925,7 +939,7 @@
apfFilter.shutdown();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
apfFilter.setLinkProperties(lp);
program = ipManagerCallback.getApfProgram();
assertDrop(program, mcastv4packet.array());
@@ -941,16 +955,47 @@
}
@Test
+ public void testApfFilterMulticastPingWhileDozing() throws Exception {
+ MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+ ApfFilter apfFilter = setupApfFilter(ipManagerCallback, getDefaultConfig());
+
+ // Construct a multicast ICMPv6 ECHO request.
+ final byte[] multicastIpv6Addr = {(byte)0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte)0xfb};
+ ByteBuffer packet = ByteBuffer.wrap(new byte[100]);
+ packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IPV6);
+ packet.put(IPV6_NEXT_HEADER_OFFSET, (byte)IPPROTO_ICMPV6);
+ packet.put(ICMP6_TYPE_OFFSET, (byte)ICMPV6_ECHO_REQUEST_TYPE);
+ put(packet, IPV6_DEST_ADDR_OFFSET, multicastIpv6Addr);
+
+ // Normally, we let multicast pings alone...
+ assertPass(ipManagerCallback.getApfProgram(), packet.array());
+
+ // ...and even while dozing...
+ apfFilter.setDozeMode(true);
+ assertPass(ipManagerCallback.getApfProgram(), packet.array());
+
+ // ...but when the multicast filter is also enabled, drop the multicast pings to save power.
+ apfFilter.setMulticastFilter(true);
+ assertDrop(ipManagerCallback.getApfProgram(), packet.array());
+
+ // However, we should still let through all other ICMPv6 types.
+ ByteBuffer raPacket = ByteBuffer.wrap(packet.array().clone());
+ raPacket.put(ICMP6_TYPE_OFFSET, (byte)ICMPV6_ROUTER_ADVERTISEMENT);
+ assertPass(ipManagerCallback.getApfProgram(), raPacket.array());
+
+ // Now wake up from doze mode to ensure that we no longer drop the packets.
+ // (The multicast filter is still enabled at this point).
+ apfFilter.setDozeMode(false);
+ assertPass(ipManagerCallback.getApfProgram(), packet.array());
+
+ apfFilter.shutdown();
+ }
+
+ @Test
public void testApfFilter802_3() throws Exception {
MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
- LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
- LinkProperties lp = new LinkProperties();
- lp.addLinkAddress(link);
-
ApfConfiguration config = getDefaultConfig();
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
- apfFilter.setLinkProperties(lp);
-
+ ApfFilter apfFilter = setupApfFilter(ipManagerCallback, config);
byte[] program = ipManagerCallback.getApfProgram();
// Verify empty packet of 100 zero bytes is passed
@@ -970,8 +1015,7 @@
ipManagerCallback.resetApfProgramWait();
apfFilter.shutdown();
config.ieee802_3Filter = DROP_802_3_FRAMES;
- apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
- apfFilter.setLinkProperties(lp);
+ apfFilter = setupApfFilter(ipManagerCallback, config);
program = ipManagerCallback.getApfProgram();
// Verify that IEEE802.3 frame is dropped
@@ -992,18 +1036,13 @@
@Test
public void testApfFilterEthTypeBL() throws Exception {
- MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
- LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
- LinkProperties lp = new LinkProperties();
- lp.addLinkAddress(link);
final int[] emptyBlackList = {};
final int[] ipv4BlackList = {ETH_P_IP};
final int[] ipv4Ipv6BlackList = {ETH_P_IP, ETH_P_IPV6};
+ MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
ApfConfiguration config = getDefaultConfig();
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
- apfFilter.setLinkProperties(lp);
-
+ ApfFilter apfFilter = setupApfFilter(ipManagerCallback, config);
byte[] program = ipManagerCallback.getApfProgram();
// Verify empty packet of 100 zero bytes is passed
@@ -1023,8 +1062,7 @@
ipManagerCallback.resetApfProgramWait();
apfFilter.shutdown();
config.ethTypeBlackList = ipv4BlackList;
- apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
- apfFilter.setLinkProperties(lp);
+ apfFilter = setupApfFilter(ipManagerCallback, config);
program = ipManagerCallback.getApfProgram();
// Verify that IPv4 frame will be dropped
@@ -1039,8 +1077,7 @@
ipManagerCallback.resetApfProgramWait();
apfFilter.shutdown();
config.ethTypeBlackList = ipv4Ipv6BlackList;
- apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
- apfFilter.setLinkProperties(lp);
+ apfFilter = setupApfFilter(ipManagerCallback, config);
program = ipManagerCallback.getApfProgram();
// Verify that IPv4 frame will be dropped
@@ -1081,7 +1118,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
// Verify initially ARP request filter is off, and GARP filter is on.
verifyArpFilter(ipManagerCallback.getApfProgram(), PASS);
@@ -1205,7 +1242,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipManagerCallback, mLog);
byte[] program = ipManagerCallback.getApfProgram();
final int ROUTER_LIFETIME = 1000;
@@ -1351,7 +1388,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- TestApfFilter apfFilter = new TestApfFilter(config, cb, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, cb, mLog);
for (int i = 0; i < 1000; i++) {
byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
r.nextBytes(packet);
@@ -1372,7 +1409,7 @@
ApfConfiguration config = getDefaultConfig();
config.multicastFilter = DROP_MULTICAST;
config.ieee802_3Filter = DROP_802_3_FRAMES;
- TestApfFilter apfFilter = new TestApfFilter(config, cb, mLog);
+ TestApfFilter apfFilter = new TestApfFilter(mContext, config, cb, mLog);
for (int i = 0; i < 1000; i++) {
byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
r.nextBytes(packet);
diff --git a/tests/net/java/android/net/util/InterfaceSetTest.java b/tests/net/java/android/net/util/InterfaceSetTest.java
new file mode 100644
index 0000000..8012838
--- /dev/null
+++ b/tests/net/java/android/net/util/InterfaceSetTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.util;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class InterfaceSetTest {
+ @Test
+ public void testNullNamesIgnored() {
+ final InterfaceSet set = new InterfaceSet(null, "if1", null, "if2", null);
+ assertEquals(2, set.ifnames.size());
+ assertTrue(set.ifnames.contains("if1"));
+ assertTrue(set.ifnames.contains("if2"));
+ }
+
+ @Test
+ public void testToString() {
+ final InterfaceSet set = new InterfaceSet("if1", "if2");
+ final String setString = set.toString();
+ assertTrue(setString.equals("[if1,if2]") || setString.equals("[if2,if1]"));
+ }
+
+ @Test
+ public void testToString_Empty() {
+ final InterfaceSet set = new InterfaceSet(null, null);
+ assertEquals("[]", set.toString());
+ }
+
+ @Test
+ public void testEquals() {
+ assertEquals(new InterfaceSet(null, "if1", "if2"), new InterfaceSet("if2", "if1"));
+ assertEquals(new InterfaceSet(null, null), new InterfaceSet());
+ assertFalse(new InterfaceSet("if1", "if3").equals(new InterfaceSet("if1", "if2")));
+ assertFalse(new InterfaceSet("if1", "if2").equals(new InterfaceSet("if1")));
+ assertFalse(new InterfaceSet().equals(null));
+ }
+}
diff --git a/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java b/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java
index b14f550..fc46b9c 100644
--- a/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java
+++ b/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java
@@ -184,7 +184,7 @@
assertStatsEntry(stats, "dummy0", 0, SET_DEFAULT, 0x0, 0L, 168L);
assertStatsEntry(stats, "lo", 0, SET_DEFAULT, 0x0, 1288L, 1288L);
- NetworkStatsFactory.noteStackedIface("v4-wlan0", null);
+ NetworkStatsFactory.clearStackedIfaces();
}
@Test
@@ -212,7 +212,7 @@
assertStatsEntry(stats, "v4-wlan0", 10106, SET_FOREGROUND, 0x0, appRxBytesAfter, 7867488L);
assertStatsEntry(stats, "wlan0", 0, SET_DEFAULT, 0x0, rootRxBytesAfter, 647587L);
- NetworkStatsFactory.noteStackedIface("v4-wlan0", null);
+ NetworkStatsFactory.clearStackedIfaces();
}
/**
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index 410f754..e573d35 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -27,6 +27,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AppOpsManager;
import android.content.Context;
import android.net.INetd;
import android.net.IpSecAlgorithm;
@@ -40,6 +41,7 @@
import android.net.NetworkUtils;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
+import android.test.mock.MockContext;
import android.support.test.filters.SmallTest;
import android.system.Os;
@@ -92,7 +94,28 @@
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F
};
- Context mMockContext;
+ AppOpsManager mMockAppOps = mock(AppOpsManager.class);
+
+ MockContext mMockContext = new MockContext() {
+ @Override
+ public Object getSystemService(String name) {
+ switch(name) {
+ case Context.APP_OPS_SERVICE:
+ return mMockAppOps;
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void enforceCallingOrSelfPermission(String permission, String message) {
+ if (permission == android.Manifest.permission.MANAGE_IPSEC_TUNNELS) {
+ return;
+ }
+ throw new SecurityException("Unavailable permission requested");
+ }
+ };
+
INetd mMockNetd;
IpSecService.IpSecServiceConfiguration mMockIpSecSrvConfig;
IpSecService mIpSecService;
@@ -114,13 +137,22 @@
@Before
public void setUp() throws Exception {
- mMockContext = mock(Context.class);
mMockNetd = mock(INetd.class);
mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class);
mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig);
// Injecting mock netd
when(mMockIpSecSrvConfig.getNetdInstance()).thenReturn(mMockNetd);
+ // A package granted the AppOp for MANAGE_IPSEC_TUNNELS will be MODE_ALLOWED.
+ when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("blessedPackage")))
+ .thenReturn(AppOpsManager.MODE_ALLOWED);
+ // A system package will not be granted the app op, so this should fall back to
+ // a permissions check, which should pass.
+ when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("systemPackage")))
+ .thenReturn(AppOpsManager.MODE_DEFAULT);
+ // A mismatch between the package name and the UID will return MODE_IGNORED.
+ when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("badPackage")))
+ .thenReturn(AppOpsManager.MODE_IGNORED);
}
@Test
@@ -232,7 +264,7 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
assertEquals(IpSecManager.Status.OK, createTransformResp.status);
verify(mMockNetd)
@@ -267,7 +299,7 @@
ipSecConfig.setAuthenticatedEncryption(AEAD_ALGO);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
assertEquals(IpSecManager.Status.OK, createTransformResp.status);
verify(mMockNetd)
@@ -301,12 +333,12 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
assertEquals(IpSecManager.Status.OK, createTransformResp.status);
// Attempting to create transform a second time with the same SPIs should throw an error...
try {
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
fail("IpSecService should have thrown an error for reuse of SPI");
} catch (IllegalStateException expected) {
}
@@ -314,7 +346,7 @@
// ... even if the transform is deleted
mIpSecService.deleteTransform(createTransformResp.resourceId);
try {
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
fail("IpSecService should have thrown an error for reuse of SPI");
} catch (IllegalStateException expected) {
}
@@ -327,7 +359,7 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
IpSecService.UserRecord userRecord =
mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent);
@@ -351,7 +383,7 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
mIpSecService.deleteTransform(createTransformResp.resourceId);
verify(mMockNetd, times(1))
@@ -398,7 +430,7 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
IpSecService.UserRecord userRecord =
mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
@@ -435,7 +467,7 @@
addAuthAndCryptToIpSecConfig(ipSecConfig);
IpSecTransformResponse createTransformResp =
- mIpSecService.createTransform(ipSecConfig, new Binder());
+ mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
int resourceId = createTransformResp.resourceId;
@@ -460,10 +492,10 @@
}
private IpSecTunnelInterfaceResponse createAndValidateTunnel(
- String localAddr, String remoteAddr) {
+ String localAddr, String remoteAddr, String pkgName) {
IpSecTunnelInterfaceResponse createTunnelResp =
mIpSecService.createTunnelInterface(
- mSourceAddr, mDestinationAddr, fakeNetwork, new Binder());
+ mSourceAddr, mDestinationAddr, fakeNetwork, new Binder(), pkgName);
assertNotNull(createTunnelResp);
assertEquals(IpSecManager.Status.OK, createTunnelResp.status);
@@ -473,7 +505,7 @@
@Test
public void testCreateTunnelInterface() throws Exception {
IpSecTunnelInterfaceResponse createTunnelResp =
- createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
// Check that we have stored the tracking object, and retrieve it
IpSecService.UserRecord userRecord =
@@ -495,12 +527,12 @@
@Test
public void testDeleteTunnelInterface() throws Exception {
IpSecTunnelInterfaceResponse createTunnelResp =
- createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
IpSecService.UserRecord userRecord =
mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
- mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId);
+ mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId, "blessedPackage");
// Verify quota and RefcountedResource objects cleaned up
assertEquals(0, userRecord.mTunnelQuotaTracker.mCurrent);
@@ -516,7 +548,7 @@
@Test
public void testTunnelInterfaceBinderDeath() throws Exception {
IpSecTunnelInterfaceResponse createTunnelResp =
- createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
IpSecService.UserRecord userRecord =
mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
@@ -539,22 +571,34 @@
@Test
public void testAddRemoveAddressFromTunnelInterface() throws Exception {
- IpSecTunnelInterfaceResponse createTunnelResp =
- createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+ for (String pkgName : new String[]{"blessedPackage", "systemPackage"}) {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr, pkgName);
+ mIpSecService.addAddressToTunnelInterface(
+ createTunnelResp.resourceId, mLocalInnerAddress, pkgName);
+ verify(mMockNetd, times(1))
+ .interfaceAddAddress(
+ eq(createTunnelResp.interfaceName),
+ eq(mLocalInnerAddress.getAddress().getHostAddress()),
+ eq(mLocalInnerAddress.getPrefixLength()));
+ mIpSecService.removeAddressFromTunnelInterface(
+ createTunnelResp.resourceId, mLocalInnerAddress, pkgName);
+ verify(mMockNetd, times(1))
+ .interfaceDelAddress(
+ eq(createTunnelResp.interfaceName),
+ eq(mLocalInnerAddress.getAddress().getHostAddress()),
+ eq(mLocalInnerAddress.getPrefixLength()));
+ mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId, pkgName);
+ }
+ }
- mIpSecService.addAddressToTunnelInterface(createTunnelResp.resourceId, mLocalInnerAddress);
- verify(mMockNetd)
- .interfaceAddAddress(
- eq(createTunnelResp.interfaceName),
- eq(mLocalInnerAddress.getAddress().getHostAddress()),
- eq(mLocalInnerAddress.getPrefixLength()));
-
- mIpSecService.removeAddressFromTunnelInterface(
- createTunnelResp.resourceId, mLocalInnerAddress);
- verify(mMockNetd)
- .interfaceDelAddress(
- eq(createTunnelResp.interfaceName),
- eq(mLocalInnerAddress.getAddress().getHostAddress()),
- eq(mLocalInnerAddress.getPrefixLength()));
+ @Test
+ public void testAddTunnelFailsForBadPackageName() throws Exception {
+ try {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr, "badPackage");
+ fail("Expected a SecurityException for badPackage.");
+ } catch (SecurityException expected) {
+ }
}
}
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
index 4a83d1b..f025f41 100644
--- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -26,6 +26,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -62,8 +64,8 @@
private void expectPermission(String[] permissions, boolean preinstalled) throws Exception {
final PackageInfo packageInfo = packageInfoWithPermissions(permissions, preinstalled);
- when(mPackageManager.getPackageInfo(MOCK_PACKAGE_NAMES[0], GET_PERMISSIONS))
- .thenReturn(packageInfo);
+ when(mPackageManager.getPackageInfoAsUser(
+ eq(MOCK_PACKAGE_NAMES[0]), eq(GET_PERMISSIONS), anyInt())).thenReturn(packageInfo);
}
private PackageInfo packageInfoWithPermissions(String[] permissions, boolean preinstalled) {
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index e692652..6142a7c 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -19,16 +19,25 @@
import static android.hardware.usb.UsbManager.USB_CONFIGURED;
import static android.hardware.usb.UsbManager.USB_CONNECTED;
import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
import static android.net.ConnectivityManager.TETHERING_WIFI;
import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
@@ -36,6 +45,7 @@
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -45,18 +55,28 @@
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.res.Resources;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
+import android.net.INetd;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
-import android.net.NetworkRequest;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.MacAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkState;
+import android.net.NetworkUtils;
+import android.net.RouteInfo;
+import android.net.ip.RouterAdvertisementDaemon;
+import android.net.util.InterfaceParams;
+import android.net.util.NetworkConstants;
import android.net.util.SharedLog;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -74,10 +94,16 @@
import android.telephony.CarrierConfigManager;
import android.test.mock.MockContentResolver;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.StateMachine;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.connectivity.tethering.IControlsTethering;
+import com.android.server.connectivity.tethering.IPv6TetheringCoordinator;
import com.android.server.connectivity.tethering.OffloadHardwareInterface;
+import com.android.server.connectivity.tethering.TetherInterfaceStateMachine;
import com.android.server.connectivity.tethering.TetheringDependencies;
+import com.android.server.connectivity.tethering.UpstreamNetworkMonitor;
import org.junit.After;
import org.junit.Before;
@@ -86,33 +112,45 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.Vector;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class TetheringTest {
+ private static final int IFINDEX_OFFSET = 100;
+
private static final String[] PROVISIONING_APP_NAME = {"some", "app"};
+ private static final String TEST_MOBILE_IFNAME = "test_rmnet_data0";
+ private static final String TEST_XLAT_MOBILE_IFNAME = "v4-test_rmnet_data0";
+ private static final String TEST_USB_IFNAME = "test_rndis0";
+ private static final String TEST_WLAN_IFNAME = "test_wlan0";
@Mock private ApplicationInfo mApplicationInfo;
@Mock private Context mContext;
- @Mock private ConnectivityManager mConnectivityManager;
@Mock private INetworkManagementService mNMService;
@Mock private INetworkStatsService mStatsService;
@Mock private INetworkPolicyManager mPolicyManager;
@Mock private MockableSystemProperties mSystemProperties;
@Mock private OffloadHardwareInterface mOffloadHardwareInterface;
@Mock private Resources mResources;
- @Mock private TetheringDependencies mTetheringDependencies;
@Mock private UsbManager mUsbManager;
@Mock private WifiManager mWifiManager;
@Mock private CarrierConfigManager mCarrierConfigManager;
+ @Mock private UpstreamNetworkMonitor mUpstreamNetworkMonitor;
+ @Mock private IPv6TetheringCoordinator mIPv6TetheringCoordinator;
+ @Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon;
+ @Mock private INetd mNetd;
+
+ private final MockTetheringDependencies mTetheringDependencies =
+ new MockTetheringDependencies();
// Like so many Android system APIs, these cannot be mocked because it is marked final.
// We have to use the real versions.
private final PersistableBundle mCarrierConfig = new PersistableBundle();
private final TestLooper mLooper = new TestLooper();
- private final String mTestIfname = "test_wlan0";
private Vector<Intent> mIntents;
private BroadcastInterceptingContext mServiceContext;
@@ -139,30 +177,141 @@
@Override
public Object getSystemService(String name) {
- if (Context.CONNECTIVITY_SERVICE.equals(name)) return mConnectivityManager;
if (Context.WIFI_SERVICE.equals(name)) return mWifiManager;
if (Context.USB_SERVICE.equals(name)) return mUsbManager;
return super.getSystemService(name);
}
}
+ public class MockTetheringDependencies extends TetheringDependencies {
+ StateMachine upstreamNetworkMonitorMasterSM;
+ ArrayList<TetherInterfaceStateMachine> ipv6CoordinatorNotifyList;
+ int isTetheringSupportedCalls;
+
+ public void reset() {
+ upstreamNetworkMonitorMasterSM = null;
+ ipv6CoordinatorNotifyList = null;
+ isTetheringSupportedCalls = 0;
+ }
+
+ @Override
+ public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
+ return mOffloadHardwareInterface;
+ }
+
+ @Override
+ public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx,
+ StateMachine target, SharedLog log, int what) {
+ upstreamNetworkMonitorMasterSM = target;
+ return mUpstreamNetworkMonitor;
+ }
+
+ @Override
+ public IPv6TetheringCoordinator getIPv6TetheringCoordinator(
+ ArrayList<TetherInterfaceStateMachine> notifyList, SharedLog log) {
+ ipv6CoordinatorNotifyList = notifyList;
+ return mIPv6TetheringCoordinator;
+ }
+
+ @Override
+ public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) {
+ return mRouterAdvertisementDaemon;
+ }
+
+ @Override
+ public INetd getNetdService() {
+ return mNetd;
+ }
+
+ @Override
+ public InterfaceParams getInterfaceParams(String ifName) {
+ final String[] ifaces = new String[] { TEST_USB_IFNAME, TEST_WLAN_IFNAME,
+ TEST_MOBILE_IFNAME };
+ final int index = ArrayUtils.indexOf(ifaces, ifName);
+ assertTrue("Non-mocked interface: " + ifName, index >= 0);
+ return new InterfaceParams(ifName, index + IFINDEX_OFFSET,
+ MacAddress.ALL_ZEROS_ADDRESS);
+ }
+
+ @Override
+ public boolean isTetheringSupported() {
+ isTetheringSupportedCalls++;
+ return true;
+ }
+ }
+
+ private static NetworkState buildMobileUpstreamState(boolean withIPv4, boolean withIPv6,
+ boolean with464xlat) {
+ final NetworkInfo info = new NetworkInfo(TYPE_MOBILE, 0, null, null);
+ info.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
+ final LinkProperties prop = new LinkProperties();
+ prop.setInterfaceName(TEST_MOBILE_IFNAME);
+
+ if (withIPv4) {
+ prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
+ NetworkUtils.numericToInetAddress("10.0.0.1"), TEST_MOBILE_IFNAME));
+ }
+
+ if (withIPv6) {
+ prop.addDnsServer(NetworkUtils.numericToInetAddress("2001:db8::2"));
+ prop.addLinkAddress(
+ new LinkAddress(NetworkUtils.numericToInetAddress("2001:db8::"),
+ NetworkConstants.RFC7421_PREFIX_LENGTH));
+ prop.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0),
+ NetworkUtils.numericToInetAddress("2001:db8::1"), TEST_MOBILE_IFNAME));
+ }
+
+ if (with464xlat) {
+ final LinkProperties stackedLink = new LinkProperties();
+ stackedLink.setInterfaceName(TEST_XLAT_MOBILE_IFNAME);
+ stackedLink.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
+ NetworkUtils.numericToInetAddress("192.0.0.1"), TEST_XLAT_MOBILE_IFNAME));
+
+ prop.addStackedLink(stackedLink);
+ }
+
+
+ final NetworkCapabilities capabilities = new NetworkCapabilities()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);;
+ return new NetworkState(info, prop, capabilities, new Network(100), null, "netid");
+ }
+
+ private static NetworkState buildMobileIPv4UpstreamState() {
+ return buildMobileUpstreamState(true, false, false);
+ }
+
+ private static NetworkState buildMobileIPv6UpstreamState() {
+ return buildMobileUpstreamState(false, true, false);
+ }
+
+ private static NetworkState buildMobileDualStackUpstreamState() {
+ return buildMobileUpstreamState(true, true, false);
+ }
+
+ private static NetworkState buildMobile464xlatUpstreamState() {
+ return buildMobileUpstreamState(false, true, true);
+ }
+
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mResources.getStringArray(com.android.internal.R.array.config_tether_dhcp_range))
.thenReturn(new String[0]);
when(mResources.getStringArray(com.android.internal.R.array.config_tether_usb_regexs))
- .thenReturn(new String[0]);
+ .thenReturn(new String[] { "test_rndis\\d" });
when(mResources.getStringArray(com.android.internal.R.array.config_tether_wifi_regexs))
- .thenReturn(new String[]{ "test_wlan\\d", "test_rndis\\d" });
+ .thenReturn(new String[]{ "test_wlan\\d" });
when(mResources.getStringArray(com.android.internal.R.array.config_tether_bluetooth_regexs))
.thenReturn(new String[0]);
when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
.thenReturn(new int[0]);
when(mNMService.listInterfaces())
- .thenReturn(new String[]{ "test_rmnet_data0", mTestIfname });
+ .thenReturn(new String[] {
+ TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME});
when(mNMService.getInterfaceConfig(anyString()))
.thenReturn(new InterfaceConfiguration());
+ when(mRouterAdvertisementDaemon.start())
+ .thenReturn(true);
mServiceContext = new MockContext(mContext);
mContentResolver = new MockContentResolver(mServiceContext);
@@ -175,9 +324,8 @@
}
};
mServiceContext.registerReceiver(mBroadcastReceiver,
- new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED));
- when(mTetheringDependencies.getOffloadHardwareInterface(
- any(Handler.class), any(SharedLog.class))).thenReturn(mOffloadHardwareInterface);
+ new IntentFilter(ACTION_TETHER_STATE_CHANGED));
+ mTetheringDependencies.reset();
mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager,
mLooper.getLooper(), mSystemProperties,
mTetheringDependencies);
@@ -264,16 +412,16 @@
}
private void verifyInterfaceServingModeStarted() throws Exception {
- verify(mNMService, times(1)).getInterfaceConfig(mTestIfname);
+ verify(mNMService, times(1)).getInterfaceConfig(TEST_WLAN_IFNAME);
verify(mNMService, times(1))
- .setInterfaceConfig(eq(mTestIfname), any(InterfaceConfiguration.class));
- verify(mNMService, times(1)).tetherInterface(mTestIfname);
+ .setInterfaceConfig(eq(TEST_WLAN_IFNAME), any(InterfaceConfiguration.class));
+ verify(mNMService, times(1)).tetherInterface(TEST_WLAN_IFNAME);
}
private void verifyTetheringBroadcast(String ifname, String whichExtra) {
// Verify that ifname is in the whichExtra array of the tether state changed broadcast.
final Intent bcast = mIntents.get(0);
- assertEquals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED, bcast.getAction());
+ assertEquals(ACTION_TETHER_STATE_CHANGED, bcast.getAction());
final ArrayList<String> ifnames = bcast.getStringArrayListExtra(whichExtra);
assertTrue(ifnames.contains(ifname));
mIntents.remove(bcast);
@@ -281,13 +429,11 @@
public void failingLocalOnlyHotspotLegacyApBroadcast(
boolean emulateInterfaceStatusChanged) throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
-
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
// hotspot mode is to be started.
if (emulateInterfaceStatusChanged) {
- mTethering.interfaceStatusChanged(mTestIfname, true);
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
}
sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
mLooper.dispatchAll();
@@ -296,30 +442,31 @@
// then it creates a TetherInterfaceStateMachine and sends out a
// broadcast indicating that the interface is "available".
if (emulateInterfaceStatusChanged) {
- verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+ assertEquals(1, mTetheringDependencies.isTetheringSupportedCalls);
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
}
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
}
- @Test
- public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
+ private void prepareUsbTethering(NetworkState upstreamState) {
+ when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+ .thenReturn(upstreamState);
// Emulate pressing the USB tethering button in Settings UI.
mTethering.startTethering(TETHERING_USB, null, false);
mLooper.dispatchAll();
verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
- // Pretend we receive a USB connected broadcast. Here we also pretend
- // that the RNDIS function is somehow enabled, so that we see if we
- // might trip ourselves up.
- sendUsbBroadcast(true, false, true);
- mLooper.dispatchAll();
+ mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true);
+ }
+
+ @Test
+ public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
+ NetworkState upstreamState = buildMobileIPv4UpstreamState();
+ prepareUsbTethering(upstreamState);
+
// This should produce no activity of any kind.
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
// Pretend we then receive USB configured broadcast.
@@ -328,6 +475,10 @@
// Now we should see the start of tethering mechanics (in this case:
// tetherMatchingInterfaces() which starts by fetching all interfaces).
verify(mNMService, times(1)).listInterfaces();
+
+ // UpstreamNetworkMonitor should receive selected upstream
+ verify(mUpstreamNetworkMonitor, times(1)).selectPreferredUpstreamType(any());
+ verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
}
@Test
@@ -342,55 +493,154 @@
public void workingLocalOnlyHotspotEnrichedApBroadcast(
boolean emulateInterfaceStatusChanged) throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
-
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
// hotspot mode is to be started.
if (emulateInterfaceStatusChanged) {
- mTethering.interfaceStatusChanged(mTestIfname, true);
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
}
- sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, mTestIfname, IFACE_IP_MODE_LOCAL_ONLY);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_LOCAL_ONLY);
mLooper.dispatchAll();
verifyInterfaceServingModeStarted();
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService);
verify(mWifiManager).updateInterfaceIpState(
- mTestIfname, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
+ TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
verifyNoMoreInteractions(mWifiManager);
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY);
- // UpstreamNetworkMonitor will be started, and will register two callbacks:
- // a "listen all" and a "track default".
- verify(mConnectivityManager, times(1)).registerNetworkCallback(
- any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
- verify(mConnectivityManager, times(1)).registerDefaultNetworkCallback(
- any(NetworkCallback.class), any(Handler.class));
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
+ verify(mUpstreamNetworkMonitor, times(1)).start();
// TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
- verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
- verifyNoMoreInteractions(mConnectivityManager);
+ assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
// Emulate externally-visible WifiManager effects, when hotspot mode
// is being torn down.
sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
- mTethering.interfaceRemoved(mTestIfname);
+ mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
mLooper.dispatchAll();
- verify(mNMService, times(1)).untetherInterface(mTestIfname);
+ verify(mNMService, times(1)).untetherInterface(TEST_WLAN_IFNAME);
// TODO: Why is {g,s}etInterfaceConfig() called more than once?
- verify(mNMService, atLeastOnce()).getInterfaceConfig(mTestIfname);
+ verify(mNMService, atLeastOnce()).getInterfaceConfig(TEST_WLAN_IFNAME);
verify(mNMService, atLeastOnce())
- .setInterfaceConfig(eq(mTestIfname), any(InterfaceConfiguration.class));
+ .setInterfaceConfig(eq(TEST_WLAN_IFNAME), any(InterfaceConfiguration.class));
verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error.
- assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
- mTethering.getLastTetherError(mTestIfname));
+ assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
+ }
+
+ /**
+ * Send CMD_IPV6_TETHER_UPDATE to TISMs as would be done by IPv6TetheringCoordinator.
+ */
+ private void sendIPv6TetherUpdates(NetworkState upstreamState) {
+ // IPv6TetheringCoordinator must have been notified of downstream
+ verify(mIPv6TetheringCoordinator, times(1)).addActiveDownstream(
+ argThat(sm -> sm.linkProperties().getInterfaceName().equals(TEST_USB_IFNAME)),
+ eq(IControlsTethering.STATE_TETHERED));
+
+ for (TetherInterfaceStateMachine tism :
+ mTetheringDependencies.ipv6CoordinatorNotifyList) {
+ NetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false);
+ tism.sendMessage(TetherInterfaceStateMachine.CMD_IPV6_TETHER_UPDATE, 0, 0,
+ upstreamState.linkProperties.isIPv6Provisioned()
+ ? ipv6OnlyState.linkProperties
+ : null);
+ }
+ mLooper.dispatchAll();
+ }
+
+ private void runUsbTethering(NetworkState upstreamState) {
+ prepareUsbTethering(upstreamState);
+ sendUsbBroadcast(true, true, true);
+ mLooper.dispatchAll();
+ }
+
+ @Test
+ public void workingMobileUsbTethering_IPv4() throws Exception {
+ NetworkState upstreamState = buildMobileIPv4UpstreamState();
+ runUsbTethering(upstreamState);
+
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+ sendIPv6TetherUpdates(upstreamState);
+ verify(mRouterAdvertisementDaemon, never()).buildNewRa(any(), notNull());
+ }
+
+ @Test
+ public void workingMobileUsbTethering_IPv6() throws Exception {
+ NetworkState upstreamState = buildMobileIPv6UpstreamState();
+ runUsbTethering(upstreamState);
+
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
+ sendIPv6TetherUpdates(upstreamState);
+ verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+ verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+ }
+
+ @Test
+ public void workingMobileUsbTethering_DualStack() throws Exception {
+ NetworkState upstreamState = buildMobileDualStackUpstreamState();
+ runUsbTethering(upstreamState);
+
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mRouterAdvertisementDaemon, times(1)).start();
+
+ sendIPv6TetherUpdates(upstreamState);
+ verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+ verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+ }
+
+ @Test
+ public void workingMobileUsbTethering_MultipleUpstreams() throws Exception {
+ NetworkState upstreamState = buildMobile464xlatUpstreamState();
+ runUsbTethering(upstreamState);
+
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME,
+ TEST_XLAT_MOBILE_IFNAME);
+
+ sendIPv6TetherUpdates(upstreamState);
+ verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull());
+ verify(mNetd, times(1)).tetherApplyDnsInterfaces();
+ }
+
+ @Test
+ public void workingMobileUsbTethering_v6Then464xlat() throws Exception {
+ // Setup IPv6
+ NetworkState upstreamState = buildMobileIPv6UpstreamState();
+ runUsbTethering(upstreamState);
+
+ // Then 464xlat comes up
+ upstreamState = buildMobile464xlatUpstreamState();
+ when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+ .thenReturn(upstreamState);
+
+ // Upstream LinkProperties changed: UpstreamNetworkMonitor sends EVENT_ON_LINKPROPERTIES.
+ mTetheringDependencies.upstreamNetworkMonitorMasterSM.sendMessage(
+ Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+ UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES,
+ 0,
+ upstreamState);
+ mLooper.dispatchAll();
+
+ // Forwarding is added for 464xlat, and was still added only once for v6
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME,
+ TEST_XLAT_MOBILE_IFNAME);
}
@Test
@@ -406,7 +656,6 @@
// TODO: Test with and without interfaceStatusChanged().
@Test
public void failingWifiTetheringLegacyApBroadcast() throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
// Emulate pressing the WiFi tethering button.
@@ -414,19 +663,17 @@
mLooper.dispatchAll();
verify(mWifiManager, times(1)).startSoftAp(null);
verifyNoMoreInteractions(mWifiManager);
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
// tethering mode is to be started.
- mTethering.interfaceStatusChanged(mTestIfname, true);
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
mLooper.dispatchAll();
- verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
- verifyNoMoreInteractions(mConnectivityManager);
+ assertEquals(1, mTetheringDependencies.isTetheringSupportedCalls);
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
}
@@ -434,7 +681,6 @@
// TODO: Test with and without interfaceStatusChanged().
@Test
public void workingWifiTetheringEnrichedApBroadcast() throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
// Emulate pressing the WiFi tethering button.
@@ -442,39 +688,30 @@
mLooper.dispatchAll();
verify(mWifiManager, times(1)).startSoftAp(null);
verifyNoMoreInteractions(mWifiManager);
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
// tethering mode is to be started.
- mTethering.interfaceStatusChanged(mTestIfname, true);
- sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, mTestIfname, IFACE_IP_MODE_TETHERED);
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
mLooper.dispatchAll();
verifyInterfaceServingModeStarted();
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService);
verify(mWifiManager).updateInterfaceIpState(
- mTestIfname, WifiManager.IFACE_IP_MODE_TETHERED);
+ TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
verifyNoMoreInteractions(mWifiManager);
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_TETHER);
- // UpstreamNetworkMonitor will be started, and will register two callbacks:
- // a "listen all" and a "track default".
- verify(mConnectivityManager, times(1)).registerNetworkCallback(
- any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
- verify(mConnectivityManager, times(1)).registerDefaultNetworkCallback(
- any(NetworkCallback.class), any(Handler.class));
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER);
+ verify(mUpstreamNetworkMonitor, times(1)).start();
// In tethering mode, in the default configuration, an explicit request
// for a mobile network is also made.
- verify(mConnectivityManager, times(1)).requestNetwork(
- any(NetworkRequest.class), any(NetworkCallback.class), eq(0), anyInt(),
- any(Handler.class));
+ verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest();
// TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
- verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
- verifyNoMoreInteractions(mConnectivityManager);
+ assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
/////
// We do not currently emulate any upstream being found.
@@ -488,34 +725,31 @@
mLooper.dispatchAll();
verify(mWifiManager, times(1)).stopSoftAp();
verifyNoMoreInteractions(mWifiManager);
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
// Emulate externally-visible WifiManager effects, when tethering mode
// is being torn down.
sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED);
- mTethering.interfaceRemoved(mTestIfname);
+ mTethering.interfaceRemoved(TEST_WLAN_IFNAME);
mLooper.dispatchAll();
- verify(mNMService, times(1)).untetherInterface(mTestIfname);
+ verify(mNMService, times(1)).untetherInterface(TEST_WLAN_IFNAME);
// TODO: Why is {g,s}etInterfaceConfig() called more than once?
- verify(mNMService, atLeastOnce()).getInterfaceConfig(mTestIfname);
+ verify(mNMService, atLeastOnce()).getInterfaceConfig(TEST_WLAN_IFNAME);
verify(mNMService, atLeastOnce())
- .setInterfaceConfig(eq(mTestIfname), any(InterfaceConfiguration.class));
+ .setInterfaceConfig(eq(TEST_WLAN_IFNAME), any(InterfaceConfiguration.class));
verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error.
- assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
- mTethering.getLastTetherError(mTestIfname));
+ assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
}
// TODO: Test with and without interfaceStatusChanged().
@Test
public void failureEnablingIpForwarding() throws Exception {
- when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
doThrow(new RemoteException()).when(mNMService).setIpForwardingEnabled(true);
@@ -524,27 +758,27 @@
mLooper.dispatchAll();
verify(mWifiManager, times(1)).startSoftAp(null);
verifyNoMoreInteractions(mWifiManager);
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
// tethering mode is to be started.
- mTethering.interfaceStatusChanged(mTestIfname, true);
- sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, mTestIfname, IFACE_IP_MODE_TETHERED);
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
mLooper.dispatchAll();
// We verify get/set called twice here: once for setup and once during
// teardown because all events happen over the course of the single
// dispatchAll() above.
- verify(mNMService, times(2)).getInterfaceConfig(mTestIfname);
+ verify(mNMService, times(2)).getInterfaceConfig(TEST_WLAN_IFNAME);
verify(mNMService, times(2))
- .setInterfaceConfig(eq(mTestIfname), any(InterfaceConfiguration.class));
- verify(mNMService, times(1)).tetherInterface(mTestIfname);
+ .setInterfaceConfig(eq(TEST_WLAN_IFNAME), any(InterfaceConfiguration.class));
+ verify(mNMService, times(1)).tetherInterface(TEST_WLAN_IFNAME);
verify(mWifiManager).updateInterfaceIpState(
- mTestIfname, WifiManager.IFACE_IP_MODE_TETHERED);
- verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
- verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+ TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
+ // TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
+ assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
+ verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
// This is called, but will throw.
verify(mNMService, times(1)).setIpForwardingEnabled(true);
// This never gets called because of the exception thrown above.
@@ -552,12 +786,11 @@
// When the master state machine transitions to an error state it tells
// downstream interfaces, which causes us to tell Wi-Fi about the error
// so it can take down AP mode.
- verify(mNMService, times(1)).untetherInterface(mTestIfname);
+ verify(mNMService, times(1)).untetherInterface(TEST_WLAN_IFNAME);
verify(mWifiManager).updateInterfaceIpState(
- mTestIfname, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
+ TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
verifyNoMoreInteractions(mWifiManager);
- verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
}
@@ -596,7 +829,7 @@
@Test
public void testDisallowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception {
- final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname};
+ final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
final boolean currDisallow = false;
final boolean nextDisallow = true;
final int expectedInteractionsWithShowNotification = 1;
@@ -618,7 +851,7 @@
@Test
public void testAllowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception {
- final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname};
+ final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
final boolean currDisallow = true;
final boolean nextDisallow = false;
final int expectedInteractionsWithShowNotification = 0;
@@ -629,7 +862,7 @@
@Test
public void testDisallowTetheringUnchanged() throws Exception {
- final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname};
+ final String[] nonEmptyActiveIfacesList = new String[]{TEST_WLAN_IFNAME};
final int expectedInteractionsWithShowNotification = 0;
boolean currDisallow = true;
boolean nextDisallow = true;
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index f59850d..e377a47 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -70,6 +70,7 @@
import android.os.Bundle;
import android.os.INetworkManagementService;
import android.os.Looper;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.test.filters.SmallTest;
@@ -88,6 +89,8 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.Inet4Address;
+import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -639,4 +642,32 @@
lp.addRoute(new RouteInfo(new IpPrefix("::/1")));
assertTrue(Vpn.providesRoutesToMostDestinations(lp));
}
+
+ @Test
+ public void testDoesNotLockUpWithTooManyRoutes() {
+ final LinkProperties lp = new LinkProperties();
+ final byte[] ad = new byte[4];
+ // Actually evaluating this many routes under 1500ms is impossible on
+ // current hardware and for some time, as the algorithm is O(n²).
+ // Make sure the system has a safeguard against this and does not
+ // lock up.
+ final int MAX_ROUTES = 4000;
+ final long MAX_ALLOWED_TIME_MS = 1500;
+ for (int i = 0; i < MAX_ROUTES; ++i) {
+ ad[0] = (byte)((i >> 24) & 0xFF);
+ ad[1] = (byte)((i >> 16) & 0xFF);
+ ad[2] = (byte)((i >> 8) & 0xFF);
+ ad[3] = (byte)(i & 0xFF);
+ try {
+ lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.getByAddress(ad), 32)));
+ } catch (UnknownHostException e) {
+ // UnknownHostException is only thrown for an address of illegal length,
+ // which can't happen in the case above.
+ }
+ }
+ final long start = SystemClock.currentThreadTimeMillis();
+ assertTrue(Vpn.providesRoutesToMostDestinations(lp));
+ final long end = SystemClock.currentThreadTimeMillis();
+ assertTrue(end - start < MAX_ALLOWED_TIME_MS);
+ }
}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
index db5373a..7c77cf5 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
@@ -31,7 +31,6 @@
import static android.net.ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
import static android.net.ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
-import static android.net.ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR;
import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
import static android.net.ConnectivityManager.TETHERING_USB;
import static android.net.ConnectivityManager.TETHERING_WIFI;
@@ -39,12 +38,12 @@
import static com.android.server.connectivity.tethering.IControlsTethering.STATE_TETHERED;
import static com.android.server.connectivity.tethering.IControlsTethering.STATE_UNAVAILABLE;
-import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.RouteInfo;
+import android.net.util.InterfaceSet;
import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.RemoteException;
@@ -75,6 +74,7 @@
@Mock private IControlsTethering mTetherHelper;
@Mock private InterfaceConfiguration mInterfaceConfiguration;
@Mock private SharedLog mSharedLog;
+ @Mock private TetheringDependencies mTetheringDependencies;
private final TestLooper mLooper = new TestLooper();
private final ArgumentCaptor<LinkProperties> mLinkPropertiesCaptor =
@@ -84,7 +84,7 @@
private void initStateMachine(int interfaceType) throws Exception {
mTestedSm = new TetherInterfaceStateMachine(
IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog,
- mNMService, mStatsService, mTetherHelper);
+ mNMService, mStatsService, mTetherHelper, mTetheringDependencies);
mTestedSm.start();
// Starting the state machine always puts us in a consistent state and notifies
// the rest of the world that we've changed from an unknown to available state.
@@ -111,7 +111,8 @@
@Test
public void startsOutAvailable() {
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(),
- TETHERING_BLUETOOTH, mSharedLog, mNMService, mStatsService, mTetherHelper);
+ TETHERING_BLUETOOTH, mSharedLog, mNMService, mStatsService, mTetherHelper,
+ mTetheringDependencies);
mTestedSm.start();
mLooper.dispatchAll();
verify(mTetherHelper).updateInterfaceState(
@@ -346,7 +347,7 @@
* Send a command to the state machine under test, and run the event loop to idle.
*
* @param command One of the TetherInterfaceStateMachine.CMD_* constants.
- * @param obj An additional argument to pass.
+ * @param arg1 An additional argument to pass.
*/
private void dispatchCommand(int command, int arg1) {
mTestedSm.sendMessage(command, arg1);
@@ -371,7 +372,7 @@
*/
private void dispatchTetherConnectionChanged(String upstreamIface) {
mTestedSm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_CONNECTION_CHANGED,
- upstreamIface);
+ new InterfaceSet(upstreamIface));
mLooper.dispatchAll();
}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index c3b9def..9661dc2 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -147,6 +147,16 @@
}
@Test
+ public void testCallbacksRegistered() {
+ mUNM.start();
+ verify(mCM, times(1)).registerNetworkCallback(any(), any(), any());
+ verify(mCM, times(1)).registerDefaultNetworkCallback(any(), any());
+
+ mUNM.stop();
+ verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
+ }
+
+ @Test
public void testRequestsMobileNetwork() throws Exception {
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index 49b2643..e371abc 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -25,6 +25,7 @@
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
import static android.net.NetworkStats.IFACE_ALL;
+import static android.net.NetworkStats.INTERFACES_ALL;
import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_NO;
import static android.net.NetworkStats.METERED_YES;
@@ -58,6 +59,9 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -94,6 +98,7 @@
import android.telephony.TelephonyManager;
import com.android.internal.net.VpnInfo;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.server.LocalServices;
import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
@@ -652,6 +657,94 @@
}
@Test
+ public void testDetailedUidStats() throws Exception {
+ // pretend that network comes online
+ expectDefaultSettings();
+ expectNetworkState(buildWifiState());
+ expectNetworkStatsSummary(buildEmptyStats());
+ expectNetworkStatsUidDetail(buildEmptyStats());
+ expectBandwidthControlCheck();
+
+ mService.forceUpdateIfaces(NETWORKS_WIFI);
+
+ NetworkStats.Entry entry1 = new NetworkStats.Entry(
+ TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L);
+ NetworkStats.Entry entry2 = new NetworkStats.Entry(
+ TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 50L, 5L, 50L, 5L, 0L);
+ NetworkStats.Entry entry3 = new NetworkStats.Entry(
+ TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xBEEF, 1024L, 8L, 512L, 4L, 0L);
+
+ incrementCurrentTime(HOUR_IN_MILLIS);
+ expectDefaultSettings();
+ expectNetworkStatsSummary(buildEmptyStats());
+ expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
+ .addValues(entry1)
+ .addValues(entry2)
+ .addValues(entry3));
+ mService.incrementOperationCount(UID_RED, 0xF00D, 1);
+
+ NetworkStats stats = mService.getDetailedUidStats(INTERFACES_ALL);
+
+ assertEquals(3, stats.size());
+ entry1.operations = 1;
+ assertEquals(entry1, stats.getValues(0, null));
+ entry2.operations = 1;
+ assertEquals(entry2, stats.getValues(1, null));
+ assertEquals(entry3, stats.getValues(2, null));
+ }
+
+ @Test
+ public void testDetailedUidStats_Filtered() throws Exception {
+ // pretend that network comes online
+ expectDefaultSettings();
+
+ final String stackedIface = "stacked-test0";
+ final LinkProperties stackedProp = new LinkProperties();
+ stackedProp.setInterfaceName(stackedIface);
+ final NetworkState wifiState = buildWifiState();
+ wifiState.linkProperties.addStackedLink(stackedProp);
+ expectNetworkState(wifiState);
+
+ expectNetworkStatsSummary(buildEmptyStats());
+ expectNetworkStatsUidDetail(buildEmptyStats());
+ expectBandwidthControlCheck();
+
+ mService.forceUpdateIfaces(NETWORKS_WIFI);
+
+ NetworkStats.Entry uidStats = new NetworkStats.Entry(
+ TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L);
+ // Stacked on matching interface
+ NetworkStats.Entry tetheredStats1 = new NetworkStats.Entry(
+ stackedIface, UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L);
+ // Different interface
+ NetworkStats.Entry tetheredStats2 = new NetworkStats.Entry(
+ "otherif", UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L);
+
+ final String[] ifaceFilter = new String[] { TEST_IFACE };
+ incrementCurrentTime(HOUR_IN_MILLIS);
+ expectDefaultSettings();
+ expectNetworkStatsSummary(buildEmptyStats());
+ when(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL), any()))
+ .thenReturn(new NetworkStats(getElapsedRealtime(), 1)
+ .addValues(uidStats));
+ when(mNetManager.getNetworkStatsTethering(STATS_PER_UID))
+ .thenReturn(new NetworkStats(getElapsedRealtime(), 2)
+ .addValues(tetheredStats1)
+ .addValues(tetheredStats2));
+
+ NetworkStats stats = mService.getDetailedUidStats(ifaceFilter);
+
+ verify(mNetManager, times(1)).getNetworkStatsUidDetail(eq(UID_ALL), argThat(ifaces ->
+ ifaces != null && ifaces.length == 2
+ && ArrayUtils.contains(ifaces, TEST_IFACE)
+ && ArrayUtils.contains(ifaces, stackedIface)));
+
+ assertEquals(2, stats.size());
+ assertEquals(uidStats, stats.getValues(0, null));
+ assertEquals(tetheredStats1, stats.getValues(1, null));
+ }
+
+ @Test
public void testForegroundBackground() throws Exception {
// pretend that network comes online
expectDefaultSettings();
@@ -1027,7 +1120,7 @@
private void expectNetworkStatsUidDetail(NetworkStats detail, NetworkStats tetherStats)
throws Exception {
- when(mNetManager.getNetworkStatsUidDetail(UID_ALL)).thenReturn(detail);
+ when(mNetManager.getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL)).thenReturn(detail);
// also include tethering details, since they are folded into UID
when(mNetManager.getNetworkStatsTethering(STATS_PER_UID)).thenReturn(tetherStats);
diff --git a/tests/net/jni/apf_jni.cpp b/tests/net/jni/apf_jni.cpp
index d415d22..152e6c3 100644
--- a/tests/net/jni/apf_jni.cpp
+++ b/tests/net/jni/apf_jni.cpp
@@ -34,6 +34,8 @@
env->GetArrayLength(program),
(uint8_t*)env->GetByteArrayElements(packet, NULL),
env->GetArrayLength(packet),
+ nullptr,
+ 0,
filter_age);
}
@@ -143,7 +145,8 @@
do {
apf_packet = pcap_next(apf_pcap.get(), &apf_header);
} while (apf_packet != NULL && !accept_packet(
- apf_program, apf_program_len, apf_packet, apf_header.len, 0));
+ apf_program, apf_program_len, apf_packet, apf_header.len,
+ nullptr, 0, 0));
// Make sure both filters matched the same packet.
if (apf_packet == NULL && bpf_packet == NULL)
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index 7e922e6..a274a8c 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -393,6 +393,11 @@
static bool generateSectionListCpp(Descriptor const* descriptor) {
generateHead("section_list");
+ // generate namespaces
+ printf("namespace android {\n");
+ printf("namespace os {\n");
+ printf("namespace incidentd {\n");
+
// generates SECTION_LIST
printf("// Generate SECTION_LIST.\n\n");
@@ -502,6 +507,10 @@
printf("const Privacy** PRIVACY_POLICY_LIST = createList();\n\n");
printf("const int PRIVACY_POLICY_COUNT = %d;\n", policyCount);
}
+
+ printf("} // incidentd\n");
+ printf("} // os\n");
+ printf("} // android\n");
return true;
}
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index 300c701..499f254 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -211,7 +211,7 @@
signature != atoms.signatures.end(); signature++) {
int argIndex;
- fprintf(out, "void\n");
+ fprintf(out, "int\n");
fprintf(out, "stats_write(int32_t code");
argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
@@ -251,7 +251,7 @@
" diff length: %s vs %s\");\n",
attributionDecl.fields.front().name.c_str(),
chainField.name.c_str());
- fprintf(out, " return;\n");
+ fprintf(out, " return -EINVAL;\n");
fprintf(out, " }\n");
}
}
@@ -284,7 +284,7 @@
argIndex++;
}
- fprintf(out, " event.write(LOG_ID_STATS);\n");
+ fprintf(out, " return event.write(LOG_ID_STATS);\n");
fprintf(out, "}\n");
fprintf(out, "\n");
}
@@ -293,7 +293,7 @@
signature != atoms.non_chained_signatures.end(); signature++) {
int argIndex;
- fprintf(out, "void\n");
+ fprintf(out, "int\n");
fprintf(out, "stats_write_non_chained(int32_t code");
argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
@@ -327,7 +327,7 @@
argIndex++;
}
- fprintf(out, " event.write(LOG_ID_STATS);\n");
+ fprintf(out, " return event.write(LOG_ID_STATS);\n");
fprintf(out, "}\n");
fprintf(out, "\n");
}
@@ -377,7 +377,7 @@
const AtomDecl &attributionDecl) {
for (set<vector<java_type_t>>::const_iterator signature = signatures.begin();
signature != signatures.end(); signature++) {
- fprintf(out, "void %s(int32_t code ", method_name.c_str());
+ fprintf(out, "int %s(int32_t code ", method_name.c_str());
int argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
arg != signature->end(); arg++) {
@@ -522,7 +522,7 @@
const AtomDecl &attributionDecl) {
for (set<vector<java_type_t>>::const_iterator signature = signatures.begin();
signature != signatures.end(); signature++) {
- fprintf(out, " public static native void %s(int code", method_name.c_str());
+ fprintf(out, " public static native int %s(int code", method_name.c_str());
int argIndex = 1;
for (vector<java_type_t>::const_iterator arg = signature->begin();
arg != signature->end(); arg++) {
@@ -719,7 +719,7 @@
result += java_type_signature(*arg);
}
}
- result += ")V";
+ result += ")I";
return result;
}
@@ -732,7 +732,7 @@
signature != signatures.end(); signature++) {
int argIndex;
- fprintf(out, "static void\n");
+ fprintf(out, "static int\n");
fprintf(out, "%s(JNIEnv* env, jobject clazz UNUSED, jint code",
jni_function_name(java_method_name, *signature).c_str());
argIndex = 1;
@@ -779,7 +779,7 @@
"\"java/lang/IllegalArgumentException\", "
"\"invalid attribution field(%s) length.\");\n",
chainField.name.c_str());
- fprintf(out, " return;\n");
+ fprintf(out, " return -EINVAL;\n");
fprintf(out, " }\n");
}
if (chainField.javaType == JAVA_TYPE_INT) {
@@ -822,7 +822,7 @@
// stats_write call
argIndex = 1;
- fprintf(out, " android::util::%s(code", cpp_method_name.c_str());
+ fprintf(out, " int ret = android::util::%s(code", cpp_method_name.c_str());
for (vector<java_type_t>::const_iterator arg = signature->begin();
arg != signature->end(); arg++) {
if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
@@ -868,6 +868,7 @@
}
argIndex++;
}
+ fprintf(out, " return ret;\n");
fprintf(out, "}\n");
fprintf(out, "\n");
diff --git a/tools/stringslint/stringslint_sha.sh b/tools/stringslint/stringslint_sha.sh
index c79ba04..bd80bb4 100755
--- a/tools/stringslint/stringslint_sha.sh
+++ b/tools/stringslint/stringslint_sha.sh
@@ -1,4 +1,5 @@
#!/bin/bash
+LOCAL_DIR="$( dirname ${BASH_SOURCE} )"
git show --name-only --pretty=format: $1 | grep values/strings.xml | while read file; do
- python $ANDROID_BUILD_TOP/frameworks/base/tools/stringslint/stringslint.py <(git show $1:$file) <(git show $1^:$file)
+ python $LOCAL_DIR/stringslint.py <(git show $1:$file) <(git show $1^:$file)
done
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 21ae3a9..b77b1ad 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -25,11 +25,13 @@
import android.net.ProxyInfo;
import android.net.StaticIpConfiguration;
import android.net.Uri;
+import android.net.wifi.WifiInfo;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.BackupUtils;
+import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
@@ -76,6 +78,8 @@
/** {@hide} */
private String mPasspointManagementObjectTree;
+ /** {@hide} */
+ private static final int MAXIMUM_RANDOM_MAC_GENERATION_RETRY = 3;
/**
* Recognized key management schemes.
@@ -798,27 +802,37 @@
* @hide
* Randomized MAC address to use with this particular network
*/
+ @NonNull
private MacAddress mRandomizedMacAddress;
/**
* @hide
* Checks if the given MAC address can be used for Connected Mac Randomization
- * by verifying that it is non-null, unicast, and locally assigned.
+ * by verifying that it is non-null, unicast, locally assigned, and not default mac.
* @param mac MacAddress to check
* @return true if mac is good to use
*/
- private boolean isValidMacAddressForRandomization(MacAddress mac) {
- return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned();
+ public static boolean isValidMacAddressForRandomization(MacAddress mac) {
+ return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned()
+ && !MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS).equals(mac);
}
/**
* @hide
* Returns Randomized MAC address to use with the network.
- * If it is not set/valid, create a new randomized address.
+ * If it is not set/valid, creates a new randomized address.
+ * If it can't generate a valid mac, returns the default MAC.
*/
- public MacAddress getOrCreateRandomizedMacAddress() {
- if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) {
+ public @NonNull MacAddress getOrCreateRandomizedMacAddress() {
+ int randomMacGenerationCount = 0;
+ while (!isValidMacAddressForRandomization(mRandomizedMacAddress)
+ && randomMacGenerationCount < MAXIMUM_RANDOM_MAC_GENERATION_RETRY) {
mRandomizedMacAddress = MacAddress.createRandomUnicastAddress();
+ randomMacGenerationCount++;
+ }
+
+ if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) {
+ mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
}
return mRandomizedMacAddress;
}
@@ -828,10 +842,7 @@
* Returns MAC address set to be the local randomized MAC address.
* Does not guarantee that the returned address is valid for use.
*/
- public MacAddress getRandomizedMacAddress() {
- if (mRandomizedMacAddress == null) {
- mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS;
- }
+ public @NonNull MacAddress getRandomizedMacAddress() {
return mRandomizedMacAddress;
}
@@ -839,7 +850,11 @@
* @hide
* @param mac MacAddress to change into
*/
- public void setRandomizedMacAddress(MacAddress mac) {
+ public void setRandomizedMacAddress(@NonNull MacAddress mac) {
+ if (mac == null) {
+ Log.e(TAG, "setRandomizedMacAddress received null MacAddress.");
+ return;
+ }
mRandomizedMacAddress = mac;
}
@@ -1532,7 +1547,7 @@
creatorUid = -1;
shared = true;
dtimInterval = 0;
- mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS;
+ mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
}
/**
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index c8df087..433285b 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1317,6 +1317,7 @@
if (pin) {
NetworkRequest request = new NetworkRequest.Builder()
.clearCapabilities()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
NetworkPinner.pin(mContext, request);
diff --git a/wifi/java/android/net/wifi/rtt/RangingResult.java b/wifi/java/android/net/wifi/rtt/RangingResult.java
index 7fe85be..758a8d5 100644
--- a/wifi/java/android/net/wifi/rtt/RangingResult.java
+++ b/wifi/java/android/net/wifi/rtt/RangingResult.java
@@ -22,7 +22,6 @@
import android.annotation.SystemApi;
import android.net.MacAddress;
import android.net.wifi.aware.PeerHandle;
-import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
@@ -79,19 +78,24 @@
private final int mDistanceMm;
private final int mDistanceStdDevMm;
private final int mRssi;
+ private final int mNumAttemptedMeasurements;
+ private final int mNumSuccessfulMeasurements;
private final byte[] mLci;
private final byte[] mLcr;
private final long mTimestamp;
/** @hide */
public RangingResult(@RangeResultStatus int status, @NonNull MacAddress mac, int distanceMm,
- int distanceStdDevMm, int rssi, byte[] lci, byte[] lcr, long timestamp) {
+ int distanceStdDevMm, int rssi, int numAttemptedMeasurements,
+ int numSuccessfulMeasurements, byte[] lci, byte[] lcr, long timestamp) {
mStatus = status;
mMac = mac;
mPeerHandle = null;
mDistanceMm = distanceMm;
mDistanceStdDevMm = distanceStdDevMm;
mRssi = rssi;
+ mNumAttemptedMeasurements = numAttemptedMeasurements;
+ mNumSuccessfulMeasurements = numSuccessfulMeasurements;
mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
mTimestamp = timestamp;
@@ -99,13 +103,16 @@
/** @hide */
public RangingResult(@RangeResultStatus int status, PeerHandle peerHandle, int distanceMm,
- int distanceStdDevMm, int rssi, byte[] lci, byte[] lcr, long timestamp) {
+ int distanceStdDevMm, int rssi, int numAttemptedMeasurements,
+ int numSuccessfulMeasurements, byte[] lci, byte[] lcr, long timestamp) {
mStatus = status;
mMac = null;
mPeerHandle = peerHandle;
mDistanceMm = distanceMm;
mDistanceStdDevMm = distanceStdDevMm;
mRssi = rssi;
+ mNumAttemptedMeasurements = numAttemptedMeasurements;
+ mNumSuccessfulMeasurements = numSuccessfulMeasurements;
mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
mTimestamp = timestamp;
@@ -163,7 +170,9 @@
/**
* @return The standard deviation of the measured distance (in mm) to the device specified by
* {@link #getMacAddress()} or {@link #getPeerHandle()}. The standard deviation is calculated
- * over the measurements executed in a single RTT burst.
+ * over the measurements executed in a single RTT burst. The number of measurements is returned
+ * by {@link #getNumSuccessfulMeasurements()} - 0 successful measurements indicate that the
+ * standard deviation is not valid (a valid standard deviation requires at least 2 data points).
* <p>
* Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
* exception.
@@ -191,6 +200,46 @@
}
/**
+ * @return The number of attempted measurements used in the RTT exchange resulting in this set
+ * of results. The number of successful measurements is returned by
+ * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1 less
+ * that the number of attempted measurements.
+ * <p>
+ * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
+ * exception.
+ */
+ public int getNumAttemptedMeasurements() {
+ if (mStatus != STATUS_SUCCESS) {
+ throw new IllegalStateException(
+ "getNumAttemptedMeasurements(): invoked on an invalid result: getStatus()="
+ + mStatus);
+ }
+ return mNumAttemptedMeasurements;
+ }
+
+ /**
+ * @return The number of successful measurements used to calculate the distance and standard
+ * deviation. If the number of successful measurements if 1 then then standard deviation,
+ * returned by {@link #getDistanceStdDevMm()}, is not valid (a 0 is returned for the standard
+ * deviation).
+ * <p>
+ * The total number of measurement attempts is returned by
+ * {@link #getNumAttemptedMeasurements()}. The number of successful measurements will be at
+ * most 1 less then the number of attempted measurements.
+ * <p>
+ * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
+ * exception.
+ */
+ public int getNumSuccessfulMeasurements() {
+ if (mStatus != STATUS_SUCCESS) {
+ throw new IllegalStateException(
+ "getNumSuccessfulMeasurements(): invoked on an invalid result: getStatus()="
+ + mStatus);
+ }
+ return mNumSuccessfulMeasurements;
+ }
+
+ /**
* @return The Location Configuration Information (LCI) as self-reported by the peer. The format
* is specified in the IEEE 802.11-2016 specifications, section 9.4.2.22.10.
* <p>
@@ -269,6 +318,8 @@
dest.writeInt(mDistanceMm);
dest.writeInt(mDistanceStdDevMm);
dest.writeInt(mRssi);
+ dest.writeInt(mNumAttemptedMeasurements);
+ dest.writeInt(mNumSuccessfulMeasurements);
dest.writeByteArray(mLci);
dest.writeByteArray(mLcr);
dest.writeLong(mTimestamp);
@@ -296,15 +347,17 @@
int distanceMm = in.readInt();
int distanceStdDevMm = in.readInt();
int rssi = in.readInt();
+ int numAttemptedMeasurements = in.readInt();
+ int numSuccessfulMeasurements = in.readInt();
byte[] lci = in.createByteArray();
byte[] lcr = in.createByteArray();
long timestamp = in.readLong();
if (peerHandlePresent) {
return new RangingResult(status, peerHandle, distanceMm, distanceStdDevMm, rssi,
- lci, lcr, timestamp);
+ numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, timestamp);
} else {
return new RangingResult(status, mac, distanceMm, distanceStdDevMm, rssi,
- lci, lcr, timestamp);
+ numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, timestamp);
}
}
};
@@ -316,7 +369,9 @@
mMac).append(", peerHandle=").append(
mPeerHandle == null ? "<null>" : mPeerHandle.peerId).append(", distanceMm=").append(
mDistanceMm).append(", distanceStdDevMm=").append(mDistanceStdDevMm).append(
- ", rssi=").append(mRssi).append(", lci=").append(mLci).append(", lcr=").append(
+ ", rssi=").append(mRssi).append(", numAttemptedMeasurements=").append(
+ mNumAttemptedMeasurements).append(", numSuccessfulMeasurements=").append(
+ mNumSuccessfulMeasurements).append(", lci=").append(mLci).append(", lcr=").append(
mLcr).append(", timestamp=").append(mTimestamp).append("]").toString();
}
@@ -335,6 +390,8 @@
return mStatus == lhs.mStatus && Objects.equals(mMac, lhs.mMac) && Objects.equals(
mPeerHandle, lhs.mPeerHandle) && mDistanceMm == lhs.mDistanceMm
&& mDistanceStdDevMm == lhs.mDistanceStdDevMm && mRssi == lhs.mRssi
+ && mNumAttemptedMeasurements == lhs.mNumAttemptedMeasurements
+ && mNumSuccessfulMeasurements == lhs.mNumSuccessfulMeasurements
&& Arrays.equals(mLci, lhs.mLci) && Arrays.equals(mLcr, lhs.mLcr)
&& mTimestamp == lhs.mTimestamp;
}
@@ -342,6 +399,6 @@
@Override
public int hashCode() {
return Objects.hash(mStatus, mMac, mPeerHandle, mDistanceMm, mDistanceStdDevMm, mRssi,
- mLci, mLcr, mTimestamp);
+ mNumAttemptedMeasurements, mNumSuccessfulMeasurements, mLci, mLcr, mTimestamp);
}
}
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index 8a3a7f5..3517984 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -18,12 +18,14 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import android.os.Parcel;
import android.net.MacAddress;
import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
+import android.net.wifi.WifiInfo;
import org.junit.Before;
import org.junit.Test;
@@ -176,22 +178,25 @@
@Test
public void testGetOrCreateRandomizedMacAddress_SavesAndReturnsSameAddress() {
WifiConfiguration config = new WifiConfiguration();
- assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress());
+ MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
+ assertEquals(defaultMac, config.getRandomizedMacAddress());
MacAddress firstMacAddress = config.getOrCreateRandomizedMacAddress();
MacAddress secondMacAddress = config.getOrCreateRandomizedMacAddress();
+ assertNotEquals(defaultMac, firstMacAddress);
assertEquals(firstMacAddress, secondMacAddress);
}
@Test
public void testSetRandomizedMacAddress_ChangesSavedAddress() {
WifiConfiguration config = new WifiConfiguration();
- assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress());
+ MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
+ assertEquals(defaultMac, config.getRandomizedMacAddress());
MacAddress macToChangeInto = MacAddress.createRandomUnicastAddress();
config.setRandomizedMacAddress(macToChangeInto);
- MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress();
+ MacAddress macAfterChange = config.getRandomizedMacAddress();
assertEquals(macToChangeInto, macAfterChange);
}
@@ -200,24 +205,37 @@
public void testGetOrCreateRandomizedMacAddress_ReRandomizesInvalidAddress() {
WifiConfiguration config = new WifiConfiguration();
+ MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
MacAddress macAddressZeroes = MacAddress.ALL_ZEROS_ADDRESS;
MacAddress macAddressMulticast = MacAddress.fromString("03:ff:ff:ff:ff:ff");
MacAddress macAddressGlobal = MacAddress.fromString("fc:ff:ff:ff:ff:ff");
config.setRandomizedMacAddress(null);
MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress();
- assertFalse(macAfterChange.equals(null));
+ assertNotEquals(macAfterChange, null);
+
+ config.setRandomizedMacAddress(defaultMac);
+ macAfterChange = config.getOrCreateRandomizedMacAddress();
+ assertNotEquals(macAfterChange, defaultMac);
config.setRandomizedMacAddress(macAddressZeroes);
macAfterChange = config.getOrCreateRandomizedMacAddress();
- assertFalse(macAfterChange.equals(macAddressZeroes));
+ assertNotEquals(macAfterChange, macAddressZeroes);
config.setRandomizedMacAddress(macAddressMulticast);
macAfterChange = config.getOrCreateRandomizedMacAddress();
- assertFalse(macAfterChange.equals(macAddressMulticast));
+ assertNotEquals(macAfterChange, macAddressMulticast);
config.setRandomizedMacAddress(macAddressGlobal);
macAfterChange = config.getOrCreateRandomizedMacAddress();
- assertFalse(macAfterChange.equals(macAddressGlobal));
+ assertNotEquals(macAfterChange, macAddressGlobal);
+ }
+
+ @Test
+ public void testSetRandomizedMacAddress_DoesNothingWhenNull() {
+ WifiConfiguration config = new WifiConfiguration();
+ MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
+ config.setRandomizedMacAddress(null);
+ assertEquals(defaultMac, config.getRandomizedMacAddress());
}
}
diff --git a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
index 1e4cea1..ddddde9 100644
--- a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
@@ -78,7 +78,7 @@
List<RangingResult> results = new ArrayList<>();
results.add(
new RangingResult(RangingResult.STATUS_SUCCESS, MacAddress.BROADCAST_ADDRESS, 15, 5,
- 10, null, null, 666));
+ 10, 8, 5, null, null, 666));
RangingResultCallback callbackMock = mock(RangingResultCallback.class);
ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
@@ -232,13 +232,15 @@
int distanceCm = 105;
int distanceStdDevCm = 10;
int rssi = 5;
+ int numAttemptedMeasurements = 8;
+ int numSuccessfulMeasurements = 3;
long timestamp = System.currentTimeMillis();
byte[] lci = { 0x5, 0x6, 0x7 };
byte[] lcr = { 0x1, 0x2, 0x3, 0xA, 0xB, 0xC };
// RangingResults constructed with a MAC address
RangingResult result = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
- lci, lcr, timestamp);
+ numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, timestamp);
Parcel parcelW = Parcel.obtain();
result.writeToParcel(parcelW, 0);
@@ -254,7 +256,7 @@
// RangingResults constructed with a PeerHandle
result = new RangingResult(status, peerHandle, distanceCm, distanceStdDevCm, rssi,
- null, null, timestamp);
+ numAttemptedMeasurements, numSuccessfulMeasurements, null, null, timestamp);
parcelW = Parcel.obtain();
result.writeToParcel(parcelW, 0);
@@ -280,14 +282,16 @@
int distanceCm = 105;
int distanceStdDevCm = 10;
int rssi = 5;
+ int numAttemptedMeasurements = 10;
+ int numSuccessfulMeasurements = 3;
long timestamp = System.currentTimeMillis();
byte[] lci = { };
byte[] lcr = { };
- RangingResult rr1 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi, lci,
- lcr, timestamp);
- RangingResult rr2 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi, null,
- null, timestamp);
+ RangingResult rr1 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
+ numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, timestamp);
+ RangingResult rr2 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
+ numAttemptedMeasurements, numSuccessfulMeasurements, null, null, timestamp);
assertEquals(rr1, rr2);
}